0 Пользователей и 1 Гость просматривают эту тему.
  • 136 Ответов
  • 59141 Просмотров
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Что такое каноническая ссылка и об атрибуте rel="canonical".
Предлагаю решение для построения канонических ссылок(в комплекте com_content, com_contact, com_weblinks, плагин расширяем для других компонентов).
Плагин нужно тестировать, о багах и глюках, а также пожеланиях и прдлжениях прошу писать в этой теме.
Инструкция по подключению. Joomla 3.0
1. Скачиваете плагин.
2. Устанавливаете плагин.
3. Расширения менеджер плагинов - включаете плагин.
Плагин временно удален. В Joomla версии 3.1 на которой тестировал, неправильно работает роутер.
Можете убедится
ваш сайт/component/content/article.html?id=7 здесь 7 ид материала из админки
Код: php
$url = JURI::getInstance()->toString();
$uri = JURI::getInstance($url);
$query = JFactory::getApplication()->getRouter()->parse($uri);
var_dump($query );
выведет id='article' это ошибка должно быть в нашем случае  id='7'
Буду просматривать обновления поправят роутер перепишу плагин
*

Shustry

  • Гуру
  • 6434
  • 745 / 3
Re: Канонические ссылки для com_content
« Ответ #1 : 07.11.2012, 13:47:03 »
Круть! Я прям в шаблон запилил. Полезная наработка.
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Re: Канонические ссылки для com_content
« Ответ #2 : 07.11.2012, 13:54:08 »
А почему для категорий используется напрямую JRoute, а не ContentHelperRoute::getCategoryRoute. Или это сделано ради уточнения конкретного layout?
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Канонические ссылки для com_content
« Ответ #3 : 07.11.2012, 14:13:35 »
Формирование ссылок взял по аналогии стандартного меню. Есть предложение по формировании ссылок для блога вставим.
В конце написания возникла мысль а может $uri->toString(array('fragment')) хватит на все это дело для других компонентов?
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Канонические ссылки для com_content
« Ответ #4 : 07.11.2012, 15:34:22 »
Спасибо! Поправил. Архив перезалил. Каждый по строчке кода и может кому то пригодится ^-^
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Re: Канонические ссылки для com_content
« Ответ #6 : 07.11.2012, 19:20:12 »
Плагин нужен однозначно! Причем особых технических препятствий для этого я не вижу - даже если в лоб делать и вырезать/вставлять ссылки на onAfterRender ;)
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Канонические ссылки для com_content
« Ответ #7 : 07.11.2012, 19:36:07 »
Плагин написать не сложно. Вот интересно было обсудить о расширяемости этого плагина, подключения новых компонентов для обработки и каких-то специфических требований к самим ссылкам. Может  у кого то пожелания будут
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Re: Канонические ссылки для com_content
« Ответ #8 : 07.11.2012, 19:38:05 »
Так реализовать в плагине абстрактный класс-адаптер, вложить в него плагины для встроенных компонентов, а дальше пополнять тем, что пришлет народ (я надеюсь, что народ-то не останется в стороне). Но в любом случае плагин нужен, править руками код в наше время уже как-то даже неприлично

эм для каких именно специфических компонентов, можно пример?
ой, можно подумать мало таких :)
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Канонические ссылки для com_content
« Ответ #9 : 07.11.2012, 19:44:41 »
frisian неправильно понял или я не так выразился.  для начала развернуть для стандартных компонентов. я говорю о том, чтобы с легкостью можно было расширять, подключать обработку других компонентов. Пока писал smart написал про то, что я имею ввиду
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Re: Канонические ссылки для com_content
« Ответ #10 : 07.11.2012, 20:02:05 »
(правда пока писал нашел один минус в этой идее.. если кто то что то в плагине ручками допишет то потеряет это при обнове плагина)
ничего подобного - можно сделать чтобы из папки adapters грузились адаптеры вида componentname.php, но перед этим  проверялось, а нет ли componentname.override.php, и если есть - использовать перегруженный. И овцы целы, и волки сыты и пастуху - вечная память.
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Канонические ссылки для com_content
« Ответ #11 : 08.11.2012, 13:01:27 »
Написал первую версию плагина. Тестируйте. Принимаются пожелания и замечания
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Re: Канонические ссылки для com_content
« Ответ #12 : 08.11.2012, 13:12:47 »
О, это уже интересно. Только форматирование кода все-таки приведи к используемому в Joomla? Сейчас читать просто невозможно... Да и лучше, когда точка выхода из метода одна, а не десяток return'ов по всему телу метода. И еще, а где объявлена переменная $option? И еще, если используется нестандартный порт (ну допустим 8088), работать будет?

p.s. Я бы все-таки эти адаптеры сделал бы классами, и инициализировал их извне данными. В конце концов в базовом можно получить все основные переменные (layout, view, document), а уже в наследниках вытягивать то, что требуется из текущей ссылки и строить каноническую ссылку.
« Последнее редактирование: 08.11.2012, 13:17:12 от smart »
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Канонические ссылки для com_content
« Ответ #13 : 08.11.2012, 13:22:50 »
extract($app->getRouter()->parse($uri)); - Здесь берем option
Объявим перменную на всякий случай. Код приведем. Больше интересует удобство такого подхода (com_newcomponent.php). Чтобы добавить свой компонент нужно добавить файл с системным именем компонента.php в папку component  в котором определена переменная $can_url
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Re: Канонические ссылки для com_content
« Ответ #14 : 08.11.2012, 13:27:54 »
extract($app->getRouter()->parse($uri)); - Здесь берем option
на мой взгляд не очень читабельно и удобно - т.е. визуально сказать нельзя, какие переменные в результате определены и какие у них значения. И еще, когда мы используем jrequest, у нас под рукой вся мощь фильтрации входных данных, а тут - после parse у нас просто ассоциативный массив, а что если в $option будет не название компонента, а допустим путь к файлу из каталога выше? или еще откуда-то? опасно...
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Re: Канонические ссылки для com_content
« Ответ #15 : 08.11.2012, 13:32:57 »
$option - согласен с Сергеем.

И читать трудно. Бей на приватные методы. Постарайся onBeforeCompileHead преврарить чисто в интерфейс, не грузи его кучой кода.

Насчет подхода - я, пока, не вижу других вариантов, так как файл тебе все равно будет нужен. Может быть действительно внутри файлов сделать классы, как Сергей предложил.
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Re: Канонические ссылки для com_content
« Ответ #16 : 08.11.2012, 13:39:46 »
Да пусть будет файл, кто против... но пусть этот файл будет классом... а не куском кода, который непонятно что и откуда берет
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Канонические ссылки для com_content
« Ответ #17 : 08.11.2012, 13:42:21 »
Но ведь мы и не знаем заранее как будет форматироваться query строка чужого компонента. Что там будет article или city к примеру. А таким образом мы получим все переменные. jrequest и новый Jinput здесь не помогут. Откуда я знаю наименования переменных чужих компонентов, чтобы их объявить. Понял вы хотите запрашивать только в option , а все остальное переложить на файл подключенный
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Re: Канонические ссылки для com_content
« Ответ #18 : 08.11.2012, 15:06:37 »
Ну так вытащи в плагине только то, что нужно - option, проведи фильтрацию и подключай адаптер, а уже внутри адаптера, пусть каждый вытаскивает из массива те переменные, которые требуются. То что сейчас - и не безопасно и не предсказуемо. Ну вот представь, что в ссылке будет &doc=test или &app=comments, что произойдет после extract? Правильно - переменные $app и $doc получат значения 'test' и 'comments'. А что будет дальше, когда ты вызовешь $doc->language? Все упадет с ошибкой! А если в ссылке будет domain?

Не, все эти extract - зло, причем абсолютное зло.
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Канонические ссылки для com_content
« Ответ #19 : 08.11.2012, 22:31:52 »
Написал версию 2. Если есть сбросьте ссылку на документацию по оформлению кода в Joomla.
Цитировать
в плагине абстрактный класс-адаптер, вложить в него плагины для встроенных компонентов
Не знаю, имеет ли смысл. Подключенный файл, задает(возвращает) нам сформированную ссылку для своего компонента. Писать его в виде класса?
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Канонические ссылки для Joomla 3
« Ответ #21 : 16.11.2012, 19:46:11 »
Написал 3 версию. Подправил код и логику. Добавил  обработку com_contact, com_weblinks
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Re: Канонические ссылки для Joomla 3
« Ответ #22 : 16.11.2012, 19:53:14 »
А зачем в com_weblinks.php и com_contact.php строчка:
Код: php
if(!class_exists('ContentHelperRoute')) require_once (JPATH_SITE . '/components/com_content/helpers/route.php');

И зачем файл com_newcomponent.php, если в нем нет ни логики ни какой? Только людей будет смущать.

и еще, если уж задаем значение по умолчанию при получении значения option, то уж давайте сразу добавим проверку, что оно не пустое.

Хм, значение $this->domain лучше установить в конструкторе, это гарантирует, что оно будет на момент вызова add_link.
*

Шмайсер

  • Давно я тут
  • 801
  • 35 / 3
Re: Канонические ссылки для Joomla 3
« Ответ #23 : 16.11.2012, 20:28:55 »
Не вдаваясь в подробности, задам вопрос - не будет ли это очередным тормозом в и так не быстром движке? Плагин использует дополнительные запросы?
Разработка сайтов любой сложности, на Joomla 3.9-4.x и не только на ней. Пишу компоненты, модули и плагины на заказ. Переношу сайты с ветки 2.5.х на 4-ю версию Joomla. Пишу любые скрипты и интерфейсы.
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Канонические ссылки для Joomla 3
« Ответ #24 : 16.11.2012, 21:43:41 »
Поправил. И еще несколько ошибок.
Шмайсер не тормозит плагин. Чего он должен тормозить. Гляньте код. Конструктивная критика приветсвуется
*

Demour

  • Осваиваюсь на форуме
  • 47
  • 0 / 0
Re: Канонические ссылки для Joomla 3
« Ответ #25 : 18.11.2012, 08:04:50 »
Отличный плагин, спасибо!
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Re: Канонические ссылки для Joomla 3
« Ответ #26 : 19.11.2012, 12:08:57 »
@Poznakomlus: кстати, вот если бы ты меня послушал и реализовал адаптеры для различных расширений в виде некоего класса, то можно было бы сделать полный изюм - закэшировать вызов метода адаптера, возвращающий ссылку, и свести нагрузку, создаваемую плагином, фактически к нулю. Ведь я думаю не секрет, что каждый вызов getArticleRoute это один запрос к БД, а если на странице таких ссылок 50, то это будет 50 лишних запросов (по крайней мере если сайт мультиязычный - точно).
*

smart

  • Администратор
  • 6478
  • 1318 / 15
  • Хочешь сделать хорошо — сделай!
Re: Канонические ссылки для Joomla 3
« Ответ #27 : 19.11.2012, 12:15:21 »
Да, вопрос  по коду:

Код: php
	private function add_link($url)
{
$doc = JFactory::getDocument();

unset($doc->_links[array_search(array('relation' => 'canonical', 'relType' => 'rel', 'attribs' => array()), $doc->_links)]);

$url = $this->domain.JRoute::_($url);

if($this->current_url != $url)
{
$url = explode('?', $url);
$doc->addHeadLink($url[0], 'canonical');
}
}

А точно unset должен быть до проверки неравенства  $this->current_url и $url? Т.е. получается, что если ссылки равны, плагин вырезает canonical ссылку?
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Канонические ссылки для Joomla 3
« Ответ #28 : 19.11.2012, 13:08:10 »
Цитировать
реализовал адаптеры для различных расширений в виде некоего класса, то можно было бы сделать полный изюм
это входит в планы, кроме этого со временем планируется управление подключением расширениями, их обновлениями и т. д.
Цитировать
А точно unset должен быть до проверки неравенства  $this->current_url и $url? Т.е. получается, что если ссылки равны, плагин вырезает canonical ссылку?
Если это ссылка оригинального материала, которая мы считаем главной страницей этого материала, то тега canonical на странице быть не должно
*

Langoliers

  • Давно я тут
  • 621
  • 67 / 2
  • Если б Я изучал людей, то был бы паразитологом
Re: Канонические ссылки для Joomla 3
« Ответ #29 : 21.11.2012, 07:40:02 »
А почему бы не предложить исправление родного SEF плагина, который Неправильно добавляет этот тег?
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Что хранится в таблице overrider Joomla 3?

Автор web1

Ответов: 2
Просмотров: 199
Последний ответ 04.04.2024, 22:10:48
от web1
reCAPTCHA V2 Google - Для Joomla 3

Автор Alex GOOD

Ответов: 35
Просмотров: 8338
Последний ответ 10.01.2024, 21:41:38
от Vastriet
Joomla 3.10.12 и MySQL 8

Автор designer71

Ответов: 0
Просмотров: 396
Последний ответ 19.10.2023, 11:25:18
от designer71
Почему Joomla не поддерживает формат webp?

Автор Sensession

Ответов: 74
Просмотров: 10625
Последний ответ 03.10.2023, 19:44:42
от fsv
erid в Joomla

Автор newalex

Ответов: 0
Просмотров: 321
Последний ответ 25.09.2023, 18:45:34
от newalex