Get customer first name from customer/session
and place it in the hidden field.
if (Mage::getSingleton('customer/session')->isLoggedIn()) {
// Load the customer's data
$customer = Mage::getSingleton('customer/session')->getCustomer();
$customer->getName(); // Full Name
$customer->getFirstname();
}
or you can directly get First name in controller also.
Create a module with name STech_Subscription and create the files like below steps:
Step 1:
Create registration.php under:
app/code/STech/Subscription/registration.php
with below content:
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'STech_Subscription',
__DIR__
);
Step 2:
Create module.xml under:
app/code/STech/Subscription/etc/module.xml
with below content:
Step 3:
Create di.xml under:
app/code/STech/Subscription/etc/frontend/di.xml
with below content:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Magento\Newsletter\Controller\Subscriber\NewAction" type="STech\Subscription\Controller\Subscriber\NewAction" />
</config>
Step 4:
Create NewAction.php under:
app/code/STech/Subscription/Controller/Subscriber/NewAction.php
with below content:
<?php
namespace STech\Subscription\Controller\Subscriber;
use Magento\Customer\Api\AccountManagementInterface as CustomerAccountManagement;
use Magento\Customer\Model\Session;
use Magento\Customer\Model\Url as CustomerUrl;
use Magento\Framework\App\Action\Context;
use Magento\Store\Model\StoreManagerInterface;
use Magento\Newsletter\Model\SubscriberFactory;
class NewAction extends \Magento\Newsletter\Controller\Subscriber\NewAction
{
protected $customerAccountManagement;
protected $_urlInterface;
public function __construct(
Context $context,
SubscriberFactory $subscriberFactory,
Session $customerSession,
StoreManagerInterface $storeManager,
CustomerUrl $customerUrl,
CustomerAccountManagement $customerAccountManagement,
\Magento\Framework\UrlInterface $urlInterface
) {
$this->_urlInterface = $urlInterface;
parent::__construct($context, $subscriberFactory, $customerSession, $storeManager, $customerUrl, $customerAccountManagement);
}
public function execute()
{
if ($this->getRequest()->isPost() && $this->getRequest()->getPost('email')) {
$email = (string)$this->getRequest()->getPost('email');
try {
$this->validateEmailFormat($email);
$this->validateGuestSubscription();
$this->validateEmailAvailable($email);
$subscriber = $this->_subscriberFactory->create()->loadByEmail($email);
if ($subscriber->getId()
&& $subscriber->getSubscriberStatus() == \Magento\Newsletter\Model\Subscriber::STATUS_SUBSCRIBED
) {
throw new \Magento\Framework\Exception\LocalizedException(
__('This email address is already subscribed.')
);
}
$status = $this->_subscriberFactory->create()->subscribe($email);
if ($status == \Magento\Newsletter\Model\Subscriber::STATUS_NOT_ACTIVE) {
$this->messageManager->addSuccess(__('The confirmation request has been sent.'));
} else {
$this->messageManager->addSuccess(__('Thank you for your subscription.'));
}
} catch (\Magento\Framework\Exception\LocalizedException $e) {
$this->messageManager->addException(
$e,
__('There was a problem with the subscription: %1', $e->getMessage())
);
} catch (\Exception $e) {
$this->messageManager->addException($e, __('Something went wrong with the subscription.'));
}
}
$this->getResponse()->setRedirect($this->_urlInterface->getUrl('custom-thankyou')); // Edit tith your custom url
}
}
Best Answer
The below worked fine for me. There is plenty of room for improvement. The form needs styling help and this adds additional first/last name fields to the admin grid rather than merging them with the existing customer name columns. Add this to your CMS page to include the form with the additional fields
{{block class="Magento\Newsletter\Block\Subscribe" template="Vendor_Module::subscribe.phtml"}}
Vendor/Module/etc/di.xml
Vendor/Module/etc/module.xml
Vendor/Module/Plugin/Newsletter/Subscriber.php
Vendor/Module/Setup/InstallSchema.php
If you are using Magento ˆ2.3 you should use this
db_schema.xml
below instead ofInstallSchema.php
above.Vendor/Module/etc/db_schema.xml
Vendor/Module/view/adminhtml/layout/newsletter_subscriber_block.xml
Vendor/Module/view/frontend/templates/subscribe.phtml
Vendor/Module/registration.php please make proper file all