1

我有一个使用数组表示法创建的表单。我有两个下拉列表。一个是父级,第二个是所选父级的兄弟姐妹。我正在使用 JQuery 在父级更改时更新兄弟级列表。

我遇到的问题是,在 JQuery 替换同级列表中的原始项目后,表单无法验证。我想在验证发生之前将新的兄弟列表推送到表单中。我的代码如下所示:

这是 jQuery 方法:

    jQuery(function($) {
    $("#parent").change(function(event){
        event.preventDefault();
        var parentID = $('#parent').val();
        var id = $('#id').val();
        $.post("**/menu/GetMenuChildren**", {pID: parentID, thisID: id }, 
            function(data){
                if(data.response === true){        
                    var $el = $("#Position");
                    $el.empty(); // remove old options
                    $.each(data.newOptions, function(value,key) {
                      $el.append($("<option></option>")
                         .attr("value", value).text(key));
                    });
                } else {
                    // print error message
                    alert("something wrong in Post");
                }
            }, 'json');
    });
});

上面的代码调用了如下所示的控制器方法getMenuChildren:

public function GetMenuChildrenAction()
{
    $request = $this->getRequest();
    $response = $this->getResponse();
    if ($request->isPost()) 
        {
        $post_data = $request->getPost();
        $parent_id = $post_data['pID'];
        $id = $post_data['thisID'];

        $sm = $this->getServiceLocator();
        $tg = $sm->get('MenuTableGateway');
        $newOptions = $this->getMenuTable()->AjaxGetPositionsByID($parent_id, $id, $tg);
        $this->newOptions = $newOptions;
        //$x = json_encode($newOptions);
        if(isset($newOptions))
        {
            $response->setContent(\Zend\Json\Json::encode(array('response' => true, 'newOptions' => $newOptions)));
        }
        else
        {
            $response->setContent(\Zend\Json\Json::encode(array('response' => false)));
        }
    }
    return $response;
}

单击表单上的保存按钮时,将执行 EditAction,如下所示:

public function editAction()
{
    $id = (int) $this->params()->fromRoute('id',0);
    if(!$id) {
        return $this->redirect()->toRoute('menu',array('action' => 'insert'));
    }

    try 
    {
        $menu = $this->getMenuTable()->getMenu($id);
    }
    catch (\Exception $ex) {
        return $this->redirect()->toRoute('menu', array('action' => 'index'));
    }

    if(!$this->form)
    {
        $this->form = new MenuForm($this->getMenuTable(), $this->getServiceLocator());
    }

    $this->form->getInputFilter();
    $this->form->bind($menu);
    $this->form->get('submit')->setAttribute('value','Save');

    $sm = $this->getServiceLocator();
    $tg = $sm->get('MenuTableGateway');

    $request = $this->getRequest();
    if($request->isPost()) {
        $this->form->setInputFilter($menu->getInputFilter());
        $this->form->setData($request->getPost());

        if($this->form->isValid()) 
        {
            $this->getMenuTable()->saveMenu($this->form->getData());
            return $this->redirect()->toRoute('menu');
        }

    }

    $sm = $this->getServiceLocator();
    $tg = $sm->get('MenuTableGateway');
    $mData = new \FoyCam\MenuData($tg);
    $menuData = $mData->GetEditMenuData();
    $this->menuTree = new \FoyCam\MenuTree($menuData);



    return array(
        'id' => $id,
        'form' => $this->form,
        'menuTree' => $this->menuTree,
    );
}

我尝试将以下内容放入,newOptions 是受保护的类成员,在调用 getMenuChildren 方法时存储,但 newOptions 为空,我猜 jQuery 使用表单的新实例。

$this->form->get("position")->setValueOptions($this->newOptions);
$this->form->setData($request->getPost());

我会很感激你的帮助。我怎样才能让表单进行验证?再次,我得到了在大海捞针中找不到输入

4

0 回答 0