Hunchentoot 处理复选框 Post 请求
Hunchentoot Handling Checkbox Post Requests
我正在使用 Cl-who、Hunchentoot 和 Common Lisp 开发一个需要处理客户订单的 Web 应用程序。因为他们显然可以订购不止一件商品,所以我认为 Checkbox 最有意义。但是,问题是当我定义一个简单的处理程序时,如果您有一系列具有相同名称和不同值的复选框,它不会像 PHP 中的数组那样接收结果数组。相反,它将变量视为字符串,因此我无法遍历每个选中的 Box。这是我的代码片段:
(:input :type "checkbox" :name "food[]" :value "cheese balls")
(:input :type "checkbox" :name "food[]" :value "fries")
(:input :type "checkbox" :name "food[]" :value "hamburger")
这是我设置的处理程序(也许我需要在这里使用循环宏?)这只是一个示例,因为当我弄清楚这个问题时,我显然会处理传递给 easy-handler 的每个参数:
(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)))))))
这些只是有人可以检查的三个潜在输入。因此,让我们假设客户检查所有三个......只有奶酪球会 return 因为 Lisp 将名称 "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;
}
}
然而,目前尚不清楚您如何使用 Cl-WHO 和 Hunchentoot 在 Common Lisp 中实现类似的功能。我能想到的唯一其他替代方法是将大约 30 个参数传递给 easy-handler,但这听起来像是解决此问题效率最低的方法。我知道还有一个 CL 表单处理库,但我希望避免走那条路,尽管如果这是唯一可能的解决方案,我会这样做。给每个复选框一个不同的名字似乎是解决这个问题的最糟糕的方法。
进一步阅读文档后,您可以更改 easy handler 期望接收的参数类型。一旦它在参数定义中看到它是一个列表,它就会将其视为一个列表。我只是将我的食物参数更改为:
(food[] :parameter-type 'list)
它把它当作一个列表,并从我的复选框中检索多个结果。
我正在使用 Cl-who、Hunchentoot 和 Common Lisp 开发一个需要处理客户订单的 Web 应用程序。因为他们显然可以订购不止一件商品,所以我认为 Checkbox 最有意义。但是,问题是当我定义一个简单的处理程序时,如果您有一系列具有相同名称和不同值的复选框,它不会像 PHP 中的数组那样接收结果数组。相反,它将变量视为字符串,因此我无法遍历每个选中的 Box。这是我的代码片段:
(:input :type "checkbox" :name "food[]" :value "cheese balls")
(:input :type "checkbox" :name "food[]" :value "fries")
(:input :type "checkbox" :name "food[]" :value "hamburger")
这是我设置的处理程序(也许我需要在这里使用循环宏?)这只是一个示例,因为当我弄清楚这个问题时,我显然会处理传递给 easy-handler 的每个参数:
(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)))))))
这些只是有人可以检查的三个潜在输入。因此,让我们假设客户检查所有三个......只有奶酪球会 return 因为 Lisp 将名称 "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;
}
}
然而,目前尚不清楚您如何使用 Cl-WHO 和 Hunchentoot 在 Common Lisp 中实现类似的功能。我能想到的唯一其他替代方法是将大约 30 个参数传递给 easy-handler,但这听起来像是解决此问题效率最低的方法。我知道还有一个 CL 表单处理库,但我希望避免走那条路,尽管如果这是唯一可能的解决方案,我会这样做。给每个复选框一个不同的名字似乎是解决这个问题的最糟糕的方法。
进一步阅读文档后,您可以更改 easy handler 期望接收的参数类型。一旦它在参数定义中看到它是一个列表,它就会将其视为一个列表。我只是将我的食物参数更改为:
(food[] :parameter-type 'list)
它把它当作一个列表,并从我的复选框中检索多个结果。