通过控制器向Zend_Form_Element_Select添加选项时出现问题

时间:2011-08-09 10:19:14

标签: zend-framework zend-form

我在表单中创建了一个Select ELement。

    $parentId = $this -> createElement('select', 'parent_id');
    $parentId -> setLabel("Select a parent menu:")
                -> setRequired(true);
    $parentId->addMultiOption(0, 'None');
    $this->addElement($parentId);

必须根据查询字符串或URL传递的值加载其选项。所以,在我的控制器中,我从url中获取了我需要的值,并使用以下代码将额外的项加载到元素中

private function renderParentElement($menu_id, $parent = 0) {
    $mapper = $this -> mapper();
    $select = $mapper -> select();
    $select -> where("parent = ?", $parent)
            -> where("menu_id = ?", $menu_id);
    $menus = $mapper -> fetchAll($select);
    if($menus -> count() > 0) {
        foreach($menus as $menu) {
            $this -> form() -> getElement('parent_id') -> addMultiOption($menu -> id, $menu -> label);
        }
    }
}

调用上述方法的Action方法就是这个

public function addAction()
{
    $menu = $this->_request->getParam('menu');

        $mapperMenu = new Application_Model_Mapper_Menu();
        $this -> view -> menu = $mapperMenu -> find($menu);

        if($this -> _request -> isPost() && $this -> form() -> isValid($_POST)) {
            $data = $this -> form() -> getValues();
            $menuItem = $this -> model();
            $menuItem -> setParent($data['parent']);
            $menuItem -> setMenu_id($data['menu_id']);
            $menuItem -> setLabel($data['label']);
            $menuItem -> setLink($data['link']);
            $menuItem -> setPage_id($data['page_id']);
            $this -> mapper() -> save($menuItem);

            $this -> _request -> setParam('menu', $data['menu_id']);
            $this -> _forward('index');
        }
        $this -> form() -> populate(array('menu_id' => $menu));
        $this -> renderParentElement($menu, 0);
        $this->view->form = $this -> form();
}

现在一切正常。元素已正确加载并正确显示。 但是当我提交它时,选择框会给出错误1 is not found is the haystack,这里1是我选择的项目的值,它是从控制器加载的。

请帮我解决这个错误!!!

2 个答案:

答案 0 :(得分:0)

提交表单时,Zend会尝试匹配传递给选择框中值的值。此错误告诉您的是,在选择中未找到值为“1”的选项。在调用isValid之前,您需要做的是使用您的选项重新填充选择框。

答案 1 :(得分:0)

从我看到你在调用isValid

之前你的元素中没有值
$this->renderParentElement($menu, 0);
// you have to set the options in the form before you validate it
if($this->_request->isPost() && $this->form()->isValid($_POST)) { ... }

请注意,您不必再调用两次渲染方法,只需将其移至if语句

之前