Magento 2: Jak ustawić niestandardowy szablon dla bloku podstawowego

15

Próbuję przesłonić register.phtml w moim module, ale wygląda na to, że istnieje jakiś problem z konfiguracją, który sprawia, że ​​Magento nie może użyć mojego niestandardowego szablonu do zastąpienia tego w module podstawowym. Sprawdziłem kod, ale nie mogę znaleźć problemu. Czy ktoś może pomóc? Z góry dziękuję. module.xml:

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="Namespace_ModuleName" setup_version="0.0.2">
        <sequence>
            <module name="Magento_Customer"/>
        </sequence>
    </module>
</config>

customer_account_create.xml w obszarze Przestrzeń nazw \ nazwa_modułu \ widok \ interfejs użytkownika \ układ:

<?xml version="1.0"?>
<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/layout_generic.xsd">
    <referenceBlock name="customer_form_register">
        <arguments>

            <argument name="template" xsi:type="string">Namespace_ModuleName::form/register.phtml</argument>

        </arguments>
    </referenceBlock>
</layout>

composer.json:

{
  "name": "namespace/module-modulename",
  "description": "modulename",
  "type": "magento2-module",
  "version": "0.0.2",
  "license": [
    "OSL-3.0",
    "AFL-3.0"
  ],
  "require": {
    "php": "~5.5.0|~5.6.0",
    "magento/framework": "~0.42",
    "magento/magento-composer-installer": "*",
    "magento/module-customer": "*"
  },
  "extra": {
    "map": [
      [
        "*",
        "Namespace/ModuleName"
      ]
    ]
  }
}
Ricky.C
źródło

Odpowiedzi:

18

Po prostu odwołaj się do niezbędnego bloku i ustaw szablon jako atrybut referenceBlockwęzła:

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceBlock name="customer_form_register" template="VendorName_ModuleName::form/register.phtml"/>
    </body>
</page>

Alternatywna składnia:

<referenceBlock name="customer_form_register">
    <action method="setTemplate">
        <argument name="template" xsi:type="string">VendorName_ModuleName::form/register.phtml</argument>
    </action>
</referenceBlock>

Także jeśli używasz Enterprise Edition, upewnij się umieścić Magento_CustomerCustomAttributesdo sequencew twojej module.xmlponieważ również nadpisuje ten szablon i może zastąpić zmiany.

Alex Paliarush
źródło
1
Dzięki Alex, ale to nie działa dla mnie. Zastanawiam się, czy przeoczyłem kilka ważnych szczegółów, np. Plik konfiguracyjny lub literówkę.
Ricky.C,
Właśnie próbowałem umieścić taki uchwyt układu w module Captcha (ma zależność od modułu klienta, więc jest ładowany po nim, podobnie jak moduł niestandardowy) i działał dla mnie. Czy twój moduł jest w ogóle rozpoznawany przez Magento? I oczywiście pamiętaj, aby wyczyścić pamięć podręczną przed odświeżeniem strony. Wypróbuj to z Captcha, aby zrozumieć, czy problem dotyczy twojego modułu lub deklaracji układu.
Alex Paliarush,
@ Ricky.C zobacz zaktualizowaną odpowiedź, szczególnie dotyczącą EE.
Alex Paliarush,
Wypróbowałem alternatywną składnię, działa ona na mojej najnowszej społeczności Magento 2.0. Wielkie dzięki.
Ricky.C,
1

Zamiast tego użyj tego kodu w pliku układu:

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceBlock name="customer_form_register">
            <arguments>
                <argument name="template" xsi:type="string">Namespace_ModuleName::form/register.phtml</argument>
            </arguments>
        </referenceBlock>
    </body>
</page>

Zastępuje „układ” słowem „strona” i dodaje znacznik body

EDYCJA: 2. alternatywą jest usunięcie oryginalnego bloku i dodanie nowego z pożądanym szablonem

<referenceBlock name="customer_form_register" remove="true"/>
<referenceContainer name="content">
    <block class="Magento\Customer\Block\Form\Register" name="my_customer_form_register" template="Namespace_ModuleName::form/register.phtml">
        <container name="form.additional.info" as="form_additional_info"/>
        <container name="customer.form.register.fields.before" as="form_fields_before" label="Form Fields Before" htmlTag="div" htmlClass="customer-form-before"/>
    </block>
</referenceContainer>
csmarvz
źródło
Dzięki za odpowiedź, próbowałem, ale wciąż nie powiodło się
Ricky.C
Spróbuj z drugim rozwiązaniem. Nawiasem mówiąc, czy plik szablonu znajduje się w Namespace / ModuleName / view / frontend / templates / form / register.phtml?
csmarvz
Wydaje mi się, że to nadal nie powiodło się, ponieważ pracuję z szablonem adminhtml. Wypróbowałem więc jeszcze bardziej alternatywną metodę: skopiuj szablon do własnego modułu, a następnie zastąp Blok, aby go wywołaćsetTemplate metodę, która następnie znajdzie szablon w tym samym module. Bardzo brudne rozwiązanie, ale jedyna rzecz, która działała dla mnie!
Jacques
0

Brakuje znacznika <body> po znaczniku <page>, spróbuj:

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
    <referenceBlock name="customer_form_register">
        <arguments>

            <argument name="template" xsi:type="string">Namespace_ModuleName::form/register.phtml</argument>

        </arguments>
    </referenceBlock>
</body>
</page>
Rozwiązanie dla magów
źródło
1
Dzięki za odpowiedź, to też nie działa dla mnie.
Ricky.C,
Czy zmieniłeś tag <layout> na tag <page>?
Mag Rozwiązanie
Tak, właśnie skopiowałem twój kod i zmieniłem Namespace_ModuleName
Ricky.C
0

Przesłonięcie metod setTemplate działa najlepiej dla mnie.

/ **
 * Mechanizm renderujący kolumny nazwy zamówienia sprzedaży
 * /
Nazwa klasy 
extends \ Magento \ Sales \ Block \ Adminhtml \ Items \ Column \ Name
{

    funkcja publiczna setTemplate ($ template) {
        return parent :: setTemplate ('Magento_Sales ::'. $ template);
    }

    / **
     * Dodaj podział linii i wartość obcięcia
     *
     * @param string $ wartość
     * @ zwróć tablicę
     * /
    funkcja publiczna getFormattedOption (wartość $)
    {
        $ pozostała = '';
        $ wartość = $ this-> truncateString (
                 str_replace (';', '; 
', $ value), 1024 '', $ reszta ); return ['wartość' => nl2br (wartość $), „reszta” => nl2br ($ reszta)]; } }
Dallas Clarke
źródło
0

Wiem, że to jest stare, ale jeśli to komuś pomaga,

ten problem github magento2 / Issues / 3356 stwierdza, że metoda referenceBlock i arguments (wspomniana w pytaniu) cierpi na błąd w przeciwieństwie do przestarzałej i działającej metody:

<referenceBlock name="customer_form_login">
    <action method="setTemplate">
        <argument name="template" xsi:type="string">
            VendorName_ModuleName::form/login.phtml
        </argument>
    </action>
</referenceBlock>

dokumentacja (Ustaw szablon bloku) nie odzwierciedla faktycznego stanu rzeczy.

medmek
źródło
1
tak, nowa metoda nie zawsze działa, więc należy użyć przestarzałej
TheKitMurkit