Gửi email toàn bộ nút (Bao gồm nội dung mẫu)


9

Tôi đã tạo tập tin node.tpl.php tùy chỉnh của riêng tôi. Bây giờ tôi muốn gửi email cho toàn bộ nút, mỗi lần người dùng tạo một nút mới của loại nội dung đó (tôi đã đảm bảo rằng tất cả các HTML trong tệp node.tpl.php của tôi đều thân thiện với email).

Tôi có thể làm cái này như thế nào? Lý tưởng nhất là tôi muốn email tự động đến một địa chỉ email cụ thể khi nút được lưu.

Tôi đã thấy rằng sự kết hợp giữa Quy tắcThư HTML có thể đạt được những gì tôi muốn. Ngoại trừ ... Khi tạo một hành động quy tắc, không có tùy chọn gửi email cho toàn bộ nút (bao gồm cả chủ đề node.tpl.php). Các quy tắc chỉ cung cấp tùy chọn để gửi email các trường nút cụ thể (không có chủ đề).

Bất kỳ đề xuất sẽ được đánh giá cao nhất!

Câu trả lời:


20

Đây là một cách tiếp cận khác. (Mã có sẵn trong hộp cát này .)

gật đầu.info

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

gật đầu.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);
}

gật đầu.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);
  }
}

Nội dung tệp cài đặt và lớp NodemailMailSystem được sử dụng để cho phép mô-đun này gửi e-mail html. Hai chức năng khác là triển khai hook_mail ()hook_node_insert () liên quan đến việc gửi e-mail khi một nút của mycontenttypeđược tạo. Một điều bạn sẽ phải lưu ý là Drupal sẽ sử dụng tệp mẫu nút của chủ đề đang được sử dụng cho các trang tạo nút (hoặc lõi node.tpl.php nếu chủ đề không có) cho chế độ xem nút . Bạn cũng có thể muốn kiểm tra các hàm node_view ()drupal_mail () được sử dụng ở đây. Toàn bộ điều này nên hoạt động với chức năng lõi 7 của Drupal (không cần mô-đun đóng góp).


Cảm ơn! Điều đó hoạt động ngoại trừ trên trang web của tôi, mẫu cho một nút thay đổi theo thuật ngữ phân loại. Vì vậy, nếu người dùng gắn thẻ nút có thuật ngữ 1, mẫu 1 được sử dụng để kết xuất nút. (xem drupal.stackexchange.com/questions/23688/õ ). Khi tôi sử dụng mã của bạn, chỉ có tệp node.tpl.php mặc định được sử dụng (chứ không phải mẫu được sử dụng để hiển thị nút). Có cách nào để khắc phục điều này? (Xin lỗi nếu tôi có vẻ phiền toái vì đã không đề cập đến vấn đề này sớm hơn - tôi nghĩ đó không phải là vấn đề vì nút kết xuất có chứa mẫu).
big_smile

@big_smile Vấn đề có lẽ là những gì tôi đã đề cập trong câu trả lời của mình: chủ đề quản trị viên đang được sử dụng để tạo nút. Các bản sửa lỗi có thể có mà tôi có thể nghĩ đến hiện tại: 1) sử dụng chủ đề mặc định của bạn để chỉnh sửa / tạo nội dung (bỏ chọn hộp kiểm trong 'admin / ngoại hình') 2) sao chép mã cần thiết từ template.php và các mẫu nút vào thư mục chủ đề quản trị viên và xóa bộ nhớ cache 3) tạo các mẫu tùy chỉnh trong mô-đun của bạn cho e-mail.
Madis

6

Bạn có thể tạo mã thông báo là nút được kết xuất hoặc tạo hành động Quy tắc tùy chỉnh sẽ gửi nút được kết xuất.

Bạn muốn nhìn vào

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

Cập nhật bằng mã

Mã này cho thấy cách thêm một thuộc tính cho tất cả các nút có thể truy cập được theo quy tắc. Tôi đã tạo ra một mô-đun gọi là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));
}

Hàm đầu tiên là một hook thêm thuộc tính vào nút, trong đó trong một cuộc gọi lại được xác định để cung cấp dữ liệu. Hàm thứ hai là hàm gọi lại thực tế trả về nút được kết xuất.

Để làm việc này, bạn cần cài đặt mô-đun mã thông báo thực thể là một phần của mô-đun API thực thể , nhưng dù sao thì điều này cũng được yêu cầu bởi quy tắc.


Cảm ơn - đó chính xác là những gì tôi cần. Nhưng làm thế nào để bạn làm điều đó? Tôi đã tải xuống Rules and Token, nhưng không có tùy chọn nào để gửi nút kết xuất.
big_smile

@big_smile Bạn sẽ phải tự tạo chức năng này - có một số cách để thực hiện việc này.
googletorp

Cảm ơn đã dành thời gian để trả lời. Thành thật mà nói, câu trả lời của bạn không hữu ích lắm. Nếu tôi biết cách tự tạo chức năng, tôi sẽ không đặt câu hỏi. Rõ ràng, tôi không mong đợi bạn đăng câu trả lời đầy đủ. Tuy nhiên, sẽ rất hữu ích nếu bạn có thể cung cấp các liên kết đến các tài nguyên chi tiết về cách thực hiện các đề xuất của bạn,
big_smile

2
@big_smile Vì vậy, bạn downvote tôi vì tôi không cho bạn ăn? Bạn đã thử google, bạn đã thử trang chủ dự án chưa? Tôi đã tìm thấy các tài liệu Quy tắc mở rộng trong 30 giây, tôi chắc chắn bạn có thể làm như vậy. Đừng lười biếng.
googletorp

1
Tôi không lười biếng và không mong được cho ăn. Câu trả lời của bạn rất mơ hồ và hoàn toàn không ngụ ý rằng câu trả lời có thể được tìm thấy trong tài liệu Rules. Trên thực tế, "Bạn sẽ tự tạo chức năng này" ngụ ý rằng tôi sẽ phải sản xuất một thứ nằm ngoài Quy tắc. Đây là lý do tại sao tôi đánh giá thấp câu trả lời của bạn - nó quá mơ hồ để có ích. Tuy nhiên, nhìn vào hồ sơ của bạn, tôi có thể thấy bạn rất hữu ích và dựa trên điều này tôi không nghĩ rằng đó là ý định mơ hồ của bạn. Tôi đã không nghĩ rằng việc bỏ phiếu sẽ rất khó chịu. Tôi sẽ đảo ngược nó nếu tôi có thể. Tôi hy vọng không có cảm giác khó khăn.
big_smile

1

Một tùy chọn khác sẽ là sử dụng mô-đun Entity2Text của tôi (DRupal 7).

Ngay bây giờ, nó cung cấp mã thông báo "textexport" cho mọi Chế độ xem của thực thể. Điều này hoạt động tốt cho nhiều loại trường nhưng có một số vấn đề phức tạp hơn như Trường địa chỉ.

Tôi cũng sẽ thêm "htmlexport". Nếu bạn muốn dùng thử, hãy kiểm tra chi nhánh này: http://drupalcode.org/project/entity2text.git/shortlog/refs/heads/7.x-1-htmlexport

Bạn vẫn sẽ phải sử dụng Rules và MimeMail (hoặc có thể là htmlmail đã đề cập ở trên).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.