จะเพิ่มแอตทริบิวต์ที่กำหนดเองของลูกค้าในแบบฟอร์มแก้ไขที่อยู่ของลูกค้าได้อย่างไร


19

ฉันเพิ่มแอตทริบิวต์ที่กำหนดเองของลูกค้าเป็นcustomer_addressประเภทและมันทำงานอย่างถูกต้องในผู้ดูแลระบบและใน onepagecheckout เช่นเดียวกับในที่อยู่จัดส่งและการเรียกเก็บเงิน

ฉันสร้าง: my_namespace/my_module/etc/module.xmlและregistration.php composer.jsonไฟล์ในไดเรกทอรีฐานโมดูล

my_namespace / my_module / ติดตั้ง / InstallData.php

namespace Namespace\Module\Setup;

use Magento\Framework\Module\Setup\Migration;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;

/**
 * @codeCoverageIgnore
 */
class InstallData implements InstallDataInterface
{
    /**
     * Customer setup factory
     *
     * @var CustomerSetupFactory
     */
    private $customerSetupFactory;

    /**
     * Init
     *
     * @param CustomerSetupFactory $customerSetupFactory
     */
    public function __construct(\Magento\Customer\Setup\CustomerSetupFactory $customerSetupFactory)
    {
        $this->customerSetupFactory = $customerSetupFactory;
    }

    /**
     * {@inheritdoc}
     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
     */
    public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
    {
        /** @var CustomerSetup $customerSetup */
        $customerSetup = $this->customerSetupFactory->create(['setup' => $setup]);

        $setup->startSetup();

        // insert attribute
        $customerSetup->addAttribute('customer_address', 'attr_code',  [
            'label' => 'My attribute',
            'type' => 'varchar',
            'input' => 'text',
            'position' => 45,
            'visible' => true,
            'required' => false,
            'system' => 0
        ]);

        $MyAttribute = $customerSetup->getEavConfig()->getAttribute('customer_address', 'attr_code');
        $MyAttribute->setData(
            'used_in_forms',
            ['adminhtml_customer_address', 'customer_address_edit', 'customer_register_address']
        );
        $MyAttribute->save();

        $setup->endSetup();
    }
}

ตอนนี้ฉันต้องเพิ่มฟิลด์แอตทริบิวต์ในแบบฟอร์มลูกค้าaddและที่editอยู่ที่เกี่ยวข้องกับไฟล์magento_customer / view / frontend / templates / address / edit.phtml

ฉันเพิ่มฟิลด์ แต่ฉันไม่สามารถรับและบันทึกค่าของแอททริบิวต์นั้นได้


วีโอไอพีรุ่นไหน
Sohel Rana

magento CE 2.1.0
Ale

สวัสดีอืมคุณช่วยแบ่งปันรหัสการทำงานของคุณสำหรับแอตทริบิวต์ที่อยู่ลูกค้าที่กำหนดเองได้หรือไม่ ฉันต้องการเพิ่มฟังก์ชั่นเดียวกัน
ราหุล

คำตอบ:


9

แอตทริบิวต์ของลูกค้าที่กำหนดเองจะไม่เพียง 'ปรากฏ' ที่ส่วนหน้าเหมือนกับที่ทำในส่วนหลัง รหัสที่แสดงในส่วนหน้าจะอยู่ในไฟล์ phtml ที่กำหนดเอง

Magento EE มีฟังก์ชั่นการใช้งานในตัวนี้ฉันไม่แนะนำให้คุณใช้เงินนั้นฉันแค่บอกว่ามันใช้งานได้แล้ว หากคุณต้องการดำเนินการต่อและพยายามเพิ่มแอตทริบิวต์ที่กำหนดเองมันค่อนข้างซับซ้อน

ก่อนอื่นคุณต้องทำทั้งหมดนี้ในโมดูลมิฉะนั้นจะไม่สามารถใช้งานได้และมันจะยากที่จะทำการดีบัก / อัพเกรดในภายหลัง

คุณต้องทำสิ่งเหล่านี้:

  • สร้างแอททริบิว (คุณทำสิ่งนี้หากมันปรากฏใน admin)
  • แทนที่โครงร่างส่วนหน้าสำหรับ referenceContainer form.additional.info
  • เพิ่มเทมเพลตไฟล์ HTML เพื่อแสดงคุณสมบัติเพิ่มเติม
  • เพิ่มไฟล์ PHP บล็อกเพื่อโหลดแอตทริบิวต์ใหม่และสร้าง HTML
  • สิ่งอื่น ๆ เช่นเรียนรู้วิธีทำให้กระบวนการเป็นอัตโนมัติและโหลดหลายรายการแทนการเข้ารหัสอย่างหนักเพื่อโหลดเฉพาะชื่อที่คุณสร้างขึ้น

คุณสามารถโหลดคุณสมบัติที่กำหนดเองของคุณใน Block PHP จากนั้นเพิ่มเลย์เอาต์ของคุณในcustomer_account_create.xmlลักษณะนี้:

<?xml version="1.0"?>

<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd">
    <update handle="customer_form_template_handle"/>
    <body>
        <referenceContainer name="form.additional.info">
            <block class="Company\Customformattributes\Block\FormCustomer" template="Company_Customformattributes::customattributes.phtml" name="customer_form_user_attributes" cacheable="false">
                <action method="setFormCode">
                    <argument name="code" xsi:type="string">customer_account_edit</argument>
                </action>
                <action method="setEntityModelClass">
                    <argument name="code" xsi:type="string">Magento\Customer\Model\Customer</argument>
                </action>
            </block>
        </referenceContainer>
    </body>
</page>

นี่คือเวทย์มนตร์ซอสเพื่อให้บล็อก PHP ของคุณโหลด, เพื่อให้โหลด HTML ของคุณ, และเพื่อให้มันเข้าสู่หน้าที่ถูกต้อง

นี่ไม่ใช่คำตอบที่เต็มไปด้วยความจริงมีมากไป แต่คุณได้รับแนวคิดพื้นฐาน


คุณช่วยเติมเต็มคำตอบของคุณได้ไหม? สิ่งที่คุณป้อนในไฟล์บล็อกและเทมเพลต
chirag

การกระทำ setEntityModelClass สามารถบันทึกคุณลักษณะของเราโดยอัตโนมัติหรือเราจำเป็นต้องเขียนรหัสสำหรับการบันทึกคุณลักษณะหรือไม่
siddhesh

2

ไม่สามารถตอบคำถามของคุณได้เนื่องจากมีรหัสไม่เพียงพอให้ แต่มีคำแนะนำเล็กน้อย คุณตรวจสอบบทช่วยสอนนี้การเพิ่มบทช่วยสอนสำหรับลูกค้าหรือไม่

ตั้งแต่ Magento 2.1 มีการเปลี่ยนแปลงและวิธีการ -> save ()เลิกใช้แล้ว คุณควรเริ่มใช้ Repositories แทน เช่น EAV ลูกค้าที่คุณควรใช้

วีโอไอพี \ Eav \ รุ่น \ AttributeRepository

ในกรณีของคุณสคริปต์ส่วนที่สองควรเปลี่ยนเป็น

/** Magento\Eav\Model\AttributeRepository $attributeRepository */
    $attributeRepository->save($MyAttribute);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.