2010-07-01 32 views
8

El módulo de suscripción al boletín en Magento tiene solo un campo (correo electrónico) por defecto. Después de agregar un campo adicional al formulario (por ejemplo, país), ¿cómo puedo obtener los datos del formulario para que se muestren en el backend de Magento y se envíen como un correo electrónico a un destinatario preestablecido? Gracias.Agregando un campo personalizado al módulo de suscripción de Magento

Respuesta

22

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

  1. agregar 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 el administrador de backend
  4. registrar los datos cuando se obtiene una nueva suscripción al boletín

Así es cómo puede hacer todas estas cosas:

Ad. 1)

Usando phpMyAdmin, mySQL línea de comando, o lo que sea su método preferido de manipulación de base de datos, agregue una nueva columna "país" como, por ejemplo, varchar (100) a la tabla newsletter_subscriber.

Ad. 2)

Magento automaticly dará acceso al nuevo campo a través de la getCountry() y setCountry() métodos del objeto Mage_Newsletter_Model_Subscriber. Lo único que no hará es guardar su campo de nuevo en el DB después de haber sido cambiado con el código en algún lugar del sistema. Para que se guarde, debe modificar la función _prepareSave (Mage_Newsletter_Model_Subscriber $ subscriber) que se encuentra en Mage_Newsletter_Model_Mysql4_Subscriber (app/code/core/Mage/Newsletter/Model/Mysql4/Subscriber.php). Asegúrese de hacer primero una copia local del archivo y no modificar el archivo central. Esto es lo que necesita agregar:

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)

Deberá modificar (una copia local de) la aplicación de archivo/code/core/Mage/Adminhtml/Block/Newsletter/Subscriber/Grid.php. El método que está buscando se llama _prepareColumns(). Allí verá una serie de llamadas a $ this-> addColumn(). Es necesario añadir una llamada correspondiente para el 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 aparezca al final de la red (como la última columna) agregarlo como la última llamada , de lo contrario, exprímalo entre las llamadas existentes exactamente donde desea que termine en el administrador.

Ad. 4)

Ésta 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 ubicado en la aplicación/code/core/Mage/Newsletter/controllers/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. Déjame saber cómo funcionó esa última parte, ya que no tuve la oportunidad de probarla.

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

ser enviados como un correo electrónico a un destinatario predefinido

Si 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

Apenas añada 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("[email protected]") 
->addTo("[email protected]") 
->setSubject("Your Subject here"); 
$mail->send(); 
+0

gracias por una respuesta brillante. 'ser enviado como un correo electrónico ..' significa que me gustaría que la información del suscriptor (el correo electrónico y el país en este caso) se envíe como un correo electrónico al administrador (digamos [email protected]), así que tengo la información agregada a la base de datos y enviada como un correo electrónico también.gracias – pixeltocode

+0

no hay una función _prepareSave en el archivo que mencionaste ... Estoy usando 1.4.0.1 ... o me falta algo? –

+0

También me falta la función _prepareSave. No puedo encontrarlo en ningún lugar dentro de la aplicación/código/ – iamjonesy

33

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

  • Añadir nueva columna para newsletter_subscriber mesa
  • Añadir texto entrada al boletín plantilla
  • Crear observador para newsletter_subscriber_save_antes de 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; 
} 


ACTUALIZACIÓN:

Aquí está el artículo detallado explicando how to add Country field Además, he creado un módulo gratuito, está disponible en el GitHub

+3

Esta solución es más simple, debería ser recompensada. IMHO – MANCHUCK

+0

Esta es definitivamente la solución ... ¿qué código tiene que entrarse en config.xml para que funcione? Sé que comienza con frontend> \t \t \t \t \t \t \t \t \t pero no puedo trabajar en lo que la siguiente parte es .. –

+0

¿Qué versión de Magento es esto? No puedo encontrar ningún evento para una acción de suscripción. –

0

Agregando a la respuesta aceptada, también puede salirse con la suya un poco más fácil si está agregando una fecha, una fecha de hora o una columna de tipo de marca de tiempo.

En mi caso, quería agregar un "Suscrito en la fecha" a mi grilla. Para hacer esto, escribí mi script de actualización, el tipo de columna siendo TIMESTAMP y el valor predeterminado siendo CURRENT_TIMESTAMP. De esta forma, cuando se agrega la fila, se registra la fecha/hora actual.

Luego, todo lo que tiene que hacer es agregar sus personalizaciones de bloques. Sugiero hacerlo ampliando el bloque de cuadrícula de Magento en lugar de hacer la anulación de la lista de códigos local. De esta manera, solo tiene que anular _prepareColumns();

Cuestiones relacionadas