From 2ae527f6ec39e1bddf86acbd16df357100cea79a Mon Sep 17 00:00:00 2001 From: Chi Date: Tue, 27 Mar 2018 17:15:51 +0500 Subject: [PATCH] Added view filter. --- src/TwigExtension.php | 34 +++++++++++++++++-- tests/src/Functional/TwigTweakTest.php | 14 ++++++++ .../templates/twig-tweak-test.html.twig | 3 ++ 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/TwigExtension.php b/src/TwigExtension.php index 730c6ff..75f6c9c 100644 --- a/src/TwigExtension.php +++ b/src/TwigExtension.php @@ -4,7 +4,9 @@ namespace Drupal\twig_tweak; use Drupal\Component\Uuid\Uuid; use Drupal\Core\Block\TitleBlockPluginInterface; -use Drupal\Core\Language\LanguageInterface; +use Drupal\Core\Entity\EntityInterface; +use Drupal\Core\Field\FieldItemInterface; +use Drupal\Core\Field\FieldItemListInterface; use Drupal\Core\Link; use Drupal\Core\Site\Settings; use Drupal\Core\Url; @@ -55,6 +57,7 @@ class TwigExtension extends \Twig_Extension { new \Twig_SimpleFilter('image_style', [$this, 'imageStyle']), new \Twig_SimpleFilter('transliterate', [$this, 'transliterate']), new \Twig_SimpleFilter('check_markup', [$this, 'checkMarkup']), + new \Twig_SimpleFilter('view', [$this, 'view']), ]; // PHP filter should be enabled in settings.php file. if (Settings::get('twig_tweak_enable_php_filter')) { @@ -141,7 +144,7 @@ class TwigExtension extends \Twig_Extension { * @param string $entity_type * The entity type. * @param mixed $id - * The ID of the entity to render. + * The ID of the entity to build. * @param string $view_mode * (optional) The view mode that should be used to render the entity. * @param string $langcode @@ -574,6 +577,33 @@ class TwigExtension extends \Twig_Extension { return check_markup($text, $format_id, $langcode, $filter_types_to_skip); } + /** + * Returns a render array for entity, field list or field item. + * + * @param mixed $object + * The object to build a render array from. + * @param string $view_mode + * (optional) The view mode that should be used to render the field. + * @param string $langcode + * (optional) For which language the entity should be rendered, defaults to + * the current content language. + * @param bool $check_access + * (Optional) Indicates that access check is required. + * + * @return array + * A render array to represent the object. + */ + public function view($object, $view_mode = 'default', $langcode = NULL, $check_access = TRUE) { + if ($object instanceof FieldItemListInterface || $object instanceof FieldItemInterface) { + return $object->view($view_mode); + } + elseif ($object instanceof EntityInterface && (!$check_access || $object->access('view'))) { + return \Drupal::entityTypeManager() + ->getViewBuilder($object->getEntityTypeId()) + ->view($object, $view_mode, $langcode); + } + } + /** * Evaluates a string of PHP code. * diff --git a/tests/src/Functional/TwigTweakTest.php b/tests/src/Functional/TwigTweakTest.php index 7f7020e..77e522c 100644 --- a/tests/src/Functional/TwigTweakTest.php +++ b/tests/src/Functional/TwigTweakTest.php @@ -215,6 +215,20 @@ class TwigTweakTest extends BrowserTestBase { // Test text format. $xpath = '//div[@class = "tt-check-markup"]'; $this->assertEquals('bold strong', trim($this->xpath($xpath)[0]->getHtml())); + + // Test node view. + $xpath = '//div[@class = "tt-node-view"]/article[contains(@class, "node--view-mode-default")]/h2[a/span[text() = "Beta"]]'; + $xpath .= '/following-sibling::footer[//h4[text() = "Member for"]]'; + $xpath .= '/following-sibling::div[@class = "node__content"]/div/p'; + $this->assertByXpath($xpath); + + // Field list view. + $xpath = '//div[@class = "tt-field-list-view"]/span[contains(@class, "field--name-title") and text() = "Beta"]'; + $this->assertByXpath($xpath); + + // Field item view. + $xpath = '//div[@class = "tt-field-item-view" and text() = "Beta"]'; + $this->assertByXpath($xpath); } /** diff --git a/tests/twig_tweak_test/templates/twig-tweak-test.html.twig b/tests/twig_tweak_test/templates/twig-tweak-test.html.twig index eeb2abb..9269cf3 100644 --- a/tests/twig_tweak_test/templates/twig-tweak-test.html.twig +++ b/tests/twig_tweak_test/templates/twig-tweak-test.html.twig @@ -49,4 +49,7 @@
{{ 'public://images/ocean.jpg' | image_style('thumbnail') }}
{{ 'Привет!' | transliterate('ru') }}
{{ 'bold strong' | check_markup('twig_tweak_test') }}
+
{{ node|view }}
+
{{ node.title|view }}
+
{{ node.title[0]|view }}