Pregunta

El módulo de suscripción al boletín en Magento tiene un solo campo (e-mail) de forma predeterminada. Después agrego un campo adicional a la forma (por ejemplo país), ¿cómo puedo obtener los datos del formulario a aparecer en el back-end de Magento y ser enviados como un correo electrónico a un destinatario predefinido? Gracias.

¿Fue útil?

Solución

Hay algunas cosas que usted necesita para cuidar de hacer este trabajo:

  1. Añadir una nueva columna para sus datos a la tabla de base de datos adecuada
  2. Asegúrese de que Magento guarda su nuevo campo a la base de datos
  3. presentar los datos en la administración de back-end
  4. Grabar los datos cuando se obtiene un nuevo boletín de suscripción

Así es como se puede hacer todas esas cosas:

Ad. 1)

El uso de phpMyAdmin, la línea de comandos de MySQL, o lo que es su método de manipulación DB preferido, agregar una nueva columna "país" como, por ejemplo, varchar (100) a la mesa newsletter_subscriber.

Ad. 2)

Magento automaticamente le dará acceso al nuevo campo a través de la getCountry () y setCountry () métodos del objeto Mage_Newsletter_Model_Subscriber. La única cosa que no hará es guardar su espalda campo a la base de datos después de que se ha cambiado con alguna parte de código en el sistema. Para conseguirlo salvó necesita modificar _prepareSave (Mage_Newsletter_Model_Subscriber $ abonado) la función encuentra en Mage_Newsletter_Model_Mysql4_Subscriber (app / código / core / Mago / Noticias / modelo / MySQL4 / Subscriber.php). Asegúrese de hacer una copia local del archivo primero y no modificar el archivo del núcleo Esto es lo que hay que añadir:.

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
    (...)
}

Ad. 3)

Se tendrá que modificar ( una copia local de ) del archivo app / código / core / Mago / Adminhtml / Bloquear / Noticias / suscriptor / Grid.php. El método que busca se llama _prepareColumns (). Allí verá una serie de llamadas a $ this-> addColumn (). Es necesario añadir una llamada correspondiente a su campo "País" con el siguiente código:

$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'   =>    '----'
));

Si desea que el campo para que aparezca al final de la red (como la última columna) añadirlo como la última llamada, de lo contrario apretar entre las llamadas existentes exactamente donde desea que termine en el admin.

Ad. 4)

Esta es una parte que no tenía que hacer en mi personalización del boletín Magento, por lo que será prácticamente teórica. La suscripción se produce en el controlador situado en app / código / core / Mago / Newsletter / controladores / SubscriberController.php. Aquí está el código del método accionnuevo con mis cambios propuestos:

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

El paso por los pasos anteriores debe hacerse cargo de la mayor parte de su problema. Quisiera saber cómo esa última parte resuelto, ya que no tuve la oportunidad de probarlo.

Una vez que tenga su campo adicional en el objeto de abonado que puede hacer lo que quiera con él. Yo realmente no entiendo lo que quiere decir con

  

se enviará como un correo electrónico a un destinatario predefinido

Si se puede explicar que voy a tratar de ayudarle con esta parte también.

Editar - cómo enviar un correo electrónico cuando alguien se suscribe

Sólo tiene que añadir el siguiente código al controlador después de la parte que añade país a un objeto de suscriptor.

$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(); 

Otros consejos

Si desea agregar algunos campos personalizados para Magento boletín abonado (por ejemplo, subscriber_name ), debe hacer lo siguiente:

  • Añadir nueva columna para la tabla newsletter_subscriber
  • Añadir entrada de texto al boletín de plantilla
  • Crear observador de newsletter_subscriber_save_before evento

En el observador puede obtener el valor de su campo personalizado de la petición y asignarlo al objeto de suscriptor:

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

    $subscriber->setSubscriberName($name);

    return $this;
}


Actualizar :

Aquí está el artículo detallado explicando cómo añadir País campo Además, he creado un módulo libre, que está disponible en el GitHub

Añadir a la respuesta aceptada, también puede salirse con esto un poco más fácil si va a añadir una fecha, la fecha y hora columna o tipo de marca de tiempo.

En mi caso, quería añadir un "suscrito en fecha" a mi red. Para ello, escribí mi script de actualización, el tipo de columna que se está TIMESTAMP y el valor por defecto ser CURRENT_TIMESTAMP. De esta manera, cuando se añade la fila, la fecha / hora actual es registrado.

A continuación, todo lo que tiene que hacer es añadir las personalizaciones de bloque. Yo sugeriría hacerlo mediante la ampliación de bloque de la rejilla de Magento en lugar de hacer la anulación codepool local, sin embargo. De esta manera, sólo tendrá que reemplazar _prepareColumns ();

Antiguo pero si alguien tiene la misma pregunta, hay una extensión libre, que agrega campos de género, nombre y apellido y la hace disponible en la red back-end para la exportación a través de XML / CSV: http://www.magentocommerce.com/magento-connect/extended-newsletter-subscription- para-guests.html

Tal vez usted puede extender el código para satisfacer sus necesidades.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top