diff --git a/render_example/render_example.info.yml b/render_example/render_example.info.yml index ddf0447..d342177 100644 --- a/render_example/render_example.info.yml +++ b/render_example/render_example.info.yml @@ -4,7 +4,7 @@ description: Provides examples demonstrating Drupal's Render API. package: Example modules core: 8.x dependencies: - - core:block - - core:node - - core:user + - drupal:block + - drupal:node + - drupal:user - examples:examples diff --git a/render_example/render_example.libraries.yml b/render_example/render_example.libraries.yml index d45506d..785ea43 100644 --- a/render_example/render_example.libraries.yml +++ b/render_example/render_example.libraries.yml @@ -2,7 +2,7 @@ # at examples/render_example/arrays. See how asset libraries are attached to # render arrays by reading the example code in # Drupal\render_example\Controller\RenderExampleController::arrays(). -render-example-css: +render-example.library: version: 1.x css: theme: diff --git a/render_example/render_example.links.menu.yml b/render_example/render_example.links.menu.yml index 76afbc3..e1df27d 100644 --- a/render_example/render_example.links.menu.yml +++ b/render_example/render_example.links.menu.yml @@ -4,16 +4,16 @@ render_example.description: route_name: render_example.description expanded: TRUE -render_example.altering: - title: Altering Render Arrays - description: Using hooks and callbacks to alter render arrays. - route_name: render_example.altering - parent: render_example.description - weight: -9 - render_example.arrays: title: Building Render Arrays description: Building render arrays in controllers. route_name: render_example.arrays parent: render_example.description + weight: -9 + +render_example.altering: + title: Altering Render Arrays + description: Using hooks and callbacks to alter render arrays. + route_name: render_example.altering + parent: render_example.description weight: -8 diff --git a/render_example/src/Controller/RenderExampleController.php b/render_example/src/Controller/RenderExampleController.php index 61ea14e..9582de8 100644 --- a/render_example/src/Controller/RenderExampleController.php +++ b/render_example/src/Controller/RenderExampleController.php @@ -64,6 +64,21 @@ class RenderExampleController extends ControllerBase { // arrays can be used to define content. $build = []; + // CSS and JavaScript libraries can be attached to elements in a renderable + // array. This way, if the element ends up being rendered and displayed you + // know for sure the CSS/JavaScript will also be included. But, if the for + // some reason the element isn't ever rendered then Drupal can skip the + // unnecessary extra files. + // + // Learn more about attaching CSS and JavaScript libraries with the + // #attached property here: + // https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Render%21theme.api.php/group/theme_render/#sec_attached + $build['#attached'] = [ + 'library' => [ + 'render_example/render-example.library', + ], + ]; + // Renderable arrays have two kinds of key/value pairs: properties and // children. Properties have keys starting with '#' and their values // influence how the array will be translated to a string. Children are all @@ -277,7 +292,8 @@ class RenderExampleController extends ControllerBase { // Properties that contain callbacks can also reference methods on a class // in addition to functions. See // \Drupal\render_example\Controller\RenderExampleController::preRender() - $build['#pre_render'] = [static::class . '::preRender']; + // @todo: This doesn't work, we need to fix it. + // $build['#pre_render'] = [static::class . '::preRender']; // Caching is an important part of the Render API, converting an array to a // string of HTML can be an expensive process, and therefore whenever @@ -359,21 +375,6 @@ class RenderExampleController extends ControllerBase { '#create_placeholder' => TRUE, ]; - // CSS and JavaScript libraries can be attached to elements in a renderable - // array. This way, if the element ends up being rendered and displayed you - // know for sure the CSS/JavaScript will also be included. But, if the for - // some reason the element isn't ever rendered then Drupal can skip the - // unnecessary extra files. - // - // Learn more about attaching CSS and JavaScript libraries with the - // #attached property here: - // https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Render%21theme.api.php/group/theme_render/#sec_attached - $build['#attached'] = [ - 'library' => [ - 'render_example/render-example-css', - ], - ]; - // Example of the marquee element type defined by // \Drupal\render_example\Element\Marquee. $build['marquee'] = [ @@ -460,7 +461,7 @@ class RenderExampleController extends ControllerBase { $build = [ 'lazy_builder_time' => [ '#markup' => '

' . \Drupal::translation()->translate('The current time is @time', [ - '@time' => \Drupal::service('date.formatter')->format(REQUEST_TIME, 'custom', $date_format), + '@time' => \Drupal::service('date.formatter')->format(REQUEST_TIME, 'long'), ]) . '

', ], ]; diff --git a/render_example/templates/description.html.twig b/render_example/templates/description.html.twig index a40d8c0..8332183 100644 --- a/render_example/templates/description.html.twig +++ b/render_example/templates/description.html.twig @@ -10,12 +10,14 @@ Description text for the Render API Example. {% trans %}

What are render arrays?

-

Add some text here that gives an overview of the render API system? ......................................

+

+ These are examples of how to construct render arrays.

-

Examples

+

+ You use render arrays to specify to Drupal how to construct HTML content.

-{% endtrans %} \ No newline at end of file +{% endtrans %} diff --git a/render_example/tests/src/Functional/RenderExampleMenuTest.php b/render_example/tests/src/Functional/RenderExampleMenuTest.php index f2dc164..990501a 100644 --- a/render_example/tests/src/Functional/RenderExampleMenuTest.php +++ b/render_example/tests/src/Functional/RenderExampleMenuTest.php @@ -2,6 +2,7 @@ namespace Drupal\Tests\render_example\Functional; +use Drupal\Core\Url; use Drupal\Tests\BrowserTestBase; /** @@ -35,29 +36,36 @@ class RenderExampleMenuTest extends BrowserTestBase { * Verify and validate that default menu links were loaded for this module. */ public function testRenderExampleLinksExist() { - $links = [ - 'examples/render-example', - 'examples/render-example/arrays', - 'examples/render-example/altering', - ]; - // Login a user that can access content. $this->drupalLogin( - $this->createUser(['access content']) + $this->createUser(['access content', 'access user profiles']) ); $assertion = $this->assertSession(); - // Get the front page, which should only have the links in the sidebar. + // Routes with menu links, and their form buttons. + $routes = [ + 'render_example.description' => [], + 'render_example.altering' => ['Save configuration'], + 'render_example.arrays' => [], + ]; + + // Ensure the links appear in the tools menu sidebar. $this->drupalGet(''); - foreach ($links as $path) { - $assertion->linkByHrefExists($path); + foreach (array_keys($routes) as $route) { + $assertion->linkByHrefExists(Url::fromRoute($route)->getInternalPath()); } - // Get each path and verify a 200 response. - foreach ($links as $path) { + // Go to all the routes and click all the buttons. + $routes = array_merge($routes, $routes); + foreach ($routes as $route => $buttons) { + $path = Url::fromRoute($route); $this->drupalGet($path); $assertion->statusCodeEquals(200); + foreach ($buttons as $button) { + $this->drupalPostForm($path, [], $button); + $assertion->statusCodeEquals(200); + } } } diff --git a/render_example/tests/src/Functional/RenderExampleTest.php b/render_example/tests/src/Functional/RenderExampleTest.php index 874d074..382de4d 100644 --- a/render_example/tests/src/Functional/RenderExampleTest.php +++ b/render_example/tests/src/Functional/RenderExampleTest.php @@ -2,6 +2,7 @@ namespace Drupal\Tests\render_example\Functional; +use Drupal\Core\Url; use Drupal\Tests\BrowserTestBase; /** @@ -42,7 +43,9 @@ class RenderExampleTest extends BrowserTestBase { $session = $this->assertSession(); - $this->drupalGet('examples/render-example/altering'); + $altering_url = Url::fromRoute('render_example.altering'); + + $this->drupalGet($altering_url); // Make sure we're telling the user about devel. $session->pageTextContains('Install the Devel module (https://www.drupal.org/project/devel) to enable additional demonstration features.'); @@ -54,7 +57,7 @@ class RenderExampleTest extends BrowserTestBase { $this->assertEmpty($this->xpath($breadcrumb_xpath)); // Move the breadcrumbs to content region. $this->drupalPostForm( - 'examples/render-example/altering', + $altering_url, [ 'render_example_move_breadcrumbs' => TRUE, 'render_example_reverse_sidebar' => FALSE, @@ -73,7 +76,7 @@ class RenderExampleTest extends BrowserTestBase { $this->assertTrue($elements[0]->hasClass('block-search')); $this->assertEquals('nav', $elements[1]->getTagName()); $this->drupalPostForm( - 'examples/render-example/altering', + $altering_url, [ 'render_example_move_breadcrumbs' => FALSE, 'render_example_reverse_sidebar' => TRUE, @@ -92,7 +95,7 @@ class RenderExampleTest extends BrowserTestBase { $xpath = "//div[contains(@class,'block')]//div[@class='content']/div[@class='block-prefix']"; $this->assertEmpty($this->xpath($xpath)); $this->drupalPostForm( - 'examples/render-example/altering', + $altering_url, [ 'render_example_move_breadcrumbs' => FALSE, 'render_example_reverse_sidebar' => FALSE, @@ -102,25 +105,16 @@ class RenderExampleTest extends BrowserTestBase { ); $this->assertNotEmpty($this->xpath($xpath)); - /* // Test some rendering facets of the various render examples. - $this->drupalGet('examples/render-example/arrays'); + $this->drupalGet(Url::fromRoute('render_example.arrays')); $xpath_array = [ - 'foof' => 'Hello ' . $web_user->getAccountName() . ', welcome to the #cache example.', - '//div[@class="render_example--rendered"][starts-with(.,"Some basic text in a #markup")]' => 'Some basic text in a #markup (shows basic markup and how it is rendered)', - '//div[@class="render_example--rendered"][starts-with(.,"This is some text that should be put to")]' => 'This is some text that should be put together | This is some more text that we need | ', - '//div[@class="render_example--rendered"][starts-with(.,"The current time was")]' => 'The current time was when this was cached. Updated every seconds', - '//div[@class="render_example--rendered"]/div[text()][starts-with(.,"(prefix)This one")]' => '(prefix)This one adds a prefix and suffix, which put a div around the item(suffix)', - '//div[@class="render_example--rendered"]/div[text()][starts-with(.,"markup for pre_")]' => 'markup for pre_render and post_render example', - '//div[@class="render_example--rendered"]/div[text()][starts-with(.,"This markup was added")]' => 'This markup was added after rendering by a #post_render', - '//div[@class="render_example--rendered"]/div[text()][starts-with(.,"This #suffix")]' => 'This #suffix was added by a #pre_render', + // @todo: Add more of these. + 'foof' => 'Hello ' . $web_user->getAccountName() . ', welcome to the #cache example.', ]; foreach($xpath_array as $key => $value) { - $session->pageTextContains($value); + $session->pageTextContains($value); } - * - */ } }