我在ZF应用程序中创建了一个简单的联系表单。仅仅为几个表单元素操作装饰器并不值得。
我的问题是:我是否仍然可以在使用Zend Form创建 的元素上使用Zend Form Filters:
<!-- Standard HTML - not generated with ZF -->
<form id="contact-form" method="post" action="/contact/submit">
<input type="text" name="name" />
<input type="email" name="email" />
<input type="submit" name="submit" />
</form>
public function submitAction()
{
$params = $this->_request->getParams();
//Am I able to apply filters/validators to the data I get from the request?
//What is the best way to handle this?
}
我看了this(达西黑斯廷斯的回答) - 看起来它会起作用,感觉有点笨拙。
赞赏任何建议。
谢谢, 肯
答案 0 :(得分:3)
是的,您可以使用Zend_Filter_Input,以下是如何设置它的示例。
//set filters and validators for Zend_Filter_Input
$filters = array(
'trackid' => array('HtmlEntities', 'StripTags')
);
$validators = array(
'trackid' => array('NotEmpty', 'Int')
);
//assign Input
$input = new Zend_Filter_Input($filters, $validators);
$input->setData($this->getRequest()->getParams());
//check input is valid and is specifically posted as 'Delete Selected'
if ($input->isValid()) {
你也可以考虑使用viewscript装饰器渲染一个Zend Form,该控件是绝对的(或几乎)。:
//in your controller action
public function indexAction() {
//a normally constructed Zend_Form
$form = new Member_Form_Bid();
$form->setAction('/member/bid/preference');
//attach a partial to display the form, this is the decrator
$form->setDecorators(array(
array('ViewScript', array('viewScript' => '_bidForm.phtml'))
));
$this->view->form = $form;
//the view
<?php echo $this->form?>
//the partial
//use a normal Zend_Form and display only the parts you want
//processing in an action is done like any other Zend_Form
form action="<?php echo $this->element->getAction() ?>"
method="<?php echo $this->element->getMethod() ?>">
<table id="sort">
<tr>
<th colspan="2">Sort By Shift</th>
<th colspan="2">Sort By Days Off</th>
<th colspan="2">Sort By Bid Location</th>
</tr>
<tr></tr>
<tr>
<td class="label"><?php echo $this->element->shift->renderLabel() ?></td>
<td class="element"><?php echo $this->element->shift->renderViewHelper() ?></td>
<td class="label"><?php echo $this->element->weekend->renderLabel() ?></td>
<td class="element"><?php echo $this->element->weekend->renderViewHelper() ?></td>
<td class="label"><?php echo $this->element->bidlocation->renderLabel() ?></td>
<td class="element"><?php echo $this->element->bidlocation->renderViewHelper() ?></td>
</tr>
<tr></tr>
<tr>
<td colspan="6" style="text-align: center"><?php echo $this->element->submit ?></td>
</tr>
</table>
</form>
答案 1 :(得分:1)
是的,您绝对可以在自渲染表单上使用Zend_Form
。
您可以通过两种方式执行此操作:
使用Zend_Form
对象,但不渲染它。您可以像往常一样创建Zend_Form
实例,并正确命名所有元素并按正常方式附加验证器和过滤器。在您的操作中,您可以检查表单isValid()
并使用getValues()
以确保您收集过滤后的数据。
第二个选项是使用Zend_Filter_Input
,它是一系列验证器和过滤器。您在构造时设置验证器和过滤器,然后调用setData
以使用请求中的信息填充过滤器。同样,您需要isValid()
进行测试,然后使用getUnescaped()
来检索数据。 manual page有更多详细信息。