ЗЕНД - декораторы и расположение элементов? - PullRequest
2 голосов
/ 10 февраля 2012

У меня проблема с Zend-декораторами, и я не могу понять, как поместить элемент в форму там, где я хочу его иметь.

Я получил форму, где декораторы помещают мои данные встол, но я хочу, чтобы мой представить из таблицы.На данный момент у меня есть что-то вроде этого:

for ($i = 0; $i < $numRows; $i++) {
    $select = new Zend_Form_Element_Select('article' . $i);
    $select->setAttrib('style', 'margin-top:10px;width:200px;');
    $select->addMultiOption('1', $this->translate->_('Zatwierdzony do druku'));
    $select->addMultiOption('0', $this->translate->_('Niezatwierdzony do druku'));
    $select->setValue($rows[$i]['reviewed']);
    $select->setDecorators(
      array(
        'ViewHelper',
        array(
          array('data' => 'HtmlTag'), 
          array('tag' => 'td', 'class' => 'padding5 tdcenter')
        ), 
            array(
                'AnyMarkup',
                array(
                    'markup' => $this->_getMarkupForRow($i, $rows),
                    'placement' => 'PREPEND',
                )
            ),
        array(
          array('row' => 'HtmlTag'),
          array('tag' => 'tr', 'openOnly'=>true)
        ),
      ),
      array('submit'),
      false
  );
  $this->addElement($select);
}

$submit = new Zend_Form_Element_Submit('updatetoprint');
$submit->setAttrib('id', 'updatetoprint');
$submit->setLabel('Zapisz');
$submit->setDecorators(
   array(
    'ViewHelper',
    array(
      array('data' => 'HtmlTag')
    ), 
    array(
      array('row' => 'HtmlTag'),
      array('tag' => 'div', 'closeOnly'=>true,'style' => 'float:left;')
    )
   //here i dont know how to get my submit on the bottom under the table...?
   ), 
   array('submit')
);
$this->addElement($submit);

На сайте, который выглядит следующим образом: my form

И я хотел бы, чтобы моя подача была внизу под таблицей ..Пожалуйста, помогите мне:)

Ответы [ 3 ]

3 голосов
/ 10 февраля 2012

Я не вижу, где вы присваиваете свою форму представлению, является ли ваша форма Zend_Form или нет, поэтому я собираюсь сделать некоторые предположения.
Я собираюсь предположить, что вы используете Zend_Form для создания своей формы, и я собираюсь предположить, что вы назначаете свою форму традиционному виду внутри действия контроллера
$this->view->form = $form;
Таким образом, с учетом вышесказанного, в вашем скрипте просмотра у вас есть доступ к каждому отдельному элементу просто через
<?php echo $this->form->elemenetName ?>
где elementName - это имя, которое вы дали своему элементу, в вашем случае кнопка отправки имеет имя «updatetoprint» .
Имея это в виду, если вам нужно создать таблицу или любой другой макет, вы можете просто создать универсальные элементы в вашей форме и просто добавить их по мере необходимости в любой скрипт вида. Может помешать вам выполнять всю эту гимнастику с декораторами.

Например, view.phtml может выглядеть так:

 <form action="<?php echo $this->form->getAction() ?>" method="<?php echo $this->form->getMethod() ?>">
    <table>
      <tr>
        <th>Dodal</th>
        <th>Tutyl</th>
        <th>Status</th>
      </tr>
    <!--you should probably put the next 5 lines into a partial and use partialLoop($data)-->
      <tr>
        <td><?php echo $this->form->dodal ?></td>
        <td><?php echo $this->form->tutyl ?></td>
        <td><?php echo $this->form->status ?></td>
      </tr>
    </table>
    <?php echo $this->form->updatetoprint ?>
    </form>

Тогда просто стиль с CSS.

Чтобы настроить форму для использования виджета, просто используйте:

$form->setDecorators(array(
    'PrepareElements',
    array('ViewScript', array('viewScript' => 'form.phtml')),
));

где form.phtml - ваше имя скрипта просмотра

[Изменить] После дальнейшего рассмотрения я понял, что использование элементов формы в таком виде имеет один серьезный недостаток. Форма никогда не инициализируется ... теги form никогда не отправляются. Это изменение предназначено для устранения этой проблемы.
Извините, что так долго

1 голос
/ 10 февраля 2012

Я вижу много тегов <tr> и <td>, но тега <table> нет. Я думаю, что вы ищете разметку примерно так:

<table>
    <tr><td>info</td><td>more info</td><td>select element</td></tr>
    <tr><td>info</td><td>more info</td><td>select element</td></tr>
    <tr><td>info</td><td>more info</td><td>select element</td></tr>
</table>
<div>
    <input type="submit">
</div>

В вашем коде отсутствуют какие-либо декораторы, производящие теги <table> и </table>. Итак, на первой итерации цикла используйте декоратор AnyMarkup для добавления <table> и строки заголовка. На последней итерации добавьте декоратор, который добавляет тег </table>.

Тогда ваша кнопка отправки (которая добавляется последней) должна находиться прямо под ней.

1 голос
/ 10 февраля 2012

Я бы предложил добавить все ваши элементы, кроме кнопки «Отправить», в группу отображения. Затем вы предоставляете группе отображения декоратор HtmlTag (с установленным тегом table), который обернет все ваши элементы таблицей, сделает ваш HTML верным и даст вам нужный макет.

...