Enviar un nodo entero por correo electrónico (incluidos los contenidos de la plantilla)


9

He creado mi propio archivo node.tpl.php personalizado. Ahora quiero enviar un correo electrónico a todo el nodo, cada vez que el usuario crea un nuevo nodo de ese tipo de contenido (me he asegurado de que todo el HTML en mi archivo node.tpl.php sea compatible con el correo electrónico).

¿Cómo puedo hacer esto? Idealmente, me gustaría que el correo electrónico vaya automáticamente a una dirección de correo electrónico específica cuando se guarde el nodo.

He descubierto que una combinación de Reglas y Correo HTML puede lograr lo que quiero. Excepto ... Al crear una acción de regla, no existe la opción de enviar por correo electrónico todo el nodo (incluido el tema node.tpl.php). Reglas solo da la opción de enviar por correo electrónico campos de nodo específicos (sin ellos).

Cualquier sugerencia sería muy apreciada!

Respuestas:


20

Aquí hay otro enfoque. (El código está disponible en este sandbox ).

nodemail.info

name = Nodemail
description = Sends node e-mails.
core = 7.x

nodemail.install '

<?php
function nodemail_enable() {
  $current = variable_get('mail_system', array('default-system' => 'DefaultMailSystem'));
  $addition = array('nodemail' => 'NodemailMailSystem');
  variable_set('mail_system', array_merge($current, $addition));
}

function nodemail_disable() {
  $mail_system = variable_get('mail_system', array('default-system' => 'DefaultMailSystem'));
  unset($mail_system['nodemail']);
  variable_set('mail_system', $mail_system);
}

nodemail.module

<?php
class NodemailMailSystem extends DefaultMailSystem {
  public function format(array $message) {
    $message['body'] = implode("\n\n", $message['body']);
    $message['body'] = drupal_wrap_mail($message['body']);
    return $message;
  }
}

function nodemail_mail($key, &$message, $params) {
  switch ($key) {
    case 'node_mail':
      $message['headers']['Content-Type'] = 'text/html; charset=UTF-8;';
      $message['subject'] = $params['subject'];
      $message['body'][] = $params['body'];
      break;
  }
}

function nodemail_node_insert($node) {
  if ($node->type == 'mycontenttype') {
    $params['subject'] = 'Node "' . $node->title . '" was created';
    $params['body'] = render(node_view($node));
    $to = variable_get('site_mail', '');
    $from = 'noreply@example.com';
    $lang = language_default();
    drupal_mail('nodemail', 'node_mail', $to, $lang, $params, $from);
  }
}

El contenido del archivo de instalación y la clase NodemailMailSystem se utilizan para permitir que este módulo envíe correos electrónicos html. Las otras 2 funciones son implementaciones de hook_mail () y hook_node_insert () que se ocupan de enviar los correos electrónicos cuando mycontenttypese crea un nodo de . Una cosa que deberá tener en cuenta es que Drupal utilizará el archivo de plantilla de nodo del tema que se está utilizando para las páginas de creación de nodo (o el nodo central.tpl.php si el tema no lo tiene) para la vista de nodo . También puede consultar las funciones node_view () y drupal_mail () que se utilizan aquí. Todo esto debería funcionar con la funcionalidad principal de Drupal 7 (no se necesitan módulos contribuidos).


¡Gracias! Eso funciona excepto ... En mi sitio, la plantilla para un nodo cambia de acuerdo con el término de taxonomía. Entonces, si el usuario etiqueta el nodo con el término 1, la plantilla 1 se usa para representar el nodo. (consulte drupal.stackexchange.com/questions/23688/… ). Cuando uso su código, solo se usa el archivo node.tpl.php predeterminado (y no la plantilla que se usa para representar el nodo). ¿Hay alguna forma de arreglar esto? (Perdón si parezco una molestia por no mencionar esto antes, pensé que no sería un problema porque el nodo representado contiene la plantilla).
big_smile

@big_smile El problema es probablemente lo que mencioné en mi respuesta: el tema de administración que se está utilizando para la creación de nodos. Posibles soluciones que se me ocurren actualmente: 1) use su tema predeterminado para la edición / creación de contenido (desmarque la casilla de verificación en 'admin / apariencia') 2) copie el código necesario de template.php y las plantillas de nodo a la carpeta del tema de administración y borrar cachés 3) crear plantillas personalizadas en su módulo para los correos electrónicos.
Madis

6

Podría crear un token que fuera el nodo representado o crear una acción de Reglas personalizada que enviará el nodo representado.

Quieres mirar

$build = node_view($node);
$html = render($build);

Actualizado con código

Este código muestra cómo agregar una propiedad a todos los nodos a los que se puede hacer accesible en las reglas. He creado este un módulo llamadogoogletorp

/**
 * Implements hook_entity_property_info_alter().
 */
function googletorp_entity_property_info_alter(&$info) {
  // Add the current user's shopping cart to the site information.
  $info['node']['properties']['rendered_node'] = array(
    'label' => t("Rendered_node"),
    'description' => t('The full rendered node.'),
    'getter callback' => 'googletorp_render_node',
  );
}

/**
 * Return a rendered node as HTML.
 */
function googletorp_render_node($node) {
  return render(node_view($node));
}

La primera función es un enlace que agrega la propiedad al nodo, donde en una devolución de llamada se define para proporcionar los datos. La segunda función es la devolución de llamada real que devuelve el nodo representado.

Para que esto funcione, debe instalar el módulo de tokens de entidad que forma parte del módulo de API de entidad , pero de todos modos esto es requerido por las reglas.


Gracias, eso es exactamente lo que necesito. ¿Pero cómo haces eso? He descargado Reglas y Token, pero no hay opciones para enviar el nodo representado.
big_smile

@big_smile Tendrías que crear esta funcionalidad tú mismo, hay varias formas de hacerlo.
googletorp

Gracias por tomarse el tiempo para responder. Para ser sincero, sus respuestas no son muy útiles. Si supiera cómo crear la funcionalidad yo mismo, no estaría haciendo una pregunta. Obviamente, no espero que publique la respuesta completa. Sin embargo, sería útil si se pudiera proporcionar enlaces a recursos que elaboran sobre cómo realizar sus sugerencias,
big_smile

2
@big_smile ¿Entonces me votaste mal porque no te di de comer a mano? ¿Has probado google, has probado la página de inicio del proyecto? Encontré extensos documentos de Reglas en 30 segundos, estoy seguro de que puede hacer lo mismo. No seas perezoso
googletorp

1
No soy flojo y no espero que me alimenten. Su respuesta fue muy vaga y no implica en absoluto que la respuesta se pueda encontrar en el documento de Reglas. De hecho, "Habría creado esta funcionalidad usted mismo" implica que tendría que producir algo que esté fuera de las Reglas. Es por eso que rechacé su respuesta: era demasiado vago para ser útil. Sin embargo, al mirar su perfil, puedo ver que es muy útil y, en base a esto, no creo que haya sido su intención ser vago. No pensé que el voto negativo sería muy molesto. Lo revertiría si pudiera. Espero que no haya resentimientos.
big_smile

1

Otra opción sería usar mi módulo Entity2Text (DRupal 7).

En este momento da un token "textexport" para cada modo de visualización de una entidad. Esto funciona bien para muchos tipos de campos, pero tiene algunos problemas más complejos como el campo de dirección.

También voy a agregar "htmlexport". Si desea probar eso, eche un vistazo a esta rama: http://drupalcode.org/project/entity2text.git/shortlog/refs/heads/7.x-1-htmlexport

Aún tendría que usar Reglas y MimeMail (o probablemente htmlmail mencionado anteriormente).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.