Странное поведение со свойством Zend_Element - PullRequest
1 голос
/ 22 января 2012

Я видел другие потоки и отчеты об ошибках, связанные со свойством assignTo элемента 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')

НЕ, если вы позвоните ...

$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" />

1 Ответ

2 голосов
/ 22 января 2012
$form->getValue('fname') or $form->getValue('sname')

работает так, потому что getValue () просто ищет имя элемента, а имена ваших elemnts: fname и sname .

 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;

Надеюсь, это поможет.

...