Làm cách nào để thêm thuộc tính tùy chỉnh của khách hàng trong biểu mẫu chỉnh sửa địa chỉ khách hàng?


19

Tôi đã thêm một thuộc tính tùy chỉnh của khách hàng dưới customer_addressdạng loại và nó chạy chính xác trong quản trị viên và trong onepagecheckout cũng như trong địa chỉ giao hàng & thanh toán.

Tôi đã tạo: my_namespace/my_module/etc/module.xmlregistration.php composer.jsoncác tập tin trong thư mục cơ sở mô-đun.

my_namespace / my_module / Setup / 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();
    }
}

Bây giờ tôi cần thêm trường thuộc tính trong biểu mẫu khách hàng addeditđịa chỉ có liên quan đến tệp magento_customer / view / frontend / samples / address / edit.phtml

Tôi đã thêm trường nhưng tôi không thể nhận và lưu giá trị của thuộc tính đó.


phiên bản magento nào?
Sohel Rana

magento CE 2.1.0
Ale

Xin chào Ale, bạn có thể vui lòng chia sẻ mã làm việc của bạn cho thuộc tính địa chỉ khách hàng tùy chỉnh. Tôi cũng cần thêm chức năng tương tự.
Raul

Câu trả lời:


9

Thuộc tính khách hàng tùy chỉnh sẽ không bao giờ chỉ "xuất hiện" trên frontend giống như họ làm trong phần phụ trợ. Mã hiển thị chúng trên frontend nằm trong tệp phtml tùy chỉnh.

Magento EE có chức năng này được tích hợp. Tôi không đề nghị bạn CẦN tiêu số tiền đó, tôi chỉ nói rằng nó có nó. Nếu bạn muốn tiếp tục và cố gắng thêm các thuộc tính tùy chỉnh, điều đó hơi phức tạp.

Trước hết, bạn phải thực hiện tất cả những điều này trong một mô-đun hoặc nó sẽ không hoạt động đúng, và sẽ rất khó để gỡ lỗi / nâng cấp sau này.

Bạn phải làm những điều này:

  • Tạo thuộc tính (bạn đã thực hiện điều này nếu nó xuất hiện trong quản trị viên)
  • ghi đè lên bố cục lối vào cho ReferenceContainer form.additable.info
  • thêm tệp phtml mẫu để hiển thị (các) thuộc tính bổ sung
  • thêm một tệp PHP khối để tải các thuộc tính mới và tạo HTML
  • những thứ khác như tìm hiểu cách tự động hóa quy trình và tải bội số thay vì mã hóa cứng để chỉ tải tên của cái bạn đã tạo.

Bạn có thể tải các thuộc tính tùy chỉnh của mình trong Block PHP. Sau đó, chỉ cần thêm bố cục của bạn vào customer_account_create.xmlnhư thế này:

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

Đây là loại nước sốt kỳ diệu để tải khối PHP của bạn, tải phtml của bạn để tải và đưa nó vào đúng trang.

Đây không phải là một câu trả lời đầy đủ một cách trung thực, có rất nhiều điều nữa, nhưng bạn có được ý tưởng cơ bản.


bạn có thể vui lòng hoàn thành câu trả lời của bạn? những gì bạn đã nhập trong khối và tập tin mẫu?
chirag

hành động setEntityModelClass có thể tự động lưu thuộc tính của chúng ta hay chúng ta cần viết mã để lưu thuộc tính?
siddhesh

2

Không thể trả lời câu hỏi của bạn, vì không có đủ mã được cung cấp, nhưng có một lời khuyên nhỏ. Bạn đã kiểm tra hướng dẫn này Thêm hướng dẫn attirbute của khách hàng ?

Vì Magento 2.1 có sự thay đổi và các phương thức -> save () không được dùng nữa. Bạn nên bắt đầu sử dụng Kho thay thế. Ví dụ cho khách hàng EAV bạn nên sử dụng

Magento \ Eav \ Model \ AttributionRep repository

Trong trường hợp của bạn, phần thứ hai của kịch bản nên được thay đổi thành

/** Magento\Eav\Model\AttributeRepository $attributeRepository */
    $attributeRepository->save($MyAttribute);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.