Форма зенда: Как я заставляю его изогнуться к моему желанию?

нам нужно доказать, что

_array[current_tail] = item; // push(3)

исключено после соответствия (current_head == current_tail)

item = _array[current_head]; // pop(3)

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

,

_head.load(std::memory_order_acquire) // push(2)

синхронизированы с

_head.store(increment(current_head), std::memory_order_release);   //pop(4)

через упорядочение Release-Acquire:

все записи в память ( pop (3) ), которые произошли до того, как выпуск атомарного хранилища ( pop (4) ) на _head становятся видимыми побочными эффектами, как только Получение атомной нагрузки ( push (2) ) завершено _head.

, поэтому код производителя после push (2) завершен, гарантированно увидит результат pop (3) . это означает, что данные из _array[current_head] копируются в элемент, и результат этой операции виден для кода источника после push (2) , поэтому _array[current_head] уже свободен.

с другой стороны из memory_order_acquire описания загрузки - никакие операции чтения или записи ( push (3) ) в текущем потоке не могут быть переупорядочены до этой загрузки. поэтому push (3) будет выполнено уже после push (2) загрузки завершено, но на этом этапе pop (3) уже завершено

[114 ]
42
задан rg88 27 May 2010 в 02:41
поделиться

13 ответов

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

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

Ваша 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-форму, каждый элемент в Вашем классе имеет свои собственные блоки проверки допустимости и требования. Назад в Вашем действии можно создать экземпляр класса формы и проверить Ваш отправлять/получать Вар против той формы:

$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-форма сценария представления может стать несинхронизированной с Вашим классом формы.

26
ответ дан 26 November 2019 в 23:50
поделиться

Я не уверен, имеет ли Пехлеви уже ту функцию, но, быстрое решение состояло бы в том, чтобы расширить класс, заставить его принять шаблон 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>
-1
ответ дан Mario 26 November 2019 в 23:50
поделиться

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

0
ответ дан monzee 26 November 2019 в 23:50
поделиться

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

Занял целый день бездельничания для получения его работа. Это было записано против Пехлеви 1.5.1, так не знайте, будет ли это работать с текущей версией, но если Вам интересно, я мог бы, вероятно, загрузить источник где-нибудь.

Это, кажется, очень частая жалоба с Формами Зенда.

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

РЕДАКТИРОВАНИЕ: Хорошо, говоря об ужасных торцом клуджах, я поместил свой код для создания табличных форм зенда в GitHub. Пойдите сюда для наблюдения его. (Поскольку gaoshan88, который попросили его.)

1
ответ дан Evan 26 November 2019 в 23:50
поделиться

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

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

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

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

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

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

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

2
ответ дан Community 26 November 2019 в 23:50
поделиться

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

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

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

2
ответ дан Barrett Conrad 26 November 2019 в 23:50
поделиться

Для добавления к тому, что было сказано:

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

декораторы ViewScript и ViewHelper дают Вам много питания.

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

я думаю, что предлагал Sean, то, что Вы не должны называть форму-> рендеринг, можно использовать что-то вроде этого в viewscript.

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

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

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

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

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

Старый ответ относительно Zend_Form

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

, Который сказал, что я могу только дать несколько подсказок на основе своего опыта:

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

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

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

<час>

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

5
ответ дан markus 26 November 2019 в 23:50
поделиться

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

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

2
ответ дан Sean McSomething 26 November 2019 в 23:50
поделиться

Если вы просто хотите добавить произвольную разметку до или после ваши элементы формы без использования декоратора 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">'.
        '<img src="info.png" alt="info icon"/></span>'),
      'placement' => 'prepend'
    ),
    'HtmlTag',
    'Label'
  )
);
3
ответ дан 26 November 2019 в 23:50
поделиться

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

<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>
1
ответ дан 26 November 2019 в 23:50
поделиться

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

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 должен иметь встроенный -in для упрощения захвата отдельных элементов .. но я думаю, что это работает очень хорошо.

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

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

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

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

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

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

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

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

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

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

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

1
ответ дан 26 November 2019 в 23:50
поделиться
Другие вопросы по тегам:

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