Формы Платформы зенда, декораторы и проверка: я должен вернуться к простому HTML?

Одна функция DataSet - то, что, если можно назвать несколько избранных операторов в хранимых процедурах, DataSet будет иметь один DataTable для каждого.

20
задан Aron Rotteveel 14 August 2009 в 13:40
поделиться

8 ответов

Я тоже считаю, что декораторы по умолчанию - это большая проблема. Я понимаю , почему они такие, какие есть, но я думаю, что «фактор неудобства» был сильно недооценен.

В любом случае, я бы рекомендовал использовать 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.

21
ответ дан 29 November 2019 в 23:30
поделиться

Я использовал как можно больше компонентов Zend за последние 10 месяцев в большом проекте, и Zend_Form был самой большой проблемой в ***. Формы медленно обрабатываются, и их сложно сделать красивыми. Даже не заставляйте меня начинать с подформ. Я видел интересную статью под названием « scaling zend_form », но, похоже, это не сильно помогло со скоростью рендеринга: (

Я думаю о создании всех моих форм с использованием прямого HTML в представлении, и только используя Zend_Form для проверки и фильтрации (не рендеринга). Либо так, ИЛИ я просто буду использовать Zend_Validate и Zend_Filter, без аспекта формы вообще.

Инструмент - это только инструмент, если он вам помогает. В противном случае это просто помеха.

9
ответ дан 29 November 2019 в 23:30
поделиться

Вот что я узнал с Zend_Form:

Позвольте ему делать то, что нужно, и в конечном итоге это сэкономит вам тонну строк кода.

Компромисс. вы в конечном итоге пишете больше CSS, чтобы вещи отображались так, как вы хотите. Помните, что почти любой элемент HTML можно стилизовать так, чтобы он выглядел как угодно. По умолчанию Zend_Form предоставляет вам множество CSS-селекторов, которые можно сделать настолько конкретными (или широкими), насколько вам нужно. Я еще не встречал случая, когда я не мог бы работать с декораторами по умолчанию в точности так, как я хотел бы.

Конечно, у меня есть большой уродливый файл CSS, но, по моему опыту, это, вероятно, было бы В любом случае, в конечном итоге это будет большой уродливый файл CSS. Я беру компромисс, не беспокоясь о кодировании / проверке / фильтрации / обработке форм конкретного приложения и т. Д., Но имею дело с некоторыми специфически стилизованными элементами в файле CSS.

Совет, если вы решили пойти по этому пути: убедитесь, что вы используете сценарий сброса стиля CSS

4
ответ дан 29 November 2019 в 23:30
поделиться

Если вам нужны валидаторы и фильтры без форм: Zend_Filter_Input

22.5. Zend_Filter_Input

Zend_Filter_Input предоставляет декларативный интерфейс для связывания несколько фильтров и валидаторов, применить их в коллекции данных и получить входные значения после того, как они обработано фильтрами и валидаторы. Значения возвращаются в экранированный формат по умолчанию для безопасности Вывод HTML.

Хотя - Мое личное предложение - научиться создавать собственные декораторы и помощники просмотра. Zend_Form очень мощный, и у меня никогда не было проблем с попыткой позиционировать / декорировать вещи. Даже при построении сложной таблицы разрешений и автоматической генерации столбцов и строк с помощью jQuery я обнаружил, что интерфейсы Zend_Form позволяют сэкономить время. Если у вас есть конкретный вопрос о том, как подойти к украшению чего-либо, я с радостью помогу. Откройте новый вопрос и прокомментируйте его здесь или что-то в этом роде ....

2
ответ дан 29 November 2019 в 23:30
поделиться

Я использую 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');
    }
}
2
ответ дан 29 November 2019 в 23:30
поделиться

Вы можете использовать Zend Form и самостоятельно сгенерировать HTML :) Вам просто нужно отслеживать изменения и сохранять элементы формы одинаково в HTML и ZF :)

1
ответ дан 29 November 2019 в 23:30
поделиться

Вот несколько декораторов, которые я использую в своих проектах с помощью 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')), );
4
ответ дан 29 November 2019 в 23:30
поделиться

В базе данных 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.

2
ответ дан 29 November 2019 в 23:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: