Скажем, я расширяю blockBase
класс для создания пользовательского блока, и я реализую blockBuild
метод для создания некоторой разметки для моего блока. Что-то вроде этого:
class YourModuleBlock extends BlockBase {
/**
* Implements \Drupal\block\BlockBase::blockBuild().
*/
public function build() {
return array(
'#markup' => 'This is a block!',
);
}
}
Если бы я хотел предоставить ссылку в этой разметке, в D7 я бы использовал эту l
функцию, но она больше не доступна ( см. Здесь ). Итак, мне нужно сделать доступным новый метод D8 для генерации ссылок. Я мог бы просто использовать <a>
тег, но это никогда не было лучшей практикой в D7.
Итак, какой метод следует использовать для создания ссылок и как сделать его доступным для моей функции?
navigation
8
24ma13wg
источник
источник
Ответы:
\ Drupal :: l устарела. Может быть, этот случай кому-нибудь пригодится
источник
toRenderable()
трюк очень полезен, спасибо!Во-первых, это не на 100%, см. Эту проблему . С учетом сказанного позвольте мне процитировать некоторый код из уведомления об изменении :
Drupal 7:
Drupal 8:
Изменить: названия маршрутов в
moduledirectory/modulename.routing.yml
файлах и (по умолчанию) в{router}
таблице.источник
fromRoute('<front>')
Другой вариант - создать ссылку в массиве рендеринга.
Drupal предоставляет нам несколько вспомогательных методов для создания URL-адресов и ссылок на сущности.
А также
источник
#attributes
можно добавить, потому что это RenderElement .Вот несколько примеров создания ссылок в Drupal 8. Обратите внимание, что $ this-> t ('some text') доступно внутри блоков, расширяющих BlockBase. Если вы копируете их в другой класс, в котором его нет, или используете их в файле .module, вам может потребоваться изменить это на t () 1 .
Базовая ссылка на узел:
Это создает массив рендеринга следующим образом:
Вы можете создать массив визуализации без загрузки узла следующим образом:
Или используя основной класс Link:
Если вы хотите использовать разметку в тексте вашей ссылки, вы не можете просто вставить строку. Вам нужно использовать элемент массива рендеринга:
Чтобы создать абсолютную ссылку, вы добавляете эту опцию к URL, а не к ссылке:
Чтобы добавить класс к вашей ссылке, вам также нужно добавить это к URL, а не к ссылке:
Чтобы добавить строку запроса к вашей ссылке, вам также необходимо указать URL-адрес, а не ссылку:
Чтобы установить ссылку для открытия в новом окне с target = _blank:
Вот ссылка на страницу терминов таксономии:
Вот ссылка на страницу редактирования узла:
Чтобы создать внешнюю ссылку:
Ссылка на домашнюю страницу:
Обратите внимание, что для любого из этих объектов url вы можете получить URL-адрес в виде строки, вызвав:
Например:
источник
link
Метод является устаревшим.Возможность задавать атрибуты в предыдущих примерах кажется утраченной или запутанной, потому что функциональность просто неочевидна. Есть два способа создания ссылок в зависимости от того, есть ли у них маршрут или нет, и каждый ведет себя немного по-разному, так что вот примеры.
С маршрутом. Это имеет смысл, вы можете просто указать его в опциях.
С внешним URL. Это немного странно. Не существует аргумента option, поэтому это может показаться невозможным, но на самом деле все в порядке. Причина в том, что необъяснимые ссылки никогда не имеют опций только на URL, который они описывают. Это означает, что вы передаете класс URL-адресу при его создании, и он будет работать.
Следствием всего этого является то, что вы также можете сделать это.
источник
Полный пример с атрибутами и разметкой HTML в тексте ссылки:
источник
Мне нужно было добавить ссылку на таблицу в виде #suffix, но нужно было поставить ее в виде HTML, чтобы добиться этого я сделал
\Drupal\Core\Link::fromTextAndUrl("Add New page", Url::fromRoute('mymodule.add_new_page'))->toString();
Где mymodule.add_new_page - это маршрут из файла моего модуля yml.
источник
Ответы здесь дали мне несколько хороших указателей. Все, что я хотел, это предоставить ссылку на узел в мои журналы ... Так вот что я закончил
источник
источник