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