diff --git a/core/lib/Drupal/Core/Entity/DatabaseStorageControllerNG.php b/core/lib/Drupal/Core/Entity/DatabaseStorageControllerNG.php index 007d6d3..9af9729 100644 --- a/core/lib/Drupal/Core/Entity/DatabaseStorageControllerNG.php +++ b/core/lib/Drupal/Core/Entity/DatabaseStorageControllerNG.php @@ -80,7 +80,7 @@ public function create(array $values) { $entity = new $this->entityClass(array(), $this->entityType); // Make sure to set the bundle first. - if ($this->bundleKey) { + if ($this->bundleKey && !empty($values[$this->bundleKey])) { $entity->{$this->bundleKey} = $values[$this->bundleKey]; unset($values[$this->bundleKey]); } @@ -235,7 +235,15 @@ protected function invokeHook($hook, EntityInterface $entity) { protected function mapToStorageRecord(EntityInterface $entity) { $record = new \stdClass(); foreach ($this->entityInfo['schema_fields_sql']['base table'] as $name) { - $record->$name = $entity->$name->value; + switch ($entity->$name->get('value')->getType()) { + // Store dates using timestamps. + case 'date': + $record->$name = $entity->$name->value->getTimestamp(); + break; + default: + $record->$name = $entity->$name->value; + break; + } } return $record; } diff --git a/core/lib/Drupal/Core/Entity/EntityNG.php b/core/lib/Drupal/Core/Entity/EntityNG.php index 7520466..c0080aa 100644 --- a/core/lib/Drupal/Core/Entity/EntityNG.php +++ b/core/lib/Drupal/Core/Entity/EntityNG.php @@ -60,6 +60,28 @@ class EntityNG extends Entity { */ protected $compatibilityMode = FALSE; + /** + * Overrides Entity::__construct(). + */ + public function __construct(array $values, $entity_type) { + parent::__construct($values, $entity_type); + $this->init(); + } + + /** + * Initialize the object. Invoked upon construction and wake up. + */ + protected function init() { + // We unset all defined properties, so magic getters apply. + unset($this->langcode); + } + + /** + * Magic __wakeup() implemenation. + */ + public function __wakeup() { + $this->init(); + } /** * Overrides Entity::id(). @@ -292,11 +314,26 @@ public function translations() { * @see EntityNG::compatibilityMode */ public function setCompatibilityMode($enabled) { - $this->compatibilityMode = (bool) $enabled; - if ($enabled) { + if (!$this->compatibilityMode && $enabled) { $this->updateOriginalValues(); $this->fields = array(); } + elseif ($this->compatibilityMode && !$enabled) { + // Field API might have written values with a language key, which should + // haved used LANGUAGE_DEFAULT. Fix that by moving values around. + $langcode = $this->get('langcode')->value; + + if ($langcode != LANGUAGE_DEFAULT) { + foreach ($this->getPropertyDefinitions() as $name => $definition) { + if (isset($this->values[$name][$langcode]) && is_array($this->values[$name][$langcode])) { + $this->values[$name][LANGUAGE_DEFAULT] = $this->values[$name][$langcode]; + unset($this->values[$name][$langcode]); + } + } + } + } + + $this->compatibilityMode = (bool) $enabled; } /** @@ -313,8 +350,8 @@ public function getCompatibilityMode() { * operation. */ public function updateOriginalValues() { - foreach ($this->fields as $name => $properties) { - foreach ($properties as $langcode => $property) { + foreach ($this->getProperties() as $name => $property) { + foreach ($this->fields[$name] as $langcode => $property) { $this->values[$name][$langcode] = $property->getValue(); } } @@ -339,10 +376,12 @@ public function &__get($name) { $return = $this->get($name); return $return; } - if (!isset($this->$name)) { - $this->$name = NULL; + // Else directly read/write plain values. That way, fields not yet converted + // to the entity field API can always be accessed as in compatibility mode. + if (!isset($this->values[$name])) { + $this->values[$name] = NULL; } - return $this->$name; + return $this->values[$name]; } /** @@ -363,8 +402,10 @@ public function __set($name, $value) { elseif ($this->getPropertyDefinition($name)) { $this->get($name)->setValue($value); } + // Else directly read/write plain values. That way, fields not yet converted + // to the entity field API can always be accessed as in compatibility mode. else { - $this->$name = $value; + $this->values[$name] = $value; } } @@ -372,24 +413,24 @@ public function __set($name, $value) { * Magic method. */ public function __isset($name) { - if ($this->compatibilityMode) { - return isset($this->values[$name]); - } - elseif ($this->getPropertyDefinition($name)) { + if (!$this->compatibilityMode && $this->getPropertyDefinition($name)) { return (bool) count($this->get($name)); } + else { + return isset($this->values[$name]); + } } /** * Magic method. */ public function __unset($name) { - if ($this->compatibilityMode) { - unset($this->values[$name]); - } - elseif ($this->getPropertyDefinition($name)) { + if (!$this->compatibilityMode && $this->getPropertyDefinition($name)) { $this->get($name)->setValue(array()); } + else { + unset($this->values[$name]); + } } /** diff --git a/core/lib/Drupal/Core/Entity/EntityRenderController.php b/core/lib/Drupal/Core/Entity/EntityRenderController.php index 2cd0578..6ccb5b9 100644 --- a/core/lib/Drupal/Core/Entity/EntityRenderController.php +++ b/core/lib/Drupal/Core/Entity/EntityRenderController.php @@ -37,29 +37,15 @@ public function buildContent(array $entities = array(), $view_mode = 'full', $la drupal_alter('entity_view_mode', $view_mode, $entity, $context); $entity->content['#view_mode'] = $view_mode; - $prepare[$view_mode][$key] = $entity; + $prepare[$view_mode][$entity->id()] = $entity; } // Prepare and build field content, grouped by view mode. foreach ($prepare as $view_mode => $prepare_entities) { - $call = array(); - // To ensure hooks are only run once per entity, check for an - // entity_view_prepared flag and only process items without it. - foreach ($prepare_entities as $entity) { - if (empty($entity->entity_view_prepared)) { - // Add this entity to the items to be prepared. - $call[$entity->id()] = $entity; - - // Mark this item as prepared. - $entity->entity_view_prepared = TRUE; - } - } + field_attach_prepare_view($this->entityType, $prepare_entities, $view_mode, $langcode); + module_invoke_all('entity_prepare_view', $prepare_entities, $this->entityType); - if (!empty($call)) { - field_attach_prepare_view($this->entityType, $call, $view_mode, $langcode); - module_invoke_all('entity_prepare_view', $call, $this->entityType); - } - foreach ($entities as $entity) { + foreach ($prepare_entities as $entity) { $entity->content += field_attach_view($this->entityType, $entity, $view_mode, $langcode); } } diff --git a/core/lib/Drupal/Core/Entity/Field/FieldItemBase.php b/core/lib/Drupal/Core/Entity/Field/FieldItemBase.php index 5c71aa3..d2c4ad6 100644 --- a/core/lib/Drupal/Core/Entity/Field/FieldItemBase.php +++ b/core/lib/Drupal/Core/Entity/Field/FieldItemBase.php @@ -22,6 +22,12 @@ * Entity field items making use of this base class have to implement * ComplexDataInterface::getPropertyDefinitions(). * + * Available settings (below the definition's 'settings' key) are: + * - property {NAME}: An array containing definition overrides for the + * property with the name {NAME}. For example, this can be used by a + * computed field to easily override the 'class' key of single field value + * only. + * * @see \Drupal\Core\Entity\Field\FieldItemInterface */ abstract class FieldItemBase extends TypedData implements IteratorAggregate, FieldItemInterface { @@ -62,6 +68,12 @@ public function __construct(array $definition) { // references on non-computed properties during construction. $step2 = array(); foreach ($this->getPropertyDefinitions() as $name => $definition) { + + // Apply any per-property definition overrides. + if (isset($this->definition['settings']['property ' . $name])) { + $definition = $this->definition['settings']['property ' . $name] + $definition; + } + if (empty($definition['computed'])) { $context = array('name' => $name, 'parent' => $this); $this->properties[$name] = typed_data()->create($definition, NULL, $context); @@ -96,8 +108,8 @@ public function getValue() { */ public function setValue($values) { // Treat the values as property value of the first property, if no array is - // given and we only have one property. - if (!is_array($values) && count($this->properties) == 1) { + // given. + if (!is_array($values)) { $keys = array_keys($this->properties); $values = array($keys[0] => $values); } diff --git a/core/lib/Drupal/Core/Entity/Field/Type/BooleanItem.php b/core/lib/Drupal/Core/Entity/Field/Type/BooleanItem.php index 131d0a2..af0652a 100644 --- a/core/lib/Drupal/Core/Entity/Field/Type/BooleanItem.php +++ b/core/lib/Drupal/Core/Entity/Field/Type/BooleanItem.php @@ -11,6 +11,12 @@ /** * Defines the 'boolean_field' entity field item. + * + * Available settings (below the definition's 'settings' key) are: + * - property {NAME}: An array containing definition overrides for the + * property with the name {NAME}. For example, this can be used by a + * computed field to easily override the 'class' key of single field value + * only. */ class BooleanItem extends FieldItemBase { diff --git a/core/lib/Drupal/Core/Entity/Field/Type/DateItem.php b/core/lib/Drupal/Core/Entity/Field/Type/DateItem.php index eb1ab12..5201051 100644 --- a/core/lib/Drupal/Core/Entity/Field/Type/DateItem.php +++ b/core/lib/Drupal/Core/Entity/Field/Type/DateItem.php @@ -11,6 +11,12 @@ /** * Defines the 'date_field' entity field item. + * + * Available settings (below the definition's 'settings' key) are: + * - property {NAME}: An array containing definition overrides for the + * property with the name {NAME}. For example, this can be used by a + * computed field to easily override the 'class' key of single field value + * only. */ class DateItem extends FieldItemBase { diff --git a/core/lib/Drupal/Core/Entity/Field/Type/EntityReferenceItem.php b/core/lib/Drupal/Core/Entity/Field/Type/EntityReferenceItem.php index a60e65e..411aad1 100644 --- a/core/lib/Drupal/Core/Entity/Field/Type/EntityReferenceItem.php +++ b/core/lib/Drupal/Core/Entity/Field/Type/EntityReferenceItem.php @@ -13,8 +13,12 @@ /** * Defines the 'entityreference_field' entity field item. * - * Required settings (below the definition's 'settings' key) are: - * - entity type: The entity type to reference. + * Available settings (below the definition's 'settings' key) are: + * - entity type: (required) The entity type to reference. + * - property {NAME}: An array containing definition overrides for the + * property with the name {NAME}. For example, this can be used by a + * computed field to easily override the 'class' key of single field value + * only. */ class EntityReferenceItem extends FieldItemBase { diff --git a/core/lib/Drupal/Core/Entity/Field/Type/IntegerItem.php b/core/lib/Drupal/Core/Entity/Field/Type/IntegerItem.php index 1f4b4e6..fc542f1 100644 --- a/core/lib/Drupal/Core/Entity/Field/Type/IntegerItem.php +++ b/core/lib/Drupal/Core/Entity/Field/Type/IntegerItem.php @@ -11,6 +11,12 @@ /** * Defines the 'integer_field' entity field item. + * + * Available settings (below the definition's 'settings' key) are: + * - property {NAME}: An array containing definition overrides for the + * property with the name {NAME}. For example, this can be used by a + * computed field to easily override the 'class' key of single field value + * only. */ class IntegerItem extends FieldItemBase { diff --git a/core/lib/Drupal/Core/Entity/Field/Type/LanguageItem.php b/core/lib/Drupal/Core/Entity/Field/Type/LanguageItem.php index f7b2a91..646718b 100644 --- a/core/lib/Drupal/Core/Entity/Field/Type/LanguageItem.php +++ b/core/lib/Drupal/Core/Entity/Field/Type/LanguageItem.php @@ -12,6 +12,12 @@ /** * Defines the 'language_field' entity field item. + * + * Available settings (below the definition's 'settings' key) are: + * - property {NAME}: An array containing definition overrides for the + * property with the name {NAME}. For example, this can be used by a + * computed field to easily override the 'class' key of single field value + * only. */ class LanguageItem extends FieldItemBase { diff --git a/core/lib/Drupal/Core/Entity/Field/Type/StringItem.php b/core/lib/Drupal/Core/Entity/Field/Type/StringItem.php index 7c8c57a..85fd6d6 100644 --- a/core/lib/Drupal/Core/Entity/Field/Type/StringItem.php +++ b/core/lib/Drupal/Core/Entity/Field/Type/StringItem.php @@ -11,6 +11,12 @@ /** * Defines the 'string_field' entity field item. + * + * Available settings (below the definition's 'settings' key) are: + * - property {NAME}: An array containing definition overrides for the + * property with the name {NAME}. For example, this can be used by a + * computed field to easily override the 'class' key of single field value + * only. */ class StringItem extends FieldItemBase { diff --git a/core/modules/comment/comment.admin.inc b/core/modules/comment/comment.admin.inc index dcbd1bc..a914fa6 100644 --- a/core/modules/comment/comment.admin.inc +++ b/core/modules/comment/comment.admin.inc @@ -109,34 +109,33 @@ function comment_admin_overview($form, &$form_state, $arg) { foreach ($comments as $comment) { // Remove the first node title from the node_titles array and attach to // the comment. - $comment->node_title = array_shift($node_titles); - $comment_body = field_get_items('comment', $comment, 'comment_body'); - $options[$comment->cid] = array( + $node_title = array_shift($node_titles); + $options[$comment->cid->value] = array( 'subject' => array( 'data' => array( '#type' => 'link', - '#title' => $comment->subject, - '#href' => 'comment/' . $comment->cid, - '#options' => array('attributes' => array('title' => truncate_utf8($comment_body[0]['value'], 128)), 'fragment' => 'comment-' . $comment->cid), + '#title' => $comment->subject->value, + '#href' => 'comment/' . $comment->id(), + '#options' => array('attributes' => array('title' => truncate_utf8($comment->comment_body->value, 128)), 'fragment' => 'comment-' . $comment->id()), ), ), - 'author' => theme('username', array('account' => $comment)), + 'author' => theme('username', array('account' => comment_prepare_author($comment))), 'posted_in' => array( 'data' => array( '#type' => 'link', - '#title' => $comment->node_title, - '#href' => 'node/' . $comment->nid, + '#title' => $node_title, + '#href' => 'node/' . $comment->nid->value, ), ), - 'changed' => format_date($comment->changed, 'short'), + 'changed' => format_date($comment->changed->value->getTimestamp(), 'short'), ); $links = array(); $links['edit'] = array( 'title' => t('edit'), - 'href' => 'comment/' . $comment->cid . '/edit', + 'href' => 'comment/' . $comment->cid->value . '/edit', 'query' => $destination, ); - $options[$comment->cid]['operations']['data'] = array( + $options[$comment->cid->value]['operations']['data'] = array( '#type' => 'operations', '#links' => $links, ); @@ -187,10 +186,10 @@ function comment_admin_overview_submit($form, &$form_state) { $comment = comment_load($value); if ($operation == 'unpublish') { - $comment->status = COMMENT_NOT_PUBLISHED; + $comment->status->value = COMMENT_NOT_PUBLISHED; } elseif ($operation == 'publish') { - $comment->status = COMMENT_PUBLISHED; + $comment->status->value = COMMENT_PUBLISHED; } comment_save($comment); } @@ -219,7 +218,7 @@ function comment_multiple_delete_confirm($form, &$form_state) { $comment_counter = 0; foreach (array_filter($edit['comments']) as $cid => $value) { $comment = comment_load($cid); - if (is_object($comment) && is_numeric($comment->cid)) { + if (is_object($comment) && is_numeric($comment->cid->value)) { $subject = db_query('SELECT subject FROM {comment} WHERE cid = :cid', array(':cid' => $cid))->fetchField(); $form['comments'][$cid] = array('#type' => 'hidden', '#value' => $cid, '#prefix' => '
  • ', '#suffix' => check_plain($subject) . '
  • '); $comment_counter++; @@ -283,11 +282,11 @@ function comment_confirm_delete_page($cid) { function comment_confirm_delete($form, &$form_state, Comment $comment) { $form_state['comment'] = $comment; // Always provide entity id in the same form key as in the entity edit form. - $form['cid'] = array('#type' => 'value', '#value' => $comment->cid); + $form['cid'] = array('#type' => 'value', '#value' => $comment->cid->value); return confirm_form( $form, - t('Are you sure you want to delete the comment %title?', array('%title' => $comment->subject)), - 'node/' . $comment->nid, + t('Are you sure you want to delete the comment %title?', array('%title' => $comment->subject->value)), + 'node/' . $comment->nid->value, t('Any replies to this comment will be lost. This action cannot be undone.'), t('Delete'), t('Cancel'), @@ -300,11 +299,11 @@ function comment_confirm_delete($form, &$form_state, Comment $comment) { function comment_confirm_delete_submit($form, &$form_state) { $comment = $form_state['comment']; // Delete the comment and its replies. - comment_delete($comment->cid); + comment_delete($comment->cid->value); drupal_set_message(t('The comment and all its replies have been deleted.')); - watchdog('content', 'Deleted comment @cid and its replies.', array('@cid' => $comment->cid)); + watchdog('content', 'Deleted comment @cid and its replies.', array('@cid' => $comment->cid->value)); // Clear the cache so an anonymous user sees that his comment was deleted. cache_invalidate(array('content' => TRUE)); - $form_state['redirect'] = "node/$comment->nid"; + $form_state['redirect'] = "node/{$comment->nid->value}"; } diff --git a/core/modules/comment/comment.api.php b/core/modules/comment/comment.api.php index 95c3e1d..c8548a3 100644 --- a/core/modules/comment/comment.api.php +++ b/core/modules/comment/comment.api.php @@ -23,7 +23,7 @@ */ function hook_comment_presave(Drupal\comment\Comment $comment) { // Remove leading & trailing spaces from the comment subject. - $comment->subject = trim($comment->subject); + $comment->subject->value = trim($comment->subject->value); } /** @@ -34,7 +34,7 @@ function hook_comment_presave(Drupal\comment\Comment $comment) { */ function hook_comment_insert(Drupal\comment\Comment $comment) { // Reindex the node when comments are added. - search_touch_node($comment->nid); + search_touch_node($comment->nid->value); } /** @@ -45,7 +45,7 @@ function hook_comment_insert(Drupal\comment\Comment $comment) { */ function hook_comment_update(Drupal\comment\Comment $comment) { // Reindex the node when comments are updated. - search_touch_node($comment->nid); + search_touch_node($comment->nid->value); } /** @@ -75,7 +75,7 @@ function hook_comment_load(Drupal\comment\Comment $comments) { */ function hook_comment_view(Drupal\comment\Comment $comment, $view_mode, $langcode) { // how old is the comment - $comment->time_ago = time() - $comment->changed; + $comment->time_ago->value = time() - $comment->changed->value->getTimestamp(); } /** @@ -117,7 +117,7 @@ function hook_comment_view_alter(&$build, Drupal\comment\Comment $comment) { * The comment the action is being performed on. */ function hook_comment_publish(Drupal\comment\Comment $comment) { - drupal_set_message(t('Comment: @subject has been published', array('@subject' => $comment->subject))); + drupal_set_message(t('Comment: @subject has been published', array('@subject' => $comment->subject->value))); } /** @@ -127,7 +127,7 @@ function hook_comment_publish(Drupal\comment\Comment $comment) { * The comment the action is being performed on. */ function hook_comment_unpublish(Drupal\comment\Comment $comment) { - drupal_set_message(t('Comment: @subject has been unpublished', array('@subject' => $comment->subject))); + drupal_set_message(t('Comment: @subject has been unpublished', array('@subject' => $comment->subject->value))); } /** @@ -147,7 +147,7 @@ function hook_comment_unpublish(Drupal\comment\Comment $comment) { function hook_comment_predelete(Drupal\comment\Comment $comment) { // Delete a record associated with the comment in a custom table. db_delete('example_comment_table') - ->condition('cid', $comment->cid) + ->condition('cid', $comment->cid->value) ->execute(); } @@ -166,7 +166,7 @@ function hook_comment_predelete(Drupal\comment\Comment $comment) { * @see entity_delete_multiple() */ function hook_comment_delete(Drupal\comment\Comment $comment) { - drupal_set_message(t('Comment: @subject has been deleted', array('@subject' => $comment->subject))); + drupal_set_message(t('Comment: @subject has been deleted', array('@subject' => $comment->subject->value))); } /** diff --git a/core/modules/comment/comment.module b/core/modules/comment/comment.module index a454af3..a31aec0 100644 --- a/core/modules/comment/comment.module +++ b/core/modules/comment/comment.module @@ -178,8 +178,8 @@ function comment_node_type_load($name) { */ function comment_uri(Comment $comment) { return array( - 'path' => 'comment/' . $comment->cid, - 'options' => array('fragment' => 'comment-' . $comment->cid), + 'path' => 'comment/' . $comment->cid->value, + 'options' => array('fragment' => 'comment-' . $comment->cid->value), ); } @@ -505,10 +505,10 @@ function comment_block_view($delta = '') { * The comment listing set to the page on which the comment appears. */ function comment_permalink($cid) { - if (($comment = comment_load($cid)) && ($node = node_load($comment->nid))) { + if (($comment = comment_load($cid)) && ($node = $comment->nid->entity)) { // Find the current display page for this comment. - $page = comment_get_display_page($comment->cid, $node->type); + $page = comment_get_display_page($comment->cid->value, $node->type); // @todo: Cleaner sub request handling. $request = drupal_container()->get('request'); @@ -937,7 +937,7 @@ function comment_prepare_thread(&$comments) { $divs = 0; foreach ($comments as $key => $comment) { - if ($first_new && $comment->new != MARK_READ) { + if ($first_new && $comment->new->value != MARK_READ) { // Assign the anchor only for the first new comment. This avoids duplicate // id attributes on a page. $first_new = FALSE; @@ -946,7 +946,7 @@ function comment_prepare_thread(&$comments) { // The $divs element instructs #prefix whether to add an indent div or // close existing divs (a negative value). - $comment->depth = count(explode('.', $comment->thread)) - 1; + $comment->depth = count(explode('.', $comment->thread->value)) - 1; if ($comment->depth > $divs) { $comment->divs = 1; $divs++; @@ -999,25 +999,25 @@ function comment_links(Comment $comment, Node $node) { if (user_access('administer comments') && user_access('post comments')) { $links['comment-delete'] = array( 'title' => t('delete'), - 'href' => "comment/$comment->cid/delete", + 'href' => "comment/{$comment->cid->value}/delete", 'html' => TRUE, ); $links['comment-edit'] = array( 'title' => t('edit'), - 'href' => "comment/$comment->cid/edit", + 'href' => "comment/{$comment->cid->value}/edit", 'html' => TRUE, ); $links['comment-reply'] = array( 'title' => t('reply'), - 'href' => "comment/reply/$comment->nid/$comment->cid", + 'href' => "comment/reply/{$comment->nid->value}/{$comment->cid->value}", 'html' => TRUE, ); - if ($comment->status == COMMENT_NOT_PUBLISHED) { + if ($comment->status->value == COMMENT_NOT_PUBLISHED) { $links['comment-approve'] = array( 'title' => t('approve'), - 'href' => "comment/$comment->cid/approve", + 'href' => "comment/{$comment->cid->value}/approve", 'html' => TRUE, - 'query' => array('token' => drupal_get_token("comment/$comment->cid/approve")), + 'query' => array('token' => drupal_get_token("comment/{$comment->cid->value}/approve")), ); } } @@ -1025,13 +1025,13 @@ function comment_links(Comment $comment, Node $node) { if (comment_access('edit', $comment)) { $links['comment-edit'] = array( 'title' => t('edit'), - 'href' => "comment/$comment->cid/edit", + 'href' => "comment/{$comment->cid->value}/edit", 'html' => TRUE, ); } $links['comment-reply'] = array( 'title' => t('reply'), - 'href' => "comment/reply/$comment->nid/$comment->cid", + 'href' => "comment/reply/{$comment->nid->value}/{$comment->cid->value}", 'html' => TRUE, ); } @@ -1339,7 +1339,7 @@ function comment_user_cancel($edit, $account, $method) { case 'user_cancel_block_unpublish': $comments = entity_load_multiple_by_properties('comment', array('uid' => $account->uid)); foreach ($comments as $comment) { - $comment->status = 0; + $comment->status->value = 0; comment_save($comment); } break; @@ -1347,7 +1347,7 @@ function comment_user_cancel($edit, $account, $method) { case 'user_cancel_reassign': $comments = entity_load_multiple_by_properties('comment', array('uid' => $account->uid)); foreach ($comments as $comment) { - $comment->uid = 0; + $comment->uid->value = 0; comment_save($comment); } break; @@ -1382,7 +1382,7 @@ function comment_access($op, Comment $comment) { global $user; if ($op == 'edit') { - return ($user->uid && $user->uid == $comment->uid && $comment->status == COMMENT_PUBLISHED && user_access('edit own comments')) || user_access('administer comments'); + return ($user->uid && $user->uid == $comment->uid->value && $comment->status->value == COMMENT_PUBLISHED && user_access('edit own comments')) || user_access('administer comments'); } } @@ -1562,7 +1562,7 @@ function comment_get_display_page($cid, $node_type) { * @see comment_menu() */ function comment_edit_page(Comment $comment) { - drupal_set_title(t('Edit comment %comment', array('%comment' => $comment->subject)), PASS_THROUGH); + drupal_set_title(t('Edit comment %comment', array('%comment' => $comment->subject->value)), PASS_THROUGH); return entity_get_form($comment); } @@ -1576,29 +1576,25 @@ function comment_preview(Comment $comment) { $preview_build = array(); if (!form_get_errors()) { - $comment_body = field_get_items('comment', $comment, 'comment_body'); - $comment->format = $comment_body[0]['format']; + $comment->format = $comment->comment_body->format; // Attach the user and time information. - if (!empty($comment->name)) { - $account = user_load_by_name($comment->name); + if (!empty($comment->name->value)) { + $account = user_load_by_name($comment->name->value); } elseif ($user->uid && empty($comment->is_anonymous)) { $account = $user; } if (!empty($account->uid)) { - $comment->uid = $account->uid; - $comment->name = check_plain($account->name); - $comment->signature = $account->signature; - $comment->signature_format = $account->signature_format; - $comment->picture = $account->picture; + $comment->uid->value = $account->uid; + $comment->name->value = check_plain($account->name); } - elseif (empty($comment->name)) { - $comment->name = config('user.settings')->get('anonymous'); + elseif (empty($comment->name->value)) { + $comment->name->value = config('user.settings')->get('anonymous'); } - $comment->created = !empty($comment->created) ? $comment->created : REQUEST_TIME; - $comment->changed = REQUEST_TIME; + $comment->created->value = !empty($comment->created->value) ? $comment->created->value : REQUEST_TIME; + $comment->changed->value = REQUEST_TIME; $comment->in_preview = TRUE; $comment_build = comment_view($comment); $comment_build['#weight'] = -100; @@ -1606,15 +1602,15 @@ function comment_preview(Comment $comment) { $preview_build['comment_preview'] = $comment_build; } - if ($comment->pid) { + if ($comment->pid->value) { $build = array(); - $comment = comment_load($comment->pid); - if ($comment && $comment->status == COMMENT_PUBLISHED) { + $comment = $comment->pid->entity; + if ($comment && $comment->status->value == COMMENT_PUBLISHED) { $build = comment_view($comment); } } else { - $build = node_view(node_load($comment->nid)); + $build = node_view($comment->nid->entity); } $preview_build['comment_output_below'] = $build; @@ -1633,6 +1629,22 @@ function comment_preprocess_block(&$variables) { } /** + * Prepares a user account object for rendering comment authors. + * + * This helper handles anonymous authors in addition to registered comment + * authors. + * + * @return \Drupal\user\User + * A user account, for use with theme_username() or the user_picture template. + */ +function comment_prepare_author(Comment $comment) { + if ($account = $comment->uid->entity) { + return $account; + } + return entity_create('user', array('uid' => 0, 'name' => $comment->name->value, 'homepage' => $comment->homepage->value)); +} + +/** * Preprocesses variables for comment.tpl.php. * * @see comment.tpl.php @@ -1642,31 +1654,38 @@ function template_preprocess_comment(&$variables) { $node = $variables['elements']['#node']; $variables['comment'] = $comment; $variables['node'] = $node; - $variables['author'] = theme('username', array('account' => $comment)); - $variables['created'] = format_date($comment->created); - $variables['changed'] = format_date($comment->changed); - - $variables['new'] = !empty($comment->new) ? t('new') : ''; - $variables['user_picture'] = theme_get_setting('toggle_comment_user_picture') ? theme('user_picture', array('account' => $comment)) : ''; - $variables['signature'] = $comment->signature; + $account = comment_prepare_author($comment); + $variables['author'] = theme('username', array('account' => $account)); + $variables['created'] = format_date($comment->created->value->getTimestamp()); + $variables['changed'] = format_date($comment->changed->value->getTimestamp()); + $variables['new'] = !empty($comment->new->value) ? t('new') : ''; + $variables['user_picture'] = theme_get_setting('toggle_comment_user_picture') ? theme('user_picture', array('account' => $account)) : ''; + + if (config('user.settings')->get('signatures') && !empty($account->signature)) { + $variables['signature'] = check_markup($account->signature, $account->signature_format, '', TRUE) ; + } + else { + $variables['signature'] = ''; + } $uri = $comment->uri(); $uri['options'] += array('attributes' => array('class' => 'permalink', 'rel' => 'bookmark')); - $variables['title'] = l($comment->subject, $uri['path'], $uri['options']); + $variables['title'] = l($comment->subject->value, $uri['path'], $uri['options']); $variables['permalink'] = l(t('Permalink'), $uri['path'], $uri['options']); $variables['submitted'] = t('Submitted by !username on !datetime', array('!username' => $variables['author'], '!datetime' => $variables['created'])); - if ($comment->pid > 0) { + if ($comment->pid->value) { // Fetch and store the parent comment information for use in templates. - $comment_parent = comment_load($comment->pid); + $comment_parent = $comment->pid->entity; + $account_parent = comment_prepare_author($comment); $variables['parent_comment'] = $comment_parent; - $variables['parent_author'] = theme('username', array('account' => $comment_parent)); - $variables['parent_created'] = format_date($comment_parent->created); - $variables['parent_changed'] = format_date($comment_parent->changed); + $variables['parent_author'] = theme('username', array('account' => $account_parent)); + $variables['parent_created'] = format_date($comment_parent->created->value->getTimestamp()); + $variables['parent_changed'] = format_date($comment_parent->changed->value->getTimestamp()); $uri_parent = $comment_parent->uri(); $uri_parent['options'] += array('attributes' => array('class' => 'permalink', 'rel' => 'bookmark')); - $variables['parent_title'] = l($comment_parent->subject, $uri_parent['path'], $uri_parent['options']); + $variables['parent_title'] = l($comment_parent->subject->value, $uri_parent['path'], $uri_parent['options']); $variables['parent_permalink'] = l(t('Parent permalink'), $uri_parent['path'], $uri_parent['options']); $variables['parent'] = t('In reply to !parent_title by !parent_username', array('!parent_username' => $variables['parent_author'], '!parent_title' => $variables['parent_title'])); @@ -1682,7 +1701,9 @@ function template_preprocess_comment(&$variables) { } // Preprocess fields. + $comment->setCompatibilityMode(TRUE); field_attach_preprocess('comment', $comment, $variables['elements'], $variables); + $comment->setCompatibilityMode(FALSE); // Helpful $content variable for templates. foreach (element_children($variables['elements']) as $key) { @@ -1694,7 +1715,7 @@ function template_preprocess_comment(&$variables) { $variables['status'] = 'preview'; } else { - $variables['status'] = ($comment->status == COMMENT_NOT_PUBLISHED) ? 'unpublished' : 'published'; + $variables['status'] = ($comment->status->value == COMMENT_NOT_PUBLISHED) ? 'unpublished' : 'published'; } // Gather comment classes. @@ -1705,14 +1726,14 @@ function template_preprocess_comment(&$variables) { if ($variables['new']) { $variables['attributes']['class'][] = 'new'; } - if (!$comment->uid) { + if (!$comment->uid->value) { $variables['attributes']['class'][] = 'by-anonymous'; } else { - if ($comment->uid == $variables['node']->uid) { + if ($comment->uid->value == $variables['node']->uid) { $variables['attributes']['class'][] = 'by-node-author'; } - if ($comment->uid == $variables['user']->uid) { + if ($comment->uid->value == $variables['user']->uid) { $variables['attributes']['class'][] = 'by-viewer'; } } @@ -1874,9 +1895,9 @@ function comment_action_info() { * @ingroup actions */ function comment_publish_action(Comment $comment = NULL, $context = array()) { - if (isset($comment->subject)) { - $subject = $comment->subject; - $comment->status = COMMENT_PUBLISHED; + if (isset($comment->subject->value)) { + $subject = $comment->subject->value; + $comment->status->value = COMMENT_PUBLISHED; } else { $cid = $context['cid']; @@ -1901,9 +1922,9 @@ function comment_publish_action(Comment $comment = NULL, $context = array()) { * @ingroup actions */ function comment_unpublish_action(Comment $comment = NULL, $context = array()) { - if (isset($comment->subject)) { - $subject = $comment->subject; - $comment->status = COMMENT_NOT_PUBLISHED; + if (isset($comment->subject->value)) { + $subject = $comment->subject->value; + $comment->status->value = COMMENT_NOT_PUBLISHED; } else { $cid = $context['cid']; @@ -1934,8 +1955,8 @@ function comment_unpublish_by_keyword_action(Comment $comment, $context) { foreach ($context['keywords'] as $keyword) { $text = drupal_render($comment); if (strpos($text, $keyword) !== FALSE) { - $comment->status = COMMENT_NOT_PUBLISHED; - watchdog('action', 'Unpublished comment %subject.', array('%subject' => $comment->subject)); + $comment->status->value = COMMENT_NOT_PUBLISHED; + watchdog('action', 'Unpublished comment %subject.', array('%subject' => $comment->subject->value)); break; } } @@ -1978,7 +1999,7 @@ function comment_unpublish_by_keyword_action_submit($form, $form_state) { function comment_save_action(Comment $comment) { comment_save($comment); cache_invalidate(array('content' => TRUE)); - watchdog('action', 'Saved comment %title', array('%title' => $comment->subject)); + watchdog('action', 'Saved comment %title', array('%title' => $comment->subject->value)); } /** @@ -2048,8 +2069,8 @@ function comment_rdf_mapping() { */ function comment_file_download_access($field, EntityInterface $entity, File $file) { if ($entity->entityType() == 'comment') { - if (user_access('access comments') && $entity->status == COMMENT_PUBLISHED || user_access('administer comments')) { - $node = node_load($entity->nid); + if (user_access('access comments') && $entity->status->value == COMMENT_PUBLISHED || user_access('administer comments')) { + $node = $entity->nid->entity; return node_access('view', $node); } return FALSE; diff --git a/core/modules/comment/comment.pages.inc b/core/modules/comment/comment.pages.inc index 3d1ecb9..7e97738 100644 --- a/core/modules/comment/comment.pages.inc +++ b/core/modules/comment/comment.pages.inc @@ -56,18 +56,15 @@ function comment_reply(Node $node, $pid = NULL) { if (user_access('access comments')) { // Load the parent comment. $comment = comment_load($pid); - if ($comment->status == COMMENT_PUBLISHED) { + if ($comment->status->value == COMMENT_PUBLISHED) { // If that comment exists, make sure that the current comment and the // parent comment both belong to the same parent node. - if ($comment->nid != $node->nid) { + if ($comment->nid->value != $node->nid) { // Attempting to reply to a comment not belonging to the current nid. drupal_set_message(t('The comment you are replying to does not exist.'), 'error'); drupal_goto("node/$node->nid"); } // Display the parent comment - $comment->node_type = 'comment_node_' . $node->type; - field_attach_load('comment', array($comment->cid => $comment)); - $comment->name = $comment->uid ? $comment->registered_name : $comment->name; $build['comment_parent'] = comment_view($comment); } else { @@ -120,11 +117,11 @@ function comment_approve($cid) { } if ($comment = comment_load($cid)) { - $comment->status = COMMENT_PUBLISHED; + $comment->status->value = COMMENT_PUBLISHED; comment_save($comment); drupal_set_message(t('Comment approved.')); - drupal_goto('node/' . $comment->nid); + drupal_goto('node/' . $comment->nid->value); } throw new NotFoundHttpException(); } diff --git a/core/modules/comment/comment.tokens.inc b/core/modules/comment/comment.tokens.inc index c77cb67..4b93a71 100644 --- a/core/modules/comment/comment.tokens.inc +++ b/core/modules/comment/comment.tokens.inc @@ -122,79 +122,75 @@ function comment_tokens($type, $tokens, array $data = array(), array $options = switch ($name) { // Simple key values on the comment. case 'cid': - $replacements[$original] = $comment->cid; + $replacements[$original] = $comment->cid->value; break; // Poster identity information for comments case 'hostname': - $replacements[$original] = $sanitize ? check_plain($comment->hostname) : $comment->hostname; + $replacements[$original] = $sanitize ? check_plain($comment->hostname->value) : $comment->hostname->value; break; case 'name': - $name = ($comment->uid == 0) ? config('user.settings')->get('anonymous') : $comment->name; + $name = ($comment->uid->value == 0) ? config('user.settings')->get('anonymous') : $comment->name->value; $replacements[$original] = $sanitize ? filter_xss($name) : $name; break; case 'mail': - if ($comment->uid != 0) { - $account = user_load($comment->uid); + if ($comment->uid->value != 0) { + $account = user_load($comment->uid->value); $mail = $account->mail; } else { - $mail = $comment->mail; + $mail = $comment->mail->value; } $replacements[$original] = $sanitize ? check_plain($mail) : $mail; break; case 'homepage': - $replacements[$original] = $sanitize ? check_url($comment->homepage) : $comment->homepage; + $replacements[$original] = $sanitize ? check_url($comment->homepage->value) : $comment->homepage->value; break; case 'title': - $replacements[$original] = $sanitize ? filter_xss($comment->subject) : $comment->subject; + $replacements[$original] = $sanitize ? filter_xss($comment->subject->value) : $comment->subject->value; break; case 'body': - if ($items = field_get_items('comment', $comment, 'comment_body', $langcode)) { - $instance = field_info_instance('comment', 'body', 'comment_body'); - $field_langcode = field_language('comment', $comment, 'comment_body', $langcode); - $replacements[$original] = $sanitize ? _text_sanitize($instance, $field_langcode, $items[0], 'value') : $items[0]['value']; - } + $replacements[$original] = $sanitize ? $comment->comment_body->processed : $comment->comment_body->value; break; // Comment related URLs. case 'url': - $url_options['fragment'] = 'comment-' . $comment->cid; - $replacements[$original] = url('comment/' . $comment->cid, $url_options); + $url_options['fragment'] = 'comment-' . $comment->cid->value; + $replacements[$original] = url('comment/' . $comment->cid->value, $url_options); break; case 'edit-url': $url_options['fragment'] = NULL; - $replacements[$original] = url('comment/' . $comment->cid . '/edit', $url_options); + $replacements[$original] = url('comment/' . $comment->cid->value . '/edit', $url_options); break; // Default values for the chained tokens handled below. case 'author': - $replacements[$original] = $sanitize ? filter_xss($comment->name) : $comment->name; + $replacements[$original] = $sanitize ? filter_xss($comment->name->value) : $comment->name->value; break; case 'parent': - if (!empty($comment->pid)) { - $parent = comment_load($comment->pid); + if (!empty($comment->pid->value)) { + $parent = comment_load($comment->pid->value); $replacements[$original] = $sanitize ? filter_xss($parent->subject) : $parent->subject; } break; case 'created': - $replacements[$original] = format_date($comment->created, 'medium', '', NULL, $langcode); + $replacements[$original] = format_date($comment->created->value->getTimestamp(), 'medium', '', NULL, $langcode); break; case 'changed': - $replacements[$original] = format_date($comment->changed, 'medium', '', NULL, $langcode); + $replacements[$original] = format_date($comment->changed->value->getTimestamp(), 'medium', '', NULL, $langcode); break; case 'node': - $node = node_load($comment->nid); + $node = $comment->nid->entity; $title = $node->label(); $replacements[$original] = $sanitize ? filter_xss($title) : $title; break; @@ -203,23 +199,23 @@ function comment_tokens($type, $tokens, array $data = array(), array $options = // Chained token relationships. if ($node_tokens = token_find_with_prefix($tokens, 'node')) { - $node = node_load($comment->nid); + $node = $comment->nid->entity; $replacements += token_generate('node', $node_tokens, array('node' => $node), $options); } if ($date_tokens = token_find_with_prefix($tokens, 'created')) { - $replacements += token_generate('date', $date_tokens, array('date' => $comment->created), $options); + $replacements += token_generate('date', $date_tokens, array('date' => $comment->created->value->getTimestamp()), $options); } if ($date_tokens = token_find_with_prefix($tokens, 'changed')) { - $replacements += token_generate('date', $date_tokens, array('date' => $comment->changed), $options); + $replacements += token_generate('date', $date_tokens, array('date' => $comment->changed->value->getTimestamp()), $options); } - if (($parent_tokens = token_find_with_prefix($tokens, 'parent')) && $parent = comment_load($comment->pid)) { + if (($parent_tokens = token_find_with_prefix($tokens, 'parent')) && $parent = $comment->pid->entity) { $replacements += token_generate('comment', $parent_tokens, array('comment' => $parent), $options); } - if (($author_tokens = token_find_with_prefix($tokens, 'author')) && $account = user_load($comment->uid)) { + if (($author_tokens = token_find_with_prefix($tokens, 'author')) && $account = $comment->uid->entity) { $replacements += token_generate('user', $author_tokens, array('user' => $account), $options); } } diff --git a/core/modules/comment/lib/Drupal/comment/Comment.php b/core/modules/comment/lib/Drupal/comment/Comment.php index ef6c16a..aed7639 100644 --- a/core/modules/comment/lib/Drupal/comment/Comment.php +++ b/core/modules/comment/lib/Drupal/comment/Comment.php @@ -8,50 +8,56 @@ namespace Drupal\comment; use Drupal\Core\Entity\ContentEntityInterface; -use Drupal\Core\Entity\Entity; +use Drupal\Core\Entity\EntityNG; /** * Defines the comment entity class. */ -class Comment extends Entity implements ContentEntityInterface { +class Comment extends EntityNG implements ContentEntityInterface { /** * The comment ID. * - * @var integer + * @todo Rename to 'id'. + * + * @var \Drupal\Core\Entity\Field\FieldInterface */ public $cid; /** * The comment UUID. * - * @var string + * @var \Drupal\Core\Entity\Field\FieldInterface */ public $uuid; /** * The parent comment ID if this is a reply to a comment. * - * @var integer + * @todo: Rename to 'parent_id'. + * + * @var \Drupal\Core\Entity\Field\FieldInterface */ public $pid; /** * The ID of the node to which the comment is attached. + * + * @var \Drupal\Core\Entity\Field\FieldInterface */ public $nid; /** * The comment language code. * - * @var string + * @var \Drupal\Core\Entity\Field\FieldInterface */ - public $langcode = LANGUAGE_NOT_SPECIFIED; + public $langcode; /** * The comment title. * - * @var string + * @var \Drupal\Core\Entity\Field\FieldInterface */ public $subject; @@ -59,25 +65,25 @@ class Comment extends Entity implements ContentEntityInterface { /** * The comment author ID. * - * @var integer + * @var \Drupal\Core\Entity\Field\FieldInterface */ - public $uid = 0; + public $uid; /** * The comment author's name. * * For anonymous authors, this is the value as typed in the comment form. * - * @var string + * @var \Drupal\Core\Entity\Field\FieldInterface */ - public $name = ''; + public $name; /** * The comment author's e-mail address. * * For anonymous authors, this is the value as typed in the comment form. * - * @var string + * @var \Drupal\Core\Entity\Field\FieldInterface */ public $mail; @@ -86,21 +92,107 @@ class Comment extends Entity implements ContentEntityInterface { * * For anonymous authors, this is the value as typed in the comment form. * - * @var string + * @var \Drupal\Core\Entity\Field\FieldInterface */ public $homepage; /** + * The comment author's hostname. + * + * @var \Drupal\Core\Entity\Field\FieldInterface + */ + public $hostname; + + /** + * The time that the comment was created. + * + * @var \Drupal\Core\Entity\Field\FieldInterface + */ + public $created; + + /** + * The time that the comment was last edited. + * + * @var \Drupal\Core\Entity\Field\FieldInterface + */ + public $changed; + + /** + * A boolean field indicating whether the comment is published. + * + * @var \Drupal\Core\Entity\Field\FieldInterface + */ + public $status; + + /** + * The alphadecimal representation of the comment's place in a thread. + * + * @var \Drupal\Core\Entity\Field\FieldInterface + */ + public $thread; + + /** + * The comment node type. + * + * @var \Drupal\Core\Entity\Field\FieldInterface + */ + public $node_type; + + /** + * The comment 'new' marker for the current user. + * + * @var \Drupal\Core\Entity\Field\FieldInterface + */ + public $new; + + /** + * The plain data values of the contained properties. + * + * Define some default values used. + * + * @var array + */ + protected $values = array( + 'langcode' => array(LANGUAGE_DEFAULT => array(0 => array('value' => LANGUAGE_NOT_SPECIFIED))), + 'name' => array(LANGUAGE_DEFAULT => array(0 => array('value' => ''))), + 'uid' => array(LANGUAGE_DEFAULT => array(0 => array('value' => 0))), + ); + + /** + * Initialize the object. Invoked upon construction and wake up. + */ + protected function init() { + // We unset all defined properties, so magic getters apply. + unset($this->cid); + unset($this->uuid); + unset($this->pid); + unset($this->nid); + unset($this->langcode); + unset($this->subject); + unset($this->uid); + unset($this->name); + unset($this->mail); + unset($this->homepage); + unset($this->hostname); + unset($this->created); + unset($this->changed); + unset($this->status); + unset($this->thread); + unset($this->node_type); + unset($this->new); + } + + /** * Implements Drupal\Core\Entity\EntityInterface::id(). */ public function id() { - return $this->cid; + return $this->get('cid')->value; } /** * Implements Drupal\Core\Entity\EntityInterface::bundle(). */ public function bundle() { - return $this->node_type; + return $this->get('node_type')->value; } } diff --git a/core/modules/comment/lib/Drupal/comment/CommentFormController.php b/core/modules/comment/lib/Drupal/comment/CommentFormController.php index cead0cd..1a52ad7 100644 --- a/core/modules/comment/lib/Drupal/comment/CommentFormController.php +++ b/core/modules/comment/lib/Drupal/comment/CommentFormController.php @@ -8,28 +8,26 @@ namespace Drupal\comment; use Drupal\Core\Entity\EntityInterface; -use Drupal\Core\Entity\EntityFormController; +use Drupal\Core\Entity\EntityFormControllerNG; /** * Base for controller for comment forms. */ -class CommentFormController extends EntityFormController { +class CommentFormController extends EntityFormControllerNG { /** * Overrides Drupal\Core\Entity\EntityFormController::form(). */ public function form(array $form, array &$form_state, EntityInterface $comment) { global $user; - - $node = node_load($comment->nid); - $form_state['comment']['node'] = $node; + $node = $comment->nid->entity; // Use #comment-form as unique jump target, regardless of node type. $form['#id'] = drupal_html_id('comment_form'); $form['#theme'] = array('comment_form__node_' . $node->type, 'comment_form'); $anonymous_contact = variable_get('comment_anonymous_' . $node->type, COMMENT_ANONYMOUS_MAYNOT_CONTACT); - $is_admin = (!empty($comment->cid) && user_access('administer comments')); + $is_admin = (!empty($comment->cid->value) && user_access('administer comments')); if (!$user->uid && $anonymous_contact != COMMENT_ANONYMOUS_MAYNOT_CONTACT) { $form['#attached']['library'][] = array('system', 'jquery.cookie'); @@ -38,8 +36,8 @@ public function form(array $form, array &$form_state, EntityInterface $comment) // If not replying to a comment, use our dedicated page callback for new // comments on nodes. - if (empty($comment->cid) && empty($comment->pid)) { - $form['#action'] = url('comment/reply/' . $comment->nid); + if (empty($comment->cid->value) && empty($comment->pid->value)) { + $form['#action'] = url('comment/reply/' . $comment->nid->value); } if (isset($form_state['comment_preview'])) { @@ -61,16 +59,16 @@ public function form(array $form, array &$form_state, EntityInterface $comment) // Prepare default values for form elements. if ($is_admin) { - $author = (!$comment->uid && $comment->name ? $comment->name : $comment->registered_name); - $status = (isset($comment->status) ? $comment->status : COMMENT_NOT_PUBLISHED); - $date = (!empty($comment->date) ? $comment->date : format_date($comment->created, 'custom', 'Y-m-d H:i O')); + $author = $comment->name->value; + $status = (isset($comment->status->value) ? $comment->status->value : COMMENT_NOT_PUBLISHED); + $date = (!empty($comment->date) ? $comment->date : format_date($comment->created->value->getTimestamp(), 'custom', 'Y-m-d H:i O')); } else { if ($user->uid) { $author = $user->name; } else { - $author = ($comment->name ? $comment->name : ''); + $author = ($comment->name->value ? $comment->name->value : ''); } $status = (user_access('skip comment approval') ? COMMENT_PUBLISHED : COMMENT_NOT_PUBLISHED); $date = ''; @@ -115,7 +113,7 @@ public function form(array $form, array &$form_state, EntityInterface $comment) $form['author']['mail'] = array( '#type' => 'email', '#title' => t('E-mail'), - '#default_value' => $comment->mail, + '#default_value' => $comment->mail->value, '#required' => (!$user->uid && $anonymous_contact == COMMENT_ANONYMOUS_MUST_CONTACT), '#maxlength' => 64, '#size' => 30, @@ -126,7 +124,7 @@ public function form(array $form, array &$form_state, EntityInterface $comment) $form['author']['homepage'] = array( '#type' => 'url', '#title' => t('Homepage'), - '#default_value' => $comment->homepage, + '#default_value' => $comment->homepage->value, '#maxlength' => 255, '#size' => 30, '#access' => $is_admin || (!$user->uid && $anonymous_contact != COMMENT_ANONYMOUS_MAYNOT_CONTACT), @@ -157,36 +155,27 @@ public function form(array $form, array &$form_state, EntityInterface $comment) '#type' => 'textfield', '#title' => t('Subject'), '#maxlength' => 64, - '#default_value' => $comment->subject, + '#default_value' => $comment->subject->value, '#access' => variable_get('comment_subject_field_' . $node->type, 1) == 1, ); // Used for conditional validation of author fields. $form['is_anonymous'] = array( '#type' => 'value', - '#value' => ($comment->cid ? !$comment->uid : !$user->uid), + '#value' => ($comment->cid->value ? !$comment->uid->value : !$user->uid), ); - // Add internal comment properties. - foreach (array('cid', 'pid', 'nid', 'uid') as $key) { - $form[$key] = array('#type' => 'value', '#value' => $comment->$key); - } - $form['node_type'] = array('#type' => 'value', '#value' => 'comment_node_' . $node->type); - // Make the comment inherit the current content language unless specifically // set. if ($comment->isNew()) { $language_content = language(LANGUAGE_TYPE_CONTENT); - $comment->langcode = $language_content->langcode; + $comment->langcode->value = $language_content->langcode; } - $form['langcode'] = array( - '#type' => 'value', - '#value' => $comment->langcode, - ); - - // Attach fields. - $comment->node_type = 'comment_node_' . $node->type; + // Add internal comment properties. + foreach (array('cid', 'pid', 'nid', 'uid', 'node_type', 'langcode') as $key) { + $form[$key] = array('#type' => 'value', '#value' => $comment->$key->value); + } return parent::form($form, $form_state, $comment); } @@ -197,7 +186,7 @@ public function form(array $form, array &$form_state, EntityInterface $comment) protected function actions(array $form, array &$form_state) { $element = parent::actions($form, $form_state); $comment = $this->getEntity($form_state); - $node = $form_state['comment']['node']; + $node = $comment->nid->entity; $preview_mode = variable_get('comment_preview_' . $node->type, DRUPAL_OPTIONAL); // No delete action on the comment form. @@ -205,7 +194,7 @@ protected function actions(array $form, array &$form_state) { // Only show the save button if comment previews are optional or if we are // already previewing the submission. - $element['submit']['#access'] = ($comment->cid && user_access('administer comments')) || $preview_mode != DRUPAL_REQUIRED || isset($form_state['comment_preview']); + $element['submit']['#access'] = ($comment->cid->value && user_access('administer comments')) || $preview_mode != DRUPAL_REQUIRED || isset($form_state['comment_preview']); $element['preview'] = array( '#type' => 'submit', @@ -271,42 +260,34 @@ public function submit(array $form, array &$form_state) { if (empty($comment->date)) { $comment->date = 'now'; } - $comment->created = strtotime($comment->date); - $comment->changed = REQUEST_TIME; + $comment->created->value = strtotime($comment->date); + $comment->changed->value = REQUEST_TIME; // If the comment was posted by a registered user, assign the author's ID. // @todo Too fragile. Should be prepared and stored in comment_form() // already. - if (!$comment->is_anonymous && !empty($comment->name) && ($account = user_load_by_name($comment->name))) { - $comment->uid = $account->uid; + if (!$comment->is_anonymous && !empty($comment->name->value) && ($account = user_load_by_name($comment->name->value))) { + $comment->uid->value = $account->uid; } // If the comment was posted by an anonymous user and no author name was // required, use "Anonymous" by default. - if ($comment->is_anonymous && (!isset($comment->name) || $comment->name === '')) { - $comment->name = config('user.settings')->get('anonymous'); + if ($comment->is_anonymous && (!isset($comment->name->value) || $comment->name->value === '')) { + $comment->name->value = config('user.settings')->get('anonymous'); } // Validate the comment's subject. If not specified, extract from comment // body. - if (trim($comment->subject) == '') { + if (trim($comment->subject->value) == '') { // The body may be in any format, so: // 1) Filter it into HTML // 2) Strip out all HTML tags // 3) Convert entities back to plain-text. - $field = field_info_field('comment_body'); - $langcode = field_is_translatable('comment', $field) ? $this->getFormLangcode($form_state) : LANGUAGE_NOT_SPECIFIED; - $comment_body = $comment->comment_body[$langcode][0]; - if (isset($comment_body['format'])) { - $comment_text = check_markup($comment_body['value'], $comment_body['format']); - } - else { - $comment_text = check_plain($comment_body['value']); - } + $comment_text = $comment->comment_body->processed; $comment->subject = truncate_utf8(trim(decode_entities(strip_tags($comment_text))), 29, TRUE); // Edge cases where the comment body is populated only by HTML tags will // require a default subject. - if ($comment->subject == '') { - $comment->subject = t('(No subject)'); + if ($comment->subject->value == '') { + $comment->subject->value = t('(No subject)'); } } @@ -342,13 +323,13 @@ public function save(array $form, array &$form_state) { } comment_save($comment); - $form_state['values']['cid'] = $comment->cid; + $form_state['values']['cid'] = $comment->cid->value; // Add an entry to the watchdog log. - watchdog('content', 'Comment posted: %subject.', array('%subject' => $comment->subject), WATCHDOG_NOTICE, l(t('view'), 'comment/' . $comment->cid, array('fragment' => 'comment-' . $comment->cid))); + watchdog('content', 'Comment posted: %subject.', array('%subject' => $comment->subject->value), WATCHDOG_NOTICE, l(t('view'), 'comment/' . $comment->cid->value, array('fragment' => 'comment-' . $comment->cid->value))); // Explain the approval queue if necessary. - if ($comment->status == COMMENT_NOT_PUBLISHED) { + if ($comment->status->value == COMMENT_NOT_PUBLISHED) { if (!user_access('administer comments')) { drupal_set_message(t('Your comment has been queued for review by site administrators and will be published after approval.')); } @@ -358,16 +339,16 @@ public function save(array $form, array &$form_state) { } $query = array(); // Find the current display page for this comment. - $page = comment_get_display_page($comment->cid, $node->type); + $page = comment_get_display_page($comment->cid->value, $node->type); if ($page > 0) { $query['page'] = $page; } // Redirect to the newly posted comment. - $redirect = array('node/' . $node->nid, array('query' => $query, 'fragment' => 'comment-' . $comment->cid)); + $redirect = array('node/' . $node->nid, array('query' => $query, 'fragment' => 'comment-' . $comment->cid->value)); } else { - watchdog('content', 'Comment: unauthorized comment submitted or comment submitted to a closed post %subject.', array('%subject' => $comment->subject), WATCHDOG_WARNING); - drupal_set_message(t('Comment: unauthorized comment submitted or comment submitted to a closed post %subject.', array('%subject' => $comment->subject)), 'error'); + watchdog('content', 'Comment: unauthorized comment submitted or comment submitted to a closed post %subject.', array('%subject' => $comment->subject->value), WATCHDOG_WARNING); + drupal_set_message(t('Comment: unauthorized comment submitted or comment submitted to a closed post %subject.', array('%subject' => $comment->subject->value)), 'error'); // Redirect the user to the node they are commenting on. $redirect = 'node/' . $node->nid; } diff --git a/core/modules/comment/lib/Drupal/comment/CommentRenderController.php b/core/modules/comment/lib/Drupal/comment/CommentRenderController.php index c614f8e..0ef2942 100644 --- a/core/modules/comment/lib/Drupal/comment/CommentRenderController.php +++ b/core/modules/comment/lib/Drupal/comment/CommentRenderController.php @@ -30,7 +30,7 @@ public function buildContent(array $entities = array(), $view_mode = 'full', $la parent::buildContent($entities, $view_mode, $langcode); foreach ($entities as $entity) { - $node = node_load($entity->nid); + $node = $entity->nid->entity; if (!$node) { throw new \InvalidArgumentException(t('Invalid node for comment.')); } @@ -73,7 +73,7 @@ protected function alterBuild(array &$build, EntityInterface $comment, $view_mod } // Add anchor for each comment. - $prefix .= "cid\">\n"; + $prefix .= "cid->value}\">\n"; $build['#prefix'] = $prefix; // Close all open divs. diff --git a/core/modules/comment/lib/Drupal/comment/CommentStorageController.php b/core/modules/comment/lib/Drupal/comment/CommentStorageController.php index 4d447a5..488931e 100644 --- a/core/modules/comment/lib/Drupal/comment/CommentStorageController.php +++ b/core/modules/comment/lib/Drupal/comment/CommentStorageController.php @@ -8,7 +8,8 @@ namespace Drupal\comment; use Drupal\Core\Entity\EntityInterface; -use Drupal\Core\Entity\DatabaseStorageController; +use Drupal\Core\Entity\DatabaseStorageControllerNG; +use Drupal\Component\Uuid\Uuid; use LogicException; /** @@ -17,7 +18,7 @@ * This extends the Drupal\Core\Entity\DatabaseStorageController class, adding * required special handling for comment entities. */ -class CommentStorageController extends DatabaseStorageController { +class CommentStorageController extends DatabaseStorageControllerNG { /** * The thread for which a lock was acquired. */ @@ -33,23 +34,47 @@ protected function buildQuery($ids, $revision_id = FALSE) { $query->innerJoin('node', 'n', 'base.nid = n.nid'); $query->addField('n', 'type', 'node_type'); $query->innerJoin('users', 'u', 'base.uid = u.uid'); + // @todo: Move to a computed 'name' field instead. $query->addField('u', 'name', 'registered_name'); - $query->fields('u', array('uid', 'signature', 'signature_format', 'picture')); return $query; } /** * Overrides Drupal\Core\Entity\DatabaseStorageController::attachLoad(). */ - protected function attachLoad(&$comments, $load_revision = FALSE) { - // Set up standard comment properties. - foreach ($comments as $key => $comment) { - $comment->name = $comment->uid ? $comment->registered_name : $comment->name; - $comment->new = node_mark($comment->nid, $comment->changed); - $comment->node_type = 'comment_node_' . $comment->node_type; - $comments[$key] = $comment; + protected function attachLoad(&$records, $load_revision = FALSE) { + // Prepare standard comment fields. + foreach ($records as $key => $record) { + $record->name = $record->uid ? $record->registered_name : $record->name; + $record->node_type = 'comment_node_' . $record->node_type; + $records[$key] = $record; } - parent::attachLoad($comments, $load_revision); + parent::attachLoad($records, $load_revision); + } + + /** + * Overrides Drupal\Core\Entity\DatabaseStorageControllerNG::create(). + */ + public function create(array $values) { + $comment = new $this->entityClass(array(), $this->entityType); + + // Make sure the bundle is set first, so bundle specific values can be set. + if (!empty($values['nid'])) { + $comment->nid = $values['nid']; + $comment->node_type->value = 'comment_node_' . $comment->nid->entity->type; + unset($values['nid']); + } + // Set all other given values. + foreach ($values as $name => $value) { + $comment->$name = $value; + } + + // Assign a new UUID if there is none yet. + if ($this->uuidKey && !isset($comment->{$this->uuidKey})) { + $uuid = new Uuid(); + $comment->{$this->uuidKey}->value = $uuid->generate(); + } + return $comment; } /** @@ -61,20 +86,19 @@ protected function attachLoad(&$comments, $load_revision = FALSE) { 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->status->value)) { + $comment->status->value = user_access('skip comment approval') ? COMMENT_PUBLISHED : COMMENT_NOT_PUBLISHED; } // Make sure we have a proper bundle name. - if (!isset($comment->node_type)) { - $node = node_load($comment->nid); - $comment->node_type = 'comment_node_' . $node->type; + if (!isset($comment->node_type->value)) { + $comment->node_type->value = 'comment_node_' . $comment->nid->entity->type; } - if (!$comment->cid) { + if ($comment->isNew()) { // Add the comment to database. This next section builds the thread field. // Also see the documentation for comment_view(). - if (!empty($comment->thread)) { + if (!empty($comment->thread->value)) { // Allow calling code to set thread itself. - $thread = $comment->thread; + $thread = $comment->thread->value; } else { if ($this->threadLock) { @@ -82,10 +106,10 @@ protected function preSave(EntityInterface $comment) { // is extended in a faulty manner. throw new LogicException('preSave is called again without calling postSave() or releaseThreadLock()'); } - if ($comment->pid == 0) { + if ($comment->pid->value == 0) { // This is a comment with no parent comment (depth 0): we start // by retrieving the maximum thread level. - $max = db_query('SELECT MAX(thread) FROM {comment} WHERE nid = :nid', array(':nid' => $comment->nid))->fetchField(); + $max = db_query('SELECT MAX(thread) FROM {comment} WHERE nid = :nid', array(':nid' => $comment->nid->value))->fetchField(); // Strip the "/" from the end of the thread. $max = rtrim($max, '/'); // We need to get the value at the correct depth. @@ -98,14 +122,14 @@ protected function preSave(EntityInterface $comment) { // the thread value at the proper depth. // Get the parent comment: - $parent = comment_load($comment->pid); + $parent = $comment->pid->entity; // Strip the "/" from the end of the parent thread. - $parent->thread = (string) rtrim((string) $parent->thread, '/'); - $prefix = $parent->thread . '.'; + $parent->thread->value = (string) rtrim((string) $parent->thread->value, '/'); + $prefix = $parent->thread->value . '.'; // Get the max value in *this* thread. $max = db_query("SELECT MAX(thread) FROM {comment} WHERE thread LIKE :thread AND nid = :nid", array( - ':thread' => $parent->thread . '.%', - ':nid' => $comment->nid, + ':thread' => $parent->thread->value . '.%', + ':nid' => $comment->nid->value, ))->fetchField(); if ($max == '') { @@ -119,7 +143,7 @@ protected function preSave(EntityInterface $comment) { $max = rtrim($max, '/'); // Get the value at the correct depth. $parts = explode('.', $max); - $parent_depth = count(explode('.', $parent->thread)); + $parent_depth = count(explode('.', $parent->thread->value)); $n = comment_alphadecimal_to_int($parts[$parent_depth]); } } @@ -128,23 +152,23 @@ protected function preSave(EntityInterface $comment) { // has the lock, just move to the next integer. do { $thread = $prefix . comment_int_to_alphadecimal(++$n) . '/'; - } while (!lock()->acquire("comment:$comment->nid:$thread")); + } while (!lock()->acquire("comment:{$comment->nid->value}:$thread")); $this->threadLock = $thread; } - if (empty($comment->created)) { - $comment->created = REQUEST_TIME; + if (empty($comment->created->value)) { + $comment->created->value = REQUEST_TIME; } - if (empty($comment->changed)) { - $comment->changed = $comment->created; + if (empty($comment->changed->value)) { + $comment->changed->value = $comment->created->value; } // We test the value with '===' because we need to modify anonymous // users as well. - if ($comment->uid === $user->uid && isset($user->name)) { - $comment->name = $user->name; + if ($comment->uid->value === $user->uid && isset($user->name)) { + $comment->name->value = $user->name; } // Add the values which aren't passed into the function. - $comment->thread = $thread; - $comment->hostname = ip_address(); + $comment->thread->value = $thread; + $comment->hostname->value = ip_address(); } } @@ -154,8 +178,8 @@ protected function preSave(EntityInterface $comment) { protected function postSave(EntityInterface $comment, $update) { $this->releaseThreadLock(); // Update the {node_comment_statistics} table prior to executing the hook. - $this->updateNodeStatistics($comment->nid); - if ($comment->status == COMMENT_PUBLISHED) { + $this->updateNodeStatistics($comment->nid->value); + if ($comment->status->value == COMMENT_PUBLISHED) { module_invoke_all('comment_publish', $comment); } } @@ -172,7 +196,7 @@ protected function postDelete($comments) { comment_delete_multiple($child_cids); foreach ($comments as $comment) { - $this->updateNodeStatistics($comment->nid); + $this->updateNodeStatistics($comment->nid->value); } } @@ -246,4 +270,110 @@ protected function releaseThreadLock() { $this->threadLock = ''; } } + + /** + * Implements \Drupal\Core\Entity\DataBaseStorageControllerNG::basePropertyDefinitions(). + */ + public function baseFieldDefinitions() { + $properties['cid'] = array( + 'label' => t('ID'), + 'description' => t('The comment ID.'), + 'type' => 'integer_field', + 'read-only' => TRUE, + ); + $properties['uuid'] = array( + 'label' => t('UUID'), + 'description' => t('The comment UUID.'), + 'type' => 'string_field', + ); + $properties['pid'] = array( + 'label' => t('Parent ID'), + 'description' => t('The parent comment ID if this is a reply to a comment.'), + 'type' => 'entityreference_field', + 'settings' => array('entity type' => 'comment'), + ); + $properties['nid'] = array( + 'label' => t('Node ID'), + 'description' => t('The ID of the node of which this comment is a reply.'), + 'type' => 'entityreference_field', + 'settings' => array('entity type' => 'node'), + 'required' => TRUE, + ); + $properties['langcode'] = array( + 'label' => t('Language code'), + 'description' => t('The comment language code.'), + 'type' => 'language_field', + ); + $properties['subject'] = array( + 'label' => t('Subject'), + 'description' => t('The comment title or subject.'), + 'type' => 'string_field', + ); + $properties['uid'] = array( + 'label' => t('User ID'), + 'description' => t('The user ID of the comment author.'), + 'type' => 'entityreference_field', + 'settings' => array('entity type' => 'user'), + ); + $properties['name'] = array( + 'label' => t('Name'), + 'description' => t("The comment author's name."), + 'type' => 'string_field', + ); + $properties['mail'] = array( + 'label' => t('e-mail'), + 'description' => t("The comment author's e-mail address."), + 'type' => 'string_field', + ); + $properties['homepage'] = array( + 'label' => t('Homepage'), + 'description' => t("The comment author's home page address."), + 'type' => 'string_field', + ); + $properties['hostname'] = array( + 'label' => t('Hostname'), + 'description' => t("The comment author's hostname."), + 'type' => 'string_field', + ); + $properties['created'] = array( + 'label' => t('Created'), + 'description' => t('The time that the comment was created.'), + 'type' => 'date_field', + ); + $properties['changed'] = array( + 'label' => t('Changed'), + 'description' => t('The time that the comment was last edited.'), + 'type' => 'date_field', + ); + $properties['status'] = array( + 'label' => t('Publishing status'), + 'description' => t('A boolean indicating whether the comment is published.'), + 'type' => 'boolean_field', + ); + $properties['thread'] = array( + 'label' => t('Thread place'), + 'description' => t("The alphadecimal representation of the comment's place in a thread, consisting of a base 36 string prefixed by an integer indicating its length."), + 'type' => 'string_field', + ); + $properties['node_type'] = array( + // @todo: The bundle property should be stored so it's queryable. + 'label' => t('Node type'), + 'description' => t("The comment node type."), + 'type' => 'string_field', + 'queryable' => FALSE, + ); + $properties['new'] = array( + 'label' => t('Comment new marker'), + 'description' => t("The comment 'new' marker for the current user (0 read, 1 new, 2 updated)."), + 'type' => 'integer_field', + 'computed' => TRUE, + 'settings' => array( + // Specify the class used for computing the field's value property. + 'property value' => array( + 'class' => '\Drupal\comment\FieldNewValue', + ), + ), + ); + return $properties; + } } diff --git a/core/modules/comment/lib/Drupal/comment/FieldNewValue.php b/core/modules/comment/lib/Drupal/comment/FieldNewValue.php new file mode 100644 index 0000000..ef2d751 --- /dev/null +++ b/core/modules/comment/lib/Drupal/comment/FieldNewValue.php @@ -0,0 +1,87 @@ +name; + } + + /** + * Implements ContextAwareInterface::setName(). + */ + public function setName($name) { + $this->name = $name; + } + + /** + * Implements ContextAwareInterface::getParent(). + * + * @return \Drupal\Core\Entity\Field\FieldItemInterface + */ + public function getParent() { + return $this->parent; + } + + /** + * Implements ContextAwareInterface::setParent(). + */ + public function setParent($parent) { + $this->parent = $parent; + } + + /** + * Implements TypedDataInterface::getValue(). + */ + public function getValue($langcode = NULL) { + + if (!isset($this->parent)) { + throw new InvalidArgumentException('Computed properties require context for computation.'); + } + $field = $this->parent->getParent(); + $entity = $field->getParent(); + return node_mark($entity->nid->value, $entity->changed->value->getTimestamp()); + } + + /** + * Implements TypedDataInterface::setValue(). + */ + public function setValue($value) { + if (isset($value)) { + throw new ReadOnlyException('Unable to set a computed property.'); + } + } +} diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentActionsTest.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentActionsTest.php index 4a2e9ca..a93d02c 100644 --- a/core/modules/comment/lib/Drupal/comment/Tests/CommentActionsTest.php +++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentActionsTest.php @@ -35,28 +35,28 @@ function testCommentPublishUnpublishActions() { $comment_text = $this->randomName(); $subject = $this->randomName(); $comment = $this->postComment($this->node, $comment_text, $subject); - $comment = comment_load($comment->id); + $comment = comment_load($comment->id()); // Unpublish a comment (direct form: doesn't actually save the comment). comment_unpublish_action($comment); - $this->assertEqual($comment->status, COMMENT_NOT_PUBLISHED, 'Comment was unpublished'); + $this->assertEqual($comment->status->value, COMMENT_NOT_PUBLISHED, 'Comment was unpublished'); $this->assertWatchdogMessage('Unpublished comment %subject.', array('%subject' => $subject), 'Found watchdog message'); $this->clearWatchdog(); // Unpublish a comment (indirect form: modify the comment in the database). - comment_unpublish_action(NULL, array('cid' => $comment->cid)); - $this->assertEqual(comment_load($comment->cid)->status, COMMENT_NOT_PUBLISHED, 'Comment was unpublished'); + comment_unpublish_action(NULL, array('cid' => $comment->cid->value)); + $this->assertEqual(comment_load($comment->cid->value)->status->value, COMMENT_NOT_PUBLISHED, 'Comment was unpublished'); $this->assertWatchdogMessage('Unpublished comment %subject.', array('%subject' => $subject), 'Found watchdog message'); // Publish a comment (direct form: doesn't actually save the comment). comment_publish_action($comment); - $this->assertEqual($comment->status, COMMENT_PUBLISHED, 'Comment was published'); + $this->assertEqual($comment->status->value, COMMENT_PUBLISHED, 'Comment was published'); $this->assertWatchdogMessage('Published comment %subject.', array('%subject' => $subject), 'Found watchdog message'); $this->clearWatchdog(); // Publish a comment (indirect form: modify the comment in the database). - comment_publish_action(NULL, array('cid' => $comment->cid)); - $this->assertEqual(comment_load($comment->cid)->status, COMMENT_PUBLISHED, 'Comment was published'); + comment_publish_action(NULL, array('cid' => $comment->cid->value)); + $this->assertEqual(comment_load($comment->cid->value)->status->value, COMMENT_PUBLISHED, 'Comment was published'); $this->assertWatchdogMessage('Published comment %subject.', array('%subject' => $subject), 'Found watchdog message'); $this->clearWatchdog(); } diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentAnonymousTest.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentAnonymousTest.php index 5e46be4..50a86b7 100644 --- a/core/modules/comment/lib/Drupal/comment/Tests/CommentAnonymousTest.php +++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentAnonymousTest.php @@ -54,7 +54,7 @@ function testAnonymous() { $this->setCommentAnonymous('1'); // Attempt to edit anonymous comment. - $this->drupalGet('comment/' . $anonymous_comment1->id . '/edit'); + $this->drupalGet('comment/' . $anonymous_comment1->id() . '/edit'); $edited_comment = $this->postComment(NULL, $this->randomName(), $this->randomName()); $this->assertTrue($this->commentExists($edited_comment, FALSE), 'Modified reply found.'); $this->drupalLogout(); @@ -99,7 +99,7 @@ function testAnonymous() { // Make sure the user data appears correctly when editing the comment. $this->drupalLogin($this->admin_user); - $this->drupalGet('comment/' . $anonymous_comment3->id . '/edit'); + $this->drupalGet('comment/' . $anonymous_comment3->id() . '/edit'); $this->assertRaw($author_name, "The anonymous user's name is correct when editing the comment."); $this->assertRaw($author_mail, "The anonymous user's e-mail address is correct when editing the comment."); @@ -107,19 +107,19 @@ function testAnonymous() { $this->performCommentOperation($anonymous_comment3, 'unpublish'); $this->drupalGet('admin/content/comment/approval'); - $this->assertRaw('comments[' . $anonymous_comment3->id . ']', 'Comment was unpublished.'); + $this->assertRaw('comments[' . $anonymous_comment3->id() . ']', 'Comment was unpublished.'); // Publish comment. $this->performCommentOperation($anonymous_comment3, 'publish', TRUE); $this->drupalGet('admin/content/comment'); - $this->assertRaw('comments[' . $anonymous_comment3->id . ']', 'Comment was published.'); + $this->assertRaw('comments[' . $anonymous_comment3->id() . ']', 'Comment was published.'); // Delete comment. $this->performCommentOperation($anonymous_comment3, 'delete'); $this->drupalGet('admin/content/comment'); - $this->assertNoRaw('comments[' . $anonymous_comment3->id . ']', 'Comment was deleted.'); + $this->assertNoRaw('comments[' . $anonymous_comment3->id() . ']', 'Comment was deleted.'); $this->drupalLogout(); // Reset. @@ -162,7 +162,7 @@ function testAnonymous() { $this->assertFieldByName('subject', '', 'Subject field found.'); $this->assertFieldByName("comment_body[$langcode][0][value]", '', 'Comment field found.'); - $this->drupalGet('comment/reply/' . $this->node->nid . '/' . $anonymous_comment3->id); + $this->drupalGet('comment/reply/' . $this->node->nid . '/' . $anonymous_comment3->id()); $this->assertText('You are not authorized to view comments', 'Error attempting to post reply.'); $this->assertNoText($author_name, 'Comment not displayed.'); } diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentApprovalTest.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentApprovalTest.php index 62a7812..e123fc4 100644 --- a/core/modules/comment/lib/Drupal/comment/Tests/CommentApprovalTest.php +++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentApprovalTest.php @@ -47,7 +47,7 @@ function testApprovalAdminInterface() { // Get unapproved comment id. $this->drupalLogin($this->admin_user); $anonymous_comment4 = $this->getUnapprovedComment($subject); - $anonymous_comment4 = entity_create('comment', array('id' => $anonymous_comment4, 'subject' => $subject, 'comment' => $body)); + $anonymous_comment4 = entity_create('comment', array('cid' => $anonymous_comment4, 'subject' => $subject, 'comment_body' => $body, 'nid' => $this->node->nid)); $this->drupalLogout(); $this->assertFalse($this->commentExists($anonymous_comment4), 'Anonymous comment was not published.'); @@ -69,8 +69,8 @@ function testApprovalAdminInterface() { $this->drupalGet('admin/content/comment/approval'); $this->assertText(t('Unapproved comments (@count)', array('@count' => 2)), 'Two unapproved comments waiting for approval.'); $edit = array( - "comments[{$comments[0]->id}]" => 1, - "comments[{$comments[1]->id}]" => 1, + "comments[{$comments[0]->id()}]" => 1, + "comments[{$comments[1]->id()}]" => 1, ); $this->drupalPost(NULL, $edit, t('Update')); $this->assertText(t('Unapproved comments (@count)', array('@count' => 0)), 'All comments were approved.'); @@ -78,9 +78,9 @@ function testApprovalAdminInterface() { // Delete multiple comments in one operation. $edit = array( 'operation' => 'delete', - "comments[{$comments[0]->id}]" => 1, - "comments[{$comments[1]->id}]" => 1, - "comments[{$anonymous_comment4->id}]" => 1, + "comments[{$comments[0]->id()}]" => 1, + "comments[{$comments[1]->id()}]" => 1, + "comments[{$anonymous_comment4->id()}]" => 1, ); $this->drupalPost(NULL, $edit, t('Update')); $this->assertText(t('Are you sure you want to delete these comments and all their children?'), 'Confirmation required.'); @@ -111,7 +111,7 @@ function testApprovalNodeInterface() { // Get unapproved comment id. $this->drupalLogin($this->admin_user); $anonymous_comment4 = $this->getUnapprovedComment($subject); - $anonymous_comment4 = entity_create('comment', array('id' => $anonymous_comment4, 'subject' => $subject, 'comment' => $body)); + $anonymous_comment4 = entity_create('comment', array('cid' => $anonymous_comment4, 'subject' => $subject, 'comment_body' => $body, 'nid' => $this->node->nid)); $this->drupalLogout(); $this->assertFalse($this->commentExists($anonymous_comment4), 'Anonymous comment was not published.'); diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentBlockTest.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentBlockTest.php index 0ec3af2..6463737 100644 --- a/core/modules/comment/lib/Drupal/comment/Tests/CommentBlockTest.php +++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentBlockTest.php @@ -85,10 +85,10 @@ function testRecentCommentBlock() { $this->assertText($block['title'], 'Block was found.'); // Test the only the 2 latest comments are shown and in the proper order. - $this->assertNoText($comment1->subject, 'Comment not found in block.'); - $this->assertText($comment2->subject, 'Comment found in block.'); - $this->assertText($comment3->comment, 'Comment found in block.'); - $this->assertTrue(strpos($this->drupalGetContent(), $comment3->comment) < strpos($this->drupalGetContent(), $comment2->subject), 'Comments were ordered correctly in block.'); + $this->assertNoText($comment1->subject->value, 'Comment not found in block.'); + $this->assertText($comment2->subject->value, 'Comment found in block.'); + $this->assertText($comment3->comment_body->value, 'Comment found in block.'); + $this->assertTrue(strpos($this->drupalGetContent(), $comment3->comment_body->value) < strpos($this->drupalGetContent(), $comment2->subject->value), 'Comments were ordered correctly in block.'); // Set the number of recent comments to show to 10. $this->drupalLogout(); @@ -103,21 +103,21 @@ function testRecentCommentBlock() { $comment4 = $this->postComment($this->node, $this->randomName(), $this->randomName()); // Test that all four comments are shown. - $this->assertText($comment1->subject, 'Comment found in block.'); - $this->assertText($comment2->subject, 'Comment found in block.'); - $this->assertText($comment3->comment, 'Comment found in block.'); - $this->assertText($comment4->subject, 'Comment found in block.'); + $this->assertText($comment1->subject->value, 'Comment found in block.'); + $this->assertText($comment2->subject->value, 'Comment found in block.'); + $this->assertText($comment3->comment_body->value, 'Comment found in block.'); + $this->assertText($comment4->subject->value, 'Comment found in block.'); // Test that links to comments work when comments are across pages. $this->setCommentsPerPage(1); $this->drupalGet(''); - $this->clickLink($comment1->subject); - $this->assertText($comment1->subject, 'Comment link goes to correct page.'); + $this->clickLink($comment1->subject->value); + $this->assertText($comment1->subject->value, 'Comment link goes to correct page.'); $this->drupalGet(''); - $this->clickLink($comment2->subject); - $this->assertText($comment2->subject, 'Comment link goes to correct page.'); - $this->clickLink($comment4->subject); - $this->assertText($comment4->subject, 'Comment link goes to correct page.'); + $this->clickLink($comment2->subject->value); + $this->assertText($comment2->subject->value, 'Comment link goes to correct page.'); + $this->clickLink($comment4->subject->value); + $this->assertText($comment4->subject->value, 'Comment link goes to correct page.'); // Check that when viewing a comment page from a link to the comment, that // rel="canonical" is added to the head of the document. $this->assertRaw('randomName(); $comment_text = $this->randomName(); $comment = $this->postComment($this->node, $comment_text, $subject_text, TRUE); - $comment_loaded = comment_load($comment->id); + $comment_loaded = comment_load($comment->id()); $this->assertTrue($this->commentExists($comment), 'Comment found.'); // Add the property to the content array and then see if it still exists on build. diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentInterfaceTest.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentInterfaceTest.php index 1070107..00a4291 100644 --- a/core/modules/comment/lib/Drupal/comment/Tests/CommentInterfaceTest.php +++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentInterfaceTest.php @@ -37,7 +37,6 @@ function testCommentInterface() { $this->drupalLogin($this->web_user); $comment_text = $this->randomName(); $comment = $this->postComment($this->node, $comment_text); - $comment_loaded = comment_load($comment->id); $this->assertTrue($this->commentExists($comment), 'Comment found.'); // Set comments to have subject and preview to required. @@ -52,11 +51,10 @@ function testCommentInterface() { $subject_text = $this->randomName(); $comment_text = $this->randomName(); $comment = $this->postComment($this->node, $comment_text, $subject_text, TRUE); - $comment_loaded = comment_load($comment->id); $this->assertTrue($this->commentExists($comment), 'Comment found.'); // Check comment display. - $this->drupalGet('node/' . $this->node->nid . '/' . $comment->id); + $this->drupalGet('node/' . $this->node->nid . '/' . $comment->id()); $this->assertText($subject_text, 'Individual comment subject found.'); $this->assertText($comment_text, 'Individual comment body found.'); @@ -67,49 +65,49 @@ function testCommentInterface() { $this->setCommentPreview(DRUPAL_OPTIONAL); // Test changing the comment author to "Anonymous". - $this->drupalGet('comment/' . $comment->id . '/edit'); - $comment = $this->postComment(NULL, $comment->comment, $comment->subject, array('name' => '')); - $comment_loaded = comment_load($comment->id); - $this->assertTrue(empty($comment_loaded->name) && $comment_loaded->uid == 0, 'Comment author successfully changed to anonymous.'); + $this->drupalGet('comment/' . $comment->id() . '/edit'); + $comment = $this->postComment(NULL, $comment->comment_body->value, $comment->subject->value, array('name' => '')); + $comment_loaded = comment_load($comment->id()); + $this->assertTrue(empty($comment_loaded->name->value) && $comment_loaded->uid->value == 0, 'Comment author successfully changed to anonymous.'); // Test changing the comment author to an unverified user. $random_name = $this->randomName(); - $this->drupalGet('comment/' . $comment->id . '/edit'); - $comment = $this->postComment(NULL, $comment->comment, $comment->subject, array('name' => $random_name)); + $this->drupalGet('comment/' . $comment->id() . '/edit'); + $comment = $this->postComment(NULL, $comment->comment_body->value, $comment->subject->value, array('name' => $random_name)); $this->drupalGet('node/' . $this->node->nid); $this->assertText($random_name . ' (' . t('not verified') . ')', 'Comment author successfully changed to an unverified user.'); // Test changing the comment author to a verified user. - $this->drupalGet('comment/' . $comment->id . '/edit'); - $comment = $this->postComment(NULL, $comment->comment, $comment->subject, array('name' => $this->web_user->name)); - $comment_loaded = comment_load($comment->id); - $this->assertTrue($comment_loaded->name == $this->web_user->name && $comment_loaded->uid == $this->web_user->uid, 'Comment author successfully changed to a registered user.'); + $this->drupalGet('comment/' . $comment->id() . '/edit'); + $comment = $this->postComment(NULL, $comment->comment_body->value, $comment->subject->value, array('name' => $this->web_user->name)); + $comment_loaded = comment_load($comment->id()); + $this->assertTrue($comment_loaded->name->value == $this->web_user->name && $comment_loaded->uid->value == $this->web_user->uid, 'Comment author successfully changed to a registered user.'); $this->drupalLogout(); // Reply to comment #2 creating comment #3 with optional preview and no // subject though field enabled. $this->drupalLogin($this->web_user); - $this->drupalGet('comment/reply/' . $this->node->nid . '/' . $comment->id); + $this->drupalGet('comment/reply/' . $this->node->nid . '/' . $comment->id()); $this->assertText($subject_text, 'Individual comment-reply subject found.'); $this->assertText($comment_text, 'Individual comment-reply body found.'); $reply = $this->postComment(NULL, $this->randomName(), '', TRUE); - $reply_loaded = comment_load($reply->id); + $reply_loaded = comment_load($reply->id()); $this->assertTrue($this->commentExists($reply, TRUE), 'Reply found.'); - $this->assertEqual($comment->id, $reply_loaded->pid, 'Pid of a reply to a comment is set correctly.'); - $this->assertEqual(rtrim($comment_loaded->thread, '/') . '.00/', $reply_loaded->thread, 'Thread of reply grows correctly.'); + $this->assertEqual($comment->id(), $reply_loaded->pid->value, 'Pid of a reply to a comment is set correctly.'); + $this->assertEqual(rtrim($comment_loaded->thread->value, '/') . '.00/', $reply_loaded->thread->value, 'Thread of reply grows correctly.'); // Second reply to comment #3 creating comment #4. - $this->drupalGet('comment/reply/' . $this->node->nid . '/' . $comment->id); + $this->drupalGet('comment/reply/' . $this->node->nid . '/' . $comment->id()); $this->assertText($subject_text, 'Individual comment-reply subject found.'); $this->assertText($comment_text, 'Individual comment-reply body found.'); $reply = $this->postComment(NULL, $this->randomName(), $this->randomName(), TRUE); - $reply_loaded = comment_load($reply->id); + $reply_loaded = comment_load($reply->id()); $this->assertTrue($this->commentExists($reply, TRUE), 'Second reply found.'); - $this->assertEqual(rtrim($comment_loaded->thread, '/') . '.01/', $reply_loaded->thread, 'Thread of second reply grows correctly.'); + $this->assertEqual(rtrim($comment_loaded->thread->value, '/') . '.01/', $reply_loaded->thread->value, 'Thread of second reply grows correctly.'); // Edit reply. - $this->drupalGet('comment/' . $reply->id . '/edit'); + $this->drupalGet('comment/' . $reply->id() . '/edit'); $reply = $this->postComment(NULL, $this->randomName(), $this->randomName(), TRUE); $this->assertTrue($this->commentExists($reply, TRUE), 'Modified reply found.'); @@ -126,9 +124,9 @@ function testCommentInterface() { $this->setCommentsPerPage(50); // Attempt to reply to an unpublished comment. - $reply_loaded->status = COMMENT_NOT_PUBLISHED; + $reply_loaded->status->value = COMMENT_NOT_PUBLISHED; $reply_loaded->save(); - $this->drupalGet('comment/reply/' . $this->node->nid . '/' . $reply_loaded->cid); + $this->drupalGet('comment/reply/' . $this->node->nid . '/' . $reply_loaded->cid->value); $this->assertText(t('The comment you are replying to does not exist.'), 'Replying to an unpublished comment'); // Attempt to post to node with comments disabled. @@ -178,5 +176,4 @@ function testCommentInterface() { $this->drupalLogin($this->admin_user); $this->setCommentForm(FALSE); } - } diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentLanguageTest.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentLanguageTest.php index a704fb7..aea8986 100644 --- a/core/modules/comment/lib/Drupal/comment/Tests/CommentLanguageTest.php +++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentLanguageTest.php @@ -127,9 +127,9 @@ function testCommentLanguage() { ->execute() ->fetchField(); $comment = comment_load($cid); - $args = array('%node_language' => $node_langcode, '%comment_language' => $comment->langcode, '%langcode' => $langcode); - $this->assertEqual($comment->langcode, $langcode, format_string('The comment posted with content language %langcode and belonging to the node with language %node_language has language %comment_language', $args)); - $this->assertEqual($comment->comment_body[$langcode][0]['value'], $comment_values[$node_langcode][$langcode], 'Comment body correctly stored.'); + $args = array('%node_language' => $node_langcode, '%comment_language' => $comment->langcode->value, '%langcode' => $langcode); + $this->assertEqual($comment->langcode->value, $langcode, format_string('The comment posted with content language %langcode and belonging to the node with language %node_language has language %comment_language', $args)); + $this->assertEqual($comment->comment_body->value, $comment_values[$node_langcode][$langcode], 'Comment body correctly stored.'); } } diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentNodeAccessTest.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentNodeAccessTest.php index 37809c6..7910196 100644 --- a/core/modules/comment/lib/Drupal/comment/Tests/CommentNodeAccessTest.php +++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentNodeAccessTest.php @@ -52,7 +52,6 @@ function setUp() { * Test that threaded comments can be viewed. */ function testThreadedCommentView() { - $langcode = LANGUAGE_NOT_SPECIFIED; // Set comments to have subject required and preview disabled. $this->drupalLogin($this->admin_user); $this->setCommentPreview(DRUPAL_DISABLED); @@ -66,20 +65,18 @@ function testThreadedCommentView() { $comment_text = $this->randomName(); $comment_subject = $this->randomName(); $comment = $this->postComment($this->node, $comment_text, $comment_subject); - $comment_loaded = comment_load($comment->id); $this->assertTrue($this->commentExists($comment), 'Comment found.'); // Check comment display. - $this->drupalGet('node/' . $this->node->nid . '/' . $comment->id); + $this->drupalGet('node/' . $this->node->nid . '/' . $comment->id()); $this->assertText($comment_subject, 'Individual comment subject found.'); $this->assertText($comment_text, 'Individual comment body found.'); // Reply to comment, creating second comment. - $this->drupalGet('comment/reply/' . $this->node->nid . '/' . $comment->id); + $this->drupalGet('comment/reply/' . $this->node->nid . '/' . $comment->id()); $reply_text = $this->randomName(); $reply_subject = $this->randomName(); $reply = $this->postComment(NULL, $reply_text, $reply_subject, TRUE); - $reply_loaded = comment_load($reply->id); $this->assertTrue($this->commentExists($reply, TRUE), 'Reply found.'); // Go to the node page and verify comment and reply are visible. diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentNodeChangesTest.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentNodeChangesTest.php index b517d04..b27412c 100644 --- a/core/modules/comment/lib/Drupal/comment/Tests/CommentNodeChangesTest.php +++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentNodeChangesTest.php @@ -26,8 +26,8 @@ public static function getInfo() { function testNodeDeletion() { $this->drupalLogin($this->web_user); $comment = $this->postComment($this->node, $this->randomName(), $this->randomName()); - $this->assertTrue(comment_load($comment->id), 'The comment could be loaded.'); + $this->assertTrue(comment_load($comment->id()), 'The comment could be loaded.'); node_delete($this->node->nid); - $this->assertFalse(comment_load($comment->id), 'The comment could not be loaded after the node was deleted.'); + $this->assertFalse(comment_load($comment->id()), 'The comment could not be loaded after the node was deleted.'); } } diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentPagerTest.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentPagerTest.php index 52f1e32..644001c 100644 --- a/core/modules/comment/lib/Drupal/comment/Tests/CommentPagerTest.php +++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentPagerTest.php @@ -66,7 +66,7 @@ function testCommentPaging() { // Post a reply to the oldest comment and test again. $replies = array(); $oldest_comment = reset($comments); - $this->drupalGet('comment/reply/' . $node->nid . '/' . $oldest_comment->id); + $this->drupalGet('comment/reply/' . $node->nid . '/' . $oldest_comment->id()); $reply = $this->postComment(NULL, $this->randomName(), $this->randomName(), TRUE); $this->setCommentsPerPage(2); @@ -114,19 +114,19 @@ function testCommentOrderingThreading() { $comments[] = $this->postComment($node, $this->randomName(), $this->randomName(), TRUE); // Post a reply to the second comment. - $this->drupalGet('comment/reply/' . $node->nid . '/' . $comments[1]->id); + $this->drupalGet('comment/reply/' . $node->nid . '/' . $comments[1]->id()); $comments[] = $this->postComment(NULL, $this->randomName(), $this->randomName(), TRUE); // Post a reply to the first comment. - $this->drupalGet('comment/reply/' . $node->nid . '/' . $comments[0]->id); + $this->drupalGet('comment/reply/' . $node->nid . '/' . $comments[0]->id()); $comments[] = $this->postComment(NULL, $this->randomName(), $this->randomName(), TRUE); // Post a reply to the last comment. - $this->drupalGet('comment/reply/' . $node->nid . '/' . $comments[2]->id); + $this->drupalGet('comment/reply/' . $node->nid . '/' . $comments[2]->id()); $comments[] = $this->postComment(NULL, $this->randomName(), $this->randomName(), TRUE); // Post a reply to the second comment. - $this->drupalGet('comment/reply/' . $node->nid . '/' . $comments[3]->id); + $this->drupalGet('comment/reply/' . $node->nid . '/' . $comments[3]->id()); $comments[] = $this->postComment(NULL, $this->randomName(), $this->randomName(), TRUE); // At this point, the comment tree is: @@ -180,7 +180,7 @@ function assertCommentOrder(array $comments, array $expected_order) { // First, rekey the expected order by cid. foreach ($expected_order as $key) { - $expected_cids[] = $comments[$key]->id; + $expected_cids[] = $comments[$key]->id(); } $comment_anchors = $this->xpath('//a[starts-with(@id,"comment-")]'); @@ -188,8 +188,7 @@ function assertCommentOrder(array $comments, array $expected_order) { foreach ($comment_anchors as $anchor) { $result_order[] = substr($anchor['id'], 8); } - - return $this->assertIdentical($expected_cids, $result_order, format_string('Comment order: expected @expected, returned @returned.', array('@expected' => implode(',', $expected_cids), '@returned' => implode(',', $result_order)))); + return $this->assertEqual($expected_cids, $result_order, format_string('Comment order: expected @expected, returned @returned.', array('@expected' => implode(',', $expected_cids), '@returned' => implode(',', $result_order)))); } /** @@ -215,15 +214,15 @@ function testCommentNewPageIndicator() { $comments[] = $this->postComment($node, $this->randomName(), $this->randomName(), TRUE); // Post a reply to the second comment. - $this->drupalGet('comment/reply/' . $node->nid . '/' . $comments[1]->id); + $this->drupalGet('comment/reply/' . $node->nid . '/' . $comments[1]->id()); $comments[] = $this->postComment(NULL, $this->randomName(), $this->randomName(), TRUE); // Post a reply to the first comment. - $this->drupalGet('comment/reply/' . $node->nid . '/' . $comments[0]->id); + $this->drupalGet('comment/reply/' . $node->nid . '/' . $comments[0]->id()); $comments[] = $this->postComment(NULL, $this->randomName(), $this->randomName(), TRUE); // Post a reply to the last comment. - $this->drupalGet('comment/reply/' . $node->nid . '/' . $comments[2]->id); + $this->drupalGet('comment/reply/' . $node->nid . '/' . $comments[2]->id()); $comments[] = $this->postComment(NULL, $this->randomName(), $this->randomName(), TRUE); // At this point, the comment tree is: diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentPreviewTest.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentPreviewTest.php index 44a38d5..f63c8bc 100644 --- a/core/modules/comment/lib/Drupal/comment/Tests/CommentPreviewTest.php +++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentPreviewTest.php @@ -95,7 +95,7 @@ function testCommentEditPreviewSave() { $expected_text_date = format_date($raw_date); $expected_form_date = format_date($raw_date, 'custom', 'Y-m-d H:i O'); $comment = $this->postComment($this->node, $edit['subject'], $edit['comment_body[' . $langcode . '][0][value]'], TRUE); - $this->drupalPost('comment/' . $comment->id . '/edit', $edit, t('Preview')); + $this->drupalPost('comment/' . $comment->id() . '/edit', $edit, t('Preview')); // Check that the preview is displaying the subject, comment, author and date correctly. $this->assertTitle(t('Preview comment | Drupal'), 'Page title is "Preview comment".'); @@ -111,11 +111,11 @@ function testCommentEditPreviewSave() { $this->assertFieldByName('date', $edit['date'], 'Date field displayed.'); // Check that saving a comment produces a success message. - $this->drupalPost('comment/' . $comment->id . '/edit', $edit, t('Save')); + $this->drupalPost('comment/' . $comment->id() . '/edit', $edit, t('Save')); $this->assertText(t('Your comment has been posted.'), 'Comment posted.'); // Check that the comment fields are correct after loading the saved comment. - $this->drupalGet('comment/' . $comment->id . '/edit'); + $this->drupalGet('comment/' . $comment->id() . '/edit'); $this->assertFieldByName('subject', $edit['subject'], 'Subject field displayed.'); $this->assertFieldByName('comment_body[' . $langcode . '][0][value]', $edit['comment_body[' . $langcode . '][0][value]'], 'Comment field displayed.'); $this->assertFieldByName('name', $edit['name'], 'Author field displayed.'); @@ -127,14 +127,14 @@ function testCommentEditPreviewSave() { $displayed['comment_body[' . $langcode . '][0][value]'] = (string) current($this->xpath("//textarea[@id='edit-comment-body-" . $langcode . "-0-value']")); $displayed['name'] = (string) current($this->xpath("//input[@id='edit-name']/@value")); $displayed['date'] = (string) current($this->xpath("//input[@id='edit-date']/@value")); - $this->drupalPost('comment/' . $comment->id . '/edit', $displayed, t('Save')); + $this->drupalPost('comment/' . $comment->id() . '/edit', $displayed, t('Save')); // Check that the saved comment is still correct. - $comment_loaded = comment_load($comment->id); - $this->assertEqual($comment_loaded->subject, $edit['subject'], 'Subject loaded.'); - $this->assertEqual($comment_loaded->comment_body[$langcode][0]['value'], $edit['comment_body[' . $langcode . '][0][value]'], 'Comment body loaded.'); - $this->assertEqual($comment_loaded->name, $edit['name'], 'Name loaded.'); - $this->assertEqual($comment_loaded->created, $raw_date, 'Date loaded.'); + $comment_loaded = comment_load($comment->id()); + $this->assertEqual($comment_loaded->subject->value, $edit['subject'], 'Subject loaded.'); + $this->assertEqual($comment_loaded->comment_body->value, $edit['comment_body[' . $langcode . '][0][value]'], 'Comment body loaded.'); + $this->assertEqual($comment_loaded->name->value, $edit['name'], 'Name loaded.'); + $this->assertEqual($comment_loaded->created->value->getTimestamp(), $raw_date, 'Date loaded.'); } diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentStatisticsTest.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentStatisticsTest.php index afdcba4..1bb8d48 100644 --- a/core/modules/comment/lib/Drupal/comment/Tests/CommentStatisticsTest.php +++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentStatisticsTest.php @@ -39,7 +39,6 @@ function setUp() { * Tests the node comment statistics. */ function testCommentNodeCommentStatistics() { - $langcode = LANGUAGE_NOT_SPECIFIED; // Set comments to have subject and preview disabled. $this->drupalLogin($this->admin_user); $this->setCommentPreview(DRUPAL_DISABLED); @@ -58,8 +57,7 @@ function testCommentNodeCommentStatistics() { // Post comment #1 as web_user2. $this->drupalLogin($this->web_user2); $comment_text = $this->randomName(); - $comment = $this->postComment($this->node, $comment_text); - $comment_loaded = comment_load($comment->id); + $this->postComment($this->node, $comment_text); // Checks the new values of node comment statistics with comment #1. // The node needs to be reloaded with a node_load_multiple cache reset. @@ -82,8 +80,7 @@ function testCommentNodeCommentStatistics() { // Post comment #2 as anonymous (comment approval enabled). $this->drupalGet('comment/reply/' . $this->node->nid); - $anonymous_comment = $this->postComment($this->node, $this->randomName(), '', TRUE); - $comment_unpublished_loaded = comment_load($anonymous_comment->id); + $this->postComment($this->node, $this->randomName(), '', TRUE); // Checks the new values of node comment statistics with comment #2 and // ensure they haven't changed since the comment has not been moderated. @@ -104,13 +101,12 @@ function testCommentNodeCommentStatistics() { // Post comment #3 as anonymous. $this->drupalGet('comment/reply/' . $this->node->nid); - $anonymous_comment = $this->postComment($this->node, $this->randomName(), '', array('name' => $this->randomName())); - $comment_loaded = comment_load($anonymous_comment->id); + $comment_loaded = $this->postComment($this->node, $this->randomName(), '', array('name' => $this->randomName())); // Checks the new values of node comment statistics with comment #3. // The node needs to be reloaded with a node_load_multiple cache reset. $node = node_load($this->node->nid, TRUE); - $this->assertEqual($node->last_comment_name, $comment_loaded->name, 'The value of node last_comment_name is the name of the anonymous user.'); + $this->assertEqual($node->last_comment_name, $comment_loaded->name->value, 'The value of node last_comment_name is the name of the anonymous user.'); $this->assertEqual($node->last_comment_uid, 0, 'The value of node last_comment_uid is zero.'); $this->assertEqual($node->comment_count, 2, 'The value of node comment_count is 2.'); } diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentTestBase.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentTestBase.php index 37a8b47..8d37a6e 100644 --- a/core/modules/comment/lib/Drupal/comment/Tests/CommentTestBase.php +++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentTestBase.php @@ -145,7 +145,10 @@ function postComment($node, $comment, $subject = '', $contact = NULL) { } if (isset($match[1])) { - return entity_create('comment', array('id' => $match[1], 'subject' => $subject, 'comment' => $comment)); + $entity = comment_load($match[1]); + $entity->subject->value = $subject; + $entity->comment_body->value = $comment; + return $entity; } } @@ -163,9 +166,9 @@ function postComment($node, $comment, $subject = '', $contact = NULL) { function commentExists(Comment $comment = NULL, $reply = FALSE) { if ($comment) { $regex = '/' . ($reply ? '
    (.*?)' : ''); - $regex .= 'subject . '(.*?)'; // Match subject. - $regex .= $comment->comment . '(.*?)'; // Match comment. + $regex .= 'subject->value . '(.*?)'; // Match subject. + $regex .= $comment->comment_body->value . '(.*?)'; // Match comment. $regex .= '/s'; return (boolean)preg_match($regex, $this->drupalGetContent()); @@ -182,7 +185,7 @@ function commentExists(Comment $comment = NULL, $reply = FALSE) { * Comment to delete. */ function deleteComment(Comment $comment) { - $this->drupalPost('comment/' . $comment->id . '/delete', array(), t('Delete')); + $this->drupalPost('comment/' . $comment->id() . '/delete', array(), t('Delete')); $this->assertText(t('The comment and all its replies have been deleted.'), 'Comment deleted.'); } @@ -292,7 +295,7 @@ function commentContactInfoAvailable() { function performCommentOperation($comment, $operation, $approval = FALSE) { $edit = array(); $edit['operation'] = $operation; - $edit['comments[' . $comment->id . ']'] = TRUE; + $edit['comments[' . $comment->id() . ']'] = TRUE; $this->drupalPost('admin/content/comment' . ($approval ? '/approval' : ''), $edit, t('Update')); if ($operation == 'delete') { diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentThreadingTest.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentThreadingTest.php index ba03951..682cf51 100644 --- a/core/modules/comment/lib/Drupal/comment/Tests/CommentThreadingTest.php +++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentThreadingTest.php @@ -42,43 +42,43 @@ function testCommentThreading() { $comment_text = $this->randomName(); $comment1 = $this->postComment($this->node, $comment_text, $subject_text, TRUE); // Confirm that the comment was created and has the correct threading. - $comment1_loaded = comment_load($comment1->id); + $comment1_loaded = comment_load($comment1->id()); $this->assertTrue($this->commentExists($comment1), 'Comment #1. Comment found.'); - $this->assertEqual($comment1_loaded->thread, '01/'); + $this->assertEqual($comment1_loaded->thread->value, '01/'); // Confirm that there is no reference to a parent comment. - $this->assertNoParentLink($comment1->id); + $this->assertNoParentLink($comment1->id()); // Reply to comment #1 creating comment #2. $this->drupalLogin($this->web_user); - $this->drupalGet('comment/reply/' . $this->node->nid . '/' . $comment1->id); + $this->drupalGet('comment/reply/' . $this->node->nid . '/' . $comment1->id()); $comment2 = $this->postComment(NULL, $this->randomName(), '', TRUE); // Confirm that the comment was created and has the correct threading. - $comment2_loaded = comment_load($comment2->id); + $comment2_loaded = comment_load($comment2->id()); $this->assertTrue($this->commentExists($comment2, TRUE), 'Comment #2. Reply found.'); - $this->assertEqual($comment2_loaded->thread, '01.00/'); + $this->assertEqual($comment2_loaded->thread->value, '01.00/'); // Confirm that there is a link to the parent comment. - $this->assertParentLink($comment2->id, $comment1->id); + $this->assertParentLink($comment2->id(), $comment1->id()); // Reply to comment #2 creating comment #3. - $this->drupalGet('comment/reply/' . $this->node->nid . '/' . $comment2->id); + $this->drupalGet('comment/reply/' . $this->node->nid . '/' . $comment2->id()); $comment3 = $this->postComment(NULL, $this->randomName(), $this->randomName(), TRUE); // Confirm that the comment was created and has the correct threading. - $comment3_loaded = comment_load($comment3->id); + $comment3_loaded = comment_load($comment3->id()); $this->assertTrue($this->commentExists($comment3, TRUE), 'Comment #3. Second reply found.'); - $this->assertEqual($comment3_loaded->thread, '01.00.00/'); + $this->assertEqual($comment3_loaded->thread->value, '01.00.00/'); // Confirm that there is a link to the parent comment. - $this->assertParentLink($comment3->id, $comment2->id); + $this->assertParentLink($comment3->id(), $comment2->id()); // Reply to comment #1 creating comment #4. $this->drupalLogin($this->web_user); - $this->drupalGet('comment/reply/' . $this->node->nid . '/' . $comment1->id); + $this->drupalGet('comment/reply/' . $this->node->nid . '/' . $comment1->id()); $comment4 = $this->postComment(NULL, $this->randomName(), '', TRUE); // Confirm that the comment was created and has the correct threading. - $comment4_loaded = comment_load($comment4->id); + $comment4_loaded = comment_load($comment4->id()); $this->assertTrue($this->commentExists($comment4), 'Comment #4. Third reply found.'); - $this->assertEqual($comment4_loaded->thread, '01.01/'); + $this->assertEqual($comment4_loaded->thread->value, '01.01/'); // Confirm that there is a link to the parent comment. - $this->assertParentLink($comment4->id, $comment1->id); + $this->assertParentLink($comment4->id(), $comment1->id()); // Post comment #2 overall comment #5. $this->drupalLogin($this->web_user); @@ -86,43 +86,43 @@ function testCommentThreading() { $comment_text = $this->randomName(); $comment5 = $this->postComment($this->node, $comment_text, $subject_text, TRUE); // Confirm that the comment was created and has the correct threading. - $comment5_loaded = comment_load($comment5->id); + $comment5_loaded = comment_load($comment5->id()); $this->assertTrue($this->commentExists($comment5), 'Comment #5. Second comment found.'); - $this->assertEqual($comment5_loaded->thread, '02/'); + $this->assertEqual($comment5_loaded->thread->value, '02/'); // Confirm that there is no link to a parent comment. - $this->assertNoParentLink($comment5->id); + $this->assertNoParentLink($comment5->id()); // Reply to comment #5 creating comment #6. $this->drupalLogin($this->web_user); - $this->drupalGet('comment/reply/' . $this->node->nid . '/' . $comment5->id); + $this->drupalGet('comment/reply/' . $this->node->nid . '/' . $comment5->id()); $comment6 = $this->postComment(NULL, $this->randomName(), '', TRUE); // Confirm that the comment was created and has the correct threading. - $comment6_loaded = comment_load($comment6->id); + $comment6_loaded = comment_load($comment6->id()); $this->assertTrue($this->commentExists($comment6, TRUE), 'Comment #6. Reply found.'); - $this->assertEqual($comment6_loaded->thread, '02.00/'); + $this->assertEqual($comment6_loaded->thread->value, '02.00/'); // Confirm that there is a link to the parent comment. - $this->assertParentLink($comment6->id, $comment5->id); + $this->assertParentLink($comment6->id(), $comment5->id()); // Reply to comment #6 creating comment #7. - $this->drupalGet('comment/reply/' . $this->node->nid . '/' . $comment6->id); + $this->drupalGet('comment/reply/' . $this->node->nid . '/' . $comment6->id()); $comment7 = $this->postComment(NULL, $this->randomName(), $this->randomName(), TRUE); // Confirm that the comment was created and has the correct threading. - $comment7_loaded = comment_load($comment7->id); + $comment7_loaded = comment_load($comment7->id()); $this->assertTrue($this->commentExists($comment7, TRUE), 'Comment #7. Second reply found.'); - $this->assertEqual($comment7_loaded->thread, '02.00.00/'); + $this->assertEqual($comment7_loaded->thread->value, '02.00.00/'); // Confirm that there is a link to the parent comment. - $this->assertParentLink($comment7->id, $comment6->id); + $this->assertParentLink($comment7->id(), $comment6->id()); // Reply to comment #5 creating comment #8. $this->drupalLogin($this->web_user); - $this->drupalGet('comment/reply/' . $this->node->nid . '/' . $comment5->id); + $this->drupalGet('comment/reply/' . $this->node->nid . '/' . $comment5->id()); $comment8 = $this->postComment(NULL, $this->randomName(), '', TRUE); // Confirm that the comment was created and has the correct threading. - $comment8_loaded = comment_load($comment8->id); + $comment8_loaded = comment_load($comment8->id()); $this->assertTrue($this->commentExists($comment8), 'Comment #8. Third reply found.'); - $this->assertEqual($comment8_loaded->thread, '02.01/'); + $this->assertEqual($comment8_loaded->thread->value, '02.01/'); // Confirm that there is a link to the parent comment. - $this->assertParentLink($comment8->id, $comment5->id); + $this->assertParentLink($comment8->id(), $comment5->id()); } /** diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentTokenReplaceTest.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentTokenReplaceTest.php index 34674e8..85e21a4 100644 --- a/core/modules/comment/lib/Drupal/comment/Tests/CommentTokenReplaceTest.php +++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentTokenReplaceTest.php @@ -39,33 +39,33 @@ function testCommentTokenReplacement() { $parent_comment = $this->postComment($node, $this->randomName(), $this->randomName(), TRUE); // Post a reply to the comment. - $this->drupalGet('comment/reply/' . $node->nid . '/' . $parent_comment->id); + $this->drupalGet('comment/reply/' . $node->nid . '/' . $parent_comment->id()); $child_comment = $this->postComment(NULL, $this->randomName(), $this->randomName()); - $comment = comment_load($child_comment->id); - $comment->homepage = 'http://example.org/'; + $comment = comment_load($child_comment->id()); + $comment->homepage->value = 'http://example.org/'; // Add HTML to ensure that sanitation of some fields tested directly. - $comment->subject = 'Blinking Comment'; + $comment->subject->value = 'Blinking Comment'; $instance = field_info_instance('comment', 'body', 'comment_body'); // Generate and test sanitized tokens. $tests = array(); - $tests['[comment:cid]'] = $comment->cid; - $tests['[comment:hostname]'] = check_plain($comment->hostname); - $tests['[comment:name]'] = filter_xss($comment->name); + $tests['[comment:cid]'] = $comment->cid->value; + $tests['[comment:hostname]'] = check_plain($comment->hostname->value); + $tests['[comment:name]'] = filter_xss($comment->name->value); $tests['[comment:mail]'] = check_plain($this->admin_user->mail); - $tests['[comment:homepage]'] = check_url($comment->homepage); - $tests['[comment:title]'] = filter_xss($comment->subject); - $tests['[comment:body]'] = _text_sanitize($instance, LANGUAGE_NOT_SPECIFIED, $comment->comment_body[LANGUAGE_NOT_SPECIFIED][0], 'value'); - $tests['[comment:url]'] = url('comment/' . $comment->cid, $url_options + array('fragment' => 'comment-' . $comment->cid)); - $tests['[comment:edit-url]'] = url('comment/' . $comment->cid . '/edit', $url_options); - $tests['[comment:created:since]'] = format_interval(REQUEST_TIME - $comment->created, 2, $language_interface->langcode); - $tests['[comment:changed:since]'] = format_interval(REQUEST_TIME - $comment->changed, 2, $language_interface->langcode); - $tests['[comment:parent:cid]'] = $comment->pid; - $tests['[comment:parent:title]'] = check_plain($parent_comment->subject); - $tests['[comment:node:nid]'] = $comment->nid; + $tests['[comment:homepage]'] = check_url($comment->homepage->value); + $tests['[comment:title]'] = filter_xss($comment->subject->value); + $tests['[comment:body]'] = $comment->comment_body->processed; + $tests['[comment:url]'] = url('comment/' . $comment->cid->value, $url_options + array('fragment' => 'comment-' . $comment->cid->value)); + $tests['[comment:edit-url]'] = url('comment/' . $comment->cid->value . '/edit', $url_options); + $tests['[comment:created:since]'] = format_interval(REQUEST_TIME - $comment->created->value->getTimestamp(), 2, $language_interface->langcode); + $tests['[comment:changed:since]'] = format_interval(REQUEST_TIME - $comment->changed->value->getTimestamp(), 2, $language_interface->langcode); + $tests['[comment:parent:cid]'] = $comment->pid->value; + $tests['[comment:parent:title]'] = check_plain($parent_comment->subject->value); + $tests['[comment:node:nid]'] = $comment->nid->value; $tests['[comment:node:title]'] = check_plain($node->title); - $tests['[comment:author:uid]'] = $comment->uid; + $tests['[comment:author:uid]'] = $comment->uid->value; $tests['[comment:author:name]'] = check_plain($this->admin_user->name); // Test to make sure that we generated something for each token. @@ -77,13 +77,13 @@ function testCommentTokenReplacement() { } // Generate and test unsanitized tokens. - $tests['[comment:hostname]'] = $comment->hostname; - $tests['[comment:name]'] = $comment->name; + $tests['[comment:hostname]'] = $comment->hostname->value; + $tests['[comment:name]'] = $comment->name->value; $tests['[comment:mail]'] = $this->admin_user->mail; - $tests['[comment:homepage]'] = $comment->homepage; - $tests['[comment:title]'] = $comment->subject; - $tests['[comment:body]'] = $comment->comment_body[LANGUAGE_NOT_SPECIFIED][0]['value']; - $tests['[comment:parent:title]'] = $parent_comment->subject; + $tests['[comment:homepage]'] = $comment->homepage->value; + $tests['[comment:title]'] = $comment->subject->value; + $tests['[comment:body]'] = $comment->comment_body->value; + $tests['[comment:parent:title]'] = $parent_comment->subject->value; $tests['[comment:node:title]'] = $node->title; $tests['[comment:author:name]'] = $this->admin_user->name; diff --git a/core/modules/field/field.attach.inc b/core/modules/field/field.attach.inc index 3b3f73e..0efdd38 100644 --- a/core/modules/field/field.attach.inc +++ b/core/modules/field/field.attach.inc @@ -1380,6 +1380,13 @@ function field_attach_prepare_view($entity_type, $entities, $view_mode, $langcod // Add this entity to the items to be prepared. $prepare[$id] = $entity; + // Enable compatibility mode if necessary. + // @todo: Remove this once all entity types have been converted to the + // new entity field API. + if ($entity instanceof \Drupal\Core\Entity\EntityNG) { + $entity->setCompatibilityMode(TRUE); + } + // Determine the actual language code to display for each field, given the // language codes available in the field data. $options['langcode'][$id] = field_language($entity_type, $entity, NULL, $langcode); @@ -1453,6 +1460,13 @@ function field_attach_view($entity_type, EntityInterface $entity, $view_mode, $l $null = NULL; $output = field_invoke_method('view', _field_invoke_formatter_target($view_mode), $entity, $view_mode, $null, $options); + // Disable compatibility mode if necessary. + // @todo: Remove this once all entity types have been converted to the + // new entity field API. + if ($entity instanceof \Drupal\Core\Entity\EntityNG) { + $entity->setCompatibilityMode(FALSE); + } + // Add custom weight handling. $output['#pre_render'][] = '_field_extra_fields_pre_render'; $output['#entity_type'] = $entity_type; diff --git a/core/modules/field/modules/text/lib/Drupal/text/Type/TextItem.php b/core/modules/field/modules/text/lib/Drupal/text/Type/TextItem.php index 07ae7f9..98b6bb6 100644 --- a/core/modules/field/modules/text/lib/Drupal/text/Type/TextItem.php +++ b/core/modules/field/modules/text/lib/Drupal/text/Type/TextItem.php @@ -10,7 +10,13 @@ use Drupal\Core\Entity\Field\FieldItemBase; /** - * Defines the 'text_item' and 'text_long_item' entity field items. + * Defines the 'text_field' and 'text_long_field' entity field items. + * + * Available settings (below the definition's 'settings' key) are: + * - property {NAME}: An array containing definition overrides for the + * property with the name {NAME}. For example, this can be used by a + * computed field to easily override the 'class' key of single field value + * only. */ class TextItem extends FieldItemBase { diff --git a/core/modules/field/modules/text/lib/Drupal/text/Type/TextSummaryItem.php b/core/modules/field/modules/text/lib/Drupal/text/Type/TextSummaryItem.php index b6438ff..eb563ce 100644 --- a/core/modules/field/modules/text/lib/Drupal/text/Type/TextSummaryItem.php +++ b/core/modules/field/modules/text/lib/Drupal/text/Type/TextSummaryItem.php @@ -8,7 +8,13 @@ namespace Drupal\text\Type; /** - * Defines the 'text_with_summary' entity field item. + * Defines the 'text_with_summary_field' entity field item. + * + * Available settings (below the definition's 'settings' key) are: + * - property {NAME}: An array containing definition overrides for the + * property with the name {NAME}. For example, this can be used by a + * computed field to easily override the 'class' key of single field value + * only. */ class TextSummaryItem extends TextItem { diff --git a/core/modules/forum/forum.module b/core/modules/forum/forum.module index 3ec8a41..6bb4e41 100644 --- a/core/modules/forum/forum.module +++ b/core/modules/forum/forum.module @@ -491,7 +491,7 @@ function forum_taxonomy_term_delete(Term $term) { * comment_save() calls hook_comment_publish() for all published comments. */ function forum_comment_publish($comment) { - _forum_update_forum_index($comment->nid); + _forum_update_forum_index($comment->nid->value); } /** @@ -503,8 +503,8 @@ function forum_comment_publish($comment) { function forum_comment_update($comment) { // comment_save() calls hook_comment_publish() for all published comments, // so we need to handle all other values here. - if (!$comment->status) { - _forum_update_forum_index($comment->nid); + if (!$comment->status->value) { + _forum_update_forum_index($comment->nid->value); } } @@ -512,14 +512,14 @@ function forum_comment_update($comment) { * Implements hook_comment_unpublish(). */ function forum_comment_unpublish($comment) { - _forum_update_forum_index($comment->nid); + _forum_update_forum_index($comment->nid->value); } /** * Implements hook_comment_delete(). */ function forum_comment_delete($comment) { - _forum_update_forum_index($comment->nid); + _forum_update_forum_index($comment->nid->value); } /** diff --git a/core/modules/forum/lib/Drupal/forum/Tests/ForumBlockTest.php b/core/modules/forum/lib/Drupal/forum/Tests/ForumBlockTest.php index e121cb8..c75512e 100644 --- a/core/modules/forum/lib/Drupal/forum/Tests/ForumBlockTest.php +++ b/core/modules/forum/lib/Drupal/forum/Tests/ForumBlockTest.php @@ -111,7 +111,7 @@ function testActiveForumTopicsBlock() { $comment = entity_create('comment', array( 'nid' => $node->nid, 'subject' => $this->randomString(20), - 'comment_body' => array(LANGUAGE_NOT_SPECIFIED => $this->randomString(256)), + 'comment_body' => $this->randomString(256), 'created' => $timestamp + $index, )); comment_save($comment); diff --git a/core/modules/node/lib/Drupal/node/Tests/NodeAccessPagerTest.php b/core/modules/node/lib/Drupal/node/Tests/NodeAccessPagerTest.php index bf8f845..3dc24ed 100644 --- a/core/modules/node/lib/Drupal/node/Tests/NodeAccessPagerTest.php +++ b/core/modules/node/lib/Drupal/node/Tests/NodeAccessPagerTest.php @@ -49,9 +49,7 @@ public function testCommentPager() { 'nid' => $node->nid, 'subject' => $this->randomName(), 'comment_body' => array( - LANGUAGE_NOT_SPECIFIED => array( - array('value' => $this->randomName()), - ), + array('value' => $this->randomName()), ), )); $comment->save(); diff --git a/core/modules/node/node.api.php b/core/modules/node/node.api.php index 113cc3d..c0d2b3d 100644 --- a/core/modules/node/node.api.php +++ b/core/modules/node/node.api.php @@ -757,7 +757,7 @@ function hook_node_update_index(Drupal\node\Node $node, $langcode) { $text = ''; $comments = db_query('SELECT subject, comment, format FROM {comment} WHERE nid = :nid AND status = :status', array(':nid' => $node->nid, ':status' => COMMENT_PUBLISHED)); foreach ($comments as $comment) { - $text .= '

    ' . check_plain($comment->subject) . '

    ' . check_markup($comment->comment, $comment->format, '', TRUE); + $text .= '

    ' . check_plain($comment->subject->value) . '

    ' . $comment->comment_body->processed; } return $text; } diff --git a/core/modules/rdf/lib/Drupal/rdf/Tests/CommentAttributesTest.php b/core/modules/rdf/lib/Drupal/rdf/Tests/CommentAttributesTest.php index fc883cb..992e94e 100644 --- a/core/modules/rdf/lib/Drupal/rdf/Tests/CommentAttributesTest.php +++ b/core/modules/rdf/lib/Drupal/rdf/Tests/CommentAttributesTest.php @@ -156,7 +156,7 @@ public function testCommentReplyOfRdfaMarkup() { $this->assertFalse($result, 'No RDFa markup referring to the comment itself is present.'); // Posts a reply to the first comment. - $this->drupalGet('comment/reply/' . $this->node1->nid . '/' . $comments[0]->id); + $this->drupalGet('comment/reply/' . $this->node1->nid . '/' . $comments[0]->id()); $comments[] = $this->postComment(NULL, $this->randomName(), $this->randomName(), TRUE); // Tests the reply_of relationship of a second level comment. @@ -181,7 +181,7 @@ function _testBasicCommentRdfaMarkup($comment, $account = array()) { $comment_container = $this->xpath('//div[contains(@class, "comment") and contains(@typeof, "sioct:Comment")]'); $this->assertTrue(!empty($comment_container), 'Comment RDF type for comment found.'); $comment_title = $this->xpath('//div[contains(@class, "comment") and contains(@typeof, "sioct:Comment")]//h3[@property="dc:title"]'); - $this->assertEqual((string) $comment_title[0]->a, $comment->subject, 'RDFa markup for the comment title found.'); + $this->assertEqual((string) $comment_title[0]->a, $comment->subject->value, 'RDFa markup for the comment title found.'); $comment_date = $this->xpath('//div[contains(@class, "comment") and contains(@typeof, "sioct:Comment")]//*[contains(@property, "dc:date") and contains(@property, "dc:created")]'); $this->assertTrue(!empty($comment_date), 'RDFa markup for the date of the comment found.'); // The author tag can be either a or span @@ -189,6 +189,6 @@ function _testBasicCommentRdfaMarkup($comment, $account = array()) { $name = empty($account["name"]) ? $this->web_user->name : $account["name"] . " (not verified)"; $this->assertEqual((string) $comment_author[0], $name, 'RDFa markup for the comment author found.'); $comment_body = $this->xpath('//div[contains(@class, "comment") and contains(@typeof, "sioct:Comment")]//div[@class="content"]//div[contains(@class, "comment-body")]//div[@property="content:encoded"]'); - $this->assertEqual((string) $comment_body[0]->p, $comment->comment, 'RDFa markup for the comment body found.'); + $this->assertEqual((string) $comment_body[0]->p, $comment->comment_body->value, 'RDFa markup for the comment body found.'); } } diff --git a/core/modules/rdf/rdf.module b/core/modules/rdf/rdf.module index 782c06f..1a622cd 100644 --- a/core/modules/rdf/rdf.module +++ b/core/modules/rdf/rdf.module @@ -428,10 +428,10 @@ function rdf_comment_load($comments) { // Pages with many comments can show poor performance. This information // isn't needed until rdf_preprocess_comment() is called, but set it here // to optimize performance for websites that implement an entity cache. - $comment->rdf_data['date'] = rdf_rdfa_attributes($comment->rdf_mapping['created'], $comment->created); - $comment->rdf_data['nid_uri'] = url('node/' . $comment->nid); - if ($comment->pid) { - $comment->rdf_data['pid_uri'] = url('comment/' . $comment->pid, array('fragment' => 'comment-' . $comment->pid)); + $comment->rdf_data['date'] = rdf_rdfa_attributes($comment->rdf_mapping['created'], $comment->created->value->getTimestamp()); + $comment->rdf_data['nid_uri'] = url('node/' . $comment->nid->value); + if ($comment->pid->value) { + $comment->rdf_data['pid_uri'] = url('comment/' . $comment->pid->value, array('fragment' => 'comment-' . $comment->pid->value)); } } } @@ -754,7 +754,7 @@ function rdf_preprocess_comment(&$variables) { $variables['rdf_metadata_attributes'][] = $parent_node_attributes; // Adds the relation to parent comment, if it exists. - if ($comment->pid != 0) { + if ($comment->pid->value != 0) { $parent_comment_attributes['rel'] = $comment->rdf_mapping['pid']['predicates']; // The parent comment URI is precomputed as part of the rdf_data so that // it can be cached as part of the entity. diff --git a/core/modules/search/search.module b/core/modules/search/search.module index 315ae7a..7be3ae7 100644 --- a/core/modules/search/search.module +++ b/core/modules/search/search.module @@ -832,7 +832,7 @@ function search_node_update(Node $node) { */ function search_comment_insert($comment) { // Reindex the node when comments are added. - search_touch_node($comment->nid); + search_touch_node($comment->nid->value); } /** @@ -840,7 +840,7 @@ function search_comment_insert($comment) { */ function search_comment_update($comment) { // Reindex the node when comments are changed. - search_touch_node($comment->nid); + search_touch_node($comment->nid->value); } /** @@ -848,7 +848,7 @@ function search_comment_update($comment) { */ function search_comment_delete($comment) { // Reindex the node when comments are deleted. - search_touch_node($comment->nid); + search_touch_node($comment->nid->value); } /** @@ -856,7 +856,7 @@ function search_comment_delete($comment) { */ function search_comment_publish($comment) { // Reindex the node when comments are published. - search_touch_node($comment->nid); + search_touch_node($comment->nid->value); } /** @@ -864,7 +864,7 @@ function search_comment_publish($comment) { */ function search_comment_unpublish($comment) { // Reindex the node when comments are unpublished. - search_touch_node($comment->nid); + search_touch_node($comment->nid->value); } /** diff --git a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityCrudHookTest.php b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityCrudHookTest.php index 4afb574..38e35bc 100644 --- a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityCrudHookTest.php +++ b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityCrudHookTest.php @@ -107,7 +107,7 @@ public function testCommentHooks() { )); $_SESSION['entity_crud_hook_test'] = array(); - $comment = comment_load($comment->cid); + $comment = comment_load($comment->cid->value); $this->assertHookMessageOrder(array( 'entity_crud_hook_test_entity_load called for type comment', @@ -115,7 +115,7 @@ public function testCommentHooks() { )); $_SESSION['entity_crud_hook_test'] = array(); - $comment->subject = 'New subject'; + $comment->subject->value = 'New subject'; comment_save($comment); $this->assertHookMessageOrder(array( @@ -126,7 +126,7 @@ public function testCommentHooks() { )); $_SESSION['entity_crud_hook_test'] = array(); - comment_delete($comment->cid); + comment_delete($comment->cid->value); $this->assertHookMessageOrder(array( 'entity_crud_hook_test_comment_predelete called', diff --git a/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/EntityTest.php b/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/EntityTest.php index 17e8470..dc6e203 100644 --- a/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/EntityTest.php +++ b/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/EntityTest.php @@ -43,14 +43,12 @@ class EntityTest extends EntityNG { public $user_id; /** - * Overrides Entity::__construct(). + * Initialize the object. Invoked upon construction and wake up. */ - public function __construct(array $values, $entity_type) { - parent::__construct($values, $entity_type); - + protected function init() { // We unset all defined properties, so magic getters apply. - unset($this->id); unset($this->langcode); + unset($this->id); unset($this->uuid); unset($this->name); unset($this->user_id); diff --git a/core/modules/tracker/tracker.module b/core/modules/tracker/tracker.module index 301ea8f..3a348a6 100644 --- a/core/modules/tracker/tracker.module +++ b/core/modules/tracker/tracker.module @@ -228,8 +228,8 @@ function tracker_node_predelete(Node $node, $arg = 0) { function tracker_comment_update($comment) { // comment_save() calls hook_comment_publish() for all published comments // so we need to handle all other values here. - if ($comment->status != COMMENT_PUBLISHED) { - _tracker_remove($comment->nid, $comment->uid, $comment->changed); + if ($comment->status->value != COMMENT_PUBLISHED) { + _tracker_remove($comment->nid->value, $comment->uid->value, $comment->changed->value->getTimestamp()); } } @@ -240,21 +240,21 @@ function tracker_comment_update($comment) { * comment_save() calls hook_comment_publish() for all published comments. */ function tracker_comment_publish($comment) { - _tracker_add($comment->nid, $comment->uid, $comment->changed); + _tracker_add($comment->nid->value, $comment->uid->value, $comment->changed->value->getTimestamp()); } /** * Implements hook_comment_unpublish(). */ function tracker_comment_unpublish($comment) { - _tracker_remove($comment->nid, $comment->uid, $comment->changed); + _tracker_remove($comment->nid->value, $comment->uid->value, $comment->changed->value->getTimestamp()); } /** * Implements hook_comment_delete(). */ function tracker_comment_delete($comment) { - _tracker_remove($comment->nid, $comment->uid, $comment->changed); + _tracker_remove($comment->nid->value, $comment->uid->value, $comment->changed->value->getTimestamp()); } /** diff --git a/core/modules/user/lib/Drupal/user/Tests/UserCancelTest.php b/core/modules/user/lib/Drupal/user/Tests/UserCancelTest.php index 8b51fe0..935b26d 100644 --- a/core/modules/user/lib/Drupal/user/Tests/UserCancelTest.php +++ b/core/modules/user/lib/Drupal/user/Tests/UserCancelTest.php @@ -299,7 +299,7 @@ function testUserDelete() { $this->assertText(t('Your comment has been posted.')); $comments = entity_load_multiple_by_properties('comment', array('subject' => $edit['subject'])); $comment = reset($comments); - $this->assertTrue($comment->cid, 'Comment found.'); + $this->assertTrue($comment->cid->value, 'Comment found.'); // Create a node with two revisions, the initial one belonging to the // cancelling user. @@ -329,7 +329,7 @@ function testUserDelete() { $this->assertFalse(node_load($node->nid, TRUE), 'Node of the user has been deleted.'); $this->assertFalse(node_revision_load($revision), 'Node revision of the user has been deleted.'); $this->assertTrue(node_load($revision_node->nid, TRUE), "Current revision of the user's node was not deleted."); - $this->assertFalse(comment_load($comment->cid), 'Comment of the user has been deleted.'); + $this->assertFalse(comment_load($comment->cid->value), 'Comment of the user has been deleted.'); // Confirm that user is logged out. $this->assertNoText($account->name, 'Logged out.'); diff --git a/core/modules/user/user.module b/core/modules/user/user.module index b7ac23d..1871902 100644 --- a/core/modules/user/user.module +++ b/core/modules/user/user.module @@ -2718,22 +2718,6 @@ function user_build_filter_query(SelectInterface $query) { } /** - * Implements hook_comment_view(). - */ -function user_comment_view($comment) { - if (config('user.settings')->get('signatures') && !empty($comment->signature)) { - // @todo This alters and replaces the original object value, so a - // hypothetical process of loading, viewing, and saving will hijack the - // stored data. Consider renaming to $comment->signature_safe or similar - // here and elsewhere in Drupal 8. - $comment->signature = check_markup($comment->signature, $comment->signature_format, '', TRUE); - } - else { - $comment->signature = ''; - } -} - -/** * Returns HTML for a user signature. * * @param $variables diff --git a/core/modules/views/lib/Drupal/views/Tests/Comment/DefaultViewRecentComments.php b/core/modules/views/lib/Drupal/views/Tests/Comment/DefaultViewRecentComments.php index 73ddfe0..67aefe5 100644 --- a/core/modules/views/lib/Drupal/views/Tests/Comment/DefaultViewRecentComments.php +++ b/core/modules/views/lib/Drupal/views/Tests/Comment/DefaultViewRecentComments.php @@ -78,12 +78,12 @@ public function setUp() { // Create some comments and attach them to the created node. for ($i = 0; $i < $this->masterDisplayResults; $i++) { $comment = entity_create('comment', array()); - $comment->uid = 0; - $comment->nid = $this->node->nid; - $comment->subject = 'Test comment ' . $i; - $comment->node_type = 'comment_node_' . $this->node->type; - $comment->comment_body[LANGUAGE_NOT_SPECIFIED][0]['value'] = 'Test body ' . $i; - $comment->comment_body[LANGUAGE_NOT_SPECIFIED][0]['format'] = 'full_html'; + $comment->uid->value = 0; + $comment->nid->value = $this->node->nid; + $comment->subject->value = 'Test comment ' . $i; + $comment->node_type->value = 'comment_node_' . $this->node->type; + $comment->comment_body->value = 'Test body ' . $i; + $comment->comment_body->format = 'full_html'; comment_save($comment); } @@ -108,10 +108,10 @@ public function testBlockDisplay() { ); $expected_result = array(); foreach (array_values($this->commentsCreated) as $key => $comment) { - $expected_result[$key]['nid'] = $comment->nid; - $expected_result[$key]['subject'] = $comment->subject; - $expected_result[$key]['cid'] = $comment->cid; - $expected_result[$key]['changed'] = $comment->changed; + $expected_result[$key]['nid'] = $comment->nid->value; + $expected_result[$key]['subject'] = $comment->subject->value; + $expected_result[$key]['cid'] = $comment->cid->value; + $expected_result[$key]['changed'] = $comment->changed->value->getTimestamp(); } $this->assertIdenticalResultset($view, $expected_result, $map); @@ -140,11 +140,11 @@ public function testPageDisplay() { ); $expected_result = array(); foreach (array_values($this->commentsCreated) as $key => $comment) { - $expected_result[$key]['nid'] = $comment->nid; - $expected_result[$key]['subject'] = $comment->subject; - $expected_result[$key]['changed'] = $comment->changed; - $expected_result[$key]['created'] = $comment->created; - $expected_result[$key]['cid'] = $comment->cid; + $expected_result[$key]['nid'] = $comment->nid->value; + $expected_result[$key]['subject'] = $comment->subject->value; + $expected_result[$key]['changed'] = $comment->changed->value->getTimestamp(); + $expected_result[$key]['created'] = $comment->created->value->getTimestamp(); + $expected_result[$key]['cid'] = $comment->cid->value; } $this->assertIdenticalResultset($view, $expected_result, $map);