ad_text.module in Advertisement 7
Same filename and directory in other branches
Enhances the ad module to support static text ads.
Copyright (c) 2005-2009. Jeremy Andrews <jeremy@tag1consulting.com>.
File
text/ad_text.moduleView source
<?php
/**
* @file
* Enhances the ad module to support static text ads.
*
* Copyright (c) 2005-2009.
* Jeremy Andrews <jeremy@tag1consulting.com>.
*/
/**
* Implementation of hook_theme().
*/
function ad_text_theme() {
return array(
'ad_text_ad' => array(
'file' => 'ad_text.module',
'arguments' => array(
'ad' => NULL,
),
),
'ad_text_text' => array(
'file' => 'ad_text.module',
'arguments' => array(
'header' => NULL,
'body' => NULL,
'link' => NULL,
),
),
);
}
/**
* Function used to display the selected ad.
*/
function ad_text_display_ad($ad) {
return theme('ad_text_ad', array(
'ad' => $ad,
));
}
/**
* Return a themed ad of type ad_text.
*
* @param @ad
* The ad object.
* @return
* A string containing the ad markup.
*/
function theme_ad_text_ad($variables) {
$ad = $variables['ad'];
if (isset($ad->aid)) {
if (!isset($ad->adheader)) {
$ad = node_load($ad->aid);
}
$output = '<div class="text-advertisement" id="ad-' . $ad->aid . '">';
if (isset($ad->url) && !empty($ad->url)) {
$output .= theme('ad_text_text', array(
'header' => ad_text_display_prepare($ad->adheader, filter_default_format()),
'body' => ad_text_display_prepare($ad->adbody, filter_default_format()),
'link' => $ad->redirect . '/@HOSTID___',
));
}
else {
$output .= theme('ad_text_text', array(
'header' => ad_text_display_prepare($ad->adheader, filter_default_format()),
'body' => ad_text_display_prepare($ad->adbody, filter_default_format()),
));
}
$output .= '</div>';
return $output;
}
}
/**
* Return a themed text ad.
*
* @param $header
* The header of the text ad.
* @param $body
* The body of the text ad.
* @param $link
* Optional link URL for header.
* @return
* A string containing the text ad.
*/
function theme_ad_text_text($variables) {
$output = '<div class="ad-header">';
if (isset($variables['link']) && !empty($variables['link'])) {
$output .= l($variables['header'], $variables['link'], array(
'attributes' => ad_link_attributes(),
'html' => TRUE,
));
}
else {
$output .= $variables['header'];
}
$output .= '</div>';
$output .= '<div class="ad-body">' . $variables['body'] . '</div>';
return $output;
}
/**
* Strip illegal characters, apply input filters, then encode the rest UTF-8.
*/
function ad_text_display_prepare($string, $format) {
$string = preg_replace("/[\\b\f\n\r\t]/", ' ', $string);
$string = check_markup($string, $format, FALSE);
return $string;
}
/**
* Implementation of hook_help().
*/
function ad_text_help($path, $arg) {
$output = '';
switch ($path) {
case 'node/add/ad#text':
$output = t('A text advertisement.');
break;
}
return $output;
}
/**
* Text ad settings form.
*/
function ad_text_global_settings($form_state) {
$form = array();
$form['header_min'] = array(
'#type' => 'textfield',
'#title' => t('Header minimum length'),
'#size' => 3,
'#maxlength' => 3,
'#default_value' => variable_get('header_min', 0),
'#description' => t('Optionally specify the minimum number of characters allowed in the header of a text ad. Set to <em>0</em> to specify no minimum length.'),
);
$form['header_max'] = array(
'#type' => 'textfield',
'#title' => t('Header maximum length'),
'#size' => 3,
'#maxlength' => 3,
'#default_value' => variable_get('header_max', 0),
'#description' => t('Optionally specify the maximum number of characters allowed in the header of a text ad. Set to <em>0</em> to specify no maximum length.'),
);
$form['body_min'] = array(
'#type' => 'textfield',
'#title' => t('Body minimum length'),
'#size' => 10,
'#maxlength' => 10,
'#default_value' => variable_get('body_min', 0),
'#description' => t('Optionally specify the minimum number of characters allowed in the body of a text ad. Set to <em>0</em> to specify no minimum length.'),
);
$form['body_max'] = array(
'#type' => 'textfield',
'#title' => t('Body maximum length'),
'#size' => 10,
'#maxlength' => 10,
'#default_value' => variable_get('body_max', 0),
'#description' => t('Optionally specify the maximum number of characters allowed in the body of a text ad. Set to <em>0</em> to specify no maximum length.'),
);
$form['save'] = array(
'#type' => 'submit',
'#value' => t('Save'),
);
return $form;
}
/**
* Settings form validation handler.
*/
function ad_text_global_settings_validate($form, &$form_state) {
if ((int) $form_state['values']['header_min'] > (int) $form_state['values']['header_max']) {
form_set_error('header_min', t('The header minimum length can not be greater than the header maximum length.'));
}
if ((int) $form_state['values']['body_min'] > (int) $form_state['values']['body_max']) {
form_set_error('body_min', t('The body minimum length can not be greater than the body maximum length.'));
}
}
/**
* Settings form submit handler.
*/
function ad_text_global_settings_submit($form, &$form_state) {
variable_set('header_min', $form_state['values']['header_min']);
variable_set('header_max', $form_state['values']['header_max']);
variable_set('body_min', $form_state['values']['body_min']);
variable_set('body_max', $form_state['values']['body_max']);
}
/**
* Implementation of hook_adapi().
*/
function ad_text_adapi($op, $node) {
switch ($op) {
case 'load':
$result = db_query('SELECT aid, url, adheader, adbody FROM {ad_text} WHERE aid = :aid', array(
':aid' => $node->nid,
))
->fetchAssoc();
$result['ad'] = ad_text_display_prepare($result['adheader'], filter_default_format()) . '<br />' . ad_text_display_prepare($result['adbody'], filter_default_format());
return $result;
case 'insert':
db_insert('ad_text')
->fields(array(
'aid' => $node->nid,
'url' => $node->url,
'adheader' => $node->adheader,
'adbody' => $node->adbody,
))
->execute();
break;
case 'update':
if (ad_permission($node->nid, 'manage ad text')) {
db_query("UPDATE {ad_text} SET url = :url, adheader = :adheader, adbody = :adbody WHERE aid = :aid", array(
':url' => $node->url,
':adheader' => $node->adheader,
':adbody' => $node->adbody,
':aid' => $node->nid,
));
}
break;
case 'delete':
db_query('DELETE FROM {ad_text} WHERE aid = :aid', array(
':aid' => $node->nid,
));
break;
case 'form':
return _ad_text_node_form($node);
case 'view':
return _ad_text_node_view($node);
case 'redirect':
return db_query('SELECT url FROM {ad_text} WHERE aid = :aid', array(
':aid' => $node->nid,
))
->fetchField();
case 'validate':
$todo = array();
return _ad_text_node_validate($node, $todo);
case 'type':
return array(
'text' => array(
'name' => t('Text ad'),
'module' => 'ad_text',
'description' => t('A text advertisement.'),
'help' => t('A text advertisement.'),
),
);
case 'permissions':
if (!isset($node->adtype) || $node->adtype == 'text') {
return array(
'manage ad text' => TRUE,
);
}
}
}
/**
* Adapi helper function for displaying a node form.
*/
function _ad_text_node_form(&$node) {
$form = array();
$form['ad_text'] = array(
'#type' => 'fieldset',
'#title' => t('Text'),
'#collapsible' => TRUE,
);
if (arg(1) == 'add' && user_access('create advertisements') || ad_permission($node->nid, 'manage ad text')) {
$access = TRUE;
}
else {
$access = FALSE;
$form['ad_text']['notice'] = array(
'#type' => 'markup',
'#value' => '<p>' . t('You do not have permission to edit this advertisement.') . '</p>',
);
}
$form['ad_text']['text'] = array(
'#type' => 'markup',
'#value' => ad_text_display_ad($node),
);
$form['ad_text']['url'] = array(
'#type' => 'textfield',
'#title' => t('Destination URL'),
'#maxlength' => 255,
'#default_value' => isset($node->url) ? $node->url : '',
'#description' => t('Enter the complete URL where you want people to be redirected when they click on this advertisement. The URL must be valid and begin with http:// or https://, for example %url, unless you !disable. If you do not enter a URL, the advertisement will not be clickable.', array(
'%url' => t('http://www.sample.org/'),
'!disable' => l(t('disable URL validation'), 'admin/content/ad/configure', array(
'fragment' => 'edit-ad-validate-url-wrapper',
)),
)),
'#disabled' => !$access,
);
$form['ad_text']['adheader'] = array(
'#type' => 'textfield',
'#title' => t('Ad header'),
'#required' => $access,
'#default_value' => isset($node->adheader) ? $node->adheader : '',
'#description' => t('This is the first line of the ad which will be linked to the URL entered above.'),
'#disabled' => !$access,
);
$form['ad_text']['adbody'] = array(
'#type' => 'textarea',
'#title' => t('Ad body'),
'#required' => $access,
'#default_value' => isset($node->adbody) ? $node->adbody : '',
'#description' => t('This is the rest of the ad.'),
'#disabled' => !$access,
);
return $form;
}
/**
* Adapi helper function for displaying ad itself.
*/
function _ad_text_node_view(&$node) {
$node->content['ad'] = array(
'#value' => theme('ad_box', array(
'title' => '',
'content' => preg_replace('&@HOSTID___&', '0', ad_text_display_ad($node)),
)),
'#weight' => -1,
);
if (!empty($node->url)) {
$link = t('Links to !url.', array(
'!url' => $node->url,
));
$link = check_plain($link);
$node->content['ad-link'] = array(
'#value' => "<div class=\"links-to\">{$link}</div>",
'#weight' => 1,
);
}
}
/**
* Text ads node validator.
*/
function _ad_text_node_validate($node, &$form_state) {
// Enforce minimum and maximum lengths.
$header_len = isset($node->adheader) ? strlen($node->adheader) : 0;
$header_min = variable_get('header_min', 0);
$header_max = variable_get('header_max', 0);
if ($header_min && $header_len < $header_min) {
form_set_error('adheader', t('Your text ad header is only %cur characters but must be at least %min characters.', array(
'%cur' => $header_len,
'%min' => $header_min,
)));
}
else {
if ($header_max && $header_len > $header_max) {
form_set_error('adheader', t('Your text ad header is %cur characters but can not be more than %max characters.', array(
'%cur' => $header_len,
'%max' => $header_max,
)));
}
}
$body_len = strlen($node->adbody);
$body_min = variable_get('body_min', 0);
$body_max = variable_get('body_max', 0);
if ($body_min && $body_len < $body_min) {
form_set_error('adbody', t('Your text ad body is only %cur characters but must be at least %min characters.', array(
'%cur' => $body_len,
'%min' => $body_min,
)));
}
else {
if ($body_max && $body_len > $body_max) {
form_set_error('adbody', t('Your text ad body is %cur characters but can not be more than %max characters.', array(
'%cur' => $body_len,
'%max' => $body_max,
)));
}
}
if ($node->url && variable_get('ad_validate_url', 1) && !valid_url($node->url, TRUE)) {
form_set_error('url', t('You must specify a valid %field.', array(
'%field' => t('Destination URL'),
)));
}
}
Functions
Name | Description |
---|---|
ad_text_adapi | Implementation of hook_adapi(). |
ad_text_display_ad | Function used to display the selected ad. |
ad_text_display_prepare | Strip illegal characters, apply input filters, then encode the rest UTF-8. |
ad_text_global_settings | Text ad settings form. |
ad_text_global_settings_submit | Settings form submit handler. |
ad_text_global_settings_validate | Settings form validation handler. |
ad_text_help | Implementation of hook_help(). |
ad_text_theme | Implementation of hook_theme(). |
theme_ad_text_ad | Return a themed ad of type ad_text. |
theme_ad_text_text | Return a themed text ad. |
_ad_text_node_form | Adapi helper function for displaying a node form. |
_ad_text_node_validate | Text ads node validator. |
_ad_text_node_view | Adapi helper function for displaying ad itself. |