Hunchentoot Handling Checkbox Опубликовать запросы - PullRequest
2 голосов
/ 28 марта 2019

Я разрабатываю веб-приложение для 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 Ответ

2 голосов
/ 28 марта 2019

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

(food[] :parameter-type 'list)

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

...