Ort und PLZ tauschen in address-form.html.twig

Ich habe gesehen, dass dieses Thema schon diskutiert wurde, habe aber für mich noch nicht die optimale Lösung gefunden:

Scheinbar gibt es ja keine Bestrebungen seitens Shopware (nach einem halben Jahr), diese Konfigurations-Option wieder einzufügen. :frowning:

Jetzt könnte ich das ganze Twig mit der alten Version überschreiben, was dann aber vermutlich in einem der nächsten Updates mir wieder auf die Füße fällt.

Mir hätte es gereicht, wenn ich in dem Block einfach plz und city tauschen könnte. Jetzt ist aber die vorgegebene Block-Struktur dermaßen bescheiden, dass ich die ganze Logik auch noch mitkopieren muss.

{% block component_address_form_zipcode_city %}
    {% set zipcodeField %}
    {% set zipcodeValue = formViolations.getInputData()['zipcode'] ?? data.get('zipcode') %}
        {% if formViolations.getViolations('/zipcode') is not empty %}
            {% set violationPath = '/zipcode' %}
        {% elseif formViolations.getViolations("/#{prefix}/zipcode") is not empty %}
            {% set violationPath = "/#{prefix}/zipcode" %}
        {% else %}
            {% set requiredMessage = 'error.VIOLATION::IS_BLANK_ERROR'|trans({ '%field%': 'address.zipcodeLabel'|trans|sw_sanitize }) %}
        {% endif %}

        {% block component_address_form_zipcode_label %}
            <label class="form-label"
                   for="{{ idPrefix ~ prefix }}AddressZipcode">
                {{ 'address.zipcodeLabel'|trans|sw_sanitize }}<span class="d-none" id="zipcodeLabel">{{ 'general.required'|trans|sw_sanitize }}</span>
            </label>
        {% endblock %}

        {% block component_address_form_zipcode_input %}
            <input type="text"
                   class="form-control{% if violationPath %} is-invalid{% endif %}"
                   autocomplete="{% if prefix == 'shippingAddress' %}shipping {% elseif prefix == 'billingAddress' %}billing {% endif %}postal-code"
                   id="{{ idPrefix ~ prefix }}AddressZipcode"
                   placeholder="{{ 'address.zipcodePlaceholder'|trans|striptags }}"
                   name="{{ prefix }}[zipcode]"
                   value="{{ zipcodeValue }}"
                   data-input-name="zipcodeInput"
            >
        {% endblock %}

        {% block component_address_form_zipcode_error %}
            {% if violationPath %}
                {% sw_include '@Storefront/storefront/utilities/form-violation.html.twig' %}
            {% endif %}
        {% endblock %}
    {% endset %}

    {% set cityField %}
        {% if formViolations.getViolations('/city') is not empty %}
            {% set violationPath = '/city' %}
        {% elseif formViolations.getViolations("/#{prefix}/city") is not empty %}
            {% set violationPath = "/#{prefix}/city" %}
        {% else %}
            {% set requiredMessage = 'error.VIOLATION::IS_BLANK_ERROR'|trans({ '%field%': 'address.cityLabel'|trans|sw_sanitize }) %}
            {% set violationPath = null %}
        {% endif %}

        {% block component_address_form_city_label %}
            <label class="form-label"
                   for="{{ idPrefix ~ prefix }}AddressCity">
                {{ 'address.cityLabel'|trans|sw_sanitize }}{{ 'general.required'|trans|sw_sanitize }}
            </label>
        {% endblock %}

        {% block component_address_form_city_input %}
            <input type="text"
                   class="form-control{% if violationPath %} is-invalid{% endif %}"
                   autocomplete="{% if prefix == 'shippingAddress' %}shipping {% elseif prefix == 'billingAddress' %}billing {% endif %}address-level2"
                   id="{{ idPrefix ~ prefix }}AddressCity"
                   placeholder="{{ 'address.cityPlaceholder'|trans|striptags }}"
                   name="{{ prefix }}[city]"
                   value="{{ data.get('city') }}"
                   data-form-validation-required
                   {% if requiredMessage is defined %}data-form-validation-required-message="{{ requiredMessage }}"{% endif %}
                   required="required">
        {% endblock %}

        {% block component_address_form_city_error %}
            {% if violationPath %}
                {% sw_include '@Storefront/storefront/utilities/form-violation.html.twig' %}
            {% endif %}
        {% endblock %}
    {% endset %}

    <div class="form-group col-md-4 col-8">
        {{ cityField }}
    </div>

    <div class="form-group col-md-2 col-4">
        {{ zipcodeField }}
    </div>
{% endblock %}

Warum programmiert SW da in den Block component_address_form_zipcode_city komplette Variablen mit Logik und Zeugs rein? Hätte man nicht die Ausgabe mit den beiden divs in einen eigenen Block packen können, den man dann einfach überschreiben kann?

Wie macht ihr das? Überschreibt ihr wirklich den ganzen Block oder gar die ganze Datei? Habt ihr da keine Angst, dass euch das beim nächsten Update um die Ohren fliegt?

Oder gibt es eine Methode, wie ich die Variable zipcodeField aus dem parent übernehmen kann, wenn ich den Block überschreibe?

Hilft nichts, du musst den kompletten Block kopieren und bei Updates immer brav die Upgrade-Guidelines lesen.

Wir haben schon etliche Templates und Blocks überschrieben, teilweise mit noch absurderem Boilerplate-Code, der wegen Logik-Spaghetti gefälligst in PHP gehört.

Ist halt Shopware, ein deutsches System, das wie die deutsche Politik Dinge lieber unnötig verkompliziert.

1 „Gefällt mir“

Hallo,

je nachdem, wie „wichtig“ dir ein korrekter tabIndex ist, könnte man das Ganze (beispielsweise für die Registrierung) auch nur über CSS lösen:

.register-address .row .form-group.col-md-4 {
     order: 3;
}

Grüße
Sebastian

Danke. Manchmal hilft es auch, wenn man bestätigt bekommt, dass es einfach nicht anders geht :wink:

Danke für die Idee. Das wäre vielleicht auch ein Ansatz.