Yii2. Добавляем микроразметку в хлебные крошки по schema.org

Пример разметки хлебных крошек по schema.org

  1. <ul itemscope itemtype="https://schema.org/BreadcrumbList">
  2.  
  3. <li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
  4. <a href="/" title="Главная" itemprop="item">
  5. <span itemprop="name">Главная</span>
  6. <meta itemprop="position" content="0">
  7. </a>
  8. </li>
  9.  
  10. <li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
  11. <a href="/section/" title="Раздел" itemprop="item">
  12. <span itemprop="name">Раздел</span>
  13. <meta itemprop="position" content="1">
  14. </a>
  15. </li>
  16.  
  17. <li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
  18. <a href="/section/page/" title="Страница" itemprop="item">
  19. <span itemprop="name">Страница</span>
  20. <meta itemprop="position" content="2">
  21. </a>
  22. </li>
  23.  
  24. </ul>

itemscope - указывает, что на странице описывается определенный объект.

itemtype - указывает тип объекта.

itemtype="https://schema.org/BreadcrumbList" - указывает тип, хлебные крошки.

itemprop="itemListElement" - указывает на отдельный пункту хлебных крошек.

itemprop="item" - ссылка пункта хлебных крошек.

itemprop="name" - название пункта хлебных крошек.

meta itemprop="position" content="number" - определяет позицию пункта хлебных крошек.

Пример результата после внедрения микроразметки хлебных крошек

Добавляем микроразметка хлебных крошек в Yii2

Создаем новый виджет хлебных крошек

Создадим класс MyBreadcrumbs.php (@app/widgets/MyBreadcrumbs.php), который будет наследовать базовый класс хлебных крошек Breadcrumbs, со следующим кодом:

  1. <?php
  2.  
  3. namespace app\widgets;
  4.  
  5. use Yii;
  6. use yii\base\InvalidConfigException;
  7. use yii\bootstrap4\Breadcrumbs;
  8. use yii\bootstrap4\Html;
  9. use yii\helpers\ArrayHelper;
  10.  
  11. class MyBreadcrumbs extends Breadcrumbs {
  12.  
  13. public $itemTemplate = "<li class=\"breadcrumb-item\" itemprop=\"itemListElement\" itemscope itemtype=\"https://schema.org/ListItem\">{link}</li>\n";
  14. public $activeItemTemplate = "<li class=\"breadcrumb-item active\" aria-current=\"page\" itemprop=\"itemListElement\" itemscope itemtype=\"https://schema.org/ListItem\">{link}</li>\n";
  15.  
  16. public function run() {
  17.  
  18. $this->registerPlugin('breadcrumb');
  19.  
  20. if (empty($this->links)) {
  21. return '';
  22. }
  23.  
  24. $links = [];
  25. $position = 0;
  26.  
  27. if ($this->homeLink === null) {
  28. $links[] = $this->renderItem([
  29. 'label' => Yii::t('yii', 'Home'),
  30. 'url' => Yii::$app->homeUrl,
  31. 'position' => $position,
  32. ], $this->itemTemplate);
  33. } else if ($this->homeLink !== false) {
  34. $links[] = $this->renderItem($this->homeLink, $this->itemTemplate);
  35. }
  36.  
  37. foreach ($this->links as $link) {
  38. $position++;
  39.  
  40. if (!is_array($link)) {
  41. $link = ['label' => $link, 'position' => $position,];
  42. } else {
  43. $link += ['position' => $position];
  44. }
  45.  
  46. $links[] = $this->renderItem($link, isset($link['url']) ? $this->itemTemplate : $this->activeItemTemplate);
  47. }
  48.  
  49. return Html::tag('nav', Html::tag($this->tag, implode('', $links), $this->options), $this->navOptions);
  50. }
  51.  
  52. protected function renderItem($link, $template) {
  53.  
  54. $encodeLabel = ArrayHelper::remove($link, 'encode', $this->encodeLabels);
  55.  
  56. if (array_key_exists('label', $link)) {
  57. $label = $encodeLabel ? Html::encode($link['label']) : $link['label'];
  58. } else {
  59. throw new InvalidConfigException('The "label" element is required for each link.');
  60. }
  61.  
  62. if (isset($link['template'])) {
  63. $template = $link['template'];
  64. }
  65.  
  66. if (isset($link['position'])) {
  67. $position = $link['position'];
  68. } else {
  69. $position = 0;
  70. }
  71.  
  72. if (isset($link['url'])) {
  73. $options = $link;
  74. $options += ['itemprop' => 'item'];
  75. unset($options['template'], $options['label'], $options['url'], $options['position']);
  76. $link = Html::a('<span itemprop="name">' . $label. '</span>', $link['url'], $options);
  77. $link .= '<meta itemprop="position" content="' . $position . '">';
  78. } else {
  79. $link = Html::a('<span itemprop="name">' . $label . '</span>', Yii::$app->request->url, ['style' => 'display: none;']);
  80. $link .= '<meta itemprop="position" content="' . $position . '">';
  81. $link .= $label;
  82. }
  83.  
  84. return strtr($template, ['{link}' => $link]);
  85.  
  86. }
  87. }

Вызываем виджет хлебных крошек с микроразметкой в Yii2

Теперь в месте где вызывается стандартный виджет хлебных крошек Breadcrumbs (обычно это: @app/views/layouts/main.php) заменяем вызов стандартного виджета на наш:

  1. <?php
  2. echo \app\widgets\MyBreadcrumbs::widget([
  3. 'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [],
  4. ]);
  5. ?>

Заполняем массив хлебных крошек

В контроллере массив с хлебными крошками заполняется как и раньше:

  1. <?php
  2. $this->params['breadcrumbs'][] = ['label' => Yii::t('app', 'Раздел'), 'url' => ['/section']];
  3. $this->params['breadcrumbs'][] = ['label' => Yii::t('app', 'Страница'
Источник: Перейти
Комментарии (0):
Чтобы оставить свой комментарий, необходимо пройти аутентификацию