Одна функция DataSet - то, что, если можно назвать несколько избранных операторов в хранимых процедурах, DataSet будет иметь один DataTable для каждого.
Я тоже считаю, что декораторы по умолчанию - это большая проблема. Я понимаю , почему они такие, какие есть, но я думаю, что «фактор неудобства» был сильно недооценен.
В любом случае, я бы рекомендовал использовать ViewScripts для ваших форм. Обратите внимание, что это не то же самое, что View - вместо этого ViewScripts явно упоминаются в вашем классе Form, действуют как своего рода «подвиды» и позволяют вам управлять компоновкой каждого элемента. Примеры того, как использовать ViewScripts, было довольно сложно найти в прошлом, но я постараюсь сделать что-то полезное.
Во-первых, переопределите loadDefaultDecorators в вашем классе формы:
public function loadDefaultDecorators() {
$this->setDecorators(
array(
array('ViewScript',
array('viewScript' => 'foo/bar.phtml')
)
)
);
}
Это будет ссылаться на ViewScript с именем bar.phtml , расположенный в / views / scripts / foo . Обратите внимание на различия с учетом регистра в "ViewScript" и "viewScript" выше.
Затем вам нужно настроить декораторы, применяемые к каждому элементу, чтобы он отображался, но без раздражающих оболочек dt / dd. Например:
$baz = new Zend_Form_Element_Text('bazInput');
$baz->setDecorators(array('ViewHelper','Errors'));
Наконец, вам нужно создать свой ViewScript, например:
<form method="post" action="<?php echo $this-element->getAction() ?>">
<table>
<tr>
<td><label for="bazInput">Baz:</label></td>
<td><?php echo $this->element->bazInput ?></td>
</tr>
</table>
<input type="submit" value="Submit Form" />
</form>
Очевидно, это очень простой пример, но он показывает, как ссылаться на элементы формы и действие формы.
Затем в вашем Просматривайте, просто ссылайтесь и выводите форму как обычно. Таким образом, вы можете иметь гораздо более точный контроль над макетами форм - включая легкое добавление Javascript.
Я считаю, что этот подход решает оба ваших требования: вы можете создавать формы в простом HTML и по-прежнему использовать механизм проверки Zend Form.
Затем вам нужно настроить декораторы, применяемые к каждому элементу, чтобы он отображался, но без раздражающих оболочек dt / dd. Например:
$baz = new Zend_Form_Element_Text('bazInput');
$baz->setDecorators(array('ViewHelper','Errors'));
Наконец, вам нужно создать свой ViewScript, например:
<form method="post" action="<?php echo $this-element->getAction() ?>">
<table>
<tr>
<td><label for="bazInput">Baz:</label></td>
<td><?php echo $this->element->bazInput ?></td>
</tr>
</table>
<input type="submit" value="Submit Form" />
</form>
Очевидно, это очень простой пример, но он показывает, как ссылаться на элементы формы и действие формы.
Затем в вашем Просматривайте, просто ссылайтесь и выводите свою форму как обычно. Таким образом, вы можете иметь гораздо более точный контроль над макетами форм - включая легкое добавление Javascript.
Я считаю, что этот подход решает оба ваших требования: вы можете создавать формы в простом HTML и по-прежнему использовать механизм проверки Zend Form.
Затем вам нужно настроить декораторы, применяемые к каждому элементу, чтобы он отображался, но без раздражающих оболочек dt / dd. Например:
$baz = new Zend_Form_Element_Text('bazInput');
$baz->setDecorators(array('ViewHelper','Errors'));
Наконец, вам нужно создать свой ViewScript, например:
<form method="post" action="<?php echo $this-element->getAction() ?>">
<table>
<tr>
<td><label for="bazInput">Baz:</label></td>
<td><?php echo $this->element->bazInput ?></td>
</tr>
</table>
<input type="submit" value="Submit Form" />
</form>
Очевидно, это очень простой пример, но он показывает, как ссылаться на элементы формы и действие формы.
Затем в вашем Просматривайте, просто ссылайтесь и выводите свою форму как обычно. Таким образом, вы можете иметь более точный контроль над макетами форм - включая легкое добавление Javascript.
Я считаю, что этот подход решает оба ваших требования: вы можете создавать формы в простом HTML и при этом пользоваться механизмом проверки Zend Form.
Мне нужно будет создать свой ViewScript, например:<form method="post" action="<?php echo $this-element->getAction() ?>">
<table>
<tr>
<td><label for="bazInput">Baz:</label></td>
<td><?php echo $this->element->bazInput ?></td>
</tr>
</table>
<input type="submit" value="Submit Form" />
</form>
Очевидно, это очень простой пример, но он показывает, как ссылаться на элементы формы и действия формы.
Затем в вашем представлении просто укажите ссылку и выведите свою форму как обычно . Таким образом, вы можете иметь гораздо более точный контроль над макетами форм - включая легкое добавление Javascript.
Я считаю, что этот подход решает оба ваших требования: вы можете создавать формы в простом HTML и по-прежнему использовать механизм проверки Zend Form.
Мне нужно будет создать свой ViewScript, например:<form method="post" action="<?php echo $this-element->getAction() ?>">
<table>
<tr>
<td><label for="bazInput">Baz:</label></td>
<td><?php echo $this->element->bazInput ?></td>
</tr>
</table>
<input type="submit" value="Submit Form" />
</form>
Очевидно, что это очень простой пример, но он показывает, как ссылаться на элементы формы и действия формы.
Затем в вашем представлении просто укажите ссылку и выведите свою форму как обычно . Таким образом, вы можете иметь гораздо более точный контроль над макетами форм - включая легкое добавление Javascript.
Я считаю, что этот подход решает оба ваших требования: вы можете создавать формы в простом HTML и по-прежнему использовать механизм проверки Zend Form.
Я использовал как можно больше компонентов Zend за последние 10 месяцев в большом проекте, и Zend_Form был самой большой проблемой в ***. Формы медленно обрабатываются, и их сложно сделать красивыми. Даже не заставляйте меня начинать с подформ. Я видел интересную статью под названием « scaling zend_form », но, похоже, это не сильно помогло со скоростью рендеринга: (
Я думаю о создании всех моих форм с использованием прямого HTML в представлении, и только используя Zend_Form для проверки и фильтрации (не рендеринга). Либо так, ИЛИ я просто буду использовать Zend_Validate и Zend_Filter, без аспекта формы вообще.
Инструмент - это только инструмент, если он вам помогает. В противном случае это просто помеха.
Вот что я узнал с Zend_Form:
Позвольте ему делать то, что нужно, и в конечном итоге это сэкономит вам тонну строк кода.
Компромисс. вы в конечном итоге пишете больше CSS, чтобы вещи отображались так, как вы хотите. Помните, что почти любой элемент HTML можно стилизовать так, чтобы он выглядел как угодно. По умолчанию Zend_Form предоставляет вам множество CSS-селекторов, которые можно сделать настолько конкретными (или широкими), насколько вам нужно. Я еще не встречал случая, когда я не мог бы работать с декораторами по умолчанию в точности так, как я хотел бы.
Конечно, у меня есть большой уродливый файл CSS, но, по моему опыту, это, вероятно, было бы В любом случае, в конечном итоге это будет большой уродливый файл CSS. Я беру компромисс, не беспокоясь о кодировании / проверке / фильтрации / обработке форм конкретного приложения и т. Д., Но имею дело с некоторыми специфически стилизованными элементами в файле CSS.
Совет, если вы решили пойти по этому пути: убедитесь, что вы используете сценарий сброса стиля CSS
Если вам нужны валидаторы и фильтры без форм: Zend_Filter_Input
22.5.
Zend_Filter_Input
Zend_Filter_Input
предоставляет декларативный интерфейс для связывания несколько фильтров и валидаторов, применить их в коллекции данных и получить входные значения после того, как они обработано фильтрами и валидаторы. Значения возвращаются в экранированный формат по умолчанию для безопасности Вывод HTML.
Хотя - Мое личное предложение - научиться создавать собственные декораторы и помощники просмотра. Zend_Form
очень мощный, и у меня никогда не было проблем с попыткой позиционировать / декорировать вещи. Даже при построении сложной таблицы разрешений и автоматической генерации столбцов и строк с помощью jQuery я обнаружил, что интерфейсы Zend_Form
позволяют сэкономить время. Если у вас есть конкретный вопрос о том, как подойти к украшению чего-либо, я с радостью помогу. Откройте новый вопрос и прокомментируйте его здесь или что-то в этом роде ....
Я использую Zend Framework около года и только Zend_Form
для одного из моих проектов (первого). Я отказался от Zend_Form
после того, как потратил все 15 минут, пытаясь разместить свою ссылку «или Отменить».
Однако мне нравится интеграция.
Сейчас я использую простые HTML-формы и использую Zend_Filter_Input
в модели ( Zend_Db_Table
в большинстве случаев, но мне пришлось добавить уровень обслуживания в моем последнем проект).
Пример фрагмента кода контроллера, использующего ZFI в модели. Обработка ошибок и общие методы проверки находятся в подклассе Zend_Db_Table
, и мои классы расширяют его.
Помощник представления форматирует массив сообщений об ошибках.
if ($this->_request->isPost()) {
$data = $this->_request->getPost();
$event = new Default_Model_DbTable_Event();
$event->createRow($data)->save();
if ($event->hasErrors()) {
$this->view->errors = $event->getErrorMessages();
$this->view->event = $data;
} else {
$this->_redirect('events');
}
}
Вы можете использовать Zend Form и самостоятельно сгенерировать HTML :) Вам просто нужно отслеживать изменения и сохранять элементы формы одинаково в HTML и ZF :)
Вот несколько декораторов, которые я использую в своих проектах с помощью Zend Form. Я считаю, что это достаточно просто для понимания.
$stdRowDec = array('ViewHelper', 'Description', 'Errors', array(array('data'=>'HtmlTag'), array('tag' => 'td', 'width' => '200')), array('Label', array('escape' => false, 'class' => 'zfFormLabel', 'tag' => 'td')), array(array('row'=>'HtmlTag'), array('tag'=>'tr')));
$startRowDec = array('ViewHelper', 'Description', 'Errors', array(array('data'=>'HtmlTag'), array('tag' => 'td')), array('Label', array('escape' => false, 'tag' => 'td', 'class' => 'zfFormLabel')), array(array('row'=>'HtmlTag'), array('tag'=>'tr', 'openOnly'=>true)));
$startRowOpenOnlyDec = array('ViewHelper', 'Description', 'Errors', array(array('data'=>'HtmlTag'), array('tag' => 'td', 'openOnly'=>true)), array('Label', array('escape' => false, 'class' => 'zfFormLabel', 'tag' => 'td')), array(array('row'=>'HtmlTag'), array('tag'=>'tr', 'openOnly'=>true)));
$midRowDec = array('ViewHelper', 'Description', 'Errors', array(array('data'=>'HtmlTag'), array('tag' => 'td')),array('Label', array('escape' => false, 'class' => 'zfFormLabel', 'tag' => 'td')));
$midRowCloseOnlyDec = array('ViewHelper', 'Description', 'Errors', array(array('data'=>'HtmlTag'), array('tag' => 'td', 'closeOnly'=>'true')),array('Label', array('escape' => false, 'class' => 'zfFormLabel', 'tag' => 'td')));
$midRowCloseOnlyNoLabelDec = array('ViewHelper', 'Description', 'Errors', array(array('data'=>'HtmlTag'), array('tag' => 'td', 'closeOnly'=>'true')));
$endRowDec = array('ViewHelper', 'Description', 'Errors', array(array('data'=>'HtmlTag'), array('tag' => 'td')), array('Label', array('escape' => false, 'class' => 'zfFormLabel', 'tag' => 'td')), array(array('row'=>'HtmlTag'), array('tag'=>'tr', 'closeOnly'=>'true')));
$endRowCloseOnlyNoLabelDec = array('ViewHelper', 'Description', 'Errors', array(array('data'=>'HtmlTag'), array('tag' => 'td', 'closeOnly'=>'true')), array(array('row'=>'HtmlTag'), array('tag'=>'tr', 'closeOnly' => 'true')));
$buttonEndRowDec = array('ViewHelper', 'Description', 'Errors', array(array('data'=>'HtmlTag'), array('tag' => 'td', 'colspan'=>'2', 'align'=>'center')), array(array('row'=>'HtmlTag'), array('tag'=>'tr', 'closeOnly'=>'true')));
$buttonDecorators = array('ViewHelper', array(array('data' => 'HtmlTag'), array('tag' => 'td', 'class' => 'element')), array(array('label' => 'HtmlTag'), array('tag' => 'td', 'placement' => 'prepend')), array(array('row' => 'HtmlTag'), array('tag' => 'tr')), );
В базе данных MySQL для PageID и Name можно задать уникальный индекс. Таким образом, при вставке строк возникает ошибка, которая может игнорироваться PHP, и можно просто перейти к следующей строке.
Предполагается, что строки вставляются по отдельности. AKA:
foreach($large_data as $fields)
{
mysql_query("INSERT INTO TABLE (`Something`) VALUES('".$fields['something']."');
}
-121--1269546- Вы пробовали
Math.Round(16.482*200)/200;
-121--4631721- Я повторил то, что lo_fye упоминал. По моему опыту Zend Forms сложны и недостаточно продуманы.
Самым простым и гибким решением является создание двух файлов форм, 1. класс формы, который инициализирует элементы формы, затем сценарий представления для отображения элементов формы. В моем классе формы я выключаю все декораторы, за вычетом фактического элемента формы. например: - > remeyDecorator («» GroupTag «») - > remureDecorator («» DtDdWrapper «») - > remeyDecorator ('Метка') - > remureDecorator («Ошибки»);
Затем в конце конструктора, инициализирующего элементы формы, передайте сценарий представления: $ this- > setDecorators (массив («ViewScript», массив («viewScript» = > «path/to/script _ form.phtml»)));
В формате представления Script I И заметьте, я удаляю украшения об ошибках и просто беру стопку ошибок и показываю ее так, как я думаю.
Минус в том, что вы создаете сценарий просмотра для каждой формы или сами строите какую-то многоразовую систему, так что дополнительная работа. Но в конечном итоге его гораздо легче проектировать формы, чтобы соответствовать вашему макету, imo.