전체 노드를 이메일로 전송 (템플릿 내용 포함)


9

내 자신의 사용자 정의 node.tpl.php 파일을 만들었습니다. 이제 사용자가 해당 컨텐츠 유형의 새 노드를 작성할 때마다 전체 노드를 이메일로 보내려고합니다 (노드 .tpl.php 파일의 모든 HTML이 이메일 친화적임을 확인했습니다).

어떻게해야합니까? 이상적으로는 노드가 저장 될 때 이메일이 자동으로 특정 이메일 주소로 가고 싶습니다.

나는 규칙HTML 메일 의 조합이 내가 원하는 것을 달성 할 수 있음을 발견했다 . 예외 ... 규칙 작업을 생성 할 때 전체 노드 (node.tpl.php 테마 포함)를 이메일로 보낼 수있는 옵션이 없습니다. 규칙은 테마없이 특정 노드 필드를 전자 메일로 보내는 옵션 만 제공합니다.

어떤 제안이라도 가장 감사하겠습니다!

답변:


20

다른 접근법이 있습니다. ( 이 샌드 박스 에서 코드를 사용할 수 있습니다 .)

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

설치 파일 내용 및 NodemailMailSystem 클래스는이 모듈이 html 전자 우편을 보낼 수 있도록하는 데 사용됩니다. 다른 두 가지 함수는 의 노드 가 생성 될 때 전자 메일 보내기를 처리하는 hook_mail ()hook_node_insert ()의 구현입니다 mycontenttype. 주목해야 할 것은 Drupal은 노드 뷰에 노드 생성 페이지 (또는 테마가없는 경우 코어 node.tpl.php)에 사용되는 테마의 노드 템플릿 파일을 사용한다는 것입니다. . 여기에 사용 된 node_view ()drupal_mail () 함수 를 점검 할 수도 있습니다. 이 모든 것이 Drupal 7 핵심 기능과 함께 작동해야합니다 (기여 된 모듈이 필요하지 않음).


감사! 내 사이트에서 노드의 템플리트가 분류 용어에 따라 변경됩니다. 따라서 사용자가 노드에 용어 1을 태그하면 템플릿 1이 노드를 렌더링하는 데 사용됩니다. ( drupal.stackexchange.com/questions/23688/… 참조 ). 코드를 사용할 때 기본 node.tpl.php 파일 만 사용되며 노드를 렌더링하는 데 사용되는 템플릿은 사용되지 않습니다. 이 문제를 해결할 방법이 있습니까? (이것에 대해 언급하지 않아서 성가신 것 같으면 렌더링 된 노드에 템플릿이 포함되어 있기 때문에 문제가되지 않을 것이라고 생각했습니다).
big_smile

@big_smile 문제는 아마도 내 대답에서 언급 한 것입니다 : 노드 생성에 사용되는 관리자 테마. 현재 생각할 수있는 수정 사항 : 1) 컨텐츠 편집 / 생성을 위해 기본 테마를 사용하십시오 ( 'admin / appearance'의 확인란을 선택 취소하십시오) 2) 필요한 코드를 template.php 및 노드 템플릿에서 관리자 테마 폴더로 복사하십시오. 캐시 지우기 3) 모듈에서 전자 메일에 대한 사용자 지정 템플릿을 만듭니다.
Madis

6

렌더링 된 노드 인 토큰을 만들거나 렌더링 된 노드를 보낼 사용자 지정 규칙 작업을 만들 수 있습니다.

당신은보고 싶어

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

코드로 업데이트

이 코드는 규칙에서 액세스 할 수있는 모든 노드에 특성을 추가하는 방법을 보여줍니다. 이 모듈을 만들었습니다.googletorp

/**
 * 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));
}

첫 번째 함수는 노드에 속성을 추가하는 후크입니다. 콜백에서 데이터를 제공하도록 정의됩니다. 두 번째 함수는 렌더링 된 노드를 반환하는 실제 콜백입니다.

이것이 작동하려면 엔티티 API 모듈 의 일부인 엔티티 토큰 모듈을 설치해야 하지만, 어쨌든 규칙에 필요합니다.


고마워-정확히 내가 필요한 것입니다. 하지만 어떻게합니까? Rules and Token을 다운로드했지만 렌더링 된 노드를 전송하는 옵션이 없습니다.
big_smile

@big_smile이 기능을 직접 만들어야합니다. 여러 가지 방법이 있습니다.
googletorp

답장을 보내 주셔서 감사합니다. 솔직히 말하면 귀하의 답변은별로 도움이되지 않습니다. 기능을 직접 만드는 방법을 알고 있다면 질문하지 않을 것입니다. 분명히, 나는 당신이 전체 답변을 게시 할 것으로 기대하지 않습니다. 그러나 제안을 수행하는 방법을 자세히 설명하는 리소스에 대한 링크를 제공 할 수 있다면 도움이 될 것입니다.
big_smile

2
@big_smile 그래서 내가 당신에게 손을 먹이지 않았기 때문에 당신은 저를 downvote? Google을 사용해 보셨습니까, 프로젝트 홈페이지를 사용해 보셨습니까? 30 초 만에 광범위한 규칙 문서를 찾았습니다. 동일한 작업을 수행 할 수 있습니다. 게으르지 마십시오.
googletorp

1
나는 게으르지 않으며 먹이를 기대하지 않습니다. 귀하의 답변은 매우 모호하며 규칙 문서에서 답변을 찾을 수 있음을 의미하지 않습니다. 사실, "이 기능을 직접 만들었을 것"은 규칙 외부에있는 것을 만들어야한다는 것을 의미합니다. 이것이 내가 당신의 대답을 내리는 이유입니다. 너무 모호해서 도움이되지 못했습니다. 그러나 귀하의 프로필을 살펴보면 귀하가 매우 도움이된다는 것을 알 수 있으며,이를 바탕으로 모호한 의도라고 생각하지 않습니다. 나는 하락 투표가 매우 화를 낼 것이라고 생각하지 않았다. 내가 할 수 있다면 나는 그것을 뒤집을 것입니다. 나는 어려운 감정이 없기를 바랍니다.
big_smile

1

다른 옵션은 내 모듈 Entity2Text (DRupal 7)를 사용하는 것입니다.

현재 엔터티의 모든보기 모드에 대해 "텍스트 내보내기"토큰을 제공합니다. 이것은 많은 필드 유형에 효과적이지만 주소 필드와 같은 더 복잡한 유형에 문제가 있습니다.

"htmlexport"도 추가하겠습니다. 이 지점을 체크 아웃하려면 http://drupalcode.org/project/entity2text.git/shortlog/refs/heads/7.x-1-htmlexport

여전히 규칙과 MimeMail (또는 위에서 언급 한 htmlmail) 을 사용해야 합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.