In Drupal 7 it was useful to do things like this:
function mymodule_content() {
$links[] = l('Google', 'http://www.google.com');
$links[] = l('Yahoo', 'http://www.yahoo.com');
return t('Links: !types', array('!types' => implode(', ', $links)));
}
In this case, we are using the exclamation mark to pass the $links
into our string but unfortunately, Drupal 8 doesn't have this option in the FormattableMarkup::placeholderFormat(), the good news is that even without this there is a way to accomplish the same thing.
According to the documentation:
- @variable: When the placeholder replacement value is:
- A string, the replaced value in the returned string will be sanitized using \Drupal\Component\Utility\Html::escape().
- A MarkupInterface object, the replaced value in the returned string will not be sanitized.
- A MarkupInterface object cast to a string, the replaced value in the returned string be forcibly sanitized using\Drupal\Component\Utility\Html::escape().
Using the @
as the first character escapes the variable if it is a string
but if we pass a MarkupInterface
object it is not going to be sanitized, so we just need to return an object of this type.
And Drupal 8 has a class that implements MarkupInterface
called: Markup
, so the code above for Drupal 8 will look like this:
public function content() {
$markup = new Markup();
$links[] = Link::fromTextAndUrl('Google', Url::fromUri('http://www.google.com'))->toString();
$links[] = Link::fromTextAndUrl('Yahoo', Url::fromUri('http://www.yahoo.com'))->toString();
$types = $markup->create(implode(', ', $links));
return [ '#markup' => t('Links %links', ['%links' =>$types]), ];
}
And that's it, our string will display the links.
If you want to see a real scenario where this is helpful, check this Comment Notify code For Drupal 7 and this patch for the D8 version.
Comments
Add new comment