simplenews_action.module in Simplenews 6
Same filename and directory in other branches
simplenews_action.inc Provide actions for simplenews.
File
simplenews_action/simplenews_action.moduleView source
<?php
/**
* @file simplenews_action.inc
* Provide actions for simplenews.
*
* @ingroup simplenews
*/
/*
* Implementation of hook_action_info()
*/
function simplenews_action_info() {
return array(
'simplenews_send_newsletter_action' => array(
'description' => t('Send single simplenews newsletter'),
'type' => 'simplenews',
'configurable' => TRUE,
'hooks' => array(
'cron' => array(
'run',
),
'user' => array(
'insert',
),
'simplenews' => array(
'subscribe',
),
),
),
'simplenews_cron_action' => array(
'description' => t('Send pending simplenews newsletters'),
'type' => 'simplenews',
'configurable' => FALSE,
'hooks' => array(
'cron' => array(
'run',
),
),
),
'simplenews_subscribe_user_action' => array(
'type' => 'simplenews',
'description' => t('Subscribe the user to a newsletter'),
'configurable' => TRUE,
'hooks' => array(
'user' => array(
'insert',
'update',
),
),
),
'simplenews_unsubscribe_user_action' => array(
'type' => 'simplenews',
'description' => t('Unsubscribe the user from a newsletter'),
'configurable' => TRUE,
'hooks' => array(
'user' => array(
'update',
'delete',
),
),
),
);
}
/**
* A configurable Drupal action. Send a simplenews newsletter.
* hook = cron: Send a newsletter to all subscribers.
* hook = user: Send a newsletter to the user who triggered the action.
*
* Available context:
* $context['nid'] newsletter id
* $context['title'] newsletter title
* $context['resend'] allow resending of a previously send newsletter
*
* @see simplenews_send_newsletter_action_form()
* @see simplenews_send_newsletter_action_submit()
*/
function simplenews_send_newsletter_action(&$object, $context = array()) {
if ($context['hook'] == 'cron' || $context['hook'] == 'user' || $context['hook'] == 'simplenews') {
// Determine newsletter receipients
$accounts = array();
if ($context['hook'] == 'user' || $context['hook'] == 'simplenews') {
$accounts[] = $context['account'];
}
// Get sent status of this newsletter. The global newsletter sent status is used not the sent status of individual emails.
$s_status = db_result(db_query("SELECT s_status FROM {simplenews_newsletters} WHERE nid = %d", $context['nid']));
// Send newsletter if resend is allowed OR newsletter is not yet send.
if ($context['resend'] or $s_status == SIMPLENEWS_STATUS_SEND_NOT) {
if ($context['hook'] == 'cron') {
// Set newsletter sent status to pending if send by cron.
db_query("UPDATE {simplenews_newsletters} SET s_status = %d WHERE nid = %d", SIMPLENEWS_STATUS_SEND_PENDING, $context['nid']);
}
simplenews_send_node($context['nid'], $accounts);
}
watchdog('action', 'Simplenews newsletter %title send.', array(
'%title' => $context['title'],
));
}
}
/**
* Implementation of a configurable Drupal action. Send newsletter
*/
function simplenews_send_newsletter_action_form($context) {
//TODO improve usability by adding a pre-selection of newsletters before the newsletter issue selection
// Requires AHAH function to select newsletters issues based on selected newsletter
//
// if (!isset($context['newsletter'])) {
// $context['newsletter'] = array();
// }
if (!isset($context['newsletter_issue'])) {
$context['newsletter_issue'] = array();
}
if (!isset($context['resend'])) {
$context['resend'] = FALSE;
}
$tree = taxonomy_get_tree(variable_get('simplenews_vid', ''));
$terms = array();
foreach ($tree as $newsletter) {
$terms[$newsletter->tid] = $newsletter->name;
}
// $form['newsletter'] = array(
// '#title' => t('Newsletter'),
// '#type' => 'select',
// '#options' => $terms,
// '#default_value' => $context['newsletter'],
// '#description' => t('The newsletter series'),
// );
$result = taxonomy_select_nodes(array_keys($terms));
$nids = array();
while ($node = db_fetch_object($result)) {
$nids[$node->nid] = $node->title;
}
$form['newsletter_issue'] = array(
'#title' => t('Newsletter issue'),
'#type' => 'select',
'#options' => $nids,
'#default_value' => $context['newsletter_issue'],
'#description' => t('The newsletter issue to send'),
);
$form['resend'] = array(
'#title' => t('Allow to resend newsletter'),
'#type' => 'checkbox',
'#default_value' => $context['resend'],
'#description' => t('When checked a newsletter will be send even when already sent before. The newsletter sent status is checked, not the status of individual email addresses. Use this for repeated (e.g. monthly) newsletters.'),
);
return $form;
}
/**
* Validate simplenews_send_newsletter_action form submissions.
*/
function simplenews_send_newsletter_action_validate($form, $form_state) {
$form_values = $form_state['values'];
// Validate the send newsletter form.
if (empty($form_values['newsletter_issue'])) {
form_set_error('newsletter_issue', t('Please select a newsletter issue.'));
}
}
/**
* Process simplenews_send_newsletter_action form submissions.
*/
function simplenews_send_newsletter_action_submit($form, $form_state) {
$form_values = $form_state['values'];
$params = array(
'nid' => $form_values['newsletter_issue'],
'title' => $form['newsletter_issue']['#options'][$form_values['newsletter_issue']],
'resend' => $form_values['resend'],
);
return $params;
}
/**
* Implementation of a Drupal action. Send pending simplenews newsletters.
*/
function simplenews_cron_action(&$object, $context = array()) {
simplenews_cron();
watchdog('action', 'Simplenews cron executed.');
}
/**
* A configurable Drupal action. Subscribe the user to a newsletter
* hook = user: Subscribe this user to selected newsletter
*
* Available context:
* $context['tid'] newsletter tid
* $context['name'] newsletter name
*
* @see simplenews_subscribe_user_action_form()
* @see simplenews_subscribe_user_action_submit()
*/
function simplenews_subscribe_user_action(&$object, $context = array()) {
if ($context['hook'] == 'user') {
if (isset($context['tid'])) {
// This action is only called in the context of user. User data is in $context.
$account = $context['account'];
simplenews_subscribe_user($account->mail, $context['tid'], FALSE);
drupal_set_message(t('You have been subscribed to newsletter %newsletter.', array(
'%newsletter' => $context['name'],
)));
watchdog('action', 'User %name subscribed to newsletter %newsletter.', array(
'%name' => $account->name,
'%newsletter' => $context['name'],
));
}
}
}
/**
* Implementation of a configurable Drupal action.
*/
function simplenews_subscribe_user_action_form($context) {
if (!isset($context['newsletter'])) {
$context['newsletter'] = array();
}
$tree = taxonomy_get_tree(variable_get('simplenews_vid', ''));
$terms = array();
foreach ($tree as $newsletter) {
$terms[$newsletter->tid] = $newsletter->name;
}
$form['newsletter'] = array(
'#title' => t('Newsletter'),
'#type' => 'select',
'#options' => $terms,
'#description' => t('The newsletter series the user will be subscribed to.'),
);
return $form;
}
/**
* Process simplenews_subscribe_user_action form submissions.
*/
function simplenews_subscribe_user_action_submit($form, $form_state) {
$form_values = $form_state['values'];
$params = array(
'tid' => $form_values['newsletter'],
'name' => $form['newsletter']['#options'][$form_values['newsletter']],
);
return $params;
}
/**
* A configurable Drupal action. Unsubscribe the user from a newsletter
* hook = user: Unsubscribe this user from selected newsletter
*
* Available context:
* $context['tid'] newsletter tid
* $context['name'] newsletter name
*
* @see simplenews_unsubscribe_user_action_form()
* @see simplenews_unsubscribe_user_action_submit()
*/
function simplenews_unsubscribe_user_action(&$object, $context = array()) {
if ($context['hook'] == 'user') {
if (isset($context['tid'])) {
// This action is only called in the context of user. User data is in $context.
$account = $context['account'];
//TODO: Unsubscribing should be done by simplenews_unsubscribe_user but simplenews_get_user_subscription fails because the user is already removed
if ($result = db_fetch_object(db_query("SELECT snid FROM {simplenews_subscriptions} WHERE mail = '%s'", $account->mail))) {
db_query('DELETE FROM {simplenews_snid_tid} WHERE snid = %d AND tid = %d', $result->snid, $context['tid']);
// Clean up simplenews_subscriptions if no more newsletter subscriptions.
if (!db_result(db_query("SELECT COUNT(*) FROM {simplenews_snid_tid} t WHERE t.snid = %d", $result->snid))) {
db_query('DELETE FROM {simplenews_subscriptions} WHERE snid = %d', $result->snid);
}
}
drupal_set_message(t('You have been removed from the %newsletter subscription list.', array(
'%newsletter' => $context['name'],
)));
watchdog('action', 'User %name unsubscribed from newsletter %newsletter.', array(
'%name' => $account->name,
'%newsletter' => $context['name'],
));
}
}
}
/**
* Implementation of a configurable Drupal action.
*/
function simplenews_unsubscribe_user_action_form($context) {
if (!isset($context['newsletter'])) {
$context['newsletter'] = array();
}
$tree = taxonomy_get_tree(variable_get('simplenews_vid', ''));
$terms = array();
foreach ($tree as $newsletter) {
$terms[$newsletter->tid] = $newsletter->name;
}
$form['newsletter'] = array(
'#title' => t('Newsletter'),
'#type' => 'select',
'#options' => $terms,
'#description' => t('The newsletter series the user will be unsubscribed from.'),
);
return $form;
}
/**
* Process simplenews_unsubscribe_user_action form submissions.
*/
function simplenews_unsubscribe_user_action_submit($form, $form_state) {
$form_values = $form_state['values'];
$params = array(
'tid' => $form_values['newsletter'],
'name' => $form['newsletter']['#options'][$form_values['newsletter']],
);
return $params;
}
/**
* Implementation of hook_hook_info().
*/
function simplenews_hook_info() {
return array(
'simplenews' => array(
'simplenews' => array(
'subscribe' => array(
'runs when' => t('After a user has been subscribed'),
),
'unsubscribe' => array(
'runs when' => t('After a user has been unsubscribed'),
),
),
),
);
}
Functions
Name | Description |
---|---|
simplenews_action_info | |
simplenews_cron_action | Implementation of a Drupal action. Send pending simplenews newsletters. |
simplenews_hook_info | Implementation of hook_hook_info(). |
simplenews_send_newsletter_action | A configurable Drupal action. Send a simplenews newsletter. hook = cron: Send a newsletter to all subscribers. hook = user: Send a newsletter to the user who triggered the action. |
simplenews_send_newsletter_action_form | Implementation of a configurable Drupal action. Send newsletter |
simplenews_send_newsletter_action_submit | Process simplenews_send_newsletter_action form submissions. |
simplenews_send_newsletter_action_validate | Validate simplenews_send_newsletter_action form submissions. |
simplenews_subscribe_user_action | A configurable Drupal action. Subscribe the user to a newsletter hook = user: Subscribe this user to selected newsletter |
simplenews_subscribe_user_action_form | Implementation of a configurable Drupal action. |
simplenews_subscribe_user_action_submit | Process simplenews_subscribe_user_action form submissions. |
simplenews_unsubscribe_user_action | A configurable Drupal action. Unsubscribe the user from a newsletter hook = user: Unsubscribe this user from selected newsletter |
simplenews_unsubscribe_user_action_form | Implementation of a configurable Drupal action. |
simplenews_unsubscribe_user_action_submit | Process simplenews_unsubscribe_user_action form submissions. |