/** * Tests that page data is exposed using RDFa. * * Two fields are not tested for output here. Changed date is not displayed * on the page, so there is no test for output in node view. Comment count is * displayed in teaser view, so it is tested in the front page tests. */ protected function doPageRdfaTests() { // The standard profile hides the created date on pages. Revert display to // true for testing. // @todo Clean-up standard profile defaults. $node_type = NodeType::load('page'); $node_type->setDisplaySubmitted(TRUE); $node_type->save(); // Feed the HTML into the parser. $graph = $this->getRdfGraph($this->page->urlInfo()); // Type. $this->assertEqual($graph->type($this->pageUri), 'schema:WebPage', 'Page type was found (schema:WebPage).'); // Test the properties that are common between pages and articles. $this->assertRdfaCommonNodeProperties($graph, $this->page, "Page"); }
/** * Tests the access for deleting top-level book nodes. */ function testBookDelete() { $node_storage = $this->container->get('entity.manager')->getStorage('node'); $nodes = $this->createBook(); $this->drupalLogin($this->adminUser); $edit = array(); // Test access to delete top-level and child book nodes. $this->drupalGet('node/' . $this->book->id() . '/outline/remove'); $this->assertResponse('403', 'Deleting top-level book node properly forbidden.'); $this->drupalPostForm('node/' . $nodes[4]->id() . '/outline/remove', $edit, t('Remove')); $node_storage->resetCache(array($nodes[4]->id())); $node4 = $node_storage->load($nodes[4]->id()); $this->assertTrue(empty($node4->book), 'Deleting child book node properly allowed.'); // Delete all child book nodes and retest top-level node deletion. foreach ($nodes as $node) { $nids[] = $node->id(); } entity_delete_multiple('node', $nids); $this->drupalPostForm('node/' . $this->book->id() . '/outline/remove', $edit, t('Remove')); $node_storage->resetCache(array($this->book->id())); $node = $node_storage->load($this->book->id()); $this->assertTrue(empty($node->book), 'Deleting childless top-level book node properly allowed.'); // Tests directly deleting a book parent. $nodes = $this->createBook(); $this->drupalLogin($this->adminUser); $this->drupalGet($this->book->urlInfo('delete-form')); $this->assertRaw(t('%title is part of a book outline, and has associated child pages. If you proceed with deletion, the child pages will be relocated automatically.', ['%title' => $this->book->label()])); // Delete parent, and visit a child page. $this->drupalPostForm($this->book->urlInfo('delete-form'), [], t('Delete')); $this->drupalGet($nodes[0]->urlInfo()); $this->assertResponse(200); $this->assertText($nodes[0]->label()); // The book parents should be updated. $node_storage = \Drupal::entityTypeManager()->getStorage('node'); $node_storage->resetCache(); $child = $node_storage->load($nodes[0]->id()); $this->assertEqual($child->id(), $child->book['bid'], 'Child node book ID updated when parent is deleted.'); // 3rd-level children should now be 2nd-level. $second = $node_storage->load($nodes[1]->id()); $this->assertEqual($child->id(), $second->book['bid'], '3rd-level child node is now second level when top-level node is deleted.'); }
/** * {@inheritdoc} */ public function save(array $form, FormStateInterface $form_state) { $form_state->setRedirect('entity.node.canonical', array('node' => $this->entity->id())); $book_link = $form_state->getValue('book'); if (!$book_link['bid']) { drupal_set_message($this->t('No changes were made')); return; } $this->entity->book = $book_link; if ($this->bookManager->updateOutline($this->entity)) { if (isset($this->entity->book['parent_mismatch']) && $this->entity->book['parent_mismatch']) { // This will usually only happen when JS is disabled. drupal_set_message($this->t('The post has been added to the selected book. You may now position it relative to other pages.')); $form_state->setRedirectUrl($this->entity->urlInfo('book-outline-form')); } else { drupal_set_message($this->t('The book outline has been updated.')); } } else { drupal_set_message($this->t('There was an error adding the post to the book.'), 'error'); } }
/** * Build the default links (Read more) for a node. * * @param \Drupal\node\NodeInterface $entity * The node object. * @param string $view_mode * A view mode identifier. * * @return array * An array that can be processed by drupal_pre_render_links(). */ protected static function buildLinks(NodeInterface $entity, $view_mode) { $links = array(); // Always display a read more link on teasers because we have no way // to know when a teaser view is different than a full view. if ($view_mode == 'teaser') { $node_title_stripped = strip_tags($entity->label()); $links['node-readmore'] = array('title' => t('Read more<span class="visually-hidden"> about @title</span>', array('@title' => $node_title_stripped)), 'url' => $entity->urlInfo(), 'language' => $entity->language(), 'html' => TRUE, 'attributes' => array('rel' => 'tag', 'title' => $node_title_stripped)); } return array('#theme' => 'links__node__node', '#links' => $links, '#attributes' => array('class' => array('links', 'inline'))); }
/** * {@inheritdoc} */ public function getCancelUrl() { return $this->node->urlInfo(); }
/** * {@inheritdoc} */ public function delete(array $form, FormStateInterface $form_state) { $form_state->setRedirectUrl($this->entity->urlInfo('book-remove-form')); }
/** * {@inheritdoc} */ public function delete(array $form, array &$form_state) { $form_state['redirect_route'] = $this->entity->urlInfo('book-remove-form'); }