Agregar un campo personalizado al módulo de suscripción de Magento
newsletter subscription (4)
Hay algunas cosas que debe tener en cuenta para que esto funcione:
- Agregue una nueva columna para sus datos a la tabla de base de datos apropiada
- Asegúrate de que magento guarda tu nuevo campo en la base de datos
- Presente los datos en el backend de administración
- Registre los datos cuando obtiene una nueva suscripción al boletín
Así es como puedes hacer todas esas cosas:
Anuncio. 1)
Usando phpMyAdmin, mySQL línea de comando, o cualquiera que sea su método preferido de manipulación de bases de datos, agregue una nueva columna "country" como, por ejemplo, varchar (100) a la tabla newsletter_subscriber.
Anuncio. 2)
Magento automáticamente le dará acceso al nuevo campo a través de los métodos getCountry () y setCountry () en el 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
(...)
}
Anuncio. 3)
Tendrá que 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 (). Debe agregar una llamada correspondiente para 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 aparezca al final de la grilla (como la última columna) agréguelo como la última llamada, de lo contrario, apriételo entre las llamadas existentes exactamente donde desea que termine en el administrador.
Anuncio. 4)
Esta es una parte que no tuve que hacer en mi personalización del boletín de magento, así que será principalmente teórico. 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 nuevo método de acción 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();
}
Pasar por los pasos anteriores debe ocuparse 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 Suscriptor, puede hacer lo que quiera con él. Realmente no entiendo lo que quieres decir con
ser enviado como un correo electrónico a un destinatario preestablecido
Si puedes explicar que intentaré ayudarte con esta parte también.
Editar - cómo enviar un correo cuando alguien se suscribe
Simplemente agregue el siguiente código al controlador después de la parte que agrega el país a un objeto del 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();
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 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 tiempo o una columna tipo sello 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.
Entonces, todo lo que tienes que hacer es agregar tus 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 ();
Hilo viejo, pero si alguien tiene la misma pregunta, hay una extensión gratuita, que agrega campos para el género, nombre y apellido y la pone a disposición en la cuadrícula de back-end para exportar a través de xml / csv: http://www.magentocommerce.com/ magento-connect / extended-newsletter-subscription-for-guests.html
Tal vez puedas extender el código para que se ajuste a tus necesidades.
Si desea agregar algunos campos personalizados para el suscriptor del boletín de Magento (por ejemplo, subscriber_name ), debe hacer lo siguiente:
- Agregar una nueva columna para la tabla
newsletter_subscriber
- Agregar entrada de texto a la plantilla del boletín
- Crear observador para newsletter_subscriber_save_antes del evento
En el observador, puede obtener el valor de su campo personalizado de la solicitud y asignarlo al objeto del 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 que explica cómo agregar el campo País. También creé un módulo gratuito, está disponible en el GitHub.