我在表单中创建了一个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是我选择的项目的值,它是从控制器加载的。
请帮我解决这个错误!!!
答案 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语句
之前