2012-01-21 273 views
1

我見過的其他線程和bug報告做,直接關係到什麼,我經歷Zend_Element但沒有任何的屬於關聯屬性..與Zend_Element「屬於關聯」屬性奇怪的行爲

這裏是我的(簡化)Zend_Form的:

$form = new Zend_Form(); 

$form->addElement('text', 'fname', array('belongsTo' => 'user')); 
$form->addElement('text', 'sname', array('belongsTo' => 'user')); 

哪些是好的,呈現的元素,像這樣:

<input type="text" name="user[fname]" /> 
<input type="text" name="user[sname]" /> 

...這正是我想要的。

然而,當提交表單時,元素值僅如果調用

$form->getValue('fname') or $form->getValue('sname') 

NOT,如果調用訪問...

$form->getValue('user'); 

什麼,我期待看到當你調用$ form-> getValues('user')是一個數組的值。 如果調用

$form->getValues(); 

如果這是預期的行爲,然後把它們放入數組的什麼點的值的數組是清晰可見?因爲「user [fname]」和「client [fname]」之間沒有區別 - 實際上添加名爲「fname」的另一個元素即使屬於另一個項目也會覆蓋前一個元素。

我已經嘗試添加一個子窗體,它確實導致我想要的,但是這樣所有的子窗體元素都會被渲染到一起,我真正想要的是將數組元素放置在隨機的地方,就像這...

<input type="text" name="user[fname]" /> 
<input type="text" name="some-other-field" /> 
<input type="text" name="some-other-field2" /> 
<input type="text" name="user[sname]" /> 
<input type="text" name="another-field-too" /> 

回答

2
$form->getValue('fname') or $form->getValue('sname') 

作品這種方式,因爲的getValue()只是尋找元素的名稱,以及您elemnts的名字是FNAMESNAME

Excerpt: Zend/Form.php 
public function getValue($name) 
{ 
    if ($element = $this->getElement($name)) { 
     return $element->getValue(); 
    } 

的方法,從我所看到應該是訪問屬於關聯數據:

$data = $form->getValues(); 
$user=$data['user']; 

這應該做你想做的。基於此:

Excerpt: Zend/Form.php 
public function getValues($suppressArrayNotation = false) 
    { 
     $values = array(); 
     $eBelongTo = null; 

     if ($this->isArray()) { 
      $eBelongTo = $this->getElementsBelongTo(); 
     } 

     foreach ($this->getElements() as $key => $element) { 
      if (!$element->getIgnore()) { 
       $merge = array(); 
       if (($belongsTo = $element->getBelongsTo()) !== $eBelongTo) { 
        if ('' !== (string)$belongsTo) { 
         $key = $belongsTo . '[' . $key . ']'; 
        } 
       } 
       $merge = $this->_attachToArray($element->getValue(), $key); 
       $values = $this->_array_replace_recursive($values, $merge); 
      } 
     } 
//...Code continues 
return $values; 

希望這會有所幫助。

+0

嗨RockyFord - 感謝您的建議,但它仍然沒有任何意義 - 設置belongsTo應該將該元素設置爲您指定的屬於它的子元素(或子表單)。否則,如果它只是將它創建爲一個單獨的元素,那麼設置belongsTo沒有意義。 – pavsid

+0

取決於你的觀點。 getValue($ key)旨在返回單個元素的值,而不管其他設置如何。 getValues()提供了將數據集的所有值作爲數組返回的方法。但ZF很酷的部分是,如果你不同意他們的選擇,改變它們。用你自己的函數擴展Zend/Form並覆蓋getValue()。 – RockyFord