Контактная информация

По всем интересующим вас вопросам связывайтесь при помощи контактной информации приведенной на этой странице!

skype: metsof
email: accusser@gmail.com

В социальных сетях...

Форма обратной связи

Авторизация

MODX статьи, уроки и готовые решения для MODX Revo

Сайдбар

Articles MODX Revolution. Articles похожие статьи

09 нояб. 2012

Предположим у нас имеется блог, базирующийся на сниппете Articles. И нам исключительно нужно рядом с доскональным описанием статьи выводить перечень схожих статей.
При данном схожесть статей обязана складываться путем сопоставления набора тегов нынешней статьи и наборов тегов иных статей.
<В свою очередь более схожие статьи должны выводиться выше собственных конкурентов.
Для исполнения этой задачи необходимо написать простенький сниппет. Именуем его SimilarPosts.
Мысль сниппета заключается в том, чтобы попеременно доставать наборы тегов для статей, которые входят в наш блог. И сопоставлять любой тег текущей статьи с любым тегом рассматриваемого набора. И естественно при совпадении добавлять к счетчику единичку, а потом записывать данное значение в массив для ключа, которое считается id рассматриваемой статьи.

Нужно заметить, что набор тегов для всякой статьи при применении Articles по умолчанию находится в добавочном параметре articlestags. Перейдем конкретно к коду сниппета SimilarPosts.

<code>//диагностика характеристик вызова сниппета
//получение параметра id родителя статьи
$myparentId = isset( $myparentId ) ? $myparentId : $modx->resource->get('parent');
//получение имени шаблона для элемента перечня схожих статей
$tpl = isset( $tpl ) ? $tpl : '';
//получение параметра id текущей странички
$myId = isset( $myId )? $myId: $modx->resource->get('id');
//получение предельной численности элементов в списке схожих статей
$limit= isset( $limit )? $limit: '10';
//проверка введения имя шаблона
if(empty($tpl)){
return 'Ввод имени шаблона для вывода ресурсов: &tpl=`name_tpl`';
}
//получения id дочерних страничек для родителя с id = $myparentIdи depth= 1
$idsAr=$modx->getChildIds($myparentId ,'1',array('1'));
//получение набора тегов текущей страницы
$tagsStr = $modx->resource->getTVValue('articlestags');
//удаляем пробелы внутри строчки (путем обследования на присутствие и подменой на пустоту)
while ( strpos($tagsStr,' ')!==false )
{
$tagsStr = str_replace(' ','',$tagsStr);
};
//проверка на наличие  тегов (тоесть запятая) и разбиение в данном случае строчки на массив тегов
if (strpos($tagsStr,',')!==false){
$tagsAr = explode(",", $tagsStr);
}
//напротив немедленно присваиваем значение тега (в случае если он там один)
else{
$tagsAr[0] = $tagsStr;
}
//в цикле получаем наборы тегов для любого дочернего ресурса из массива $idsAr
foreach ($idsAr as $Id){
$resource = $modx->getObject('modResource', $Id);
$tagsTStr = $resource->getTVValue('articlestags');
while ( strpos($tagsTStr,' ')!==false )
{
$tagsTStr = str_replace(' ','',$tagsTStr);
};
if (strpos($tagsTStr,',')!==false){э
// чистим массив пред записью нового набора тегов
$tagsTAr = array();
$tagsTAr = explode(",", $tagsTStr);
}
else{
$tagsTAr = array();
$tagsTAr[0] = $tagsTStr;
}
//обнуляем счетчик повторений
$count=0;
//перебор всех тегов текущей страницы
foreach ($tagsAras $tag){
//перебир всех тегов для рассматриваемого набора тегов одной из статей
foreach ($tagsTAras $tagT){
//в случае если названия тегов сходятся
if (!strcmp($tagT,$tag)){
$count++;
//вписываем в массив $arr обновленное значение счетчика для ключа $id
$arr[$Id]=$count;
}
}
}
}
//сортируем  массив по значениям счетчиков
arsort($arr);
$i=0;
//производим составление строчки k, которая будет содержать список id схожих статей в порядке убывания значений их счетчиков
foreach ($arr as $key=>$v){
if ($key!==$myId){
$k.=$key;
$k.=',';
}
$i++;
}
//вырезаем заключительную запятую из строчки
$k=substr($k, 0, strlen($k)-1);
//назначаем строчку как параметр выводимых ресурсов
$options['resources'] = $k;
//назначаем строчку как параметра порядка вывода ресурсов
$options['sortby'] = 'FIELD(modResource.id, '.$k.' )';
//id родителя со знаком '-' для того чтобы демонстрировать лишь статьи отмеченные параметром resources
$options['parents'] = '-'.$myparentId;
//непременно включаем скрытые ресурсы (для статей Articles)
$options['showHidden'] = '1';
//шаблон вывода ресурсов
$options['tpl'] = $tpl;
//предельная численность выводимых ресурсов
$options['limit'] = '10';
//применяем отличную функцию runSnippe tдля запуска сниппета <a class="myClass" href="http://www.modx.cc/documentation/additions/getresources/">getResources</a> внутри нашего сниппета SimilarPosts
$result = $modx->runSnippet("<a class="myClass" href="http://www.modx.cc/documentation/additions/getresources/">getResources</a>",$options);
if ($result[0]==''){
return 'Не найдено';
}
//возвращаем результат
return $result;</code>

Далее необходимо только затребовать данный сниппет на страничке, определяя имя шаблона для элемента списка и наибольшую численность элементов (по умолчанию 10):
 
<code>[[!SimilarPost? &tpl=`example-post-tpl` &limit=`20`]]</code>

При данном вызов обязан быть не кэширующий. Таким образом правильнее поступать в основной массе сниппетов разработанных независимо.

В свою очередь можно задать параметры $myparentId (родитель из коего берется из статьи для сопоставления) и $myId (текущая страничка, на ней вызываем сниппет).

Нужно заметить, что в определенных ситуациях может появиться проблема с вызовом (а конкретно при попытке применять сниппет внутри шаблона для getResources):
 
<code>$myparentId = $modx->resource->get('parent');</code>

В следствии этого лучше назначать id родителя вручную, во время вызова сниппета.

Никакого спама, только обновления!!!

Комментарии (0)


    Услуги по MODX Revolution

    Посмотреть все услуги

    Техническая оптимизация сайта

    Подробнее & Заказать

    Создание сайта на MODX Revolution

    Подробнее & Заказать

    Перенос сайта на MODX Revolution

    Подробнее & Заказать

    Продвижение сайта на MODX

    Подробнее & Заказать