View source
<?php
$freelinking['nodetitle'] = array(
'indicator' => '/nt$|nodetitle|title/A',
'callback' => 'freelinking_nodetitle_callback',
'tip' => t('Click to view a local node.'),
'run on view' => TRUE,
'weight' => -10,
);
function freelinking_nodetitle_callback($target, $plugin) {
$link = _freelinking_nodetitle_prepare_link($target, $plugin['tip']);
if (empty($link)) {
return _freelinking_nodetitle_failure($target);
}
if (isset($target['text'])) {
$link['title'] = check_plain($target['text']);
}
if (isset($target['tooltip'])) {
$link['tooltip'] = $target['tooltip'];
}
return array(
$link['title'],
$link['url'],
array(
'language' => $link['language'],
'attributes' => array(
'title' => $link['tooltip'],
),
),
);
}
function freelinking_nodetitle_settings() {
$form['freelinking_nodetitle_linkcontenttype'] = array(
'#title' => t('Only link to nodes belonging to the following content types:'),
'#type' => 'checkboxes',
'#options' => node_type_get_names(),
'#default_value' => variable_get('freelinking_nodetitle_linkcontenttype', array()),
'#description' => t('Lookup by title to will be restricted to this content type or these content types.'),
);
$failover_option['none'] = t('Do nothing');
$failover_option['showtext'] = t('Show text (remove markup)');
$extra_description = '';
if (module_exists('freelinking_prepopulate')) {
$failover_option['create'] = t('Add a link to create content. (Without Permission: Access Denied)');
}
else {
$extra_description .= '<br />' . t('Note: Enable the <strong>Freelinking Prepopulate</strong> submodule to add a content creation failover option.');
}
if (module_exists('search')) {
$failover_option['search'] = t('Add a link to Search Content');
}
else {
$extra_description .= '<br /><strong>' . t('Note: Enable the %module module for internal search option.', array(
'%module' => 'Search',
)) . '</strong>';
if (($search_plugin = variable_get('freelinking_search_failover', 'error')) != 'error') {
$failover_option['search'] = t('Add a link to %search Search Content.', array(
'%search' => drupal_ucfirst($search_plugin),
));
}
}
$failover_option['error'] = t('Insert an error message');
$form['freelinking_nodetitle_failover'] = array(
'#title' => t('If a suitable content is not found'),
'#type' => 'select',
'#options' => $failover_option,
'#default_value' => variable_get('freelinking_nodetitle_failover', _freelinking_nodetitle_default_failover()),
'#description' => t('What should freelinking do when the page is not found?') . $extra_description,
);
return $form;
}
function _freelinking_nodetitle_prepare_link($target, $tip) {
$link_cache =& drupal_static(__FUNCTION__, array());
$id = md5($target['dest']);
if (!isset($link_cache[$id])) {
$output = array();
$contenttypes = variable_get('freelinking_nodetitle_linkcontenttype', array());
$result = db_query("SELECT n.nid FROM {node} n WHERE n.title = :title AND n.status = 1", array(
":title" => $target['dest'],
));
$all = $result
->fetchAll();
$found = FALSE;
foreach ($all as $item) {
$nodex = node_load($item->nid);
if ($contenttypes[$nodex->type] && node_access('view', $nodex)) {
$found = TRUE;
break;
}
}
if ($found && isset($nodex)) {
$tooltip = $target['tooltip'] ? $target['tooltip'] : $tip;
$output = array(
'title' => $nodex->title,
'url' => 'node/' . $nodex->nid,
'language' => isset($nodex->language) ? $nodex->language : LANGUAGE_NONE,
'tooltip' => $tooltip,
);
}
$link_cache[$id] = $output;
}
return $link_cache[$id];
}
function _freelinking_nodetitle_failure($target) {
$failover = variable_get('freelinking_nodetitle_failover', _freelinking_nodetitle_default_failover());
switch ($failover) {
case 'create':
return array(
'failover' => 'freelinking_prepopulate',
'target' => $target,
);
case 'showtext':
return array(
'failover' => 'showtext',
'target' => $target,
);
case 'search':
return array(
'failover' => 'search',
'target' => $target,
);
case 'error':
return array(
'failover' => 'error',
'message' => t('node title “%title” does not exist', array(
'%title' => $target['dest'],
)),
);
}
return FALSE;
}
function _freelinking_nodetitle_default_failover() {
if (module_exists('freelinking_prepopulate')) {
return 'create node';
}
elseif (module_exists('search')) {
return 'search';
}
return 'none';
}