Magento 2:コアブロックのカスタムテンプレートを設定する方法


15

私のモジュールでregister.phtmlをオーバーライドしようとしていますが、Magentoがカスタムモジュールを使用してコアモジュールのテンプレートをオーバーライドできないようにする構成上の問題があるようです。コードを確認しましたが、問題が見つかりません。誰でも助けることができますか?前もって感謝します。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>

Namespace \ ModuleName \ view \ frontend \ layoutの下のcustomer_account_create.xml:

<?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"
      ]
    ]
  }
}

回答:


18

必要なブロックを参照し、テンプレートをreferenceBlockノードの属性として設定するだけです:

<?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>

代替構文:

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

また、Enterprise Editionを使用している場合は、このテンプレートもオーバーライドし、変更をオーバーライドする可能性があるため、必ずに入れMagento_CustomerCustomAttributesてください。sequencemodule.xml


1
アレックスに感謝しますが、私にはうまくいきません。configファイルなどの重要な詳細を見逃したり、タイプミスをしたりしているのではないかと思っています。
Ricky.C

そのようなレイアウトハンドルをCaptchaモジュールに配置しようとしました(Customerモジュールに依存しているため、カスタムモジュールのようにその後ロードされます)。あなたのモジュールはMagentoに認識されていますか?そしてもちろん、ページを更新する前にキャッシュをクリアすることを忘れないでください。Captchaでこれを試してください。問題がモジュールまたはレイアウトの宣言にあるかどうかを理解するためだけです。
アレックスPaliarush

@ Ricky.Cは、特にEEに関する最新の回答をご覧ください。
アレックスPaliarush

私は最新のCommunity Magento 2.0で動作する代替構文を試しました。どうもありがとう。
リッキーC

1

代わりに、レイアウトファイルで次のコードを使用します。

<?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>

「レイアウト」を「ページ」に置き換え、bodyタグを追加します

編集:2番目の選択肢は、元のブロックを削除して、目的のテンプレートで新しいブロックを追加することです

<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>

あなたの答えのおかげで、私はそれを試してみましたが、それでも失敗しました
Ricky.C

2番目のソリューションを試してください。ところで、テンプレートファイルはNamespace / ModuleName / view / frontend / templates / form / register.phtmlにありますか?
csmarvz

adminhtmlテンプレートを使用しているため、これはまだ失敗しました。そこで、さらに別の方法を試しました。テンプレートを自分のモジュールにコピーし、ブロックをオーバーライドしてsetTemplateメソッドを呼び出し、同じモジュール内でテンプレートを見つけます。非常に汚い解決策ですが、私のために働いた唯一のもの!
ジャック

0

<page>タグの後に<body>タグがありません。試してください:

<?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>

1
あなたの答えをありがとう、それは私にとってもうまくいきません。
リッキーC

<レイアウト>タグを<ページ>タグに変更しましたか?
メイジソリューション

はい、コードをコピーしてNamespace_ModuleNameを変更しました
Ricky.C

0

setTemplateメソッドをオーバーライドすると、私にとって最適に機能します。

/ **
 *受注アイテム名列レンダラー
 * /
クラス名 
\ Magento \ Sales \ Block \ Adminhtml \ Items \ Column \ Nameを拡張します
{

    パブリック関数setTemplate($ template){
        return parent :: setTemplate( 'Magento_Sales ::'。$ template);
    }

    / **
     *改行を追加して値を切り捨てる
     *
     * @param string $ value
     * @return配列
     * /
    パブリック関数getFormattedOption($ value)
    {
        $ remainder = '';
        $ value = $ this-> truncateString(
                 str_replace( ';'、 '; 
'、$ value)、 1024、 ''、$ remainder ); return ['value' => nl2br($ value)、 'remainder' => nl2br($ remainder)]; } }

0

私はこれが古いことを知っていますが、それが誰かを助けるなら、

このgithubの問題magento2 / issues / 3356は、referenceBlockおよびargumentsメソッド(この質問で言及)が非推奨で動作するメソッドとは対照的にバグに苦しむことを示しています。

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

ドキュメント(ブロックテンプレートの設定)は、物事の実際の状態を反映していません。


1
はい、新しい方法は常に機能するとは限らないため、非推奨の方法を使用する必要があります
-TheKitMurkit
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.