Magento 2-レイアウトxml / ui引数を使用してチェックアウトフォームの住所に影響を与える方法


7

チェックアウトの配送先住所フォームの住所フィールドにプレースホルダーを設定しようとしています。この例に従ってください:http : //devdocs.magento.com/guides/v2.0/howdoi/checkout/checkout_form.html モジュールを変更しましたcheckout_index_index.xml

ほとんどのフィールドは、以下を定義することにより、チェックアウトのプレースホルダーを持っています。

<item name="telephone" xsi:type="array">
  <item name="config" xsi:type="array">
    <item name="elementTmpl" xsi:type="string">Magento_Checkout/form/element/my-input</item>
  </item>
</item>

電話は機能します。入力テンプレートが使用されます。

住所はグループmagento-ui/view/frontend/view/frontend/templates/group/group.html です。「2つの入力要素が含まれている」を参照してください。

レイアウトからこれらの要素テンプレートに影響を与えることはできませんcheckout_index_index.xml

最後に私はこれを試しましたが、成功しませんでした:

<item name="street" xsi:type="array">
    <item name="children" xsi:type="array">
        <item name="0" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="elementTmpl" xsi:type="string">Magento_Checkout/form/element/my-input</item>
            </item>
        </item>
        <item name="1" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="elementTmpl" xsi:type="string">Magento_Checkout/form/element/my-input</item>
            </item>
        </item>
    </item>
</item>

キー01は正しいようです。ストリートグループのチェックアウトページソースの大きなJSONでそれらを確認します。

<script type="text/x-magento-init">
{
  "#checkout":
    "Magento_Ui/js/core/app":  { ... }
}
</script>

誰でも、番地入力フィールドがどのように影響を受けるかを知っていますか?

PS:入力プレースホルダーを有効にするには、次のように入力HTMLテンプレートを編集します:https : //stackoverflow.com/questions/35406440/magento2-checkout-form-how-to-display-placeholder-attribute-value-in-fields/

回答:


3

番地については、コーディングを行う必要があります。

チェックアウト時に、フィールドは Magento\Checkout\Block\Checkout\AttributeMerger.

streetのプレースホルダーを表示するには、関数getMultilineFieldConfigに移動して貼り付けます。

if($attributeCode=='street') {
    $line['label'] = $attributeConfig['label'];
}

if ($isFirstLine && isset($attributeConfig['default']) && $attributeConfig['default'] != null) {
        $line['value'] = $attributeConfig['default'];
}

そしてその魔法を見てください。私はすでにmagento 2インスタンスでそれを試しました、そしてそれは働いています。


1
これは、プリファレンスでAttributeMergerブロックを書き換えることで機能します。おそらくプラグインでも。そこから、見elementTmplたところに必要な機能をオーバーロードしました。ありがとうございました。
2016

1
関数getMultilineFieldConfig()は保護されているため、プラグインはここでは機能しません:-/
Giel Berkers '26

あなたはこの..canを行っているどのようにあなたは私の完全なコードを共有する
SUBBULAKSHMI G

19

私にとっての最善の解決策は、上記と同じメソッドに基づいて自分自身をベースにすることでした:(getMultilineFieldConfig)

ただし、新しいモジュールを作成します。

新規または既存のモジュールMagento_Checkoutで、ノードシーケンス(VendorName / ModuleName / etc / module.xml)に追加します

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="VendorName_ModuleName" setup_version="1.0.0">
    <sequence>
        <module name="Magento_Checkout"/>
    </sequence>
</module>

次に、Magento \ Checkout \ Block \ Checkout \ LayoutProcessorの依存関係注入を設定します

(ベンダー名/モジュール名/etc/frontend/di.xml):

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Checkout\Block\Checkout\LayoutProcessor">
        <plugin name="vendorname_modulename" type="VendorName\ModuleName\Block\LayoutProcessor" sortOrder="100"/>
    </type>
</config>

不足しているのは、ブロック(VendorName / ModuleName / Block / LayoutProcessor.php)を作成することです

<?php
namespace VendorName\ModuleName\Block;

class LayoutProcessor
{
     /**
     * @param \Magento\Checkout\Block\Checkout\LayoutProcessor $subject
     * @param array $jsLayout
     * @return array
     */
     public function afterProcess(
         \Magento\Checkout\Block\Checkout\LayoutProcessor $subject,
         array  $jsLayout
     ) {
        $jsLayout['components']['checkout']['children']['steps']['children']['shipping-step']['children']
    ['shippingAddress']['children']['shipping-address-fieldset']['children']['street'] = [
        'component' => 'Magento_Ui/js/form/components/group',
        'label' => __('Address'),
        'required' => true,
        'dataScope' => 'shippingAddress.street',
        'provider' => 'checkoutProvider',
        'sortOrder' => 60,
        'type' => 'group',
        'children' => [
            [
                'component' => 'Magento_Ui/js/form/element/abstract',
                'config' => [
                    'customScope' => 'shippingAddress',
                    'template' => 'ui/form/field',
                    'elementTmpl' => 'ui/form/element/input'
                ],
                'dataScope' => '0',
                'provider' => 'checkoutProvider',
                'validation' => true,
                'additionalClasses' => 'additional',
                'label' => __('Street')
            ],
            [
                'component' => 'Magento_Ui/js/form/element/abstract',
                'config' => [
                    'customScope' => 'shippingAddress',
                    'template' => 'ui/form/field',
                    'elementTmpl' => 'ui/form/element/input'
                ],
                'dataScope' => '1',
                'provider' => 'checkoutProvider',
                'validation' => true,
                'label' => __('Number')
            ],
            [
                'component' => 'Magento_Ui/js/form/element/abstract',
                'config' => [
                    'customScope' => 'shippingAddress',
                    'template' => 'ui/form/field',
                    'elementTmpl' => 'ui/form/element/input'
                ],
                'dataScope' => '2',
                'provider' => 'checkoutProvider',
                'validation' => true,
                'label' => __('District')
                ]
            ]

        ];

         return $jsLayout;
     }
 }

結果: ここに画像の説明を入力してください


これらのテキストボックスにフィールド検証を追加するにはどうすればよいですか。これを実行すると、デフォルトの検証が機能しなくなります。
Ashish Jagnani 2016

4
@AshishJagnani、使用'validation' => ["required-entry"=>true,"max_text_length"=>255,"min_text_length"=>1]-私のために働いた
peter.gulyas

これはクライアント側の検証を解決します。Max Lenth 255と言います。サーバー側の検証はどうですか?
Ankit Shah

住所フィールドの最大長を入力する必要があります。どうやってするか?
Ankit Shah

1
請求先住所に同じことを行うことは可能ですか?
Dhaval Solanki 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.