Я разрабатываю веб-приложение для 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, но я надеялся не идти по этому пути, хотя буду, если это единственно возможное решение. Назначение каждому флажку другого имени кажется худшим из возможных способов решения этой проблемы.