Issue #2426447 by mpdonadio, Berdir: Views no longer supports {{ something }} as twig placeholder for a path, only {{something}}
							parent
							
								
									27f69c2df5
								
							
						
					
					
						commit
						d6458cd8fa
					
				| 
						 | 
				
			
			@ -104,6 +104,12 @@ abstract class PluginBase extends ComponentPluginBase implements ContainerFactor
 | 
			
		|||
   */
 | 
			
		||||
  protected $usesOptions = FALSE;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Stores the render API renderer.
 | 
			
		||||
   *
 | 
			
		||||
   * @var \Drupal\Core\Render\RendererInterface
 | 
			
		||||
   */
 | 
			
		||||
  protected $renderer;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Constructs a PluginBase object.
 | 
			
		||||
| 
						 | 
				
			
			@ -364,14 +370,14 @@ abstract class PluginBase extends ComponentPluginBase implements ContainerFactor
 | 
			
		|||
    // Non-Twig tokens are a straight string replacement, Twig tokens get run
 | 
			
		||||
    // through an inline template for rendering and replacement.
 | 
			
		||||
    $text = strtr($text, $other_tokens);
 | 
			
		||||
    if ($twig_tokens) {
 | 
			
		||||
    if ($twig_tokens && !empty($text)) {
 | 
			
		||||
      $build = array(
 | 
			
		||||
        '#type' => 'inline_template',
 | 
			
		||||
        '#template' => $text,
 | 
			
		||||
        '#context' => $twig_tokens,
 | 
			
		||||
      );
 | 
			
		||||
 | 
			
		||||
      return drupal_render($build);
 | 
			
		||||
      return $this->getRenderer()->render($build);
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      return $text;
 | 
			
		||||
| 
						 | 
				
			
			@ -576,4 +582,18 @@ abstract class PluginBase extends ComponentPluginBase implements ContainerFactor
 | 
			
		|||
 | 
			
		||||
    return $changes;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Returns the render API renderer.
 | 
			
		||||
   *
 | 
			
		||||
   * @return \Drupal\Core\Render\RendererInterface
 | 
			
		||||
   */
 | 
			
		||||
  protected function getRenderer() {
 | 
			
		||||
    if (!isset($this->renderer)) {
 | 
			
		||||
      $this->renderer = \Drupal::service('renderer');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return $this->renderer;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -103,7 +103,7 @@ abstract class FieldPluginBase extends HandlerBase implements FieldHandlerInterf
 | 
			
		|||
  /**
 | 
			
		||||
   * Stores the render API renderer.
 | 
			
		||||
   *
 | 
			
		||||
   * @var \Drupal\Core\Render\Renderer
 | 
			
		||||
   * @var \Drupal\Core\Render\RendererInterface
 | 
			
		||||
   */
 | 
			
		||||
  protected $renderer;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1332,7 +1332,7 @@ abstract class FieldPluginBase extends HandlerBase implements FieldHandlerInterf
 | 
			
		|||
      // In that case the original path looks like
 | 
			
		||||
      // user-path:/admin/content/files/usage/{{ fid }}, which will be escaped by
 | 
			
		||||
      // the toUriString() call above.
 | 
			
		||||
      $path = str_replace(['%7B','%7D'], ['{','}'], $path);
 | 
			
		||||
      $path = preg_replace(['/(\%7B){2}(\%20)*/', '/(\%20)*(\%7D){2}/'], ['{{','}}'], $path);
 | 
			
		||||
 | 
			
		||||
      // Use strip tags as there should never be HTML in the path.
 | 
			
		||||
      // However, we need to preserve special characters like " that
 | 
			
		||||
| 
						 | 
				
			
			@ -1730,7 +1730,7 @@ abstract class FieldPluginBase extends HandlerBase implements FieldHandlerInterf
 | 
			
		|||
  /**
 | 
			
		||||
   * Returns the render API renderer.
 | 
			
		||||
   *
 | 
			
		||||
   * @return \Drupal\Core\Render\Renderer
 | 
			
		||||
   * @return \Drupal\Core\Render\RendererInterface
 | 
			
		||||
   */
 | 
			
		||||
  protected function getRenderer() {
 | 
			
		||||
    if (!isset($this->renderer)) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -119,6 +119,13 @@ class FieldPluginBaseTest extends UnitTestCase {
 | 
			
		|||
   */
 | 
			
		||||
  protected $pathProcessor;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * The mocked path renderer.
 | 
			
		||||
   *
 | 
			
		||||
   * @var \Drupal\Core\Render\RendererInterface|\PHPUnit_Framework_MockObject_MockObject
 | 
			
		||||
   */
 | 
			
		||||
  protected $renderer;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * {@inheritdoc}
 | 
			
		||||
   */
 | 
			
		||||
| 
						 | 
				
			
			@ -147,11 +154,14 @@ class FieldPluginBaseTest extends UnitTestCase {
 | 
			
		|||
    $this->unroutedUrlAssembler = $this->getMock('Drupal\Core\Utility\UnroutedUrlAssemblerInterface');
 | 
			
		||||
    $this->linkGenerator = $this->getMock('Drupal\Core\Utility\LinkGeneratorInterface');
 | 
			
		||||
 | 
			
		||||
    $this->renderer = $this->getMock('Drupal\Core\Render\RendererInterface');
 | 
			
		||||
 | 
			
		||||
    $container_builder = new ContainerBuilder();
 | 
			
		||||
    $container_builder->set('url_generator', $this->urlGenerator);
 | 
			
		||||
    $container_builder->set('path.validator', $this->pathValidator);
 | 
			
		||||
    $container_builder->set('unrouted_url_assembler', $this->unroutedUrlAssembler);
 | 
			
		||||
    $container_builder->set('request_stack', $this->requestStack);
 | 
			
		||||
    $container_builder->set('renderer', $this->renderer);
 | 
			
		||||
    \Drupal::setContainer($container_builder);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -421,6 +431,65 @@ class FieldPluginBaseTest extends UnitTestCase {
 | 
			
		|||
    return $data;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Test rendering of a link with a path and options.
 | 
			
		||||
   *
 | 
			
		||||
   * @dataProvider providerTestRenderAsLinkWithPathAndTokens
 | 
			
		||||
   * @covers ::renderAsLink
 | 
			
		||||
   */
 | 
			
		||||
  public function testRenderAsLinkWithPathAndTokens($path, $tokens, $link_html) {
 | 
			
		||||
    $alter = [
 | 
			
		||||
      'make_link' => TRUE,
 | 
			
		||||
      'path' => $path,
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
    $this->setUpUrlIntegrationServices();
 | 
			
		||||
    $this->setupDisplayWithEmptyArgumentsAndFields();
 | 
			
		||||
    $this->executable->build_info['substitutions'] = $tokens;
 | 
			
		||||
    $field = $this->setupTestField(['alter' => $alter]);
 | 
			
		||||
    $field->field_alias = 'key';
 | 
			
		||||
    $row = new ResultRow(['key' => 'value']);
 | 
			
		||||
 | 
			
		||||
    $build =[
 | 
			
		||||
      '#type' => 'inline_template',
 | 
			
		||||
      '#template' => 'base:test-path/' . explode('/', $path)[1],
 | 
			
		||||
      '#context' => ['foo' => 123],
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
    $this->renderer->expects($this->once())
 | 
			
		||||
      ->method('render')
 | 
			
		||||
      ->with($build, FALSE)
 | 
			
		||||
      ->willReturn('base:test-path/123');
 | 
			
		||||
 | 
			
		||||
    $result = $field->advancedRender($row);
 | 
			
		||||
    $this->assertEquals($link_html, $result);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Data provider for ::testRenderAsLinkWithPathAndTokens().
 | 
			
		||||
   *
 | 
			
		||||
   * @return array
 | 
			
		||||
   *   Test data.
 | 
			
		||||
   */
 | 
			
		||||
  public function providerTestRenderAsLinkWithPathAndTokens() {
 | 
			
		||||
    $tokens = ['{{ foo }}' => 123];
 | 
			
		||||
    $link_html = '<a href="/test-path/123">value</a>';
 | 
			
		||||
 | 
			
		||||
    $data = [];
 | 
			
		||||
 | 
			
		||||
    $data[] = ['test-path/{{foo}}', $tokens, $link_html];
 | 
			
		||||
    $data[] = ['test-path/{{ foo}}', $tokens, $link_html];
 | 
			
		||||
    $data[] = ['test-path/{{  foo}}', $tokens, $link_html];
 | 
			
		||||
    $data[] = ['test-path/{{foo }}', $tokens, $link_html];
 | 
			
		||||
    $data[] = ['test-path/{{foo  }}', $tokens, $link_html];
 | 
			
		||||
    $data[] = ['test-path/{{ foo }}', $tokens, $link_html];
 | 
			
		||||
    $data[] = ['test-path/{{  foo }}', $tokens, $link_html];
 | 
			
		||||
    $data[] = ['test-path/{{ foo  }}', $tokens, $link_html];
 | 
			
		||||
    $data[] = ['test-path/{{  foo  }}', $tokens, $link_html];
 | 
			
		||||
 | 
			
		||||
    return $data;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Sets up a test field.
 | 
			
		||||
   *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue