سيمفوني:كيفية تجنب تغليف أنواع النماذج المخصصة في div تلقائيًا؟

StackOverflow https://stackoverflow.com//questions/22014792

سؤال

نموذج نوع المستخدم:

class UserType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('email', 'email', ['label' => 'EMail']);
        // various other fields....
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'validation_groups' => array('registration'),
            'data_class' => 'Vendor\Model\Entity\User',
        ));
    }

    public function getName()
    {
        return 'form_user';
    }
}

نموذج نوع المعلم:

class TutorType extends Translate
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('user', new UserType(), ['label' => false]);

        $builder->add('school', 'entity', [
            'class' => 'Model:School',
            'property' => 'name',
            'label' => 'Label'
        ]);

        // Various other fields
        $builder->add('save', 'Submit');
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            //'validation_groups' => array('registration'),
            'data_class' => 'Vendor\Model\Entity\Tutor',
            'cascade_validation' => true,
        ));
    }

    public function getName()
    {
        return 'form_tutor';
    }
}

عند التقديم، UserType يتم تقديمه داخل div، ولا أستطيع العثور على طريقة للتغلب على ذلك.

يتم تقديم النموذج كما

the result

<form name="form_tutor"
      method="post"
      action=""
      novalidate="novalidate"
      class="form-horizontal form-horizontal"
      id="form_tutor">
    <div id="form_tutor"
         novalidate="novalidate"
         class="form-horizontal">
        <div class="form-group">
            <div class="col-lg-10">
                <div id="form_tutor_user">
                    <div class="form-group">
                        <label class="col-lg-2 control-label aaaa required"
                             for="form_tutor_user_email">EMail</label>

                        <div class="col-lg-10">
                            <input type="email"
                                 id="form_tutor_user_email"
                                 name="form_tutor[user][email]"
                                 required="required"
                                 class="form-control" />
                        </div>
                    </div>
                </div>
            </div>
        </div>

        <div class="form-group">
            <label class="col-lg-2 control-label aaaa required"
                 for="form_tutor_tutorType">Type</label>

            <div class="col-lg-10">
                <select id="form_tutor_tutorType"
                     name="form_tutor[tutorType]"
                     class="form-control">
                    </select>
            </div>
        </div>

        <div class="form-group">
            <div class="col-lg-offset-2 col-lg-10">
                <button type="submit"
                     id="form_tutor_save"
                     name="form_tutor[save]"
                     class="btn btn-default">Speichern</button>
            </div>
        </div><input type="hidden"
             id="form_tutor__token"
             name="form_tutor[_token]"
             class="form-control"
             value="s6i6zPxJs7KU5CiEe8i6Ahg_ca8rc2t5CnSk5yAsUhk" />
    </div>
</form>

ال form_tutor_user يتم تغليفه في div مجموعة النموذج الخاصة.لقد حاولت الكتابة فوق form_tutor_user_widget ولكن هذا مستوى واحد للعمق.(وفقط حل سريع، يجب تطبيقه عالميًا على جميع أنواع النماذج - الفئات)

كيف يمكنني تغيير السمة بحيث لا يتم تغليف جميع الأنواع المخصصة بقالب form_row الافتراضي؟

أو كيف أعرف في الغصين متى يتم تقديم "نموذج فرعي"؟حتى أتمكن من اتخاذ قرار بطباعة <div class="form-group"> عندما لا تكون العقدة الفرعية نموذجًا فرعيًا، أو قم بتخطيها، إذا كان هذا هو الحال.

تيا

هل كانت مفيدة؟

المحلول

بشكل افتراضي ، في شكل قاعدة الموضوع:

{% block form_row %}
{% spaceless %}
    <div>
        {{ form_label(form) }}
        {{ form_errors(form) }}
        {{ form_widget(form) }}
    </div>
{% endspaceless %}
{% endblock form_row %}

و العرف مجمع أشكال:

{% block form_widget_compound %}
{% spaceless %}
    <div {{ block('widget_container_attributes') }}>
        {% if form.parent is empty %}
            {{ form_errors(form) }}
        {% endif %}
        {{ block('form_rows') }}
        {{ form_rest(form) }}
    </div>
{% endspaceless %}
{% endblock form_widget_compound %}

إذا لم تغير شيئا هنا DIV ترى أن تأتي من أي واحد أو آخر قليلا من القالب.

ومع ذلك ، في specfic سبيل المثال ، إذا كان form_tutor_user_row هو تعريف الشيء الأول هو لم تستخدم قط ، و إذا form_tutor_user_widget يتم تعريف آخر بت يستخدم أبدا.

عودة إلى سؤالك.سؤالك هو :"كيف يمكنني تغيير الموضوع حتى كل أنواع مخصصة ليست ملفوفة مع الافتراضي form_row القالب؟"

هنا هي المشكلة كما أرى:تريد أن أعلى أشكال (الشكل الذي الفرعية كافة أشكال مدرجة) المشترك طريقة التقديم في أقسام.كل قسم سيتم تضمينها في شعبة مع class="form-المجموعة".قد تحتاج إلى رمي في بعض إضافية مما يجعل العمليات ولكن سأقتصر على هذا لابقاء الامور بسيطة.

ما تحتاج إلى القيام به بعد ذلك هو خلق specfic شكل نوع وجعل كل ما تبذلونه من أعلى أشكال ترث من هذا الشكل الجديد من نوع.على سبيل المثال:

class TopType extends AbstractType
{
    public function getName()
    {
        return 'top_form';
    }
}

...و ورثت شكل:

class MyFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        ...
    }

    public function getName()
    {
        return 'my_form';
    }

    public function getParent()
    {
        return 'top_form';
    }
}

كما ترون, هناك حاجة إلى جعل PHP الميراث على شكل تطبيق السمات الميراث إلى العمل.

قالب-السمات-الحكمة (يمكنني قول هذا؟), إذا كان لا يوجد شكل محدد السمات هو my_form, Symfony سوف نفهم أن النموذج الافتراضي الموضوع على شكل موضوع top_form, أنك يمكن أن تحدد على هذا النحو:

{% block top_form_widget %}
{% spaceless %}
    {% for child in form %}
        <div class="form-group">
            {{ form_widget(child) }}
        </div>
    {% endfor %}
    {{ form_rest(form) }}
{% endspaceless %}
{% endblock top_form_widget %}

وأود أن أضيف أن هذه هي المشكلة لقد واجه بالفعل و حلها.قل لي كيف يعمل لك.

تحرير:

باختصار ، ما عليك القيام به هو:

  • إنشاء TopType شكل نوع ،
  • إضافة top_form_widget كتلة في شكل موضوع ،
  • على كل ما تبذلونه من الجذر أشكال (أيأعلى مستوى أشكال, أشكال كلا الوالدين) ، إضافة getParent() الطريقة التي سيعود اسم TopType شكل ("top_form")

نصائح أخرى

من الناحية النظرية، إذا قمت بتجاوز form_widget_compound قم بحظر سمة النموذج العام بهذه الطريقة، فيجب أن تعمل كما تريد:

// app/Resources/views/form.html.twig

{% block form_widget_compound %}
    {% if form.parent is empty %}
        <div {{ block('widget_container_attributes') }}>
        {{ form_errors(form) }}
    {% endif %}
    {{ block('form_rows') }}
    {{ form_rest(form) }}
    {% if form.parent is empty %}
        </div>
    {% endif %}
{% endblock %}

وقم بتسجيل موضوع النموذج الخاص بك:

// app/config/config.yml
twig:
    form:
        resources:
            - "::form.html.twig"

I usually solve this problem by rendering the nested form's fields manually:

{{ form_row(form.tutor.school) }}
{{ form_row(form.tutor.user.email) }}

Probably that's not the most elegant solution, but it works for me and I haven't looked for an elegant one yet.

Bootstrap 3.3.4 I ended up doing this.

They key part of this:

 <div class="{% if form.parent.parent is empty %}form-group{% endif %}{% if (not compound or force_error|default(false)) and not valid %} has-error{% endif %}">

Full template.

{% block form_row -%}
    <div class="{% if form.parent.parent is empty %}form-group{% endif %}{% if (not compound or force_error|default(false)) and not valid %} has-error{% endif %}">
        {% if form.parent.parent is null and label is not empty %}
            {{- form_label(form) -}}
        {% elseif label is empty %}
            {{- form_label(form) -}}
        {% endif %}
        {% if compound is empty %}<div class="{{ block('form_group_class') }}">{% endif %}
            {{- form_widget(form) -}}
            {{- form_errors(form) -}}
        {% if compound is empty %}</div>{% endif %}
    </div>
{%- endblock form_row %}

Maybe it is not an elegant solution, however works for me, because I was also trying to find the solution.

As an example:

{% for custom_field in form.custom_fields %}
<div class="edit_custom">
{{ form_row(custom_field.name) }}
{{ form_row(custom_field.value) }}
</div>
{% endfor %}

<script>
$('.edit_custom').find('input').unwrap();
</script>

Try using form_themes.

First, in you parent template define the form theme:

{% form_theme form with ['BundleName:ControlerName:somesubform_form.html.twig'] %}

btw replace BundleName, ControllerName and somesubform with the proper names.

then render it with:

{{ form_row(form.somesubform) }}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top