如何设置Zend Form Elements的顺序并避免重复

Sha*_*ell 4 zend-framework zend-form

在Zend Form中,如果两个元素具有相同的顺序,则Zend将完全忽略第二个元素(而不是在第一个元素下显示它).以下面的代码为例.注意,CityZip 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);
Run Code Online (Sandbox Code Playgroud)

当这个表单呈现时,该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);

}
Run Code Online (Sandbox Code Playgroud)

mar*_*kus 7

如果你真的需要使用setOrder()方法,我将使用订单号10,20,30,40 ......这样就可以很容易地在已经设置的元素之间添加元素.

此外,为了避免使用两次订单号,您可以使用一个数组,您可以在其中存储从1到X的所有数字.每当您设置订单号时,您可以通过名为getOrderNumberFromArray()的方法设置它,该方法返回下一个数组中仍有更高或更低的订单号,并取消设置此数组元素.

或者,也许甚至更好,你可以你希望新元素之前有元素上做getOrder(),然后通过X通过现有的表单元素递增的顺序号,然后循环,并检查订单号不存在然而.

或者您可以在要在新元素之前和之后显示的元素上使用getOrder(),并确保不对新元素使用相同的订单号.