添加自定义字段到Magento的订阅模块

fumotvh3  于 2022-11-12  发布在  其他
关注(0)|答案(5)|浏览(185)

Magento中的新闻订阅模块默认只有一个字段(email)。在我添加了一个额外的字段到表单(比如国家)后,我如何才能让表单数据显示在Magento后端并以电子邮件的形式发送给预设的收件人呢?谢谢。

gojuced7

gojuced71#

如果您想为Magento新闻通讯订阅者添加一些自定义字段(例如subscriber_name),您应该执行以下操作:

  • newsletter_subscriber表添加新列
  • 将文本输入添加到新闻稿模板
  • newsletter_subscriber_保存_before事件创建观察者

在观察器中,您可以从请求中获取自定义字段的值,并将其分配给订阅者的对象:

public function newsletterSubscriberSave(Varien_Event_Observer $observer)
{
    $subscriber = $observer->getEvent()->getSubscriber();
    $name = Mage::app()->getRequest()->getParam('subscriber_name');

    $subscriber->setSubscriberName($name);

    return $this;
}

更新

这里是详细的文章解释how to add Country field此外,我已经创建了一个免费的模块,它可以在GitHub

qkf9rpyu

qkf9rpyu2#

要使其正常工作,您需要注意以下几点:
1.将数据的新列添加到相应的数据库表中
1.确保Magento将新字段保存到数据库中
1.在管理后端显示数据
1.在订阅新的新闻通讯时记录数据
以下是您可以完成所有这些任务的方法:
附件1)
使用phpMyAdmin、MySQL命令行或任何您喜欢的DB操作方法,向newsletter_subscriber表添加一个新列“country”,比如说varchar(100)。
第2段)
Magento将自动为您提供通过 getCountry访问新字段的权限() 与 * 设置国家/地区 Mage _Newsletter_Model_Subscriber对象上的()* 方法。它唯一不会做的事情是在系统中的某个地方用代码更改字段后将其保存回DB。要保存它,您需要modify _prepareSave在Mage_Newsletter_Model_Mysql4_Subscriber中找到的( Mage _Newsletter_Model_Subscriber $订阅者)函数(app/code/core/Mage/Newsletter/Model/Myql4/Subscriber.php).**请务必先制作该文件的本地副本,而不要修改核心文件。**此处'你需要补充的是:

protected function _prepareSave(Mage_Newsletter_Model_Subscriber $subscriber)
{
    $data = array();
    $data['customer_id'] = $subscriber->getCustomerId();
    $data['store_id'] = $subscriber->getStoreId()?$subscriber->getStoreId():0;
    $data['subscriber_status'] = $subscriber->getStatus();
    $data['subscriber_email']  = $subscriber->getEmail();
    $data['subscriber_confirm_code'] = $subscriber->getCode();

    //ADD A NEW FIELD START

    //note that the string index for the $data array
    //must match the name of the column created in step 1
    $data['country'] = $subscriber->getCountry();

    //ADD A NEW FIELD END
    (...)
}

第3段)
你需要修改文件app/code/core/ Mage /Adminhtml/Block/Newsletter/Subscriber/Grid.php.你要找的方法叫做_prepareColumns().在这里你会看到一系列对$this-〉addColumn()的调用.你需要用下面的代码为你的“Country”字段添加一个相应的调用:

$this->addColumn('country', array(
    'header'    => Mage::helper('newsletter')->__('Country'),
    //the index must match the name of the column created in step 1
    'index'     => 'country',
    'default'   =>    '----'
));

如果您希望该字段显示在网格的末尾(作为最后一列),请将其添加为最后一次调用,否则,请将其挤压在现有调用之间,使其恰好位于您希望其在管理中结束的位置。
第4段)
这是我在定制Magento时事通讯时没有做的一部分,所以它主要是理论上的。订阅发生在控制器中,位于app/code/core/Mage/Newsletter/controllers/SubscriberController.php。以下是newAction方法的代码,以及我建议的修改:

public function newAction()
{
    if ($this->getRequest()->isPost() && $this->getRequest()->getPost('email')) {
        $session   = Mage::getSingleton('core/session');
        $email     = (string) $this->getRequest()->getPost('email');

        try {
            if (!Zend_Validate::is($email, 'EmailAddress')) {
                Mage::throwException($this->__('Please enter a valid email address'));
            }

            $status = Mage::getModel('newsletter/subscriber')->subscribe($email);
            if ($status == Mage_Newsletter_Model_Subscriber::STATUS_NOT_ACTIVE) {
                $session->addSuccess($this->__('Confirmation request has been sent'));
            }
            else {
                $session->addSuccess($this->__('Thank you for your subscription'));
            }

                //ADD COUNTRY INFO START

                //at this point we may safly assume that subscription record was created
                //let's retrieve this record and add the additional data to it
                $subscriber = Mage::getModel('newsletter/subscriber')->loadByEmail($email);

                //assuming that the input's id is "country"
                $subscriber->setCountry((string) $this->getRequest()->getPost('country'));

                //don't forget to save the subscriber!
                $subscriber->save();

                //ADD COUNTRY INFO END
        }
        catch (Mage_Core_Exception $e) {
            $session->addException($e, $this->__('There was a problem with the subscription: %s', $e->getMessage()));
        }
        catch (Exception $e) {
            $session->addException($e, $this->__('There was a problem with the subscription'));
        }
    }
    $this->_redirectReferer();
}

通过以上步骤应该可以解决你的大部分问题。让我知道最后一部分是如何解决的,因为我没有机会测试它。
一旦在Subscriber对象中有了附加字段,您就可以对它做任何您想做的事情了。
作为电子邮件发送到预设收件人
如果你能解释一下,我也会试着帮你解决这个问题。

编辑-如何在有人订阅时发送邮件

只需将以下代码添加到控制器中将国家添加到订阅者对象的部分之后。

$mail = new Zend_Mail();
$mail->setBodyHtml("New subscriber: $email <br /><br />Country: ".$this->getRequest()->getPost('country'));
$mail->setFrom("youremail@email.com")
->addTo("admin@mysite.com")
->setSubject("Your Subject here");
$mail->send();
ozxc1zmp

ozxc1zmp3#

如果您要添加日期、日期时间或时间戳类型的列,那么除了已接受的答案之外,还可以更容易地完成此操作。
在我的例子中,我想在我的网格中添加一个“Subscribed at Date”。为此,我编写了升级脚本,列类型为TIMESTAMP,默认值为CURRENT_TIMESTAMP。这样,当添加行时,将记录当前日期/时间。
然后,你所要做的就是添加你的块定制。我建议你通过扩展Magento的网格块来做,而不是覆盖本地代码池。这样,你只需要覆盖_prepareColumns();

odopli94

odopli944#

旧线程,但如果有人有同样的问题,有一个免费的扩展,添加字段的性别,名字和姓氏,并使其在后端网格中可用,以通过xml/csv导出:http://www.magentocommerce.com/magento-connect/extended-newsletter-subscription-for-guests.html
也许您可以扩展代码以满足您的需要。

oalqel3c

oalqel3c5#

这是对任何安装了Ebizmarts_MailChimp扩展的人的警告。
这是一个很好的扩展,但是它将subscriber_firstnamesubscriber_lastname添加到了newsletter_subscriber表中。
如果您打算创建这些字段,您应该“要求”Ebizmarts_MailChimp扩展,或者在您的扩展创建它们之前检查这些字段是否存在。
相反,如果您已经创建了这些字段,并希望在创建完这些字段后安装Ebizmarts_MailChimp扩展,则必须在安装过程中注解掉这两个字段的addColumn代码。

相关问题