'admin/settings/premium',
'title' => t('Premium'),
'description' => t('Set the Premium mode, time count, time unit and message.'),
'callback' => 'drupal_get_form',
'callback arguments' => 'premium_settings',
'access' => user_access('administer site configuration'));
}
return $items;
}
/**
* Implementation of hook_settings()
*/
function premium_settings() {
$form = array();
// timeframe for premium + update existing nodes
$form['premium_mode'] = array(
'#type' => 'radios',
'#title' => t('Mode'),
'#default_value' => variable_get('premium_mode', '0'),
'#options' => array(
'0' => t('Premium items are permanently restricted'),
'archive' => t('Protect archives only: Items switch to premium status after a specified period'),
'latest' => t('Protect latest content only: Items switch to non-premium status after a specified period'),
),
);
$form['premium_time_count'] = array(
'#type' => 'select',
'#title' => t('Count'),
'#default_value' => variable_get('premium_time_count', '2'),
'#options' => array(1=>1, 2=>2, 3=>3, 4=>4, 5=>5, 6=>6, 7=>7, 8=>8, 9=>9,
10=>10, 11=>11, 12=>12, 13=>13, 14=>14, 15=>15),
);
$form['premium_time_unit'] = array(
'#type' => 'select',
'#title' => t('Unit'),
'#default_value' => variable_get('premium_time_unit', 'W'),
'#options' => array('D' => t('Days'),
'W' => t('Weeks'),
'M' => t('Months'),
'Y' => t('Years')),
);
$form['premium_message'] = array(
'#type' => 'textarea',
'#title' => t('FREELENS Premium Haupttext'),
'#default_value' => variable_get('premium_message', t('Full text available to premium subscribers only')),
'#cols' => 60,
'#rows' => 10,
'#description' => t('When a visitor doesn\'t have access to a premium item they will see this message instead of its full text')
);
$form['premium_message_left'] = array(
'#type' => 'textarea',
'#title' => t('FREELENS Premium linke Spalte'),
'#default_value' => variable_get('premium_message_left', t('Auch diese Spalte ist alleine FREELENS Mitgliedern vorbehalten')),
'#cols' => 60,
'#rows' => 10,
'#description' => t('When a visitor doesn\'t have access to a premium item they will see this message instead of its full text')
);
return system_settings_form($form);
}
/**
* Implementation of hook_cron()
*/
function premium_cron() {
db_query('DELETE FROM {premium} WHERE start_ts < NOW() AND end_ts != 0 AND end_ts < NOW()');
}
/**
* Implementation of hook_nodeapi()
*/
function premium_nodeapi(&$node, $op, $teaser) {
switch ($op) {
case 'delete':
case 'insert':
case 'update':
if ($node->nid) {
db_query('DELETE FROM {premium} WHERE nid = %d', $node->nid);
if ($op == 'delete') return;
}
if ($node->premium) {
_premium_offset($node, $start_ts = 0, $end_ts = 0);
db_query('INSERT INTO {premium} (nid, start_ts, end_ts) VALUES ( %d, %d, %d )'
, $node->nid, $start_ts, $end_ts);
}
return;
case 'load':
return array('premium' => (int) db_result(db_query(
'SELECT 1 FROM {premium} WHERE nid = %d
AND ( start_ts = 0 OR start_ts > NOW()) AND end_ts < NOW()', $node->nid)));
case 'view':
$node->premium_access = true;
global $user;
if (!$node->premium || user_access('access premium content')) {
return; // not premium content or user has privileges
}
if ($teaser) {
return; // not viewing the body
}
foreach (module_implements('premium_access') as $name) {
$function = $name.'_premium_access';
if ($function($user, $node)) {
return; // access granted explicitly
}
}
$node->premium_access = false;
// You do not change body in 5.0.
//$node->body = theme('premium_body', $node);
// The following is one replacement. The other is to use nodeapi alter.
$node->field_content_left[0]['value'] = theme('premium_left', $node);
$node->content['body']['#value'] = theme('premium_body', $node);
}
return;
}
/**
* Implementation of hook_form_alter()
*
* Add the Premium checkbox to the node editing options and default settings
* The Premium flag will behave like other options (published, promote, etc)
*/
function premium_form_alter($form_id, &$form) {
$type = $form['type']['#value'];
$title = t('Access restricted for non-premium users');
switch ($form_id) {
case $type .'_node_settings':
$form['workflow']["node_options_$type"]['#options']['premium'] = $title;
if (in_array('premium', variable_get("node_options_{$type}",array()))) {
$form['workflow']["node_options_$type"]['#default_value'][] = 'premium';
}
return;
case $type .'_node_form':
if (user_access('administer nodes')) {
$node = $form['#node'];
$premium = (int) $node->nid ? $node->premium : in_array('premium', variable_get("node_options_{$type}",array()));
$form['options']['premium'] = array(
'#type' => 'checkbox',
'#title' => t('Access restricted for non-premium users'),
'#default_value' => $premium,
);
}
return;
}
}
/**
* Calculate time offset for auto-aging / auto-archiving
*/
function _premium_offset($node, &$start_ts, &$end_ts) {
$c = variable_get('premium_time_count',2);
$u = variable_get('premium_time_unit','W');
$s = $node->created;
switch ( variable_get('premium_mode', 0) ) {
case 'archive' : // public first, premium after awhile
$start_ts = mktime(date('H',$s)+($u=='H')*$c, 0, 0, date('m',$s)+($u=='M')*$c,
date('d',$s)+($u=='D')*$c+($u=='W')*$c*7, date('y',$s)+($u=='Y')*$c);
return;
case 'latest' : // premium first, ages to general availability
$end_ts = mktime(date('H',$s)+($u=='H')*$c, 0, 0, date('m',$s)+($u=='M')*$c,
date('d',$s)+($u=='D')*$c+($u=='W')*$c*7, date('y',$s)+($u=='Y')*$c);
return;
}
return;
}
/**
* Reformat the message body with a premium content message
*/
function theme_premium_body($node) {
return $node->teaser . '
'.variable_get('premium_message','') . '';
}
function theme_premium_left($node) {
return '
'.variable_get('premium_message_left','') . '';
}
/**
* Implementation of hook_link()
*/
function premium_link($type, $node = NULL, $teaser = FALSE) {
$links = array();
if ($type == 'node' && $node->premium && $teaser == TRUE) {
$links['premium_links'] = theme('premium_links', $node);
}
else {
$links[] = array(
'title' => t('Read more'),
'href' => "node/$node->nid",
'attributes' => array('title' => t('Read the rest of this posting.'))
);
}
return $links;
}
/* Link function for premium Content */
function theme_premium_links($node) {
return array(
'title' => t('Members only'),
'href' => 'node/'. $node->nid,
'attributes' => array('title' => t('This Content is Members Only'))
);
}
/* just works when the file system is private !!! please check first !!! */
function premium_file_download($filename) {
$file = file_create_path($filename);
$result = db_query("SELECT f.* FROM {files} f WHERE filepath = '%s'",
$file);
if ($file = db_fetch_object($result)) {
$node = node_load($file->nid);
$node->premium_access = true;
global $user;
if (!$node->premium) {
return; // not premium content
}
if (!user_access(_premium_access_perm($file->name))) {
return -1; // user has no privileges
}
}
}