newsletter_subscriber.module in Newsletter 7.2
Module for the Newsletter Subscriber Entity
File
modules/subscriber/newsletter_subscriber.moduleView source
<?php
/**
* @file
* Module for the Newsletter Subscriber Entity
*/
/**
* Implements hook_menu().
*/
function newsletter_subscriber_menu() {
$items = array();
$items['newsletter/subscribe'] = array(
'title' => 'Subscribe',
'description' => 'Subscribe to our newsletters.',
'access arguments' => array(
'subscribe newsletters',
),
'page callback' => 'newsletter_subscriber_manage_subscriptions',
'file' => 'includes/newsletter_subscriber.pages.inc',
);
$items['newsletter/confirm/%newsletter_subscriber_by_hash'] = array(
'title' => 'Confirm subscription',
'description' => 'Confirm your subscription to our newsletters.',
'access arguments' => array(
'subscribe newsletters',
),
'type' => MENU_CALLBACK,
'page callback' => 'newsletter_confirm',
'page arguments' => array(
2,
),
'file' => 'includes/newsletter_subscriber.pages.inc',
);
$items['newsletter/unsubscribe/%newsletter_subscriber_by_hash'] = array(
'title' => 'Unsubscribe',
'description' => 'Confirm that you want to unsubscribe from our newsletters.',
'access arguments' => array(
'subscribe newsletters',
),
'type' => MENU_CALLBACK,
'page callback' => 'drupal_get_form',
'page arguments' => array(
'newsletter_subscriber_unsubscribe',
2,
),
'file' => 'includes/newsletter_subscriber.pages.inc',
);
$items['newsletter/edit/%newsletter_subscriber_by_hash'] = array(
'title' => 'Edit newsletter subscriptions',
'page callback' => 'newsletter_subscriber_manage_subscriptions',
'page arguments' => array(
2,
),
'access arguments' => array(
'subscribe newsletters',
),
'type' => MENU_CALLBACK,
'file' => 'includes/newsletter_subscriber.pages.inc',
);
$items['user/%newsletter_subscriber_by_uid_or_new/newsletter'] = array(
'title' => 'Newsletter subscriptions',
'page callback' => 'newsletter_subscriber_manage_subscriptions',
'page arguments' => array(
1,
),
'access callback' => 'newsletter_subscriber_access',
'access arguments' => array(
'edit',
1,
),
'type' => MENU_LOCAL_TASK,
'file' => 'includes/newsletter_subscriber.pages.inc',
);
return $items;
}
/**
* Implements hook_entity_info().
*/
function newsletter_subscriber_entity_info() {
$entities['newsletter_subscriber'] = array(
'label' => t('Newsletter subscriber'),
'entity class' => 'NewsletterSubscriber',
'controller class' => 'NewsletterSubscriberController',
'base table' => 'newsletter_subscriber',
'fieldable' => TRUE,
'entity keys' => array(
'id' => 'subscriber_id',
'bundle' => 'type',
),
// Bundles are defined by the subscriber types below.
'bundles' => array(),
'bundle keys' => array(
'bundle' => 'type',
),
'label callback' => 'entity_class_label',
'uri callback' => 'entity_class_uri',
'creation callback' => 'newsletter_subscriber_create',
'access callback' => 'newsletter_subscriber_access',
'module' => 'newsletter_subscriber',
// The information below is used by the NewsletterSubscriberUIController.
'admin ui' => array(
'path' => 'admin/config/media/newsletter/subscribers',
'file' => 'includes/newsletter_subscriber.admin.inc',
'controller class' => 'NewsletterSubscriberUIController',
'menu wildcard' => '%newsletter_subscriber',
),
);
// Add bundle info but bypass entity_load() as we cannot use it here.
$types = db_select('newsletter_subscriber_type', 'ns')
->fields('ns')
->execute()
->fetchAllAssoc('type');
foreach ($types as $type => $info) {
$entities['newsletter_subscriber']['bundles'][$type] = array(
'label' => $info->name,
'admin' => array(
'path' => 'admin/structure/newsletter-subscriber-types/manage/%newsletter_subscriber_type',
'real path' => 'admin/structure/newsletter-subscriber-types/manage/' . $type,
'bundle argument' => 4,
'access arguments' => array(
'administer newsletter subscriber types',
),
),
);
}
// The entity that holds information about the entity types.
$entities['newsletter_subscriber_type'] = array(
'label' => t('Newsletter subscriber type'),
'entity class' => 'NewsletterSubscriberType',
'controller class' => 'NewsletterSubscriberTypeController',
'base table' => 'newsletter_subscriber_type',
'fieldable' => FALSE,
'bundle of' => 'newsletter_subscriber',
'exportable' => TRUE,
'entity keys' => array(
'id' => 'id',
'name' => 'type',
'label' => 'name',
),
'access callback' => 'newsletter_subscriber_type_access',
'module' => 'newsletter_subscriber',
// Enable the entity API's admin UI.
'admin ui' => array(
'path' => 'admin/structure/newsletter-subscriber-types',
'file' => 'includes/newsletter_subscriber.admin.inc',
'controller class' => 'NewsletterSubscriberTypeUIController',
),
);
return $entities;
}
/**
* Implements hook_entity_property_info_alter().
*/
function newsletter_entity_property_info_alter(&$info) {
// Turn subscriber status into boolean for better views integration.
$info['newsletter_subscriber']['properties']['status']['type'] = 'boolean';
}
/**
* Implements hook_permission().
*/
function newsletter_subscriber_permission() {
// We set up permisssions to manage entity types, manage all entities and the
// permissions for each individual entity.
$permissions = array(
'administer newsletter subscriber types' => array(
'title' => t('Administer newsletter subscribers types'),
'description' => t('Create and delete fields for newsletter subscriber types, and set their permissions.'),
),
'administer newsletter subscribers' => array(
'title' => t('Administer newsletter subscribers'),
'description' => t('Edit and delete all newsletter subscribers'),
),
'subscribe newsletters' => array(
'title' => t('Subscribe newsletters'),
'description' => t('Can subscribe to various newsletter lists.'),
),
);
// Generate permissions per subscriber type.
foreach (newsletter_subscriber_get_types() as $type) {
$type_name = check_plain($type->type);
$permissions += array(
"edit any {$type_name} subscriber" => array(
'title' => t('%type_name: Edit any newsletter subscriber', array(
'%type_name' => $type->name,
)),
),
"view any {$type_name} subscriber" => array(
'title' => t('%type_name: View any newsletter subscriber', array(
'%type_name' => $type->name,
)),
),
);
}
return $permissions;
}
/**
* Implements hook_variable_info().
*/
function newsletter_subscriber_variable_info($options) {
$variable['newsletter_subscriber_block_prefix'] = array(
'title' => t('Newsletter subscribe block prefix'),
'description' => t('This text will appear above the email address in the subscribe block.'),
'type' => 'string',
'access' => 'administer newsletter subscribers',
);
$variable['newsletter_subscriber_block_suffix'] = array(
'title' => t('Newsletter subscribe block suffix'),
'description' => t('This text will appear below the email address in the subscribe block.'),
'type' => 'string',
'access' => 'administer newsletter subscribers',
);
return $variable;
}
/**
* Implements hook_block_info().
*/
function newsletter_subscriber_block_info() {
$blocks['newsletter_subscriber_subscribe'] = array(
'info' => t('Newsletter: Subscribe'),
);
return $blocks;
}
/**
* Implements hook_block_view().
*/
function newsletter_subscriber_block_view($delta = '') {
switch ($delta) {
case 'newsletter_subscriber_subscribe':
if (user_access('subscribe newsletters') && (!newsletter_subscriber_is_subscribed() || variable_get('newsletter_subscriber_block_always_show', FALSE))) {
$block['subject'] = t('Subscribe to our Newsletters');
$block['content'][] = array(
'#prefix' => '<div class="prefix">',
'#markup' => check_plain(variable_get('newsletter_subscriber_block_prefix')),
'#suffix' => '</div>',
);
$block['content'][] = drupal_get_form('newsletter_subscriber_subscribe_form');
$block['content'][] = array(
'#prefix' => '<div class="suffix">',
'#markup' => check_plain(variable_get('newsletter_subscriber_block_suffix')),
'#suffix' => '</div>',
);
}
else {
$block = array();
}
break;
}
return $block;
}
/**
* Implements hook_block_configure().
*/
function newsletter_subscriber_block_configure($delta = '') {
$form = array();
if ($delta == 'newsletter_subscriber_subscribe') {
$form['settings'] = array(
'#type' => 'fieldset',
'#collapsible' => TRUE,
'#title' => t('Layout settings'),
);
$form['settings']['newsletter_subscriber_block_prefix'] = array(
'#type' => 'textarea',
'#title' => t('Text before email address'),
'#description' => t('This text will appear above the email address in the subscribe block.'),
'#default_value' => variable_get('newsletter_block_prefix'),
);
$form['settings']['newsletter_subscriber_block_suffix'] = array(
'#type' => 'textarea',
'#title' => t('Text after email address'),
'#description' => t('This text will appear below the email address in the subscribe block.'),
'#default_value' => variable_get('newsletter_block_suffix'),
);
$form['settings']['newsletter_subscriber_block_always_show_mail'] = array(
'#type' => 'checkbox',
'#title' => t('Always show e-mail in the subscribe form block.'),
'#default_value' => variable_get('newsletter_show_email_in_block', FALSE),
);
$form['settings']['newsletter_subscriber_block_always_show'] = array(
'#type' => 'checkbox',
'#title' => t('Always show subscribe block,even if user is subscribed.'),
'#default_value' => variable_get('newsletter_always_show_subscribe_block', FALSE),
);
}
return $form;
}
/**
* Implements hook_block_save().
*/
function newsletter_subscriber_block_save($delta = '', $edit = array()) {
if ($delta == 'newsletter_subscriber_subscribe') {
// Save the configuration to the database.
foreach ($edit as $key => $value) {
if (strpos($key, 'newsletter_subscriber_') === 0) {
variable_set($key, $value);
}
}
}
return;
}
/**
* Implements hook_user_insert().
*/
function newsletter_subscriber_user_insert(&$edit, $account, $category) {
if ($lists = variable_get('newsletter_subscriber_subscribe_new_users', array())) {
$subscriber = newsletter_subscriber_create(array(
'email' => $account->mail,
'uid' => $account->uid,
));
$subscriber_wrapper = entity_metadata_wrapper('newsletter_subscriber', $subscriber);
foreach ($lists as $list) {
$subscriber_wrapper->field_newsletter_list[]->target_id = $list;
}
newsletter_subscriber_save($subscriber);
}
}
/**
* Determines whether the given user has access to a newsletter subscriber.
*
* @param $op
* The operation being performed. One of 'view', 'update', 'create', 'delete'
* or just 'edit' (being the same as 'create' or 'update').
* @param $subscriber
* Optionally a subscriber or a subscriber type to check access for.
* If nothing is given, access for all subscribers is determined.
* @param $account
* The user to check for. Leave it to NULL to check for the global user.
*
* @return boolean
* Whether access is allowed or not.
*/
function newsletter_subscriber_access($op, $subscriber = NULL, $account = NULL) {
if (user_access('administer newsletter subscribers', $account)) {
return TRUE;
}
if (isset($subscriber) && ($type_name = $subscriber->type)) {
$op = $op == 'view' ? 'view' : 'edit';
if (user_access("{$op} any {$type_name} newsletter subscriber", $account)) {
return TRUE;
}
elseif ($subscriber->uid == $GLOBALS['user']->uid && user_access('subscribe newsletters')) {
return TRUE;
}
}
return FALSE;
}
/**
* Access callback for the entity API.
*/
function newsletter_subscriber_type_access($op, $type = NULL, $account = NULL) {
return user_access('administer newsletter subscriber types', $account);
}
/**
* Gets an array of all newsletter subscriber types, keyed by the type name.
*
* @param $type_name
* If set, the type with the given name is returned.
* @return NeswletterSubscriberType[]
* Depending whether $type isset, an array of newsletter subscriber types
* or a single one.
*/
function newsletter_subscriber_get_types($type_name = NULL) {
$types = entity_load_multiple_by_name('newsletter_subscriber_type', isset($type_name) ? array(
$type_name,
) : FALSE);
return isset($type_name) ? reset($types) : $types;
}
/**
* Menu argument loader; Load a subscriber type by string.
*
* @param $type
* The machine-readable name of a subscriber type to load.
*
* @return
* A subscriber type array or FALSE if $type does not exist.
*/
function newsletter_subscriber_type_load($type) {
return newsletter_subscriber_get_types($type);
}
/**
* Fetch a subscriber object.
*
* @param $subscriber_id
* Integer specifying the subscriber id.
* @param $reset
* A boolean indicating that the internal cache should be reset.
*
* @return
* A fully-loaded $subscriber object or FALSE if it cannot be loaded.
*
* @see newsletter_subscriber_load_multiple()
*/
function newsletter_subscriber_load($subscriber_id, $reset = FALSE) {
if (empty($subscriber_id)) {
return array();
}
$subscribers = newsletter_subscriber_load_multiple(array(
$subscriber_id,
), array(), $reset);
return reset($subscribers);
}
/**
* Load multiple subscribers by IDs.
*
* @param $subscriber_ids
* An array of subscriber IDs.
* @param $reset
* A boolean indicating that the internal cache should be reset.
*
* @return
* An array of subscriber objects, indexed by subscriber_id.
*
* @see entity_load()
* @see newsletter_subscriber_load()
*/
function newsletter_subscriber_load_multiple($subscriber_ids = array(), $reset = FALSE) {
return entity_load('newsletter_subscriber', $subscriber_ids, array(), $reset);
}
/**
* Loads up the requested subscriber by hash.
*/
function newsletter_subscriber_by_hash_load($hash) {
return newsletter_subscriber_by_property('hash', $hash);
}
/**
* Loads up the requested subscriber by uid. If none is found creates a new one.
*/
function newsletter_subscriber_by_uid_or_new_load($uid) {
$user = user_load($uid);
$subscriber = newsletter_subscriber_by_property('uid', $uid);
return $subscriber ? $subscriber : newsletter_subscriber_create(array(
'uid' => $uid,
'mail' => $user->mail,
));
}
/**
* Loads up a requested subscriber object by a property.
*
* @param $property
* The newsletter subscriber property to search against.
* @param $value
* The searched value of propery.
*
* @return
* Fully loaded subscriber object.
*/
function newsletter_subscriber_by_property($property, $value) {
$query = new EntityFieldQuery();
$entities = $query
->entityCondition('entity_type', 'newsletter_subscriber')
->propertyCondition($property, $value)
->execute();
$keys = isset($entities['newsletter_subscriber']) ? array_keys($entities['newsletter_subscriber']) : array();
// Since we always expect to have one subscriber:
return newsletter_subscriber_load(array_pop($keys));
}
/**
* Get the subscribers of a newsletter list.
*
* @param $nlid
* The id of the newsletter list.
* @param $filter
* (boolean) Whether to filter out unconfirmed subscribers.
*
* @return
* Array containg the subscriber full objects. Otherwise an empty array.
*/
function newsletter_subscriber_by_list($nlid, $filter = TRUE) {
$query = new EntityFieldQuery();
$query
->entityCondition('entity_type', 'newsletter_subscriber')
->fieldCondition('field_newsletter_list', 'target_id', $nlid);
if ($filter) {
$query
->propertyCondition('confirmed', 1);
}
$entities = $query
->execute();
return isset($entities['newsletter_subscriber']) ? newsletter_subscriber_load_multiple(array_keys($entities['newsletter_subscriber'])) : array();
}
/**
* Deletes a subscriber.
*/
function newsletter_subscriber_delete(NewsletterSubscriber $subscriber) {
$subscriber
->delete();
}
/**
* Delete multiple subscribers.
*
* @param $subscriber_ids
* An array of newsletter subscriber IDs.
*/
function newsletter_subscriber_delete_multiple(array $subscriber_ids) {
entity_get_controller('newsletter_subscriber')
->delete($subscriber_ids);
}
/**
* Create a subscriber object.
*/
function newsletter_subscriber_create($values = array()) {
return entity_get_controller('newsletter_subscriber')
->create($values);
}
/**
* Saves a subscriber to the database.
*
* @param $subscriber
* The subscriber object.
*/
function newsletter_subscriber_save(NewsletterSubscriber $subscriber) {
return $subscriber
->save();
}
/**
* Create a subscriber type object.
*/
function newsletter_subscriber_type_create($values = array()) {
return entity_get_controller('newsletter_subscriber_type')
->create($values);
}
/**
* Saves a subscriber type to the db.
*/
function newsletter_subscriber_type_save(NewsletterSubscriberType $type) {
$type
->save();
}
/**
* Deletes a subscriber type from the db.
*/
function newsletter_subscriber_type_delete(NewsletterSubscriberType $type) {
$type
->delete();
}
/**
* Implements hook_views_api().
*/
function newsletter_subscriber_views_api() {
return array(
'api' => 3,
'path' => drupal_get_path('module', 'newsletter_subscriber') . '/includes/views',
);
}
/**
* Implements hook_colorbox_form_access().
*/
function newsletter_subscriber_colorbox_form_access($form_id) {
$form = explode('?', $form_id);
if ($form[0] == 'newsletter_subscriber_manage_subscriptions_form') {
module_load_include('inc', 'newsletter_subscriber', 'includes/newsletter_subscriber.pages');
return user_access('subscribe newsletters');
}
return FALSE;
}
/**
* Checks whether an email is registered to newsletter list or not.
*
* @return
* boolean TRUE or FALSE.
*/
function newsletter_subscriber_is_subscribed($mail = NULL) {
if (!isset($mail)) {
global $user;
$mail = isset($user->mail) ? $user->mail : FALSE;
}
if ($mail) {
$is_subscribed = db_query('SELECT mail FROM {newsletter_subscriber} WHERE mail = :mail', array(
':mail' => $mail,
))
->fetchField();
return (bool) $is_subscribed;
}
return FALSE;
}
/**
* Implements hook_form_FORM_ID_alter() for newsletter_configure_form.
*/
function newsletter_subscriber_form_newsletter_configure_form_alter(&$form, &$form_state) {
$lists = db_query('SELECT list_id, title FROM {newsletter_list}')
->fetchAllKeyed();
$form['settings']['newsletter_subscriber_subscribe_new_users'] = array(
'#type' => 'select',
'#title' => t('Automatically subscribe newly registered user to the selected lists:'),
'#options' => array_map('check_plain', $lists),
'#multiple' => TRUE,
'#description' => t('Leave empty to bypass this feature'),
'#default_value' => variable_get('newsletter_subscriber_subscribe_new_users', array()),
);
$form['settings']['newsletter_subscriber_show_email'] = array(
'#type' => 'checkbox',
'#title' => t('Always show e-mail in the subscribe form.'),
'#default_value' => variable_get('newsletter_subscriber_show_email', TRUE),
);
}
/**
* Form constructor for the subscribe block form.
*
* @see newsletter_subscriber_subscribe_form_validate()
* @see newsletter_subscribe_form_submit()
* @ingroup forms
*/
function newsletter_subscriber_subscribe_form($form, &$form_state) {
global $user;
if (!isset($user->mail) || variable_get('newsletter_subscriber_block_always_show_mail', FALSE)) {
$form['mail'] = array(
'#type' => 'textfield',
'#default_value' => t('user@example.com'),
'#size' => 20,
'#required' => TRUE,
);
}
else {
$form['logged-in'] = array(
'#type' => 'hidden',
'#value' => TRUE,
);
}
//form_load_include($form_state, 'inc', 'newsletter_subscriber', 'includes/newsletter_subscriber.pages');
$form['#attached']['js'][] = drupal_get_path('module', 'newsletter_subscriber') . '/js/newsletter_subscriber.js';
$form['actions'] = array(
'#type' => 'container',
'#attributes' => array(
'class' => array(
'form-actions',
),
),
'#weight' => 400,
);
$form['actions']['submit'] = array(
'#type' => 'submit',
'#value' => t('Subscribe'),
);
return $form;
}
/**
* Form validation handler for newsletter_subscriber_subscribe_form().
*
* @see newsletter_subscriber_subscribe_form_submit()
*/
function newsletter_subscriber_subscribe_form_validate($form, &$form_state) {
if (isset($form_state['values']['logged-in'])) {
global $user;
$mail = $user->mail;
}
else {
$mail = $form_state['values']['mail'] != t('user@example.com') ? $form_state['values']['mail'] : '';
}
if (!valid_email_address($mail) || newsletter_subscriber_is_subscribed($mail)) {
form_set_error('mail', t("This e-mail doesn't exist or you have already subscribed"));
}
}
/**
* Form submission handler for newsletter_subscriber_subscribe_form().
*
* @see newsletter_subscriber_subscribe_form_validate()
*/
function newsletter_subscriber_subscribe_form_submit($form, &$form_state) {
$form_state['redirect'] = array(
'newsletter/subscribe',
array(
'query' => array(
'mail' => $form_state['values']['mail'],
) + drupal_get_destination(),
),
);
}
/**
* Form callback wrapper: additional operations on a subscriber.
*
* @param $subscriber
* The subscriber object being edited by this form.
*
* @param $op
* The operation performed.
*/
function newsletter_subscriber_operation_form($form, &$form_state, $type, $subscriber, $op) {
form_load_include($form_state, 'inc', 'newsletter_subscriber', 'includes/newsletter_subscriber.admin');
return drupal_get_form("newsletter_subscriber_{$op}_form", $subscriber);
}
/**
* The class used for newsletter subscriber entities.
*/
class NewsletterSubscriber extends Entity {
public function __construct($values = array()) {
parent::__construct($values, 'newsletter_subscriber');
}
protected function defaultLabel() {
return $this->mail;
}
}
/**
* The class used for newsletter subscriber type entities.
*/
class NewsletterSubscriberType extends Entity {
public $type;
public $label;
public function __construct($values = array()) {
parent::__construct($values, 'newsletter_subscriber_type');
}
}
Functions
Classes
Name![]() |
Description |
---|---|
NewsletterSubscriber | The class used for newsletter subscriber entities. |
NewsletterSubscriberType | The class used for newsletter subscriber type entities. |