0

I have added a custom field in Magento Admin Customer edit section and want to send that value to custom function. But not sure how to do this?

I have followed this tutorial - https://webkul.com/blog/tab-with-form-in-admin-customer-edit-magento-2-0/

Below is my code -

<?php
namespace MyCustom\Customadmin\Block\Adminhtml\Customer\Edit;

use Magento\Customer\Controller\RegistryConstants;
use Magento\Ui\Component\Layout\Tabs\TabInterface;
use Magento\Backend\Block\Widget\Form;
use Magento\Backend\Block\Widget\Form\Generic;
/**
 * Customer account form block
 */
class Tabs extends Generic implements TabInterface
{
    protected $_systemStore;
    protected $_coreRegistry;

    public function __construct(
        \Magento\Backend\Block\Template\Context $context,
        \Magento\Framework\Registry $registry,
        \Magento\Framework\Data\FormFactory $formFactory,
        \Magento\Store\Model\System\Store $systemStore,

        array $data = []
    ) {
        $this->_coreRegistry = $registry;
        $this->_systemStore = $systemStore;
        parent::__construct($context, $registry, $formFactory, $data);
    }

    public function getCustomerId()
    {
        return $this->_coreRegistry->registry(RegistryConstants::CURRENT_CUSTOMER_ID);
    }

    public function getTabLabel()
    {
        return __('Password Change');
    }

    public function getTabTitle()
    {
        return __('Password Change');
    }

    public function canShowTab()
    {
        if ($this->getCustomerId()) {
            return true;
        }
        return false;
    }

    public function isHidden()
    {
       if ($this->getCustomerId()) {
            return false;
        }
        return true;
    }

    public function getTabClass()
    {
        return '';
    }

    public function getTabUrl()
    {
        return '';
    }

    public function isAjaxLoaded()
    {
        return false;
    }
    public function initForm($rowcom)
    {
        if (!$this->canShowTab()) {
            return $this;
        }
        /**@var \Magento\Framework\Data\Form $form */
        $form = $this->_formFactory->create();
        $form->setHtmlIdPrefix('myform_');

        $fieldset = $form->addFieldset('base_fieldset', ['legend' => __('Password Change')]);

            $fieldset->addField(
                'demo_field',
                'text',
                [
                    'name' => 'demo_field',
                    'data-form-part' => $this->getData('target_form'),
                    'label' => __('Enter New Password'),
                    'title' => __('Enter New Password'),
                    'value' => $rowcom,
                ]
            );
        $this->setForm($form);
        return $this;
    }

    protected function _toHtml()
    {
        if ($this->canShowTab()) {
            $this->initForm('test test ');
            return parent::_toHtml();
        } else {
            return '';
        }
    }

}

Here I am passing value to $this->initForm('test test ');

But I want that user should ad this value and this store in the database. How can we do this?

I want to set that textbox value as customer password.

public function setPassword(){
        $customerId = $this->_coreRegistry->registry(RegistryConstants::CURRENT_CUSTOMER_ID);
        $password = 'testpassword@123';

        $customer = $customerRepository->getById($customerId);
        $random = $objectManager->get('Magento\Framework\Math\Random');
        $newPasswordToken = $random->getUniqueHash();
        $customerSecure = $customerRegistry->retrieveSecureData($customer->getId());
        $customerSecure->setRpToken($newPasswordToken);
        $customerSecure->setRpTokenCreatedAt((new \DateTime())->format(\Magento\Framework\Stdlib\DateTime::DATETIME_PHP_FORMAT));
        $customerSecure->setPasswordHash($encryptor->getHash($password, true));
        $customerRepository->save($customer);
    }

Edit

Override Save.php -

Location - MyCustom/Customadmin/Controller/Adminhtml/Index/Save.php

<?php
namespace MyCustom\Customadmin\Controller\Adminhtml\Index;

use Magento\Customer\Api\AddressMetadataInterface;
use Magento\Customer\Api\CustomerMetadataInterface;
use Magento\Customer\Api\Data\CustomerInterface;
use Magento\Customer\Controller\RegistryConstants;
use Magento\Customer\Model\EmailNotificationInterface;
use Magento\Customer\Model\Metadata\Form;
use Magento\Framework\Exception\LocalizedException;

class Save extends \Magento\Customer\Controller\Adminhtml\Index\Save
{
    private $emailNotification;

    public function execute()
    {
        $returnToEdit = false;
        $originalRequestData = $this->getRequest()->getPostValue();

        $customerId = $this->getCurrentCustomerId();

        if ($originalRequestData) {
            try {
                // optional fields might be set in request for future processing by observers in other modules
                $customerData = $this->_extractCustomerData();
                $addressesData = $this->_extractCustomerAddressData($customerData);

                if ($customerId) {
                    $currentCustomer = $this->_customerRepository->getById($customerId);
                    $customerData = array_merge(
                        $this->customerMapper->toFlatArray($currentCustomer),
                        $customerData
                        );
                    $customerData['id'] = $customerId;
                }

                /** @var CustomerInterface $customer */
                $customer = $this->customerDataFactory->create();
                $this->dataObjectHelper->populateWithArray(
                    $customer,
                    $customerData,
                    '\Magento\Customer\Api\Data\CustomerInterface'
                    );
                $addresses = [];
                foreach ($addressesData as $addressData) {
                    $region = isset($addressData['region']) ? $addressData['region'] : null;
                    $regionId = isset($addressData['region_id']) ? $addressData['region_id'] : null;
                    $addressData['region'] = [
                    'region' => $region,
                    'region_id' => $regionId,
                    ];
                    $addressDataObject = $this->addressDataFactory->create();
                    $this->dataObjectHelper->populateWithArray(
                        $addressDataObject,
                        $addressData,
                        '\Magento\Customer\Api\Data\AddressInterface'
                        );
                    $addresses[] = $addressDataObject;
                }

                $this->_eventManager->dispatch(
                    'adminhtml_customer_prepare_save',
                    ['customer' => $customer, 'request' => $this->getRequest()]
                    );
                $customer->setAddresses($addresses);
                if (isset($customerData['sendemail_store_id'])) {
                    $customer->setStoreId($customerData['sendemail_store_id']);
                }

                // Save customer
                if ($customerId) {
                    $this->_customerRepository->save($customer);

                    $this->getEmailNotification()->credentialsChanged($customer, $currentCustomer->getEmail());
                } else {
                    $customer = $this->customerAccountManagement->createAccount($customer);
                    $customerId = $customer->getId();
                }

                $isSubscribed = null;
                if ($this->_authorization->isAllowed(null)) {
                    $isSubscribed = $this->getRequest()->getPost('subscription');
                }
                if ($isSubscribed !== null) {
                    if ($isSubscribed !== 'false') {
                        $this->_subscriberFactory->create()->subscribeCustomerById($customerId);
                    } else {
                        $this->_subscriberFactory->create()->unsubscribeCustomerById($customerId);
                    }
                }

                // After save
                $this->_eventManager->dispatch(
                    'adminhtml_customer_save_after',
                    ['customer' => $customer, 'request' => $this->getRequest()]
                    );
                $this->_getSession()->unsCustomerFormData();
                // Done Saving customer, finish save action

                $this->_coreRegistry->register(RegistryConstants::CURRENT_CUSTOMER_ID, $customerId);
                $this->messageManager->addSuccess(__('You saved the customer.'));
                $returnToEdit = (bool)$this->getRequest()->getParam('back', false);
            } catch (\Magento\Framework\Validator\Exception $exception) {
                $messages = $exception->getMessages();
                if (empty($messages)) {
                    $messages = $exception->getMessage();
                }
                $this->_addSessionErrorMessages($messages);
                $this->_getSession()->setCustomerFormData($originalRequestData);
                $returnToEdit = true;
            } catch (LocalizedException $exception) {
                $this->_addSessionErrorMessages($exception->getMessage());
                $this->_getSession()->setCustomerFormData($originalRequestData);
                $returnToEdit = true;
            } catch (\Exception $exception) {
                $this->messageManager->addException($exception, __('Something went wrong while saving the customer.'));
                $this->_getSession()->setCustomerFormData($originalRequestData);
                $returnToEdit = true;
            }
        }
        $resultRedirect = $this->resultRedirectFactory->create();
        if ($returnToEdit) {
            if ($customerId) {
                $resultRedirect->setPath(
                    'customer/*/edit',
                    ['id' => $customerId, '_current' => true]
                    );
            } else {
                $resultRedirect->setPath(
                    'customer/*/new',
                    ['_current' => true]
                    );
            }
        } else {
            $resultRedirect->setPath('customer/index');
        }
        return $resultRedirect;
    }
}
2
  • Have you created this attribute? Commented Feb 19, 2018 at 10:17
  • No, I dont want to create attribute, I just want to stored this value into password field using my setPassword(). setPassword is working correctly I just want to pass text box value to this function.
    – Rahul
    Commented Feb 19, 2018 at 10:22

1 Answer 1

0

You could create a plugin for the class Magento\Customer\Controller\Adminhtml\Index\Save

create a method afterExecute handle the post data and persist your data.

http://devdocs.magento.com/guides/v2.0/extension-dev-guide/plugins.html

10
  • but if I dont pass value in $this->initForm('test test '); it is getting me error that $rowcom is not defined. as function need arguments. How can I handle this ? Also there is no afterExecute method in Magento\Customer\Controller\Adminhtml\Index\Save
    – Rahul
    Commented Feb 19, 2018 at 11:03
  • First of all, you need to understand how plugins work. Please read the link devdocs.magento.com/guides/v2.0/extension-dev-guide/… Commented Feb 19, 2018 at 11:32
  • I have override class Save and method execute but How to access custom field value ?
    – Rahul
    Commented Feb 19, 2018 at 11:58
  • $subject->getRequest()->getPost('demo_field'); Commented Feb 19, 2018 at 12:14
  • I have overirde class Save in my custom module. But its not working. where is $subject object. please check updated question.
    – Rahul
    Commented Feb 19, 2018 at 12:44

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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