2007-08-23 16:01:01 +00:00
< ? php
/**
* @ file
2012-02-19 03:31:32 +00:00
* User page callbacks for tracker . module .
2007-08-23 16:01:01 +00:00
*/
/**
2012-02-19 03:31:32 +00:00
* Page callback : Generates a page of tracked nodes for the site .
*
* Queries the database for info , adds RDFa info if applicable , and generates
* the render array that will be used to render the page .
*
* @ return array
* A renderable array .
*
* @ see tracker_menu ()
2007-08-23 16:01:01 +00:00
*/
2007-11-06 08:51:23 +00:00
function tracker_page ( $account = NULL , $set_title = FALSE ) {
if ( $account ) {
2012-06-05 05:42:19 +00:00
$query = db_select ( 'tracker_user' , 't' )
-> extend ( 'Drupal\Core\Database\Query\PagerSelectExtender' );
2009-08-31 06:52:50 +00:00
$query -> condition ( 't.uid' , $account -> uid );
2007-11-06 08:51:23 +00:00
if ( $set_title ) {
// When viewed from user/%user/track, display the name of the user
// as page title -- the tab title remains Track so this needs to be done
2008-12-30 16:43:20 +00:00
// here and not in the menu definition.
2012-01-16 02:18:26 +00:00
drupal_set_title ( user_format_name ( $account ));
2007-11-06 08:51:23 +00:00
}
2007-08-23 16:01:01 +00:00
}
2009-08-31 06:52:50 +00:00
else {
2012-06-05 05:42:19 +00:00
$query = db_select ( 'tracker_node' , 't' , array ( 'target' => 'slave' ))
-> extend ( 'Drupal\Core\Database\Query\PagerSelectExtender' );
2009-08-31 06:52:50 +00:00
}
// This array acts as a placeholder for the data selected later
// while keeping the correct order.
2013-03-10 19:05:24 +00:00
$tracker_data = $query
2009-08-31 06:52:50 +00:00
-> addTag ( 'node_access' )
2012-07-26 21:40:46 +00:00
-> addMetaData ( 'base_table' , 'tracker_node' )
2009-08-31 06:52:50 +00:00
-> fields ( 't' , array ( 'nid' , 'changed' ))
-> condition ( 't.published' , 1 )
-> orderBy ( 't.changed' , 'DESC' )
-> limit ( 25 )
-> execute ()
-> fetchAllAssoc ( 'nid' );
2007-08-23 16:01:01 +00:00
2009-12-02 14:56:32 +00:00
$rows = array ();
2013-03-10 19:05:24 +00:00
if ( ! empty ( $tracker_data )) {
$nids = array_keys ( $tracker_data );
$nodes = entity_load_multiple ( 'node' , $nids );
2012-02-19 03:31:32 +00:00
// Now, get the data and put into the placeholder array.
2013-03-10 19:05:24 +00:00
$result = db_query ( 'SELECT n.nid, l.comment_count FROM {node} n INNER JOIN {node_comment_statistics} l ON n.nid = l.nid INNER JOIN {users} u ON n.uid = u.uid WHERE n.nid IN (:nids)' , array ( ':nids' => $nids ), array ( 'target' => 'slave' )) -> fetchAllKeyed ();
foreach ( $result as $nid => $comment_count ) {
$nodes [ $nid ] -> last_activity = $tracker_data [ $nid ] -> changed ;
$nodes [ $nid ] -> comment_count = $comment_count ;
2009-08-31 06:52:50 +00:00
}
2009-04-05 12:26:12 +00:00
2012-02-19 03:31:32 +00:00
// Display the data.
2009-08-31 06:52:50 +00:00
foreach ( $nodes as $node ) {
2012-02-19 03:31:32 +00:00
// Determine the number of comments.
2009-08-31 06:52:50 +00:00
$comments = 0 ;
if ( $node -> comment_count ) {
$comments = $node -> comment_count ;
2007-08-23 16:01:01 +00:00
2009-08-31 06:52:50 +00:00
if ( $new = comment_num_new ( $node -> nid )) {
$comments .= '<br />' ;
2012-02-19 03:31:32 +00:00
$comments .= l ( format_plural ( $new , '1 new' , '@count new' ), 'node/' . $node -> nid , array ( 'fragment' => 'new' ));
2009-08-31 06:52:50 +00:00
}
2007-08-23 16:01:01 +00:00
}
2010-01-14 06:23:40 +00:00
$row = array (
2012-09-19 09:54:05 +00:00
'type' => check_plain ( node_get_type_label ( $node )),
2012-07-22 18:07:00 +00:00
// Do not use $node->label(), because $node comes from the database.
2010-01-14 06:23:40 +00:00
'title' => array ( 'data' => l ( $node -> title , 'node/' . $node -> nid ) . ' ' . theme ( 'mark' , array ( 'type' => node_mark ( $node -> nid , $node -> changed )))),
'author' => array ( 'data' => theme ( 'username' , array ( 'account' => $node ))),
'replies' => array ( 'class' => array ( 'replies' ), 'data' => $comments ),
'last updated' => array ( 'data' => t ( '!time ago' , array ( '!time' => format_interval ( REQUEST_TIME - $node -> last_activity )))),
2009-08-31 06:52:50 +00:00
);
2010-01-14 06:23:40 +00:00
// Adds extra RDFa markup to the $row array if the RDF module is enabled.
if ( function_exists ( 'rdf_mapping_load' )) {
// Each node is not loaded for performance reasons, as a result we need
// to retrieve the RDF mapping for each node type.
$mapping = rdf_mapping_load ( 'node' , $node -> type );
// Adds RDFa markup to the title of the node. Because the RDFa markup is
// added to the td tag which might contain HTML code, we specify an
// empty datatype to ensure the value of the title read by the RDFa
// parsers is a plain literal.
$row [ 'title' ] += rdf_rdfa_attributes ( $mapping [ 'title' ]) + array ( 'datatype' => '' );
// Annotates the td tag containing the author of the node.
$row [ 'author' ] += rdf_rdfa_attributes ( $mapping [ 'uid' ]);
// Annotates the td tag containing the number of replies. We add the
// content attribute to ensure that only the comment count is used as
// the value for 'num_replies'. Otherwise, other text such as a link
// to the number of new comments could be included in the 'num_replies'
// value.
$row [ 'replies' ] += rdf_rdfa_attributes ( $mapping [ 'comment_count' ]);
$row [ 'replies' ] += array ( 'content' => $node -> comment_count );
// If the node has no comments, we assume the node itself was modified
// and apply 'changed' in addition to 'last_activity'. If there are
// comments present, we cannot infer whether the node itself was
// modified or a comment was posted, so we use only 'last_activity'.
$mapping_last_activity = rdf_rdfa_attributes ( $mapping [ 'last_activity' ], $node -> last_activity );
if ( $node -> comment_count == 0 ) {
$mapping_changed = rdf_rdfa_attributes ( $mapping [ 'changed' ], $node -> last_activity );
$mapping_last_activity [ 'property' ] = array_merge ( $mapping_last_activity [ 'property' ], $mapping_changed [ 'property' ]);
}
$row [ 'last updated' ] += $mapping_last_activity ;
// We need to add the about attribute on the tr tag to specify which
2012-02-19 03:31:32 +00:00
// node the RDFa annotations above apply to. We move the content of
2010-01-14 06:23:40 +00:00
// $row to a 'data' sub array so we can specify attributes for the row.
$row = array ( 'data' => $row );
$row [ 'about' ] = url ( 'node/' . $node -> nid );
}
$rows [] = $row ;
2009-08-31 06:52:50 +00:00
}
2007-08-23 16:01:01 +00:00
}
2009-07-02 04:27:23 +00:00
$page [ 'tracker' ] = array (
'#rows' => $rows ,
2009-11-23 02:45:42 +00:00
'#header' => array ( t ( 'Type' ), t ( 'Title' ), t ( 'Author' ), t ( 'Replies' ), t ( 'Last updated' )),
2009-07-02 04:27:23 +00:00
'#theme' => 'table' ,
2009-12-02 14:56:32 +00:00
'#empty' => t ( 'No content available.' ),
2009-07-02 04:27:23 +00:00
);
$page [ 'pager' ] = array (
'#theme' => 'pager' ,
'#quantity' => 25 ,
'#weight' => 10 ,
);
$page [ '#sorted' ] = TRUE ;
2007-08-23 16:01:01 +00:00
2009-07-02 04:27:23 +00:00
return $page ;
2007-08-23 16:01:01 +00:00
}