Come aggiungere un attributo personalizzato del cliente nel modulo di modifica dell'indirizzo cliente?


19

Ho aggiunto un attributo personalizzato del cliente come customer_addresstipo e viene eseguito correttamente nell'amministratore e in onepagecheckout, nonché nell'indirizzo di spedizione e fatturazione.

Ho creato: my_namespace/my_module/etc/module.xmle registration.php composer.jsonfile nella directory di base del modulo.

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();
    }
}

Ora devo aggiungere il campo dell'attributo nel modulo cliente adde editindirizzo relativo al file magento_customer / view / frontend / templates / address / edit.phtml

Ho aggiunto il campo ma non sono in grado di ottenere e salvare il valore di quell'attributo.


quale versione di magento?
Sohel Rana,

magento CE 2.1.0
Ale

Ciao Ale, puoi condividere il tuo codice di lavoro per l'attributo dell'indirizzo cliente personalizzato. Devo anche aggiungere la stessa funzionalità.
Rahul,

Risposte:


9

Gli attributi personalizzati dei clienti non verranno mai "visualizzati" sul frontend come nel backend. Il codice che li visualizza sul frontend si trova in un file phtml personalizzato.

Magento EE ha questa funzionalità integrata. Non sto suggerendo che BISOGNO di spendere quei soldi, sto solo dicendo che ce l'ha. Se vuoi andare avanti e provare ad aggiungere attributi personalizzati, è alquanto complesso.

Prima di tutto, devi fare tutto questo in un modulo o semplicemente non funzionerà correttamente e sarà difficile eseguire il debug / l'aggiornamento in un secondo momento.

Devi fare queste cose:

  • Crea l'attributo (lo hai fatto se si presenta in admin)
  • sovrascrive il layout frontend per referenceContainer form.additional.info
  • aggiungi un file phtml modello per mostrare gli attributi aggiuntivi
  • aggiungere un file PHP a blocchi per caricare i nuovi attributi e creare l'HTML
  • altre cose come imparare come automatizzare il processo e caricare multipli invece di codificarlo per caricare solo il nome di quello che hai creato.

Puoi caricare i tuoi attributi personalizzati in Block PHP. Quindi aggiungi il tuo layout in customer_account_create.xmlquesto modo:

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

Questa è la salsa magica per caricare il tuo blocco PHP, per caricare il tuo phtml e per inserirlo nella pagina corretta.

Questa non è una risposta completa onestamente, c'è molto di più, ma hai l'idea di base.


puoi per favore completare la tua risposta? cosa hai inserito nel file di blocco e modello?
chirag,

L'azione setEntityModelClass può salvare automaticamente il nostro attributo o dobbiamo anche scrivere il codice per salvare l'attributo?
siddhesh,

2

Non è possibile rispondere alla tua domanda, perché non è stato fornito abbastanza codice, ma hai un piccolo consiglio. Hai controllato questo tutorial Aggiunta di tutorial attirbute cliente ?

Da Magento 2.1 c'è una modifica e i metodi -> save () sono obsoleti. Dovresti invece iniziare a utilizzare i repository. Ad esempio per il cliente EAV che dovresti usare

Magento \ Eav \ modello \ AttributeRepository

Nel tuo caso, la seconda parte dello script dovrebbe essere cambiata in

/** Magento\Eav\Model\AttributeRepository $attributeRepository */
    $attributeRepository->save($MyAttribute);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.