Zend_Form: таблица данных с флажками - PullRequest
5 голосов
/ 11 августа 2011

Я хотел бы иметь таблицу данных, поступающих из БД, в моем элементе формы, похожую на следующую:

+-----+-------------------------+-----------------------+
|     | Number                  | Name                  |
+-----+-------------------------+-----------------------+
| [ ] | 123                     | ABC                   |
+-----+-------------------------+-----------------------+
| [x] | 456                     | DEF                   |
+-----+-------------------------+-----------------------+
| [x] | 789                     | HIJ                   |
+-----+-------------------------+-----------------------+

Это позволит выбрать несколько строк, например, элемент MultiCheckBox.

Вот вид разметки, который я хотел бы получить:

<table>
<thead>
  <tr>
    <th>Select</th>

    <th>Number</th>

    <th>Name</th>
  </tr>
</thead>

<tr>
  <td><input type="checkbox" name="subscribers[]" value="1234"></td>

  <td>1234</td>

  <td>ABC</td>
</tr>

<tr>
  <td><input type="checkbox" name="subscribers[]" value="375950"></td>

  <td>375950</td>

  <td>DEF</td>
</tr>

<!-- and so on... -->

Я могу сделать это вручную, но использование Zend_Form позволило бы мне заполнить форму, легко получить значения и пройти проверку. У меня есть другие нормальные элементы в моей форме.

Есть идеи, как этого добиться с помощью Zend_Form? Может быть, нестандартный элемент и декоратор?

Спасибо. При необходимости попросите дополнительную информацию.

Этот вопрос, похоже, связан: Zend_Form: записи базы данных в таблице HTML с флажками

Марк

1 Ответ

5 голосов
/ 11 августа 2011

хорошо, так что ответ будет более длинным

Форма </p> <pre><code><?php class Form_MyTest extends Zend_Form { public function init() { $element = $this->createElement('multiCheckbox', 'subscribers'); $element->setOptions(array('value1' => 'label1', 'value2' => 'label2')); $this->addElement($element); // ... other elements } }

Контроллер </p> <pre><code><?php class MyController extends Zend_Controller_Action { public function myTestAction() { $form = new Form_MyTest(); // ... processing logics $this->view->assign('form', $form); } }

Посмотреть </p> <pre><code><form action="<?php echo $this->form->getAction(); ?>" method="<?php echo $this->form->getMethod(); ?>"> <table> <thead> <tr> <th>Select</th> <th>Number</th> <th>Name</th> </tr> </thead> <?php $values = $this->form->getElement('subscribers')->getValue(); ?> <?php foreach($this->form->getElement('subscribers')->getMultiOptions() as $key => $value) : ?> <tr> <td><input type="checkbox" name="subscribers[]" id="subscribers-<?php echo $key; ?>" value="<?php echo $key; ?>" <?php echo in_array($key, $values) ? 'checked="checked"':''; ?>/></td> <td><label for="subscribers-<?php echo $key; ?>"><?php echo $key; ?></label></td> <td><label for="subscribers-<?php echo $key; ?>"><?php echo $value; ?></label></td> </tr> <?php endforeach; ?> </table> <!-- rest of form --> </form>

Здесь происходит пара вещей.
Я получаю предварительно заполненные значения из объекта формы:
</p> <pre><code><?php $values = $this->form->getElement('subscribers')->getValue(); ?>

Я отмечаю каждый флажок как проверенный или не основанный на массиве выше </p> <pre><code><?php echo in_array($key, $values) ? 'checked="checked"':''; ?>

РЕДАКТИРОВАТЬ В ОТВЕТ НА КОММЕНТАРИЙ B / C КОММЕНТАРИИ НЕ ПОДДЕРЖИВАЮТ БЛОКИ

$element->setOptions(

или

$element->setMultiOptions(

принимает только пары ключ => значение, поэтому все, что вы хотите сделать вне пар ключ / значение, будет немного странным. Если ваша программа позволяет передавать в переменную другую переменную, массив, который использует те же ключи, что и multiCheckbox,

$this->view->assign('more_datums', array('value1' => array('col_1' => 'col_1_val'[, ...])));

и затем в foreach в представлении используйте

$this->more_datums[$key]['col_1']
...