1

jqueryを使用して(ユーザーの選択に基づいて)テキストボックスを動的に作成しています..Zendフォームからそのテキストボックスの検証を提供する方法はありますか..?

4

1 に答える 1

2

はいあります。

ほとんどのクレジットはjeremykendallに送られます。http: //www.jeremykendall.net/2009/01/19/dynamically-adding-elements-to-zend-form/を参照してください。

私がそれを解決した方法は、次のようなフォーム要素を追加するアクションに対してjquery/ajax呼び出しを実行することです。

$.ajax({
    type : "POST",
    url : "/<controller>/addfield/",
    success : function(newElements) {
        // Insert new element before the submit button
        $("#productsNew-submit-element").before(newElements);
    }
});

これは、フォーム要素を生成し、追加できるhtmlを返すアクションを呼び出すことです。

public function addfieldAction()
{
    //use $ajaxContext = $this->_helper->getHelper('AjaxContext'); in the init to make it return html via ajax

    $element = new Zend_Form_Element_Text("extraElement_1");
    $element->setBelongsTo("yourForm");
    $element->setLabel('myElementName');

    /*
    set other stuff like decorators or so
    */

    //now create the html 
    $elements .= $element->__toString();

    $this->view->fields = $elements;
}

その後、ajaxを介してフォームに新しい要素を取得します

今、あなたが提出するとき、あなたはそれをもう一度しなければなりません、しかしそれから事前検証

  1. 最初に、フォームにextraElementsがあるかどうかを確認し、ある場合は再度追加します
  2. 追加要素に投稿された値を入力します
  3. 検証
public function saveAction()
{
    function findFields($field) {
        // return field names that include 'extraElement_'
        if (strpos($field, 'extraElement_') !== false) {
            return $field;
        }
    }

    //set all stuff you need especially the form

    if($this->getRequest()->isPost()) {
        $postValues = $this->getRequest()->getPost();

        //step 1 
        $extraFields = array_filter(array_keys(current($postValues)), 'findFields');

        //add the element before validation
        if(count($extraFields) !== 0) {
            foreach(extraFields as $extraField) {
                $this->addFields($postValues[$extraField]); <-- step 2 add the field(s)
            }
        }

        //step 3 validate
        if($this->_form->isValid($postValues)) {
            //do post validation stuff
        } else {
            //show errors
        }
    }       
}
于 2012-06-14T07:38:52.820 に答える