Symfony: добавить пользовательские классы для элементов формы при сбое проверки? - PullRequest
1 голос
/ 03 августа 2011

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

<label>First Name</label>
<ul class='error-list'>
  <li>Required.</li>
</ul>
<input type='text' name='first_name'/>

Я пытаюсь выяснить, есть ли способ заставить Symfony также добавлять пользовательские классы к любым элементам, которые я хочу, когда они не проходят проверку. Например, добавьте class='error' к моим label или input, если проверка не пройдена. Таким образом, я могу стилизовать эти элементы.

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

Есть ли способ сделать это?

Ответы [ 3 ]

2 голосов
/ 04 августа 2011

Я нашел другое решение, используя метод hasError ().

<?php if ($form['email']->hasError()) {
  echo $form['email']->render( array('class'=>'error') );
} else {
  echo $form['email']->render();
} ?>

hasError() явно проверяет, есть ли ошибки для этого элемента формы.

2 голосов
/ 04 августа 2011

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

jQuery(document).ready(function($){

    if($('.sf_admin_form .error_list').length>0 ){ // style if erro is present

        $('.sf_admin_form .error_list').each(function(){
            // label of fields with error should be bold and red
            $(this).prev('label').css('font-weight', 'bold');
            $(this).prev('label').css('color', 'red');
        });

    }

});

Если вам не нужно рассчитывать на включение javascript, тогда вы можете использовать пользовательский форматировщик форм.Ниже приведен пример.

/**
 * Class derived from Table formatter, renders customized version if the row has errors.
 *
 * @package    symfony
 * @subpackage widget
 * @author     Paulo R. Ribeiro <paulo@duocriativa.com.br>
 */
class sfWidgetFormSchemaFormatterCustom extends sfWidgetFormSchemaFormatter
{
  protected  
    $rowFormat       = "<tr>\n  <th>%label%</th>\n  <td>%error%%field%%help%%hidden_fields%</td>\n</tr>\n",
    // THIS IS NEW 
    $rowWithErrorsFormat  = "<tr class='has-errors'>\n  <th class='has-errors'>%label%</th>\n  <td class='has-errors'>%error%%field%%help%%hidden_fields%</td>\n</tr>\n",
    //
    $errorRowFormat  = "<tr><td colspan=\"2\">\n%errors%</td></tr>\n",
    $helpFormat      = '<br />%help%',
    $decoratorFormat = "<table>\n  %content%</table>";

    $errorListFormatInARow     = "  <ul class=\"error_list\">\n%errors%  </ul>\n",
    $errorRowFormatInARow      = "    <li>%error%</li>\n",
    $namedErrorRowFormatInARow = "    <li>%name%: %error%</li>\n",


  public function formatRow($label, $field, $errors = array(), $help = '', $hiddenFields = null)
  {
    if(count($erros)==0){  // no errors, renders as usual

        return strtr($this->getRowFormat(), array(
          '%label%'         => $label,
          '%field%'         => $field,
          '%error%'         => $this->formatErrorsForRow($errors),
          '%help%'          => $this->formatHelp($help),
          '%hidden_fields%' => null === $hiddenFields ? '%hidden_fields%' : $hiddenFields,
        ));

    } else {  // has errors, through in some classes

        return strtr($this->getRowWithErrorsFormat(), array(
          '%label%'         => $label,
          '%field%'         => $field,
          '%error%'         => $this->formatErrorsForRow($errors),
          '%help%'          => $this->formatHelp($help),
          '%hidden_fields%' => null === $hiddenFields ? '%hidden_fields%' : $hiddenFields,
        ));


    }

  }


  public function getRowWithErrorsFormat()
  {
    return $this->rowWithErrorsFormat;
  }


}

Чтобы включить настраиваемый форматер для всех форм, используйте класс ProjectConfiguration для его настройки.

// /config/ProjectConfiguration.class.php
class ProjectConfiguration extends sfProjectConfiguration
{
  public function setup()
  {
    /// CODE FOR ENABLING PLUGINS...

    // configure your default form formatter
    sfWidgetFormSchema::setDefaultFormFormatterName('custom');
  }
}
0 голосов
/ 15 мая 2015

Вместо применения условия к каждому полю формы, вы можете глобально переопределить блок form_label:

{%- block form_row -%}
    <div>
        {{- form_label(form) -}}
        {{- form_widget(form) -}}
    </div>
{%- endblock form_row -%}

{%- block form_label -%}
    {% if label is not sameas(false) -%}
        {% if not compound -%}
            {% set label_attr = label_attr|merge({'for': id}) %}
        {%- endif %}
        {% if required -%}
            {% set label_attr = label_attr|merge({'class': (label_attr.class|default('') ~ ' required')|trim}) %}
        {%- endif %}
        {% if label is empty -%}
            {%- if label_format is not empty -%}
                {% set label = label_format|replace({
                    '%name%': name,
                    '%id%': id,
                }) %}
            {%- else -%}
                {% set label = name|humanize %}
            {%- endif -%}
        {%- endif -%}
        {% if errors|length > 0 %}
            {% set label_attr = label_attr|merge({'class': (label_attr.class|default('') ~ ' error_class')|trim}) %}
        {% endif %}
        <label{% for attrname, attrvalue in label_attr %} {{ attrname }}="{{ attrvalue }}"{% endfor %}>{{ label|trans({}, translation_domain) }}</label>
    {%- endif -%}
{%- endblock form_label -%}

И в вашей конфигурации:

twig:
    form:
        resources:
            - 'Form/fields.html.twig'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...