5 * A dummy module for testing node related hooks.
7 * This is a dummy module that implements node related hooks to test API
8 * interaction with the Node module.
11 use Drupal\Core\Entity\EntityInterface;
12 use Drupal\Core\Entity\Display\EntityViewDisplayInterface;
13 use Drupal\Core\Form\FormStateInterface;
14 use Drupal\Core\Session\AccountInterface;
15 use Drupal\node\NodeInterface;
18 * Implements hook_ENTITY_TYPE_view() for node entities.
20 function node_test_node_view(array &$build, NodeInterface $node, EntityViewDisplayInterface $display, $view_mode) {
21 if ($view_mode == 'rss') {
22 // Add RSS elements and namespaces when building the RSS feed.
23 $node->rss_elements[] = [
24 'key' => 'testElement',
25 'value' => t('Value of testElement RSS element for node @nid.', ['@nid' => $node->id()]),
28 // Add content that should be displayed only in the RSS feed.
29 $build['extra_feed_content'] = [
30 '#markup' => '<p>' . t('Extra data that should appear only in the RSS feed for node @nid.', ['@nid' => $node->id()]) . '</p>',
35 if ($view_mode != 'rss') {
36 // Add content that should NOT be displayed in the RSS feed.
37 $build['extra_non_feed_content'] = [
38 '#markup' => '<p>' . t('Extra data that should appear everywhere except the RSS feed for node @nid.', ['@nid' => $node->id()]) . '</p>',
44 * Implements hook_ENTITY_TYPE_build_defaults_alter() for node entities.
46 function node_test_node_build_defaults_alter(array &$build, NodeInterface &$node, $view_mode = 'full') {
47 if ($view_mode == 'rss') {
48 $node->rss_namespaces['xmlns:drupaltest'] = 'http://example.com/test-namespace';
53 * Implements hook_node_grants().
55 function node_test_node_grants(AccountInterface $account, $op) {
56 // Give everyone full grants so we don't break other node tests.
57 // Our node access tests asserts three realms of access.
58 // See testGrantAlter().
60 'test_article_realm' => [1],
61 'test_page_realm' => [1],
62 'test_alter_realm' => [2],
67 * Implements hook_node_access_records().
69 function node_test_node_access_records(NodeInterface $node) {
70 // Return nothing when testing for empty responses.
71 if (!empty($node->disable_node_access)) {
75 if ($node->getType() == 'article') {
76 // Create grant in arbitrary article_realm for article nodes.
78 'realm' => 'test_article_realm',
86 elseif ($node->getType() == 'page') {
87 // Create grant in arbitrary page_realm for page nodes.
89 'realm' => 'test_page_realm',
101 * Implements hook_node_access_records_alter().
103 function node_test_node_access_records_alter(&$grants, NodeInterface $node) {
104 if (!empty($grants)) {
105 foreach ($grants as $key => $grant) {
106 // Alter grant from test_page_realm to test_alter_realm and modify the gid.
107 if ($grant['realm'] == 'test_page_realm' && $node->isPromoted()) {
108 $grants[$key]['realm'] = 'test_alter_realm';
109 $grants[$key]['gid'] = 2;
116 * Implements hook_node_grants_alter().
118 function node_test_node_grants_alter(&$grants, AccountInterface $account, $op) {
119 // Return an empty array of grants to prove that we can alter by reference.
124 * Implements hook_ENTITY_TYPE_presave() for node entities.
126 function node_test_node_presave(NodeInterface $node) {
127 if ($node->getTitle() == 'testing_node_presave') {
128 // Sun, 19 Nov 1978 05:00:00 GMT
129 $node->setCreatedTime(280299600);
130 // Drupal 1.0 release.
131 $node->changed = 979534800;
133 // Determine changes.
134 if (!empty($node->original) && $node->original->getTitle() == 'test_changes') {
135 if ($node->original->getTitle() != $node->getTitle()) {
136 $node->title->value .= '_presave';
142 * Implements hook_ENTITY_TYPE_update() for node entities.
144 function node_test_node_update(NodeInterface $node) {
145 // Determine changes on update.
146 if (!empty($node->original) && $node->original->getTitle() == 'test_changes') {
147 if ($node->original->getTitle() != $node->getTitle()) {
148 $node->title->value .= '_update';
154 * Implements hook_entity_view_mode_alter().
156 function node_test_entity_view_mode_alter(&$view_mode, EntityInterface $entity, $context) {
157 // Only alter the view mode if we are on the test callback.
158 $change_view_mode = \Drupal::state()->get('node_test_change_view_mode') ?: '';
159 if ($change_view_mode) {
160 $view_mode = $change_view_mode;
165 * Implements hook_ENTITY_TYPE_insert() for node entities.
167 * This tests saving a node on node insert.
169 * @see \Drupal\node\Tests\NodeSaveTest::testNodeSaveOnInsert()
171 function node_test_node_insert(NodeInterface $node) {
172 // Set the node title to the node ID and save.
173 if ($node->getTitle() == 'new') {
174 $node->setTitle('Node ' . $node->id());
175 $node->setNewRevision(FALSE);
181 * Implements hook_form_alter().
183 function node_test_form_alter(&$form, FormStateInterface $form_state, $form_id) {
184 if (!$form_state->get('node_test_form_alter')) {
185 drupal_set_message('Storage is not set');
186 $form_state->set('node_test_form_alter', TRUE);
189 drupal_set_message('Storage is set');