Предположим у нас имеется блог, базирующийся на сниппете 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="https://www.modx.cc/documentation/additions/getresources/">getResources</a> внутри нашего сниппета SimilarPosts $result = $modx->runSnippet("<a class="myClass" href="https://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 родителя вручную, во время вызова сниппета.
Смотрите также:
Услуги по MODX Revolution
Посмотреть все услуги
Оптимизация сайта
Заказав услуги по технической оптимизации сайта мы избавим вас от ошибок присутствующих на сайте, а так же увеличим скорость работы вашего сайта.
Создание сайта на MODX
Мы создадим для вас такой сайт, который подойдет именно в вашем случае и станет отличным инструментом привлечения клиентов и увеличения продаж.
Перенос сайта на MODX
Работа по переносу сайта на MODX осуществляется в максимально короткие сроки. Стоимость зависит от сложности переносимого сайта
Продвижение сайта на MODX
Если вы хотите получить быстрые и ощутимые результаты, подняться в топ в минимальные сроки, то доверьте нам продвижение своего сайта.