Элементы формы ZEND в таблице, содержащей также данные из базы данных

Привет!:) У меня проблема с декораторами и формой, которые были бы в таблице, и в этой таблице я хочу иметь также данные из базы данных... Я не имею ни малейшего представления, как это сделать, чтобы иметь структуру, подобную приведенной ниже, скажем

<table>
<tr>
  <td><?php echo array[0]['name']?>
//and here input from zend form
  <td>
  <select name='foo' id='bar'>
    <option value='something'>Foo</option>
    <option value='something2'>Foo2</option>
  </select>
  </td>
</tr>
</table>

Ofcourse tr будет больше и генерируется с помощью foreach или некоторого цикла.

У меня есть что-то вроде этого:

<?php

class EditArticles_Form_EditArticles extends Zend_Form
{
protected $uid;

public function render()
{


    /* Form Elements & Other Definitions Here ... */
    $this->setName('editarticles');

    $data = new EditArticles_Model_DbTable_EditArticlesModel();
    $datadata = $data->GetArticlesToEdit($this->getUid());    //here is my data from db


    for ($i=0;$i<count($datadata);$i++)
    {           
        $do = new Zend_Form_Element_Select(''.$i);
        $do->addMultiOption('0', 'Aktywny');
                $do->addMultiOption('1', 'Nieaktywny');

        $this->addElements(array($do));
    }



    $submit = new Zend_Form_Element_Submit('updateart');
    $this->addElement($submit);


    //and here are decorators for array, and i would like to have in this table also data from array containing data from database
    $this->addDecorators(array(

                        'FormElements',
                        array('HtmlTag', array('tag' => 'table', 'id' => 'aaaa', 'style' => 'width:500px;')), 'Form', 

                        ));                 

    $this->setElementDecorators(array(

                        'ViewHelper',
                        array(  array('data' => 'HtmlTag'), array('tag' => 'td', 'style' => 'width:200px;')), 
                                array('Label', array('tag' => 'td')),

                        array(array('row' => 'HtmlTag'), array('tag' => 'tr'))

                        ), 
                        //wykluczenie submita z overrida stulu
                        array('submit'), false);


    return  parent::render();

}


//setting user id for get content from db
public function setUid($uid) {
    $this->uid = $uid;
    return $this;
}

public function getUid() {
    return $this->uid;
}

}
?>

вывод приведенного выше кода выглядит примерно так: (отмечен красным, где я хотел бы, чтобы это выбиралось из формы. На этом изображении таблица с данными - это другая таблица, сгенерированная в phtml, но я хотел бы сгенерировать эту таблицу по форме od просто вставьте только элементы формы в таблицу, созданную в представлении phtml).

http://img14.imageshack.us/img14/9973/clipboard01pw.png

Что-то найдено здесь: Zend_Form: записи базы данных в таблице HTML с флажками

но я не знаю с чего начать...

1 ответ

Решение

Несколько комментариев:

  1. Как правило, добавление элементов в форму выполняется в init(), скорее, чем render(),

  2. Если объект потребителя (в данном случае форма) нуждается в зависимости (в данном случае в модели статьи) для своей работы, часто бывает полезно явно предоставить зависимость потребителю либо в конструкторе потребителя, либо через метод установки (например: $form->setArticleModel($model)). Это облегчает моделирование модели при тестировании формы и четко иллюстрирует зависимость формы от модели.

  3. Re: рендеринг другого контента в форме через декораторы: Может быть, посмотрите на декоратор AnyMarkup. Похоже (извините, я не могу полностью понять польский), вы хотите, чтобы в каждой строке вы выводили поле выбора. Таким образом, вы получаете свои строки, используя модель, перебирая строки, создавая поле выбора в каждой строке. Когда вы назначаете декораторы элементу выбора - ViewHelper, Errors, вероятно, HtmlTag декоратор, чтобы обернуть его в <td> - Вы также добавляете AnyMarkup декоратор, чтобы подготовить кучу <td>содержит ваши данные строки, наконец, оборачивая всю строку в <tr>,

Возможно, что-то вроде этого (не полностью проверено, просто чтобы дать идею):

class EditArticles_Form_EditArticles extends Zend_Form
{
    protected $model;

    public function __construct($model)
    {
        $this->model = $model;
        parent::__construct();
    }

    public function init()
    {
        $rows = $this->model->GetArticlesToEdit($this->getUid());
        $numRows = count($rows);
        for ($i = 0; $i < $numRows; $i++) {
            $do = new Zend_Form_Element_Select('myselect' . $i);
            $do->addMultiOption('0', 'Aktywny');
            $do->addMultiOption('1', 'Nieaktywny');
            $do->setDecorators(array(
                'ViewHelper',
                array(array('cell' => 'HtmlTag'), array(
                        'tag' => 'td'
                )),
                array('AnyMarkup', array(
                        'markup' => $this->_getMarkupForRow($i, $row),
                        'placement' => 'PREPEND',
                )),
                array(array('row' => 'HtmlTag'), array(
                        'tag' => 'tr'
                )),
            ));
            $this->addElement($do);
        }
    }

    protected function _getMarkupForRow($i, $row)
    {
        return '<td>' . $i . '</td>' .
            '<td>' . $row['nazwa'] . '</td>' .
            '<td>' . $row['typ'] . '</td>' .
            '<td>' . $row['rozmiar'] . '</td>';
    }
}

Последнее замечание: не забудьте зарегистрировать путь префикса декоратора элемента следующим образом (в форме, вероятно, в init()):

$this->addElementPrefixPath('My_Decorator', 'My/Decorator', self::DECORATOR);

Это позволяет элементу разрешать короткое имя AnyMarkup в полное имя класса My_Decorator_AnyMarkup,

Другие вопросы по тегам