2

I'm trying to add another field to the customer create form.

The following code troughs an error in the backend. The error is:

Class Magento\Customer\Model\Metadata\Form\String does not exist

or if I refresh the page it will change to:

The requested component ("string") is not found. Before using, you must add the implementation.

and back to the original error if i refresh again.

Setup/InstallData.php

<?php
namespace tivol\registrationExtra\Setup;

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

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

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

    /**
     * Installs DB schema for a module
     *
     * @param ModuleDataSetupInterface $setup
     * @param ModuleContextInterface $context
     * @return void
     */
    public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
    {
        $installer = $setup;
        $installer->startSetup();
        $customerSetup = $this->customerSetupFactory->create(['setup' => $setup]);
        $entityTypeId = $customerSetup->getEntityTypeId(\Magento\Customer\Model\Customer::ENTITY);

        $customerSetup->addAttribute(\Magento\Customer\Model\Customer::ENTITY, "salesAssociate", [
            "type" => "varchar",
            "backend" => "",
            "label" => "Sales associate",
            "input" => "string",
            "source" => 'Magento\Eav\Model\Entity\Attribute\Source\AbstractSource',
            "visible" => true,
            "required" => false,
            "default" => "",
            "frontend" => "",
            "unique" => false,
            "note" => "",

        ]);

        $salesAssociate = $customerSetup->getAttribute(\Magento\Customer\Model\Customer::ENTITY, "salesAssociate");

        $salesAssociate = $customerSetup->getEavConfig()->getAttribute(\Magento\Customer\Model\Customer::ENTITY, 'salesAssociate');
        $used_in_forms[] = "adminhtml_customer";
        $used_in_forms[] = "checkout_register";
        $used_in_forms[] = "customer_account_create";
        /* $used_in_forms[]="customer_account_edit"; */
        $used_in_forms[] = "adminhtml_checkout";
        $salesAssociate->setData("used_in_forms", $used_in_forms)
            ->setData("is_used_for_customer_segment", true)
            ->setData("is_system", 0)
            ->setData("is_user_defined", 1)
            ->setData("is_visible", 1)
            ->setData("sort_order", 100);
        $salesAssociate->save();

        $installer->endSetup();
    }
}

view/frontend/layout/customer_registration.xml

<?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>
        <referenceContainer name="form.additional.info">
            <block class="Magento\Framework\View\Element\Template" name="sales_associate" template="MyModules_CustomerMarketingFields::salesassociate.phtml"/>
        </referenceContainer>
    </body>
</page>

view/frontend/templates/salesassociate.phtml

<legend class="legend"><span><?php /* @escapeNotVerified */
        echo __('If you shop in-store who is your regular sales associate') ?></span>
</legend>


<div class="field">
    <label for="associate" class="label"><span><?php /* @escapeNotVerified */
            echo __('Associate') ?></span></label>
    <div class="control">
        <select name="regulation" id="associate" title="<?php /* @escapeNotVerified */
        echo __('Associate') ?>">
            <option value="Option 1">Option 1</option>
            <option value="Option 2">Option 2</option>
            <option value="Option 3">Option 3</option>
        </select>
    </div>
</div>

registration.php

<?php
\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'tivol_registrationExtra',
    __DIR__
);

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="tivol_registrationExtra" setup_version="0.0.1"/>
</config>

Any ideas as to what I have done wrong?

4

Try to change this line:

"input"    => "string",

to the:

"input"    => "text",

because a component with name 'string' not exist.

Then reinstall your module.

Note: if on uninstall process your module does not delete the attribute salesAssociate programmatically you should do-it-yourself. Useful link - Magento 2 How to uninstall attributes added by custom module?

Edit:

You can change input type right in the eav_attribute table, just find your attribute by the attribute_code (it should be salesAssociate) and set its frontend_input value as text. I didn't check this solution, but it should help.

Update:

You can just update your install class and reinstall the module. Add the line:

$customerSetup->removeAttribute(\Magento\Customer\Model\Customer::ENTITY, "salesAssociate");

Before the:

$customerSetup->addAttribute(\Magento\Customer\Model\Customer::ENTITY, "salesAssociate", [ ....

Remove the record about your module from the setup_module table and execute command bin/magento setup:upgrade in the magento root folder.

  • I followed the link but am unsure of where to put that file and what to call it? – Mark Aug 25 '16 at 12:29
  • @Mark I was glad to help. I have updated the answer just in case – Siarhey Uchukhlebau Aug 25 '16 at 12:43
  • now i just need to work out why it shows in the backend and not the front lol – Mark Aug 25 '16 at 14:00
  • So I can see it all now but it didn't save to the database for the customer any ideas? – Mark Aug 25 '16 at 14:35
  • @Mark Try to change the <select name="regulation" to the <select name="salesAssociate" because the name of your attribute is salesAssociate – Siarhey Uchukhlebau Aug 25 '16 at 14:40

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.