5

我需要一些帮助来清理 Zend_Form 并为元素添加过滤器。现在我的印象是,当您向表单添加过滤器时,当表单发布时,该过滤器在控制器中作为调度的一部分执行。

然而,当我惊恐地测试我的表单时,过滤器StripTags似乎没有运行,我正在获取数据中带有 HTML 标记的数据。

我的表单元素看起来像这样。

$address1 = new Zend_Form_Element_Textarea('address1');
    $address1->addFilter('StripTags')
        ->addFilter('StringTrim')            
        ->setAttrib('cols', 30)
        ->setAttrib('rows', 5)
        ->removeDecorator('DtDdWrapper')
        ->removeDecorator('label')
        ->removeDecorator('HtmlTag')

但是,如果我在文本区域中放入一些带有 html 标签的数据,然后使用检查表单是否有效

$formData = $this->_request->getPost();
if($form->isValid($formData){
    ...

数据与其中的标签一起返回。仅当我通过strip_tags()函数传递数据时才将其删除。

我想我的问题是StipTags过滤器是否应该过滤,为什么不过滤?我在这里想念什么。

4

2 回答 2

8

您没有在调用 isValid 后发布有关如何访问数据的代码。$form->getValue('someElement')IIRC 过滤器只有在您通过这些方式或类似方式访问数据时才会生效。

于 2009-07-13T19:50:16.270 回答
0

对不起,我知道我迟到了,但万一有人遇到同样的问题,

我今天遇到了这个问题,我找到了解决这个问题的几种方法:

首先我的代码是:

  • 这是表单

    类 Application_Form_UserForm 扩展 Zend_Form {

    公共函数初始化(){

    /* Form Elements & Other Definitions Here ... */
    $this->setMethod('POST');
    
    $fname = new Zend_Form_Element_Text('fname');
    $fname->setLabel('First Name: ');
    $fname->setAttribs(Array(
        'placeholder'=>'Example: Eslam',
        'class'=>'form-control'
    ));
    $fname->setRequired();
    $fname->addValidator('StringLength', false, Array(4,20));
    $fname->addFilter('StringTrim');
    $fname->addFilter('StripTags');
    $fname->removeDecorator('DtDdWrapper');
    $fname->removeDecorator('label');
    $fname->removeDecorator('HtmlTag');
    
    
    $lname = new Zend_Form_Element_Text('lname');
    $lname->setLabel('Last Name: ');
    $lname->setAttribs(Array(
        'placeholder'=>'Example: Khoga',
        'class'=>'form-control'
    ));
    $lname->setRequired();
    $lname->addValidator('StringLength', false, Array(4,20));
    $lname->addFilter('StringTrim');
    $lname->addFilter('StripTags');
    $lname->removeDecorator('DtDdWrapper');
    $lname->removeDecorator('label');
    $lname->removeDecorator('HtmlTag');
    
    $email = new Zend_Form_Element_Text('email');
    $email->setLabel('Email: ');
    $email->setAttribs(Array(
        'placeholder'=>'Example@Example.com',
        'class'=>'form-control'
    ));
    $email->setRequired();
    $email->addValidator('StringLength', false, Array(5,250));
    $email->addFilter('StringTrim');
    $email->addFilter('StripTags');
    $email->removeDecorator('DtDdWrapper');
    $email->removeDecorator('label');
    $email->removeDecorator('HtmlTag');
    
    $gender = new Zend_Form_Element_Select('gender');
    $gender->setRequired();
    $gender->addMultiOption('male','Male')->
    addMultiOption('female','Female')->
    addMultiOption('none','Prefer not to mention');
    $gender->setAttrib('class', 'form-control');
    
    
    $track_obj = new Application_Model_Track();
    $allTracks = $track_obj->listAll();
    $track = new Zend_Form_element_Select('track');
    foreach($allTracks as $key=>$value)
    {
        $track->addMultiOption($value['id'], $value['name']);
    }
    
    $submit= new Zend_Form_Element_Submit('submit');
    $submit->setAttribs(array('class'=>'btn btn-success'));
    
    $reset= new Zend_Form_Element_Submit('reset');
    $reset->setAttribs(array('class'=>'btn btn-danger'));
    
    $this->addElements(array(
        $fname,
        $lname,
        $email,
        $gender,
        $track,
        $submit,
        $reset
    ));
    

    }

    }

  • 这是控制器

类 UserController 扩展 Zend_Controller_Action{

public function init()
{
    /* Initialize action controller here */
}

public function indexAction()
{
    // action body
}

public function listAction()
{
    // action body
    $user_model = new Application_Model_User();
    $this->view->users = $user_model->listUsers();

    $track_form = new Application_Form_Track();
    $this->view->track_form = $track_form;
    $track_model = new Application_Model_Track();
    $request = $this->getRequest();
    if($request->isPost())
    {
        if($track_form->isValid($request->getPost())){
            $track_model-> addTrack($request->getParams());
            $this->redirect('/user/add');
        }
    }
}

public function detailsAction()
{
    // action body
    $user_model = new Application_Model_User();
    $us_id = $this->_request->getParam("uid");
    $user = $user_model->userDetails($us_id);
    $trackModel = new Application_Model_Track();
    $track = $trackModel->getTrackName($user[0]['track']);
    $user[0]['track'] = $track[0]['name'];
    $this->view->user = $user[0];
}

public function deleteAction()
{
    // action body
    $user_model = new Application_Model_User();
    $us_id = $this->_request->getParam("uid");
    $user_model->deleteUser($us_id);
    $this->redirect("/user/list");
}

public function addAction()
{
    // action body
    $form = new Application_Form_UserForm();
    $request = $this->getRequest();
    if($request->isPost()){
        if($form->isValid($request->getPost())){
            /*echo "<pre>";
            print_r($form);
            echo "</pre>";
            exit;*/
            $userData['fname'] = $form->getValue('fname');
            $userData['lname'] = $form->getValue('lname');
            $userData['email'] = $form->getValue('email');
            $userData['gender'] = $form->getValue('gender');
            $userData['track'] = $form->getValue('track');
            $user_model = new Application_Model_User();
            $user_model-> addNewUser($userData);
            $this->redirect('/user/list');
        }
    }
    $this->view->user_form = $form;
}

public function editAction()
{
    // action body
    $form = new Application_Form_UserForm();
    $user_model = new Application_Model_User ();
    $id = $this->_request->getParam('uid');
    $user_data = $user_model-> userDetails($id)[0];
    $form->populate($user_data);
    $this->view->userName = $user_data['fname']." ".$user_data['lname'];
    $this->view->user_form = $form;
    $request = $this->getRequest();
    if($request->isPost()){
        if($form->isValid($request->getPost())){
            $userData['fname'] = $form->getValue('fname');
            $userData['lname'] = $form->getValue('lname');
            $userData['email'] = $form->getValue('email');
            $userData['gender'] = $form->getValue('gender');
            $userData['track'] = $form->getValue('track');
            $user_model-> updateUser($id, $userData);
            $this->redirect('/user/list');
        }
    }
}


}

第一个解决方案:

我在表单类中的表单元素上使用了过滤器,但是我从控制器中的$form对象中检索了数据,因为我发现了那个方法

添加过滤器()

$_POST 数组值没有改变,所以我从 $form 对象中检索了数据,然后将其作为数组传递给模型。

第二种解决方案:

我试图通过从过滤器类创建对象并应用所需的过滤器来对控制器中的值应用过滤器,而不是在表单中

第三个解决方案:

是使用方法

添加验证器()

使用影响 $_POST 值的正则表达式。

于 2017-03-11T14:10:32.180 回答