在Zend Form中,如果两个元素具有相同的顺序,那么Zend将完全忽略第二个元素(而不是在第一个元素下显示它)。以下面的代码为例。请注意,City
和Zip Code
元素的顺序为 4
$address = new Zend_Form_Element_Textarea('address');
$address->setLabel('Address')
->setAttrib('cols', 20)
->setAttrib('rows', 2)
->setOrder(3)
;
$city = new Zend_Form_Element_Text('city');
$city->setLabel('City')
->setOrder(4)
;
$postal = new Zend_Form_Element_Text('postal');
$postal->setLabel('Zip Code')
->setOrder(4);
当此表单呈现时,Zip Code
元素无处可寻。
如果我想动态设置像按钮这样的元素,但是告诉它在表单的末尾呈现,我该怎么做呢,而不会遇到两个元素具有相同顺序的问题?
public function addSubmitButton($label = "Submit", $order = null)
{
$form_name = $this->getName();
// Convert Label to a lowercase no spaces handle
$handle = strtolower(str_replace(" ","_",$label));
$submit = new Zend_Form_Element_Submit($handle);
$submit->setLabel($label)
->setAttrib('id', $form_name . "_" . $handle)
;
///////// Set the button order to be at the end of the form /////////
$submit->setOrder(??????);
$this->addElement($submit);
}
答案 0 :(得分:7)
如果你真的需要使用setOrder()方法,我会使用订单号10,20,30,40 ......这样就可以很容易地在已设置的元素之间添加元素。
此外,为了避免使用两次订单号,您可以使用一个数组,您可以存储从1到X的所有数字。每当您设置订单号时,您可以通过名为getOrderNumberFromArray()的方法设置它。返回数组中仍然可用的下一个更高或更低的订单号,并取消设置此数组元素。
或者,甚至可能更好,您可以在新元素之前对要获得的元素执行getOrder(),然后将此订单号递增X,然后循环遍历现有表单元素并检查订单号是否为还没有。
或者您可以在要在新元素之前和之后显示的元素上使用getOrder(),并确保不对新元素使用相同的订单号。
答案 1 :(得分:3)
很抱歉这个问题迟到了。我所做的是扩展Zend_Form并覆盖_sort()方法,如下所示:
/**
* Sort items according to their order
*
* @return void
*/
protected function _sort()
{
if ($this->_orderUpdated) {
$items = array();
$index = 0;
foreach ($this->_order as $key => $order) {
if (null === $order) {
if (null === ($order = $this->{$key}->getOrder())) {
while (array_search($index, $this->_order, true)) {
++$index;
}
$items[$index][]= $key;
++$index;
} else {
$items[$order][]= $key;
}
} else {
$items[$order][]= $key;
}
}
ksort($items);
$index = 0;
foreach($items as $i=>$item){
foreach($item as $subItem){
$newItems[$index++]=$subItem;
}
}
$items = array_flip($newItems);
asort($items);
$this->_order = $items;
$this->_orderUpdated = false;
}
}
这与原始排序方法不同,方法是将项目放在基于索引的数组中,然后进行深度优先遍历以展平数组。
答案 2 :(得分:0)
试试这段代码:
$elements = array();
$elements[] = new Zend_Form_Element_Textarea('address');
......
$elements[] = new Zend_Form_Element_Text('city');
.......
$elements[] = new Zend_Form_Element_Submit($handle);
.....
$this->addElements($elements);
您需要做的就是按照您希望他们展示的顺序添加
答案 3 :(得分:0)
我要做的是 - 使用临时数组 - 保持元素名称的顺序(不要介意键)。然后像这样使用foreach:
foreach(array_values($tempArray) as $order => $name) {
$form->$name->setOrder($order+1);
}
注意array_values - 它将返回值作为编号数组;)不确定setOrder(0)是否有效 - 这就是为什么有+1