Элементы формы ZEND в таблице, содержащей также данные из базы данных - PullRequest
1 голос
/ 22 ноября 2011

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

<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>

Конечно, 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, но я хотел бы сгенерировать эту таблицу с помощью формы или просто вставитьтолько элементы формы для этой таблицы, сгенерированные в представлении phtml).

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

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

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

1 Ответ

2 голосов
/ 22 ноября 2011

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

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

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

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

...