Magento 2.2 – adding name field to newsletter module

The question:

I’m using magento 2.2 and I want to add name field for newsletter module, so there has to be input box in front-end, and also it needs to show in backend, how to achieve this? There is a lot of posts about this, but they all are on older magento versions. So can someone explain how to achieve this?

The Solutions:

Below are the methods you can try. The first solution is probably the best. Try others if the first one doesn’t work. Senior developers aren’t just copying/pasting – they read the methods carefully & apply them wisely to each case.

Method 1

I have created module for your requirement and firstname & lastname

Create registeration file.

appcodeHmNewsletters – registration.php

<?php
MagentoFrameworkComponentComponentRegistrar::register(
    MagentoFrameworkComponentComponentRegistrar::MODULE,
    'Hm_Newsletters',
    __DIR__
);

appcodeHmNewslettersetc – 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="Hm_Newsletters" setup_version="1.0.0">
            <sequence>
                <module name="Magento_Newsletter" />
            </sequence>
        </module>
    </config>

Override a newsletter subscriber action using a plungin

appcodeHmNewslettersetc – di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
  <type name="MagentoNewsletterModelSubscriber">
    <plugin name="hm_newsletter_model_subscriber" type="HmNewslettersPluginSubscriber" sortOrder="1" />
  </type>
</config>

Replace a custom newsletter form with default form with layout

appcodeHmNewslettersviewfrontendlayout -default.xml

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceContainer name="footer">
        <block class="MagentoNewsletterBlockSubscribe" name="form.subscribe.new" before="-" template="Hm_Newsletters::subscribe.phtml"/>
    </referenceContainer>
        <referenceBlock name="form.subscribe" remove="true" />
    </body>
</page>

Add two fields in newsletter form

appcodeHmNewslettersviewfrontendtemplates – subscribe.phtml

<?php
/**
 * Copyright © 2016 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */

// @codingStandardsIgnoreFile

/** @var MagentoNewsletterBlockSubscribe $block */

?>
<div class="block newsletter">
    <div class="title"><strong><?php /* @escapeNotVerified */ echo __('Newsletter') ?></strong></div>
    <div class="content">
        <form class="form subscribe" novalidate
              action="<?php echo $block->escapeUrl($block->getFormActionUrl()) ?>"
              method="post"
              data-mage-init='{"validation": {"errorClass": "mage-error"}}'
              id="newsletter-validate-detail">
            <div class="field firstname">
                <label class="label" for="firstname"><span><?php echo $block->escapeHtml(__('Vorname')) ?></span></label>
                <div class="control">
                    <input name="firstname" type="text" id="firstname" placeholder="<?php echo $block->escapeHtml(__('Vorname')) ?>" data-validate="{required:true}"/>
                </div>
            </div>
            <div class="field lastname">
                <label class="label" for="lastname"><span><?php echo $block->escapeHtml(__('Nachname')) ?></span></label>
                <div class="control">
                    <input name="lastname" type="text" id="lastname" placeholder="<?php echo $block->escapeHtml(__('Nachname')) ?>" data-validate="{required:true}"/>
                </div>
            </div>
            <div class="field newsletter">
                <label class="label" for="newsletter"><span><?php echo $block->escapeHtml(__('Mailadresse:')) ?></span></label>
                <div class="control">
                    <input name="email" type="email" id="newsletter" placeholder="<?php echo $block->escapeHtml(__('Mailadresse')) ?>" data-validate="{required:true, 'validate-email':true}"/>
                </div>
            </div>
            <div class="actions">
                <button class="action subscribe primary" title="<?php echo $block->escapeHtml(__('Absenden')) ?>" type="submit">
                    <span><?php echo $block->escapeHtml(__('Absenden')) ?></span>
                </button>
            </div>
        </form>
    </div>
</div>

Create a plugin for newsletter subscriber action

appcodeHmNewslettersPlugin – Subscriber.php

<?php
namespace HmNewslettersPlugin;

use MagentoFrameworkAppRequestHttp;

class Subscriber {
    protected $request;
    public function __construct(Http $request){
        $this->request = $request;
    }

    public function aroundSubscribe($subject, Closure $proceed, $email) {

        if ($this->request->isPost() && $this->request->getPost('firstname')) { 

            $firstname = $this->request->getPost('firstname');
            $lastname = $this->request->getPost('lastname');

            $subject->setCFirstname($firstname);
            $subject->setCLastname($lastname);
            $result = $proceed($email);

            try {
                $subject->save();
            }catch (Exception $e) {
                throw new Exception($e->getMessage());
            }
        }
        return $result;
    }
}

Create database table fields using installSchema

appcodeHmNewslettersSetup – InstallSchema.php

<?php

namespace HmNewslettersSetup;

use MagentoFrameworkSetupInstallSchemaInterface;
use MagentoFrameworkSetupModuleContextInterface;
use MagentoFrameworkSetupSchemaSetupInterface;
use MagentoFrameworkDBDdlTable;

class InstallSchema implements InstallSchemaInterface
{
    public function install(SchemaSetupInterface $setup, ModuleContextInterface $context) {
        $setup->startSetup();

        $table = $setup->getTable('newsletter_subscriber');

        $setup->getConnection()->addColumn(
            $table,
            'c_firstname',
            [
                'type' => Table::TYPE_TEXT,
                'nullable' => true,
                'comment' => 'First Name'
            ]
        );
        $setup->getConnection()->addColumn(
            $table,
            'c_lastname',
            [
                'type' => Table::TYPE_TEXT,
                'nullable' => true,
                'comment' => 'Last Name'
            ]
        );
        $setup->endSetup();
    }
}

Create Admin grid columns using newsletter_subscriber_block

appcodeHmNewslettersviewadminhtmllayout –
newsletter_subscriber_block.xml

<?xml version="1.0"?>    
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceBlock name="adminhtml.newsletter.subscriber.container">
            <block class="MagentoNewsletterBlockAdminhtmlSubscriberGrid" name="adminhtml.newslettrer.subscriber.grid" as="grid">
                <arguments>
                    <argument name="id" xsi:type="string">subscriberGrid</argument>
                    <argument name="dataSource" xsi:type="object">MagentoNewsletterModelResourceModelSubscriberGridCollection</argument>
                    <argument name="default_sort" xsi:type="string">subscriber_id</argument>
                    <argument name="default_dir" xsi:type="string">desc</argument>
                    <argument name="use_ajax" xsi:type="string">1</argument>
                </arguments>
                <block class="MagentoBackendBlockWidgetGridMassaction" name="adminhtml.newslettrer.subscriber.grid.massaction" as="grid.massaction">
                    <arguments>
                        <argument name="massaction_id_field" xsi:type="string">subscriber_id</argument>
                        <argument name="form_field_name" xsi:type="string">subscriber</argument>
                        <argument name="use_select_all" xsi:type="string">1</argument>
                        <argument name="options" xsi:type="array">
                            <item name="unsubscribe" xsi:type="array">
                                <item name="label" xsi:type="string" translate="true">Unsubscribe</item>
                                <item name="url" xsi:type="string">*/*/massUnsubscribe</item>
                            </item>
                            <item name="delete" xsi:type="array">
                                <item name="label" xsi:type="string" translate="true">Delete</item>
                                <item name="url" xsi:type="string">*/*/massDelete</item>
                            </item>
                        </argument>
                    </arguments>
                </block>
                <block class="MagentoBackendBlockWidgetGridExport" name="adminhtml.newslettrer.subscriber.grid.export" as="grid.export">
                    <arguments>
                        <argument name="exportTypes" xsi:type="array">
                            <item name="csv" xsi:type="array">
                                <item name="urlPath" xsi:type="string">*/*/exportCsv</item>
                                <item name="label" xsi:type="string" translate="true">CSV</item>
                            </item>
                            <item name="excel" xsi:type="array">
                                <item name="urlPath" xsi:type="string">*/*/exportXml</item>
                                <item name="label" xsi:type="string" translate="true">Excel XML</item>
                            </item>
                        </argument>
                    </arguments>
                </block>
                <block class="MagentoBackendBlockWidgetGridColumnSet" name="adminhtml.newslettrer.subscriber.grid.columnSet" as="grid.columnSet">
                    <arguments>
                        <argument name="id" xsi:type="string">problemGrid</argument>
                    </arguments>
                    <block class="MagentoBackendBlockWidgetGridColumn" as="subscriber_id">
                        <arguments>
                            <argument name="header" xsi:type="string" translate="true">ID</argument>
                            <argument name="index" xsi:type="string">subscriber_id</argument>
                            <argument name="header_css_class" xsi:type="string">col-id</argument>
                            <argument name="column_css_class" xsi:type="string">col-id</argument>
                        </arguments>
                    </block>
                    <block class="MagentoBackendBlockWidgetGridColumn" as="email">
                        <arguments>
                            <argument name="header" xsi:type="string" translate="true">Email</argument>
                            <argument name="index" xsi:type="string">subscriber_email</argument>
                            <argument name="header_css_class" xsi:type="string">col-email</argument>
                            <argument name="column_css_class" xsi:type="string">ccol-email</argument>
                        </arguments>
                    </block>
                    <block class="MagentoBackendBlockWidgetGridColumn" as="type">
                        <arguments>
                            <argument name="header" xsi:type="string" translate="true">Type</argument>
                            <argument name="index" xsi:type="string">type</argument>
                            <argument name="type" xsi:type="string">options</argument>
                            <argument name="options" xsi:type="array">
                                <item name="guest" xsi:type="array">
                                    <item name="value" xsi:type="string">1</item>
                                    <item name="label" xsi:type="string" translate="true">Guest</item>
                                </item>
                                <item name="customer" xsi:type="array">
                                    <item name="value" xsi:type="string">2</item>
                                    <item name="label" xsi:type="string" translate="true">Customer</item>
                                </item>
                            </argument>
                            <argument name="header_css_class" xsi:type="string">col-type</argument>
                            <argument name="column_css_class" xsi:type="string">col-type</argument>
                        </arguments>
                    </block>
                    <block class="MagentoBackendBlockWidgetGridColumn" as="firstname">
                        <arguments>
                            <argument name="header" xsi:type="string" translate="true">Customer First Name</argument>
                            <argument name="index" xsi:type="string">firstname</argument>
                            <argument name="renderer" xsi:type="string">HmNewslettersBlockNewsletterAdminhtmlTemplateGridRendererCustomerfirstname</argument>
                            <argument name="default" xsi:type="string">----</argument>
                            <argument name="header_css_class" xsi:type="string">col-first-name</argument>
                            <argument name="column_css_class" xsi:type="string">col-first-name</argument>
                        </arguments>
                    </block>
                    <block class="MagentoBackendBlockWidgetGridColumn" as="lastname">
                        <arguments>
                            <argument name="header" xsi:type="string" translate="true">Customer Last Name</argument>
                            <argument name="index" xsi:type="string">lastname</argument>
                            <argument name="renderer" xsi:type="string">HmNewslettersBlockNewsletterAdminhtmlTemplateGridRendererCustomerlastname</argument>
                            <argument name="default" xsi:type="string">----</argument>
                            <argument name="header_css_class" xsi:type="string">col-last-name</argument>
                            <argument name="column_css_class" xsi:type="string">col-last-name</argument>
                        </arguments>
                    </block>
                    <block class="MagentoBackendBlockWidgetGridColumn" as="status">
                        <arguments>
                            <argument name="header" xsi:type="string" translate="true">Status</argument>
                            <argument name="index" xsi:type="string">subscriber_status</argument>
                            <argument name="type" xsi:type="string">options</argument>
                            <argument name="options" xsi:type="array">
                                <item name="status_not_active" xsi:type="array">
                                    <item name="value" xsi:type="string">2</item>
                                    <item name="label" xsi:type="string" translate="true">Not Activated</item>
                                </item>
                                <item name="status_subscribed" xsi:type="array">
                                    <item name="value" xsi:type="string">1</item>
                                    <item name="label" xsi:type="string" translate="true">Subscribed</item>
                                </item>
                                <item name="status_unsubscribed" xsi:type="array">
                                    <item name="value" xsi:type="string">3</item>
                                    <item name="label" xsi:type="string" translate="true">Unsubscribed</item>
                                </item>
                                <item name="status_unconfirmed" xsi:type="array">
                                    <item name="value" xsi:type="string">4</item>
                                    <item name="label" xsi:type="string" translate="true">Unconfirmed</item>
                                </item>
                            </argument>
                            <argument name="header_css_class" xsi:type="string">col-status</argument>
                            <argument name="column_css_class" xsi:type="string">col-status</argument>
                        </arguments>
                    </block>
                    <block class="MagentoBackendBlockWidgetGridColumnMultistore" as="website">
                        <arguments>
                            <argument name="header" xsi:type="string" translate="true">Web Site</argument>
                            <argument name="index" xsi:type="string">website_id</argument>
                            <argument name="type" xsi:type="string">options</argument>
                            <argument name="options" xsi:type="options" model="MagentoConfigModelConfigSourceWebsiteOptionHash"/>
                            <argument name="header_css_class" xsi:type="string">col-website</argument>
                            <argument name="column_css_class" xsi:type="string">col-website</argument>
                        </arguments>
                    </block>
                    <block class="MagentoBackendBlockWidgetGridColumnMultistore" as="group">
                        <arguments>
                            <argument name="header" xsi:type="string" translate="true">Store</argument>
                            <argument name="index" xsi:type="string">group_id</argument>
                            <argument name="type" xsi:type="string">options</argument>
                            <argument name="options" xsi:type="options" model="MagentoNewsletterBlockSubscribeGridOptionsGroupOptionHash"/>
                            <argument name="header_css_class" xsi:type="string">col-store</argument>
                            <argument name="column_css_class" xsi:type="string">col-store</argument>
                        </arguments>
                    </block>
                    <block class="MagentoBackendBlockWidgetGridColumnMultistore" as="store">
                        <arguments>
                            <argument name="header" xsi:type="string" translate="true">Store View</argument>
                            <argument name="index" xsi:type="string">store_id</argument>
                            <argument name="type" xsi:type="string">options</argument>
                            <argument name="options" xsi:type="options" model="MagentoNewsletterBlockSubscribeGridOptionsStoreOptionHash"/>
                            <argument name="header_css_class" xsi:type="string">col-store-view</argument>
                            <argument name="column_css_class" xsi:type="string">col-store-view</argument>
                        </arguments>
                    </block>
                </block>
            </block>
        </referenceBlock>
    </body>
</page>

Add renderer to display firstname and lastname if user not logged in

appcodeHmNewslettersBlockNewsletterAdminhtmlTemplateGridRenderer
– Customerfirstname.php

<?php
namespace HmNewslettersBlockNewsletterAdminhtmlTemplateGridRenderer;
use MagentoFrameworkDataObject;
class Customerfirstname extends MagentoBackendBlockWidgetGridColumnRendererAbstractRenderer
{
    public function render(MagentoFrameworkDataObject $row)
    {
        if($row->getData('type')==1){
            return ($row->getData('c_firstname')!=''?$row->getData('c_firstname'):'----');
        }else{
            return ($row->getData('firstname')!=''?$row->getData('firstname'):'----');
        }
    }
}

appcodeHmNewslettersBlockNewsletterAdminhtmlTemplateGridRenderer
– Customerlastname.php

<?php
namespace HmNewslettersBlockNewsletterAdminhtmlTemplateGridRenderer;
use MagentoFrameworkDataObject;
class Customerlastname extends MagentoBackendBlockWidgetGridColumnRendererAbstractRenderer
{
    public function render(MagentoFrameworkDataObject $row)
    {
        if($row->getData('type')==1){
            return ($row->getData('c_lastname')!=''?$row->getData('c_lastname'):'----');
        }else{
            return ($row->getData('lastname')!=''?$row->getData('lastname'):'----');
        }
    }
}

Hope this will work for you……


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

Leave a Comment