2017-06-27 9 views
2

Wenn Sie die Forms-Komponente in Symfony verwenden, gibt es eine Möglichkeit, die Komponente oder Teil des Formulars "View" "Lesen" Teil von CRUD wiederzuverwenden.Symfony CRUD - Formulare und "View"

ich ein Formulartyp (für die Zwecke dieser Frage leicht gemacht) erstellt haben:

class CustomerType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('name', TextType::class, array('label' => 'Customer Surname')) 
      ->add('submit', SubmitType::class, array('label' => 'Create')) 
      ; 
    } 
} 

Für den „Bearbeiten“ Teil ist es einfach:

{{ form_start(form) }} 
{{ form_row(form.name) }} 
{{ form_end(form) }} 

Und die 'form' => $form->createForm() passieren rendern.

Dadurch werden die Beschriftungen und alles aus der Typdefinition generiert.

jedoch, wenn es um Ansicht Lese kommt, es scheint, ich habe dies zu tun:

<span>Customer Surname</span> {{ data.name }} 

Und das 'data' => $customer Objekt das machen passieren.

Gibt es eine Möglichkeit, die „label“ Teil des Formulars Art zu nehmen und diese zu verwenden, wenn die „Ansicht“ die Schaffung „lesen“ Vorlage so, wenn ich das Etikett aktualisieren es sowohl Änderungen auf der „Ansicht“ "Lesen" und die "Update" Teile?

Formulare scheinen sehr nützlich, vor allem mit Funktionen wie Datentransformation, aber es scheint ein bisschen Codeverdoppelung zwischen dem "update" und der "view" "lesen".

Antwort

1

Ja. Sie können Übersetzungen verwenden.

In Form:

->add('name',TextType::class, array('label' => 'form.name')) 

In Aufrufe - form/form_label.html.twig

{% block form_label %} 
    {% spaceless %} 
     <label for="{{ id }}">{{ id|replace({'_':'.'})|trans }}</label> 
    {% endspaceless %} 
{% endblock form_label %} 

In config.yml

framework: 
    translator:  { fallbacks: ["%locale%"] } 
twig: 
    form_themes: 
     - 'form/form_label.html.twig' 

In jeder Ansicht können Sie mit

{{ 'form.name'|trans }} 

Aber versuchen, jedes Label No Assign, dann können Sie Standard-Label erzeugt, wie verwenden:

< name of bundle >_< name of class >_< name of property > 

Natürlich können Sie auch Übersetzungen definieren sollten. Ich nehme an, dass Sie wissen, wie man Übersetzungen benutzt. Wenn nicht, schauen docs:

https://symfony.com/doc/current/components/translation/usage.html

Update - erweiterte Antwort

Beispiel messages.yml

1), wenn Sie Etiketten manuell erstellen möchten, und verwenden Sie {{ ‚Form .Name '| trans}}

form: 
    name: 'Customer Name' 

2), wenn Sie keine Schreib vorformulierten wollen, (ich lieber diese Art und Weise)

app: 
    customer: 
     name: 'Customer Name' 

ich davon ausgegangen, dass Ihr Paketnamen AppBundle hat, hat Ihr Klassennamen Kunden . Sie können nun String ‚Kundenname‘ verwenden, in „Lesen“ Teil crud:

<span>{{'app.customer.name'|trans}}</span>{{customer.name}} 

und in Form wird es automatisch hinzugefügt werden, so dass es genug ist

{{form_start(form)}} 
{{form_rest(form)}} 
<input type="sumbit" name="Create/update - or translations of these words"> 
{{form_end(form)}} 

Es haben sich bewährt, , um Formulare auf diese Weise zu schreiben, und fügen Sie sumbit nicht an, um Definition zu bilden. Es ermöglicht in Zukunft einfacher verschachtelte Formulare zu erstellen und ein Formular zum Erstellen und Bearbeiten zu erstellen.

+0

Danke für die Antwort Daniel, aber ich bin mir nicht sicher, ob das beantwortet, was ich zu fragen versuchte. Wenn ich "Ansicht" sage, meine ich eigentlich "lesen", so wie man normalerweise nur Daten von einer Entität anzeigt. –

+0

Ich verstehe, dass Sie 'Kundenname' nur an einer Stelle in Ihrem Code schreiben möchten. Wenn ja, dann sind Übersetzungen der beste Weg, dies zu erreichen. Wenn Sie eine wirklich kleine Menge Code haben möchten, dann setzen Sie das Label nicht in Form. Wird automatisch erstellt, wie zum Beispiel 'app_customer_name', und dann in form_label.html.twig wird es transformiert in 'app.customer.name'. Als nächstes sollten Sie Übersetzungen hinzufügen und Sie können {{'app.customer.name'}} in jeder Ansicht verwenden - lesen, aktualisieren, löschen und einen Teil von crud erstellen. – Daniel

Verwandte Themen