class CommentStorageController extends EntityDatabaseStorageController {
public function load($ids = array(), $conditions = array()) {
$comments = parent::load($ids, $conditions);
foreach ($comments as $key => $comment) {
$comment->new = node_mark($comment->nid, $comment->changed);
}
return $comments;
}
protected function buildQuery($ids, $conditions = array(), $revision_id = FALSE) {
$query = parent::buildQuery($ids, $conditions, $revision_id);
$query->innerJoin('node', 'n', 'base.nid = n.nid');
$query->addField('n', 'type', 'node_type');
$query->innerJoin('users', 'u', 'base.uid = u.uid');
$query->addField('u', 'name', 'registered_name');
$query->fields('u', array('uid', 'signature', 'signature_format', 'picture'));
return $query;
}
protected function attachLoad(&$comments, $revision_id = FALSE) {
foreach ($comments as $key => $comment) {
$comment->name = $comment->uid ? $comment->registered_name : $comment->name;
$comment->node_type = 'comment_node_' . $comment->node_type;
$comments[$key] = $comment;
}
parent::attachLoad($comments, $revision_id);
}
protected function preSave(EntityInterface $comment) {
global $user;
if (!isset($comment->status)) {
$comment->status = user_access('skip comment approval') ? COMMENT_PUBLISHED : COMMENT_NOT_PUBLISHED;
}
if (!isset($comment->node_type)) {
$node = node_load($comment->nid);
$comment->node_type = 'comment_node_' . $node->type;
}
if (!$comment->cid) {
if (!empty($comment->thread)) {
$thread = $comment->thread;
}
elseif ($comment->pid == 0) {
$max = db_query('SELECT MAX(thread) FROM {comment} WHERE nid = :nid', array(':nid' => $comment->nid))->fetchField();
$max = rtrim((string) $max, '/');
$parts = explode('.', $max);
$firstsegment = $parts[0];
$thread = comment_increment_alphadecimal($firstsegment) . '/';
}
else {
$parent = comment_load($comment->pid);
$parent->thread = (string) rtrim((string) $parent->thread, '/');
$max = db_query("SELECT MAX(thread) FROM {comment} WHERE thread LIKE :thread AND nid = :nid", array(
':thread' => $parent->thread . '.%',
':nid' => $comment->nid,
))->fetchField();
if ($max == '') {
$thread = $parent->thread . '.' . comment_int_to_alphadecimal(0) . '/';
}
else {
$max = rtrim($max, '/');
$parts = explode('.', $max);
$parent_depth = count(explode('.', $parent->thread));
$last = $parts[$parent_depth];
$thread = $parent->thread . '.' . comment_increment_alphadecimal($last) . '/';
}
}
if (empty($comment->created)) {
$comment->created = REQUEST_TIME;
}
if (empty($comment->changed)) {
$comment->changed = $comment->created;
}
if ($comment->uid === $user->uid && isset($user->name)) {
$comment->name = $user->name;
}
$comment->thread = $thread;
$comment->hostname = ip_address();
}
}
protected function postSave(EntityInterface $comment, $update) {
$this->updateNodeStatistics($comment->nid);
if ($comment->status == COMMENT_PUBLISHED) {
module_invoke_all('comment_publish', $comment);
}
$node_info = entity_get_info('node');
if (isset($node_info['entity cache']) && $node_info['entity cache']) {
cache('entity_node')->delete($comment->nid);
}
}
protected function postDelete($comments) {
$query = db_select('comment', 'c')
->fields('c', array('cid'))
->condition('pid', array(array_keys($comments)), 'IN');
$child_cids = $query->execute()->fetchCol();
comment_delete_multiple($child_cids);
foreach ($comments as $comment) {
$this->updateNodeStatistics($comment->nid);
$nodes[] = $comment->nid;
}
$node_info = entity_get_info('node');
if (isset($node_info['entity cache']) && $node_info['entity cache']) {
foreach (array_unique($nodes) as $nid) {
cache('entity_node')->delete($nid);
}
}
}
protected function updateNodeStatistics($nid) {
if (!state_get('comment_maintain_node_statistics', TRUE)) {
return;
}
$count = db_query('SELECT COUNT(cid) FROM {comment} WHERE nid = :nid AND status = :status', array(
':nid' => $nid,
':status' => COMMENT_PUBLISHED,
))->fetchField();
if ($count > 0) {
$last_reply = db_query_range('SELECT cid, name, changed, uid FROM {comment} WHERE nid = :nid AND status = :status ORDER BY cid DESC', 0, 1, array(
':nid' => $nid,
':status' => COMMENT_PUBLISHED,
))->fetchObject();
db_update('node_comment_statistics')
->fields(array(
'cid' => $last_reply->cid,
'comment_count' => $count,
'last_comment_timestamp' => $last_reply->changed,
'last_comment_name' => $last_reply->uid ? '' : $last_reply->name,
'last_comment_uid' => $last_reply->uid,
))
->condition('nid', $nid)
->execute();
}
else {
$node = db_query('SELECT uid, created FROM {node} WHERE nid = :nid', array(':nid' => $nid))->fetchObject();
db_update('node_comment_statistics')
->fields(array(
'cid' => 0,
'comment_count' => 0,
'last_comment_timestamp' => $node->created,
'last_comment_name' => '',
'last_comment_uid' => $node->uid,
))
->condition('nid', $nid)
->execute();
}
}
public function buildContent(EntityInterface $comment, $view_mode = 'full', $langcode = NULL) {
global $language_content;
$langcode = $langcode ? $langcode : $language_content->langcode;
$node = node_load($comment->nid);
$comment->content = array();
$view_mode = key(entity_view_mode_prepare('comment', array($comment->cid => $comment), $view_mode, $langcode));
field_attach_prepare_view('comment', array($comment->cid => $comment), $view_mode, $langcode);
entity_prepare_view('comment', array($comment->cid => $comment), $langcode);
$comment->content += field_attach_view('comment', $comment, $view_mode, $langcode);
$comment->content['links'] = array(
'#theme' => 'links__comment',
'#pre_render' => array('backdrop_pre_render_links'),
'#attributes' => array('class' => array('links', 'inline')),
);
if (empty($comment->in_preview)) {
$comment->content['links']['comment'] = array(
'#theme' => 'links__comment__comment',
'#links' => comment_links($comment, $node),
'#attributes' => array('class' => array('links', 'inline')),
);
}
module_invoke_all('comment_view', $comment, $view_mode, $langcode);
module_invoke_all('entity_view', $comment, 'comment', $view_mode, $langcode);
$comment->content += array('#view_mode' => $view_mode);
}
public function view($comments, $view_mode = 'full', $langcode = NULL, $page = NULL) {
global $language_content;
$langcode = $langcode ? $langcode : $language_content->langcode;
$view = array();
foreach ($comments as $comment) {
$this->buildContent($comment, $view_mode, $langcode);
$node = node_load($comment->nid);
$build = $comment->content;
unset($comment->content);
$build += array(
'#theme' => 'comment__node_' . $node->type . '__' . $view_mode,
'#comment' => $comment,
'#node' => $node,
'#view_mode' => $view_mode,
'#language' => $langcode,
'#page' => $page,
);
$node_type = node_type_get_type($node->type);
if (empty($comment->in_preview)) {
$prefix = '';
$is_threaded = isset($comment->divs) && $node_type->settings['comment_mode'] == COMMENT_MODE_THREADED;
if (!empty($comment->first_new)) {
$prefix .= "<a id=\"new\"></a>\n";
}
if ($is_threaded) {
$prefix .= $comment->divs <= 0 ? str_repeat('</div>', abs($comment->divs)) : "\n" . '<div class="indented">';
}
$prefix .= "<a id=\"comment-$comment->cid\"></a>\n";
$build['#prefix'] = $prefix;
if ($is_threaded && !empty($comment->divs_final)) {
$build['#suffix'] = str_repeat('</div>', $comment->divs_final);
}
}
$type = 'comment';
backdrop_alter(array('comment_view', 'entity_view'), $build, $type);
$view[$type][$comment->id()] = $build;
}
return $view;
}
}