| 1 |
<?php |
<?php |
| 2 |
// $Id: nodereferrer.module,v 1.18 2009/04/09 14:43:17 andypost Exp $ |
// $Id: nodereferrer.module,v 1.19 2009/06/17 10:17:50 andypost Exp $ |
| 3 |
|
|
| 4 |
|
|
| 5 |
|
|
| 6 |
/** |
/** |
| 7 |
* @file |
* @file |
| 8 |
* Defines a field type for backlinking referencing nodes. |
* Defines a field type for backlinking referencing nodes. |
| 9 |
|
* |
| 10 |
* @todo |
* @todo |
| 11 |
* -clear content cache with nodeapi. |
* -clear content cache with nodeapi. |
| 12 |
* -query nids for access on load/view.. |
* -query nids for access on load/view.. |
| 15 |
/** |
/** |
| 16 |
* Implementation of hook_help(). |
* Implementation of hook_help(). |
| 17 |
*/ |
*/ |
| 18 |
function nodereferrer_help($section, $arg) { |
function nodereferrer_help($path, $arg) { |
| 19 |
switch ($section) { |
switch ($path) { |
| 20 |
case 'admin/modules#description': |
case 'admin/modules#description': |
| 21 |
return t('<strong>CCK:</strong> Defines a field type for displaying referrers to a node. <em>Note: Requires content.module.</em>'); |
return t('<strong>CCK:</strong> Defines a field type for displaying referrers to a node. <em>Note: Requires content.module.</em>'); |
| 22 |
} |
} |
| 42 |
foreach ($data as $k => $v) { |
foreach ($data as $k => $v) { |
| 43 |
$data[$k] = array(); |
$data[$k] = array(); |
| 44 |
} |
} |
| 45 |
} else { |
} |
| 46 |
|
else { |
| 47 |
$data = array(); |
$data = array(); |
| 48 |
} |
} |
| 49 |
return $data; |
return $data; |
| 72 |
); |
); |
| 73 |
|
|
| 74 |
$options = nodereferrer_nodereference_field_options(); |
$options = nodereferrer_nodereference_field_options(); |
| 75 |
$form['referrer_fields'] = array ( |
$form['referrer_fields'] = array( |
| 76 |
'#type' => 'checkboxes', |
'#type' => 'checkboxes', |
| 77 |
'#title' => t('Referring Fields'), |
'#title' => t('Referring Fields'), |
| 78 |
'#multiple' => TRUE, |
'#multiple' => TRUE, |
| 165 |
// clear any modules referring to me as my title or other data may change. |
// clear any modules referring to me as my title or other data may change. |
| 166 |
// and nodereference doesn't clear the cache yet. |
// and nodereference doesn't clear the cache yet. |
| 167 |
foreach (nodereferrer_referrers($node->nid, $fields, $types, false) as $delta => $item) { |
foreach (nodereferrer_referrers($node->nid, $fields, $types, false) as $delta => $item) { |
| 168 |
$cid = 'content:'. $item['nid'] .':'. $item['vid']; |
$cid = 'content:' . $item['nid'] . ':' . $item['vid']; |
| 169 |
cache_clear_all($cid, 'cache_page'); |
cache_clear_all($cid, 'cache_page'); |
| 170 |
} |
} |
| 171 |
return; |
return; |
| 264 |
$themed_items = array(); |
$themed_items = array(); |
| 265 |
foreach ($items as $i) { |
foreach ($items as $i) { |
| 266 |
$i['field'] = $info; // Add some extra information the themer might like to have |
$i['field'] = $info; // Add some extra information the themer might like to have |
| 267 |
$themed_items[] = theme('nodereferrer_field_'.$formatter, $i); |
$themed_items[] = theme('nodereferrer_field_' . $formatter, $i); |
| 268 |
} |
} |
| 269 |
$out = theme_item_list($themed_items).$pager; |
$out = theme('item_list', $themed_items) . $pager; |
| 270 |
|
|
| 271 |
return $out; |
return $out; |
| 272 |
} |
} |
| 279 |
} |
} |
| 280 |
|
|
| 281 |
function theme_nodereferrer_field_default($element) { |
function theme_nodereferrer_field_default($element) { |
| 282 |
return l($element['title'], 'node/'. $element['nid']); |
return l($element['title'], 'node/' . $element['nid']); |
| 283 |
} |
} |
| 284 |
|
|
| 285 |
/** |
/** |
| 332 |
} |
} |
| 333 |
|
|
| 334 |
/** |
/** |
| 335 |
* Implementation of hook_content_is_empty |
* Implementation of hook_content_is_empty(). |
| 336 |
*/ |
*/ |
| 337 |
function nodereferrer_content_is_empty($item, $field) { |
function nodereferrer_content_is_empty($item, $field) { |
| 338 |
return TRUE; |
return TRUE; |
| 352 |
|
|
| 353 |
function nodereferrer_referrers($nid, $fieldnames = array(), $nodetypes = array(), $translations = 0, $order = 'DESC') { |
function nodereferrer_referrers($nid, $fieldnames = array(), $nodetypes = array(), $translations = 0, $order = 'DESC') { |
| 354 |
if ($nodetypes) { |
if ($nodetypes) { |
| 355 |
$filter_nodetypes = "AND n.type IN ('". implode("', '", $nodetypes) ."')"; |
$filter_nodetypes = "AND n.type IN ('" . implode("', '", $nodetypes) . "')"; |
| 356 |
} |
} |
| 357 |
else { |
else { |
| 358 |
$filter_nodetypes = ''; |
$filter_nodetypes = ''; |
| 359 |
} |
} |
| 360 |
$fields = content_fields(); |
$fields = content_fields(); |
| 361 |
// Set default values of fieldnames.. |
// Set default values of fieldnames. |
| 362 |
if (!count($fieldnames)) { |
if (!count($fieldnames)) { |
| 363 |
$fieldnames = array_keys($fields); |
$fieldnames = array_keys($fields); |
| 364 |
} |
} |
| 386 |
|
|
| 387 |
|
|
| 388 |
$values = array(); |
$values = array(); |
| 389 |
foreach($fieldnames as $fieldname) { |
foreach ($fieldnames as $fieldname) { |
| 390 |
if ($fields[$fieldname]['type'] == 'nodereference') { |
if ($fields[$fieldname]['type'] == 'nodereference') { |
| 391 |
$db_info = content_database_info($fields[$fieldname]); |
$db_info = content_database_info($fields[$fieldname]); |
| 392 |
|
|
| 394 |
$query = "SELECT n.nid, n.vid, n.title |
$query = "SELECT n.nid, n.vid, n.title |
| 395 |
FROM {" . $db_info['table'] . "} nr |
FROM {" . $db_info['table'] . "} nr |
| 396 |
INNER JOIN {node} current_node ON current_node.nid = %d |
INNER JOIN {node} current_node ON current_node.nid = %d |
| 397 |
INNER JOIN {node} n ON n.vid = nr.vid AND n.status = 1 ". $filter_nodetypes ." |
INNER JOIN {node} n ON n.vid = nr.vid AND n.status = 1 " . $filter_nodetypes . " |
| 398 |
LEFT JOIN {node} translations ON current_node.tnid > 0 AND translations.tnid = current_node.tnid |
LEFT JOIN {node} translations ON current_node.tnid > 0 AND translations.tnid = current_node.tnid |
| 399 |
WHERE (current_node.tnid = 0 AND nr." . $db_info['columns']['nid']['column'] . " = current_node.nid) |
WHERE (current_node.tnid = 0 AND nr." . $db_info['columns']['nid']['column'] . " = current_node.nid) |
| 400 |
OR |
OR |
| 401 |
(current_node.tnid > 0 AND nr." . $db_info['columns']['nid']['column'] . " = translations.nid) |
(current_node.tnid > 0 AND nr." . $db_info['columns']['nid']['column'] . " = translations.nid) |
| 402 |
ORDER BY ". $order; |
ORDER BY " . $order; |
| 403 |
} else { |
} |
| 404 |
|
else { |
| 405 |
$query = "SELECT n.nid, n.vid, n.title |
$query = "SELECT n.nid, n.vid, n.title |
| 406 |
FROM {" . $db_info['table'] . "} nr |
FROM {" . $db_info['table'] . "} nr |
| 407 |
INNER JOIN {node} n ON n.vid = nr.vid AND n.status = 1 ". $filter_nodetypes ." |
INNER JOIN {node} n ON n.vid = nr.vid AND n.status = 1 " . $filter_nodetypes . " |
| 408 |
WHERE nr." . $db_info['columns']['nid']['column'] . " = %d |
WHERE nr." . $db_info['columns']['nid']['column'] . " = %d |
| 409 |
ORDER BY ". $order; |
ORDER BY " . $order; |
| 410 |
} |
} |
| 411 |
|
|
| 412 |
$query = db_rewrite_sql($query); |
$query = db_rewrite_sql($query); |
| 430 |
$types = content_fields(); |
$types = content_fields(); |
| 431 |
foreach($types as $type) { |
foreach($types as $type) { |
| 432 |
if ($type['type'] == 'nodereference') { |
if ($type['type'] == 'nodereference') { |
| 433 |
$options[$type['field_name']] = $type['field_name'] .' ('. $type['widget']['label'] .')'; |
$options[$type['field_name']] = $type['field_name'] . ' (' . $type['widget']['label'] . ')'; |
| 434 |
} |
} |
| 435 |
} |
} |
| 436 |
return $options; |
return $options; |
| 437 |
} |
} |
| 438 |
|
|
| 439 |
/** |
/** |
| 440 |
* Implementation of hook_nodeapi |
* Implementation of hook_nodeapi(). |
| 441 |
*/ |
*/ |
| 442 |
function nodereferrer_nodeapi($node, $op) { |
function nodereferrer_nodeapi($node, $op) { |
| 443 |
switch ($op) { |
switch ($op) { |
| 453 |
// when the referencing node is updated. |
// when the referencing node is updated. |
| 454 |
if ($field['type'] == 'nodereference') { |
if ($field['type'] == 'nodereference') { |
| 455 |
$node_field = isset($node->$field['field_name']) ? $node->$field['field_name'] : array(); |
$node_field = isset($node->$field['field_name']) ? $node->$field['field_name'] : array(); |
| 456 |
foreach($node_field as $delta => $item) { |
foreach ($node_field as $delta => $item) { |
| 457 |
$nids[$item['nid']] = $item['nid']; |
$nids[$item['nid']] = $item['nid']; |
| 458 |
} |
} |
| 459 |
} |
} |
| 478 |
} |
} |
| 479 |
|
|
| 480 |
/** |
/** |
| 481 |
* Implementation of hook_views_api |
* Implementation of hook_views_api(). |
| 482 |
*/ |
*/ |
| 483 |
function nodereferrer_views_api() { |
function nodereferrer_views_api() { |
| 484 |
return array( |
return array( |
| 485 |
'api' => '2.0', |
'api' => '2.0', |
| 486 |
'path' => drupal_get_path('module', 'nodereferrer').'/views', |
'path' => drupal_get_path('module', 'nodereferrer') . '/views', |
| 487 |
); |
); |
| 488 |
} |
} |
| 489 |
|
|