Hunchentoot Handling Checkbox Опубликовать запросы

Я разрабатываю веб-приложение для Cl-who, Hunchentoot и Common Lisp, которое будет необходимо обрабатывать заказы клиентов. Поскольку они, очевидно, могли заказать более одного предмета, я подумал, что флажок будет наиболее целесообразным. Однако проблема в том, что когда я определяю easy-handler, он не получает массив результатов, такой как массив в PHP, если у вас есть серия флажков с одинаковым именем и разными значениями. Вместо этого он обрабатывает переменную как строку, поэтому я не могу выполнить итерацию для каждого флажка, который был отмечен. Вот фрагмент моего кода:

(:input :type "checkbox" :name "food[]" :value "cheese balls")
(:input :type "checkbox" :name "food[]" :value "fries")
(:input :type "checkbox" :name "food[]" :value "hamburger")

Вот обработчик, который я настроил (возможно, мне нужно использовать макрос цикла здесь?) Это всего лишь пример, потому что я, очевидно, буду обрабатывать каждый аргумент, передаваемый easy-обработчику, когда выясню эту проблему:

(define-easy-handler (process-order :uri "/process-order") 
    (customer-name customer-address customer-city customer-phone order-type food[])
       (standard-page (:title "order results"
                       :href "file.css")
           (:h1 (if food[]
                (dolist (x food[])
                   (:li (fmt "We see that you want ~A~%" x)))))))

Это всего лишь три потенциальных входа, которые кто-то может проверить. Итак, давайте предположим, что клиент проверяет все три... Вернутся только сырные шарики, потому что Лисп рассматривает имя "food[]" как отдельную строку. Под этим я подразумеваю, что в PHP эта переменная для имени ("food[]") будет обрабатываться так, как если бы она была массивом. Так что в HTML и PHP это будет выглядеть примерно так:

<input type="checkbox" name="food[]" value="cheese balls" class="check"/>
<input type="checkbox" name="food[]" value="fries" class="check"/>
<input type="checkbox" name="food[]" value="hamburger" class="check"/>

Предполагая, что клиент выбрал все три флажка, я мог бы сделать что-то похожее на это в PHP:

if( isset( $_POST['food'])) {
    foreach ( $_POST['food'] as $food){
        echo $food;
    }
 }

Однако неясно, как вы достигли бы подобной функциональности в Common Lisp с Cl-WHO и Hunchentoot. Единственная другая альтернатива, о которой я могу подумать, это передача 30 параметров в easy-handler, но это звучит как наименее эффективный способ решения этой проблемы. Я знаю, что есть также библиотека обработки форм CL, но я надеялся не идти по этому пути, хотя буду, если это единственно возможное решение. Назначение каждому флажку другого имени кажется худшим из возможных способов решения этой проблемы.

1 ответ

Решение

После дальнейшего прочтения документации вы можете изменить тип параметра, который должен получить простой обработчик. Как только он видит, что это список в определении параметра, он обрабатывает его как список. Я просто изменил свой параметр питания на это:

(food[] :parameter-type 'list)

И он обрабатывает его так, как если бы он был списком, и получает несколько результатов из моих чеков.

Другие вопросы по тегам