Issue #2506151 by joelpittet, Cottser, lauriii, Lukas von Blarer, tim.plunkett: Make the Twig extension link() accept Attribute objects
parent
1aca0e483a
commit
df44c00a6c
|
@ -43,10 +43,11 @@ use Drupal\Component\Utility\SafeStringInterface;
|
||||||
* htmlspecialchars() and the entire attribute string is marked safe for output.
|
* htmlspecialchars() and the entire attribute string is marked safe for output.
|
||||||
*/
|
*/
|
||||||
class Attribute implements \ArrayAccess, \IteratorAggregate, SafeStringInterface {
|
class Attribute implements \ArrayAccess, \IteratorAggregate, SafeStringInterface {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Stores the attribute data.
|
* Stores the attribute data.
|
||||||
*
|
*
|
||||||
* @var array
|
* @var \Drupal\Core\Template\AttributeValueBase[]
|
||||||
*/
|
*/
|
||||||
protected $storage = array();
|
protected $storage = array();
|
||||||
|
|
||||||
|
@ -261,6 +262,21 @@ class Attribute implements \ArrayAccess, \IteratorAggregate, SafeStringInterface
|
||||||
return $return;
|
return $return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all storage elements as an array.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
* An associative array of attributes.
|
||||||
|
*/
|
||||||
|
public function toArray() {
|
||||||
|
$return = [];
|
||||||
|
foreach ($this->storage as $name => $value) {
|
||||||
|
$return[$name] = $value->value();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $return;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implements the magic __clone() method.
|
* Implements the magic __clone() method.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -260,17 +260,20 @@ class TwigExtension extends \Twig_Extension {
|
||||||
* The link text for the anchor tag as a translated string.
|
* The link text for the anchor tag as a translated string.
|
||||||
* @param \Drupal\Core\Url|string $url
|
* @param \Drupal\Core\Url|string $url
|
||||||
* The URL object or string used for the link.
|
* The URL object or string used for the link.
|
||||||
* @param array $attributes
|
* @param array|\Drupal\Core\Template\Attribute $attributes
|
||||||
* An optional array of link attributes.
|
* An optional array or Attribute object of link attributes.
|
||||||
*
|
*
|
||||||
* @return array
|
* @return array
|
||||||
* A render array representing a link to the given URL.
|
* A render array representing a link to the given URL.
|
||||||
*/
|
*/
|
||||||
public function getLink($text, $url, array $attributes = []) {
|
public function getLink($text, $url, $attributes = []) {
|
||||||
if (!$url instanceof Url) {
|
if (!$url instanceof Url) {
|
||||||
$url = Url::fromUri($url);
|
$url = Url::fromUri($url);
|
||||||
}
|
}
|
||||||
if ($attributes) {
|
if ($attributes) {
|
||||||
|
if ($attributes instanceof Attribute) {
|
||||||
|
$attributes = $attributes->toArray();
|
||||||
|
}
|
||||||
if ($existing_attributes = $url->getOption('attributes')) {
|
if ($existing_attributes = $url->getOption('attributes')) {
|
||||||
$attributes = array_merge($existing_attributes, $attributes);
|
$attributes = array_merge($existing_attributes, $attributes);
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,6 +85,7 @@ class EngineTwigTest extends WebTestBase {
|
||||||
'link via the linkgenerator: ' . $link_generator->generate('register', new Url('user.register', [], ['absolute' => TRUE, 'attributes' => ['foo' => 'bar']])),
|
'link via the linkgenerator: ' . $link_generator->generate('register', new Url('user.register', [], ['absolute' => TRUE, 'attributes' => ['foo' => 'bar']])),
|
||||||
'link via the linkgenerator: ' . $link_generator->generate('register', new Url('user.register', [], ['attributes' => ['foo' => 'bar', 'id' => 'kitten']])),
|
'link via the linkgenerator: ' . $link_generator->generate('register', new Url('user.register', [], ['attributes' => ['foo' => 'bar', 'id' => 'kitten']])),
|
||||||
'link via the linkgenerator: ' . $link_generator->generate('register', new Url('user.register', [], ['attributes' => ['id' => 'kitten']])),
|
'link via the linkgenerator: ' . $link_generator->generate('register', new Url('user.register', [], ['attributes' => ['id' => 'kitten']])),
|
||||||
|
'link via the linkgenerator: ' . $link_generator->generate('register', new Url('user.register', [], ['attributes' => ['class' => ['llama', 'kitten', 'panda']]])),
|
||||||
];
|
];
|
||||||
|
|
||||||
// Verify that link() has the ability to bubble cacheability metadata:
|
// Verify that link() has the ability to bubble cacheability metadata:
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
namespace Drupal\twig_theme_test;
|
namespace Drupal\twig_theme_test;
|
||||||
|
|
||||||
|
use Drupal\Core\Template\Attribute;
|
||||||
use Drupal\Core\Url;
|
use Drupal\Core\Url;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -53,11 +54,14 @@ class TwigThemeTestController {
|
||||||
* Renders for testing link_generator functions in a Twig template.
|
* Renders for testing link_generator functions in a Twig template.
|
||||||
*/
|
*/
|
||||||
public function linkGeneratorRender() {
|
public function linkGeneratorRender() {
|
||||||
return array(
|
return [
|
||||||
'#theme' => 'twig_theme_test_link_generator',
|
'#theme' => 'twig_theme_test_link_generator',
|
||||||
'#test_url' => new Url('user.register', [], ['absolute' => TRUE]),
|
'#test_url' => new Url('user.register', [], ['absolute' => TRUE]),
|
||||||
'#test_url_attribute' => new Url('user.register', [], ['attributes' => ['foo' => 'bar']]),
|
'#test_url_attribute' => new Url('user.register', [], ['attributes' => ['foo' => 'bar']]),
|
||||||
);
|
// Explicitly creating an Attribute object to avoid false positives when
|
||||||
|
// testing Attribute object merging with the twig link() function.
|
||||||
|
'#attributes' => new Attribute(['class' => ['llama', 'kitten', 'panda']]),
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -2,3 +2,4 @@
|
||||||
<div>link via the linkgenerator: {{ link('register', test_url, {'foo': 'bar'}) }}</div>
|
<div>link via the linkgenerator: {{ link('register', test_url, {'foo': 'bar'}) }}</div>
|
||||||
<div>link via the linkgenerator: {{ link('register', test_url_attribute, {'id': 'kitten'}) }}</div>
|
<div>link via the linkgenerator: {{ link('register', test_url_attribute, {'id': 'kitten'}) }}</div>
|
||||||
<div>link via the linkgenerator: {{ link('register', 'route:user.register', {'id': 'kitten'}) }}</div>
|
<div>link via the linkgenerator: {{ link('register', 'route:user.register', {'id': 'kitten'}) }}</div>
|
||||||
|
<div>link via the linkgenerator: {{ link('register', 'route:user.register', attributes) }}</div>
|
||||||
|
|
|
@ -43,7 +43,11 @@ function twig_theme_test_theme($existing, $type, $theme, $path) {
|
||||||
'template' => 'twig_theme_test.url_generator',
|
'template' => 'twig_theme_test.url_generator',
|
||||||
);
|
);
|
||||||
$items['twig_theme_test_link_generator'] = array(
|
$items['twig_theme_test_link_generator'] = array(
|
||||||
'variables' => array('test_url' => NULL, 'test_url_attribute' => NULL),
|
'variables' => [
|
||||||
|
'test_url' => NULL,
|
||||||
|
'test_url_attribute' => NULL,
|
||||||
|
'attributes' => [],
|
||||||
|
],
|
||||||
'template' => 'twig_theme_test.link_generator',
|
'template' => 'twig_theme_test.link_generator',
|
||||||
);
|
);
|
||||||
$items['twig_theme_test_url_to_string'] = array(
|
$items['twig_theme_test_url_to_string'] = array(
|
||||||
|
|
Loading…
Reference in New Issue