Zend_Forms и декораторы в ZF - Отображение метки, ввода и ошибок в одном контейнере - PullRequest
1 голос
/ 22 октября 2011

в значительной степени рвет на себе то, как плохо оформлены декораторы в Zend Framework.Я потратил много времени сегодня и несколько других дней, пытаясь выяснить, как сделать что-то, что должно быть простой задачей внешнего интерфейса.

Zend_Forms и декораторы, на мой взгляд, являются худшей частью ZF как внутреннего интерфейса ивнешний интерфейс не разделен должным образом.Почему класс формы определяет, как должен быть напечатан HTML-код?

Все, что я ищу, это что-то simple вроде:

<div class="labeledField">
    <label for="username">Username</label>
    <input type="text" id="username" name="username" />
</div>
<div class="labeledField">
    <label for="password">Password</label>
    <input type="password" id="password" name="password" />
</div>

Причина, по которой я так хочу этопотому что я хочу, чтобы метка располагалась над полем, например:

[Username       ]
[Password       ]

Таким образом, я могу сделать метку слегка блеклой, когда выбран вход, но по-прежнему оставаться, когда выбран вход.При использовании JS метка скрыта, когда в поле ввода есть что-либо.Эта функциональность существует в корзине покупок Apple.

Мне нравятся проверочные части Zend_form, и мне было бы интересно, как это можно разместить в веб-интерфейсе, если внутренний код не определяет, как выглядит HTML.

По моему мнению, он должен либо взять шаблон (из интерфейса с доступом к папке / views /), либо я смогу сделать что-то вроде:

<div class="labeledField">
    <?php
    echo $this->form->username->getLabel();
    echo $this->form->username->getElement();
    $errors = $this->form->username->getErrors();
    if (sizeof($errors) > 0) {
        ?>
        <div class="errors">
        <?php
        foreach($errors as $error) {
            ?>
            <li><?php echo $error ?></li>
            <?php
        } 
        ?>
        </div>
        <?php
    }
    ?>
</div>

Но тогда шаблоны позволят мнепросто введите echo $ this-> form и используйте формат, указанный выше, для полей, которые я хочу.

1 Ответ

2 голосов
/ 24 октября 2011

Нет сомнений, декораторы могут привыкнуть. Позвольте мне обратиться / ответить на некоторые ваши вопросы / вопросы:

в значительной степени рвал на себе волосы из-за того, как плохо оформлены декораторы в Zend Framework. Я потратил много времени сегодня и несколько других дней, пытаясь понять, как сделать что-то, что должно быть простой задачей веб-интерфейса.

Да, это чудо, у меня вообще остались волосы.

Zend_Forms и декораторы, на мой взгляд, являются худшей частью ZF, так как бэкэнд и фронтенд не разделены должным образом. Почему класс формы определяет, как должен быть напечатан HTML-код?

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

Для примеров автономного класса, который устанавливает декораторы в отдельной форме, посмотрите EasyBib_Form_Decorator и Использование Zend_Form без Zend Framework MVC

По моему мнению, он должен либо взять шаблон (из внешнего интерфейса с доступом к папке / views /, либо я должен иметь возможность сделать что-то вроде:

Вы в значительной степени обладаете этой функциональностью, используя ViewScript decorator .

$form->setDecorators(array(
    array('ViewScript', array(                      // note case
        'viewScript' => '_partials/forms/my.phtml', // note case
)));

Тем не менее, желаемая разметка относительно проста с использованием стандартных декораторов:

// not tested, but should be pretty close
$element->setDecorators(array(
   'ViewHelper',
   'Label',
   'Errors',
   array('HtmlTag', array('tag' => 'div', 'attribs' => array('class' => 'labeledField'))),
));

Конечно, на эту разметку на стороне клиента можно наложить любую специальную стилизацию или манипулирование на стороне клиента формой - например, эффект корзины Apple, на который вы ссылаетесь -

...