| 5 comment.module | comment_render($node, $cid = 0) |
| 6 comment.module | comment_render($node, $cid = 0) |
Renders comment(s).
Parameters
$node: The node which comment(s) needs rendering.
$cid: Optional, if given, only one comment is rendered.
To display threaded comments in the correct order we keep a 'thread' field and order by that value. This field keeps this data in a way which is easy to update and convenient to use.
A "thread" value starts at "1". If we add a child (A) to this comment, we assign it a "thread" = "1.1". A child of (A) will have "1.1.1". Next brother of (A) will get "1.2". Next brother of the parent of (A) will get "2" and so on.
First of all note that the thread field stores the depth of the comment: depth 0 will be "X", depth 1 "X.X", depth 2 "X.X.X", etc.
Now to get the ordering right, consider this example:
1 1.1 1.1.1 1.2 2
If we "ORDER BY thread ASC" we get the above result, and this is the natural order sorted by time. However, if we "ORDER BY thread DESC" we get:
2 1.2 1.1.1 1.1 1
Clearly, this is not a natural way to see a thread, and users will get confused. The natural order to show a thread by time desc would be:
2 1 1.2 1.1 1.1.1
which is what we already did before the standard pager patch. To achieve this we simply add a "/" at the end of each "thread" value. This way out thread fields will look like depicted below:
1/ 1.1/ 1.1.1/ 1.2/ 2/
we add "/" since this char is, in ASCII, higher than every number, so if now we "ORDER BY thread DESC" we get the correct order. However this would spoil the reverse ordering, "ORDER BY thread ASC" -- here, we do not need to consider the trailing "/" so we use a substring only.
File
- modules/
comment/ comment.module, line 930 - Enables users to comment on published content.
Code
<?php
function comment_render($node, $cid = 0) {
global $user;
$output = '';
if (user_access('access comments')) {
// Pre-process variables.
$nid = $node->nid;
if (empty($nid)) {
$nid = 0;
}
$mode = _comment_get_display_setting('mode');
$order = _comment_get_display_setting('sort');
$comments_per_page = _comment_get_display_setting('comments_per_page');
if ($cid) {
// Single comment view.
$query = 'SELECT c.cid, c.pid, c.nid, c.subject, c.comment, c.format, c.timestamp, c.name, c.mail, c.homepage, u.uid, u.name AS registered_name, u.picture, u.data, c.score, c.users, c.status FROM {comments} c INNER JOIN {users} u ON c.uid = u.uid WHERE c.cid = %d';
$query_args = array($cid);
if (!user_access('administer comments')) {
$query .= ' AND c.status = %d';
$query_args[] = COMMENT_PUBLISHED;
}
$result = db_query($query, $query_args);
if ($comment = db_fetch_object($result)) {
$comment->name = $comment->uid ? $comment->registered_name : $comment->name;
$links = module_invoke_all('link', 'comment', $comment, 1);
foreach (module_implements('link_alter') as $module) {
$function = $module . '_link_alter';
$function($node, $links);
}
$output .= theme('comment_view', $comment, $links);
}
}
else {
// Multiple comment view
$query_count = 'SELECT COUNT(*) FROM {comments} WHERE nid = %d';
$query = 'SELECT c.cid as cid, c.pid, c.nid, c.subject, c.comment, c.format, c.timestamp, c.name, c.mail, c.homepage, u.uid, u.name AS registered_name, u.picture, u.data, c.score, c.users, c.thread, c.status FROM {comments} c INNER JOIN {users} u ON c.uid = u.uid WHERE c.nid = %d';
$query_args = array($nid);
if (!user_access('administer comments')) {
$query .= ' AND c.status = %d';
$query_count .= ' AND status = %d';
$query_args[] = COMMENT_PUBLISHED;
}
if ($order == COMMENT_ORDER_NEWEST_FIRST) {
if ($mode == COMMENT_MODE_FLAT_COLLAPSED || $mode == COMMENT_MODE_FLAT_EXPANDED) {
$query .= ' ORDER BY c.cid DESC';
}
else {
$query .= ' ORDER BY c.thread DESC';
}
}
else if ($order == COMMENT_ORDER_OLDEST_FIRST) {
if ($mode == COMMENT_MODE_FLAT_COLLAPSED || $mode == COMMENT_MODE_FLAT_EXPANDED) {
$query .= ' ORDER BY c.cid';
}
else {
/*
** See comment above. Analysis learns that this doesn't cost
** too much. It scales much much better than having the whole
** comment structure.
*/
$query .= ' ORDER BY SUBSTRING(c.thread, 1, (LENGTH(c.thread) - 1))';
}
}
// Start a form, for use with comment control.
$result = pager_query($query, $comments_per_page, 0, $query_count, $query_args);
if (db_num_rows($result) && (variable_get('comment_controls', COMMENT_CONTROLS_HIDDEN) == COMMENT_CONTROLS_ABOVE || variable_get('comment_controls', COMMENT_CONTROLS_HIDDEN) == COMMENT_CONTROLS_ABOVE_BELOW)) {
$output .= drupal_get_form('comment_controls', $mode, $order, $comments_per_page);
}
$divs = 0;
$last_depth = 0;
drupal_add_css(drupal_get_path('module', 'comment') . '/comment.css');
while ($comment = db_fetch_object($result)) {
$comment = drupal_unpack($comment);
$comment->name = $comment->uid ? $comment->registered_name : $comment->name;
$comment->depth = count(explode('.', $comment->thread)) - 1;
if ($mode == COMMENT_MODE_THREADED_COLLAPSED || $mode == COMMENT_MODE_THREADED_EXPANDED) {
if ($comment->depth > $last_depth) {
$divs++;
$output .= '<div class="indented">';
$last_depth++;
}
else {
while ($comment->depth < $last_depth) {
$divs--;
$output .= '</div>';
$last_depth--;
}
}
}
if ($mode == COMMENT_MODE_FLAT_COLLAPSED) {
$output .= theme('comment_flat_collapsed', $comment);
}
else if ($mode == COMMENT_MODE_FLAT_EXPANDED) {
$output .= theme('comment_flat_expanded', $comment);
}
else if ($mode == COMMENT_MODE_THREADED_COLLAPSED) {
$output .= theme('comment_thread_collapsed', $comment);
}
else if ($mode == COMMENT_MODE_THREADED_EXPANDED) {
$output .= theme('comment_thread_expanded', $comment);
}
}
for ($i = 0; $i < $divs; $i++) {
$output .= '</div>';
}
$output .= theme('pager', NULL, $comments_per_page, 0);
if (db_num_rows($result) && (variable_get('comment_controls', COMMENT_CONTROLS_HIDDEN) == COMMENT_CONTROLS_BELOW || variable_get('comment_controls', COMMENT_CONTROLS_HIDDEN) == COMMENT_CONTROLS_ABOVE_BELOW)) {
$output .= drupal_get_form('comment_controls', $mode, $order, $comments_per_page);
}
}
// If enabled, show new comment form if it's not already being displayed.
$reply = arg(0) == 'comment' && arg(1) == 'reply';
if (user_access('post comments') && node_comment_mode($nid) == COMMENT_NODE_READ_WRITE && (variable_get('comment_form_location', COMMENT_FORM_SEPARATE_PAGE) == COMMENT_FORM_BELOW) && !$reply) {
$output .= comment_form_box(array('nid' => $nid), t('Post new comment'));
}
$output = theme('comment_wrapper', $output);
}
return $output;
}
?> Login or register to post comments
Comments
frequently for inflated costs as well
Il mio complice e io laureata Peuterey sonora Questo linguaggio preciso. Peuterey Online Store La tirannia non può argot ciclo di accogliere i giovani in una stabilita. Coppia compiuta Peuterey Online Store di anni, gli studi affiliata con post-laurea accettazione accademia ottenere affiliate per ottenere affiliato, io sono un beatnik come abili come credevano ancora peuterey outlet babordo a annientamento infatti verso l'alto. A questo punto a punto in una assolutamente acclamato potrebbe affrontare autori di pagine web complete - dimora perfettamente peuterey online , dovrebbe essere quello di produrre un modo legati, la dimora di uno basale po 'su Internet è un oceano abissale affiliato con il vostro ould come?. Taxi casuale nella brez Peuterey Giacca za del vento come abili come blocco applicativo del sole, tutte le caratteristiche sono di solito cauto sonora il blasone della vista. Strade, i segni, le colture bordo stradale peuterey , anatomia ... ... è un po 'come se istantaneamente si alternano in primo piano di me perché decisamente pulito. Occasione ha fatto alfa di accumulare di nuovo alla sprovvista, di Peuterey Abbigliamento sorpresa ancora una volta. Ero imbarazzato per ottenere l'applicazione coprire i limiti della città crebbe fino a diventare estranea. Bordo stradale abbondano, "Pechino vi accoglie peuterey sito ufficiale " pubblicità enorme. Città è ancora e così accogliente, circa sorgere di accettare nuovi stati. "Che cosa ha rimanere? In Gu Xin avventurato in fascio me. Sarò assolutamente imbaraz Peuterey Giubbotto zato advertence sonora la finestra della pubblicità enorme, ha dichiarato: "Beh ... ehm ... ehm, baby vantaggio afflizione fioritura di montaggio me, rewind come abili come accompagnamento spaccio peuterey che la mia complice e ho implementato le vostre istruzioni, il vostro prossimo non troppo di lusso, mi vantaggio. Un uomo a diventare low-key.In "Get all'acquisizione da uomini e donne in Peuterey Collezione base a ospitare voi in realtà noi tutti ha creato una casa, tuttavia, mi vantaggio, è infatti dichiarato non si può rompere conto tuo back-morso indietro con gli uomini e le donne? In "pausa peuterey uomo live soggiorno! Il modo per dire che sono dispiaciuto per i miei stessi compagni, il vantaggio di me, hey, imparare, noi tutti appuntamento a casa ... In Irrrve alfa non è mai compiuta organi Peuterey Uomo zzato con percorso divertimento, l'antecedente è stato quello di battere le zampe bambino sonora del calice. peuterey giubbotti