Подтвердить что ты не робот

Форма Zend: как мне заставить ее сгибаться по моей воле?

Я читал руководство много раз, я просматривал сообщения, предлагаемые Google по этому вопросу, я даже купил пару книг, которые касаются ZF. Теперь, почему я все еще запутался?

Я могу, используя Zend_Form, создать форму, которая проверяет и функционирует нормально. То, что я не могу сделать, делает форму, которая выглядит так, как будто я хочу, чтобы она выглядела с сообщениями об ошибках, которые я хочу иметь. Мне нужны пользовательские кнопки, мне нужны фанковые макеты, я хочу вставить текст в середине формы и т.д.

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

Любые советы? Любые простые "способы" для пользовательских кнопок, фанковых макетов и базовых (или, скорее, продвинутых, поскольку есть тонны базовых обучающих программ, которые пропускают более сложные проблемы) "что-то сделано" с формой zend?

4b9b3361

Ответ 1

Совет Баррета Конрада - это то, что я бы предложил. Кроме того, имейте в виду, что вам не нужно использовать объект формы для визуализации вашей формы.

Одна вещь, которую вы можете сделать, это создать форму в вашем представлении script, которая имеет элементы с тем же именем, что и класс формы.

Ваша форма HTML:

<form action="/login/" method="post">
<fieldset>
    <label for="username">Username:</label>
    <input type="text" size="10" name="username" />
    <label for="password">Password:</label>
    <input type="password" size="10" name="password" />
    <input type="submit" />
</fieldset>
</form>

Ваш класс:

class LoginForm extends Zend_Form
{
    public function init()
    {
        $username = $this->createElement('text','username');
        $username->setRequired(true);
        $this->addElement($username);

        $password = $this->createElement('password','password');
        $password->setRequired(true);
        $this->addElement($password);        
    }
}

Ваш класс формы отражает вашу HTML-форму, каждый элемент вашего класса имеет свои собственные валидаторы и требования. В своем действии вы можете создать экземпляр своего класса формы и проверить свои сообщения/получить vars против этой формы:

$form = new LoginForm();
if ($this->_request->isPost()) {
    if ($form->isValid($this->_request->getParams())) {
        // do whatever you need to do
    } else {
        $this->view->errors = $form->getMessages();
    }
}

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

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

Ответ 2

Отметьте каждый элемент индивидуально в своем представлении - например

<!-- view script here -->
<form method="POST">
Name: <?php echo $this->myForm->getElement('name')->render(); ?>
some other text between the fields
Birthdate: <?php echo $this->myForm->getElement('birthdate')->render(); ?>
<input type="submit" />
</form>

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

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

Ответ 4

В настоящее время у нас есть новый и блестящий Zend\Form, который еще сложнее старого, но также гораздо более управляемый, инкапсулированный и мощный. Итак, то, что я сказал ниже, не применяется. Новый компонент IMHO - огромное улучшение, потому что он...

  • ... дает вам полный контроль над тем, как вы хотите отображать свою форму, вам нужно написать немного больше кода просмотра, но это того стоит
  • ... отделяет данные, логику и представление до максимально возможной степени.
  • ... использует элементы формы HTML5
  • ... дает вам много вариантов, как вы хотите объединить свои формы, например. гидратации, аннотации и т.д.

Старый ответ о Zend_Form

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

Я сказал, что могу только дать несколько советов из своего опыта:

  • фильтры просты в использовании без использования формы
  • большинство, если не все вещи, которые вы хотите достичь, выполняются с помощью декораторов.
  • Я начал с небольших форм и добавил материал по частям, но я не получаю некоторые вещи, которые я делаю в некоторых своих формах, потому что результат основан на пробной версии и ошибке (главным образом, с декораторами)
  • У меня есть информация из почтового списка zend, который я не мог найти нигде в Интернете.

Из связанных вопросов с этим в правой части очевидно, что отсутствует полная документация для Zend_Form, особенно учитывая ее неинтуитивный характер. Мне бы очень хотелось, чтобы парни ZF делали что-то в этом отношении, насколько мне нравится Zend Framework.

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


или, альтернативно, вы можете использовать трюки умения джедая, конечно!

Ответ 5

Чтобы добавить к сказанному:

Не бойтесь декораторов, вы будете использовать их много, если решите придерживаться Zend_Form. Это довольно просто, как только вы его получите ", к сожалению, документы слабы, и играть с ним - это почти единственный способ добраться туда.

Декораторы ViewScript и ViewHelper дают вам много энергии.

Не бойтесь прорыть источник для разных декораторов, которые существуют, и посмотреть, как они делают вещи (я получил достаточное количество проницательности, сравнивая оригинальные декораторы с dojo).

Я думаю, что Шон предлагал, что вам не нужно вызывать form- > render, вы можете использовать что-то вроде этого в вашем viewcript.

 <someHtmlThingy name="blah" value="<?php echo $this->formInstance->getElement('whatever')->getValue(); ?>" />

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

Ответ 6

Если вы просто хотите добавить произвольную разметку до или после элементов формы без использования декоратора ViewScript, вы можете использовать мой декоратор AnyMarkup: http://www.zfsnippets.com/snippets/view/id/62

Например, здесь вы можете добавить поле ввода с изображением внутри тега обертки (для этого нужно указать пути для автоматической загрузки):

$form->addElement('text', 'my_field', array(
  'label' => 'Enter Info:',
  'decorators' => array(
    'ViewHelper',
    array('AnyMarkup', array(
      'markup' => '<span class="imgwrapper"&gt'.
        '<img src="info.png" alt="info icon"/></span>'),
      'placement' => 'prepend'
    ),
    'HtmlTag',
    'Label'
  )
);

Ответ 7

Пропускание на декораторах формы (IE - печать отдельных элементов формы, а не просто использование стандартного помощника View Form для обработки всего) - это один из способов получить кучу контроля.

Другим вариантом является просто ручное оформление формы и использование ZF только для проверки и фильтрации.

Ответ 8

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

Большинство более сложных задач действительно сводятся к расширению хелпера по умолчанию для определенного типа поля. Например, у меня был проект, в котором я хотел применить класс "ошибка" ко всем полям, которые не прошли проверку после отправки формы вместо того, чтобы писать текст ошибки проверки:

<label for="field">Label:</label>
<input type="text" name="field" id="field" class="error">

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

  • Мне нужно было создать помощник представления клиента для каждого типа поля, к которому я хотел применить класс "error". В нем я переопределил метод formXXX() и добавил проверку, чтобы увидеть, произошел ли элемент с ошибкой. Кроме того, я добавил метод setElement(), который декоратор мог вызвать для установки экземпляра элемента, чтобы мой помощник мог проверить наличие ошибок.
  • Затем мне пришлось переопределить значение по умолчанию Zend_Form_Decorator_ViewHelper. В нем я обратился к представлению и создавал экземпляр хелпера для типа элемента формы и проверял существование метода setElement(), который я создал в моем помощнике вида, установив его, если он существует. Сделав это, я мог бы расширить некоторые типы элементов элементов, а не другие, не разбивая весь script.
  • В моей функции init() для каждой формы мне пришлось добавить новый путь префикса элемента (addElementPrefixPath('My_Form_Decorator'), 'path/to/decorator')), который указывал на мой новый декоратор формы.
  • Наконец, мне пришлось добавить вспомогательный путь к моему приложению, чтобы Zend Framework мог найти помощники, которые я создал в первом пункте: addHelperPath('/path/to/helpers', 'My_View_Helper');

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

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

Ответ 9

whycantitbemorethan25c упомянул их выше, но ViewScripts дает вам чрезвычайно тонкий контроль для рендеринга форм. Zend_Form должен быть быстрым, и поэтому он принимает множество значений по умолчанию, таких как стандартные декораторы, и упорядочивает элемент так, как он был добавлен в объект формы. С помощью ViewScript вы можете пропустить большую часть этого и поместить все свои элементы, но вы хотите в нормальном HTML.

Не пропустите концепцию Decorators, хотя. Они стилируют отдельные элементы, даже если они используются позже в представлении ViewScript. Например, вы можете использовать их для сообщений об ошибках, как предлагали другие.

Если у вас очень сложная форма с несколькими точками данных с аналогичными действиями (подумайте о списке пользователей с активными/неактивными кнопками и кнопке удаления для каждого), вы должны рассмотреть Zend_Form_SubForm. Субформы могут использовать ViewScripts так же, как и обычные формы, и если вы каскадируете форму с помощью ViewScript с подчиненными формами со своими собственными ViewScripts, вы получите великолепно содержащую логику и презентацию, которая намного мощнее, чем просто форма.

Ответ 10

Я написал некоторые подклассы Zend_Form и декораторы, чтобы сделать его компоновкой формы в таблице > . У него даже были некоторые специальные трюки, чтобы делать такие вещи, как сделать несколько кнопок отправки в одной строке.

Взял полный день взлома, чтобы заставить его работать. Он был написан против Zend 1.5.1, поэтому не знаю, будет ли он работать с текущей версией, но если вы заинтересованы, я мог бы, возможно, загрузить источник где-нибудь.

Это, кажется, очень распространенная жалоба с Zend Forms.

(Я знаю, что пуристы poo-poo пугаются с использованием таблиц в форматах макета, и, хотя я согласен с тем, что CSS лучше для большинства вещей, мне еще нужно увидеть хороший макет формы, используя CSS, который не делает "Я выгляжу как прикладом-уродливым клочем. С таблицами формы" просто работают "в любом браузере, в котором они мне нужны.)

EDIT: Хорошо, говоря о прикладах-уродливых кломах, я поместил свой код для создания табличных форм zend в github. Go здесь, чтобы увидеть его. (Потому что gaoshan88 попросил об этом.)

Ответ 11

ОТВЕЧАЙ ЗДЕСЬ. НАДЕЖДА, это поможет вам. Я просмотрел огромное количество информации, пока не нашел ее.

<table>
    <tr>
        <td>Page name: *</td>
        <td><?php echo $this->pageForm->header_title;?></td>
    </tr>

    <tr>
        <td>H1 tag: *</td>
        <td><?php echo $this->pageForm->h1_tag;?></td>
    </tr>

    <tr>
        <td>Page URL: *</td>
        <td><?php echo $this->pageForm->url;?></td>
    </tr>

    <tr>
        <td>Meta Description: </td>
        <td><?php echo $this->pageForm->meta_description;?></td>
    </tr>

    <tr>
        <td>Meta Keywords: </td>
        <td><?php echo $this->pageForm->meta_keywords;?></td>
    </tr>

    <tr>
        <td>Short Description: *</td>
        <td><?php echo $this->pageForm->short_description;?></td>
    </tr>

    <tr>
        <td colspan="2"><a href="<?php echo $this->websiteUrl;?>backend_template/list?placeValuesBeforeTB_=savedValues&TB_iframe=true&height=200&width=300&modal=true"
                           title="add a caption to title attribute / or leave blank" class="thickbox">Open iFrame Modal</a></td>
         <td>
            <a href="<?php echo $this->websiteUrl;?>backend_template/list?placeValuesBeforeTB_=savedValues&TB_iframe=true&height=200&width=300&modal=true" onclick="javascript:getDataFromAddPage()" title="Select Template For Page" class="thickbox" > TEST FORM  </a>
         </td>
    </tr>

    <tr>
        <td>Featured: </td>
        <td><?php echo $this->pageForm->featured;?></td>
    </tr>

    <tr>
        <td>Mark as 404: </td>
        <td><?php echo $this->pageForm->is_404page;?></td>
    </tr>

    <tr>
        <td>Show in Navigation Menu: </td>
        <td><?php echo $this->pageForm->in_navmain;?></td>
    </tr>

    <tr>
        <td>Show in Static Menu:</td>
        <td><?php echo $this->pageForm->in_navstatic;?></td>
    </tr>

    <tr>
        <td><?php echo $this->pageForm->submit;?></td>
        <td><?php echo $this->pageForm->button_close;?></td>
    </tr>

</table>

Ответ 12

Вероятно, вы решили это сделать, но я занимался какой-то работой и нуждался в аналогичном решении.

form->getSubform('subform'); 
foreach ($subform as $key => $value) {
//some markup and custom code here
    print $value;
//some markup and custom code here

}
?>

внутри цикла foreach вы можете добавить разметку таблицы. Если вы правильно назвали свои ключи для строк таблицы, они должны совпадать с ключами формы. Вы даже можете использовать цикл, который захватывает соответствующую подформацию по ключу или даже элемент ключом. вы можете пропустить цикл foreach, если знаете ключи, и просто скажите print $subform ['somekey']; если вы задаете основную форму, указав $form- > setIsArray (true); (не уверен, что эта последняя часть строго необходима, но для сложных форм она должна быть установлена ​​так же.

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

Надеюсь, что это поможет кому-то!

Ответ 13

Sean McSomething первый совет - это способ пойти за мной. Я всегда думал, что сделать <?php echo $this->form ?> для визуализации формы слишком волшебным. Я сделаю еще один шаг и сделаю индивидуальные декораторы, а не отдельные элементы с помощью магических методов $element->renderDecorator(). Таким образом, вам не придется беспокоиться о порядке, в котором вы определили своих декораторов. Вам просто нужно, чтобы они были там, и вам не придется добавлять этих досадных, неинтуитивных декораторов HtmlTag. Я сделал сообщение в блоге об этом.

Ответ 14

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

Например:

<?php
$form = new zend_form_whatever($field_list + $validators + $template);
echo $form;
?>

шаблон:

<form id="my_custom_form">
    <label>{label.email}</label>
    {input.email}
    <span class="red">{error.email}</span>

    <div>
        {label.password}
        {error.password}
        {input.password}
    </div>

    <div class="purple">{input.submit}<div>
</form>