Пример разметки хлебных крошек по schema.org
- <ul itemscope itemtype="https://schema.org/BreadcrumbList">
- <li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
- <a href="/" title="Главная" itemprop="item">
- <span itemprop="name">Главная</span>
- <meta itemprop="position" content="0">
- </a>
- </li>
- <li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
- <a href="/section/" title="Раздел" itemprop="item">
- <span itemprop="name">Раздел</span>
- <meta itemprop="position" content="1">
- </a>
- </li>
- <li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
- <a href="/section/page/" title="Страница" itemprop="item">
- <span itemprop="name">Страница</span>
- <meta itemprop="position" content="2">
- </a>
- </li>
- </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, со следующим кодом:
- <?php
- namespace app\widgets;
- use Yii;
- use yii\base\InvalidConfigException;
- use yii\bootstrap4\Breadcrumbs;
- use yii\bootstrap4\Html;
- use yii\helpers\ArrayHelper;
- class MyBreadcrumbs extends Breadcrumbs {
- public $itemTemplate = "<li class=\"breadcrumb-item\" itemprop=\"itemListElement\" itemscope itemtype=\"https://schema.org/ListItem\">{link}</li>\n";
- public $activeItemTemplate = "<li class=\"breadcrumb-item active\" aria-current=\"page\" itemprop=\"itemListElement\" itemscope itemtype=\"https://schema.org/ListItem\">{link}</li>\n";
- public function run() {
- $this->registerPlugin('breadcrumb');
- if (empty($this->links)) {
- return '';
- }
- $links = [];
- $position = 0;
- if ($this->homeLink === null) {
- $links[] = $this->renderItem([
- 'label' => Yii::t('yii', 'Home'),
- 'url' => Yii::$app->homeUrl,
- 'position' => $position,
- ], $this->itemTemplate);
- } else if ($this->homeLink !== false) {
- $links[] = $this->renderItem($this->homeLink, $this->itemTemplate);
- }
- foreach ($this->links as $link) {
- $position++;
- if (!is_array($link)) {
- $link = ['label' => $link, 'position' => $position,];
- } else {
- $link += ['position' => $position];
- }
- $links[] = $this->renderItem($link, isset($link['url']) ? $this->itemTemplate : $this->activeItemTemplate);
- }
- return Html::tag('nav', Html::tag($this->tag, implode('', $links), $this->options), $this->navOptions);
- }
- protected function renderItem($link, $template) {
- $encodeLabel = ArrayHelper::remove($link, 'encode', $this->encodeLabels);
- if (array_key_exists('label', $link)) {
- $label = $encodeLabel ? Html::encode($link['label']) : $link['label'];
- } else {
- throw new InvalidConfigException('The "label" element is required for each link.');
- }
- if (isset($link['template'])) {
- $template = $link['template'];
- }
- if (isset($link['position'])) {
- $position = $link['position'];
- } else {
- $position = 0;
- }
- if (isset($link['url'])) {
- $options = $link;
- $options += ['itemprop' => 'item'];
- unset($options['template'], $options['label'], $options['url'], $options['position']);
- $link = Html::a('<span itemprop="name">' . $label. '</span>', $link['url'], $options);
- $link .= '<meta itemprop="position" content="' . $position . '">';
- } else {
- $link = Html::a('<span itemprop="name">' . $label . '</span>', Yii::$app->request->url, ['style' => 'display: none;']);
- $link .= '<meta itemprop="position" content="' . $position . '">';
- $link .= $label;
- }
- return strtr($template, ['{link}' => $link]);
- }
- }
Вызываем виджет хлебных крошек с микроразметкой в Yii2
Теперь в месте где вызывается стандартный виджет хлебных крошек Breadcrumbs (обычно это: @app/views/layouts/main.php
) заменяем вызов стандартного виджета на наш:
- <?php
- echo \app\widgets\MyBreadcrumbs::widget([
- 'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [],
- ]);
- ?>
Заполняем массив хлебных крошек
В контроллере массив с хлебными крошками заполняется как и раньше:
- <?php
- $this->params['breadcrumbs'][] = ['label' => Yii::t('app', 'Раздел'), 'url' => ['/section']];
- $this->params['breadcrumbs'][] = ['label' => Yii::t('app', 'Страница'