Модуль "Похожие метки" показ материалов из произвольной категории

  • 11 Ответов
  • 870 Просмотров

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

*

Оффлайн ALEHAN

Нужен модуль с выводом материалов как в модуле "похожие метки", но только вывод материалов должен быть только из определенной категории материалов.
Уже месяц ищу, нечто похожее нашел в теме http://joomlaforum.ru/index.php/topic,283350.msg1557826.html, но там другая задача ставилась.
То есть грубо говоря нужен фильтр по id категории материалов.

*

Оффлайн ALEHAN

Знатоки SQL подскажите пожалуйста!
helper.php из модуля mod_tags_similar (похожие метки)
Код: (php) [Выделить]
$query = $db->getQuery(true)
->select(
array(
$db->quoteName('m.core_content_id'),
$db->quoteName('m.content_item_id'),
$db->quoteName('m.type_alias'),
'COUNT( ' . $db->quoteName('tag_id'). ') AS ' . $db->quoteName('count'),
$db->quoteName('ct.router'),
$db->quoteName('cc.core_title'),
$db->quoteName('cc.core_alias'),
$db->quoteName('cc.core_catid'),
$db->quoteName('cc.core_language'),
$db->quoteName('cc.core_params')
)
);
Если я правильно понял именно тут идет отбор материалов из базы, я не ошибаюсь, это $db->quoteName('cc.core_catid') поле с записью категории материала? В этой записи нужно что то менять, что бы была выполнена фильтрация по категории?
В mod_tags_similar.xml добавил строки
Код: (xml) [Выделить]
<field name="catid" type="category" extension="com_content" multiple="false" size="5" label="JCATEGORY" description="MOD_ARTICLES_CATEGORY_FIELD_CATEGORY_DESC">
  <option value="">JOPTION_ALL_CATEGORIES</option>
  </field>
Появился выбор категории.
в helper.php добавил
Код: (php) [Выделить]
...
$ordering   = $params->get('ordering', 'count');
$catid = $params->get('catid'); // мой код
$tagsHelper = new JHelperTags;
...;
То есть теперь если не ошибаюсь $catid содержит значение из поля "категория" в настройках модуля.
Как теперь заставить это заработать?)
Помогите несмышленышу.

PS похоже ('cc.core_catid') это категория меток. Копаю дальше(
« Последнее редактирование: 22.05.2015, 17:08:21 от ALEHAN »

*

Оффлайн midav

В XML файле можно указать multiple="true" , тогда можно будет выбирать несколько категорий из списка, а не одну .
В хелпере в запросе добавить условие where :
Код: (php) [Выделить]
if(!empty($catid)){
$query->where('cc.core_catid IN (' . implode(',', $catid). ')');
}

cc.core_catid это таки категория материала, а не меток  ^-^
Ответы на вопросы по CSS . Откройте для себя Firebug

*

Оффлайн ALEHAN

В XML файле можно указать multiple="true" , тогда можно будет выбирать несколько категорий из списка, а не одну .
Изначально так и было, изменил, что бы по проще было.
В хелпере в запросе добавить условие where :
Код: (php) [Выделить]
if(!empty($catid)){
$query->where('cc.core_catid IN (' . implode(',', $catid). ')');
}
А вот тут можно поподробнее? куда бы не вставлял код либо без реакции, либо ошибка в строке, либо SQL ошибка с текстом
Код: (php-brief) [Выделить]
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') GROUP BY `m`.`core_content_id`,`m`.`content_item_id`,`m`.`type_alias`,`ct`.`r' at line 6 SQL=SELECT `m`.`core_content_id`,`m`.`content_item_id`,`m`.`type_alias`,COUNT( `tag_id`) AS `count`,`ct`.`router`,`cc`.`core_title`,`cc`.`core_alias`,`cc`.`core_catid`,`cc`.`core_language`,`cc`.`core_params` FROM `ilocm_contentitem_tag_map` AS `m` INNER JOIN `ilocm_tags` AS `t` ON m.tag_id = t.id INNER JOIN `ilocm_ucm_content` AS `cc` ON m.core_content_id = cc.core_content_id INNER JOIN `ilocm_content_types` AS `ct` ON m.type_alias = ct.type_alias WHERE `m`.`tag_id` IN (3,27,28) AND t.access IN (1,1,5) AND (cc.core_access IN (1,1,5) OR cc.core_access = 0) AND (`m`.`content_item_id` <> 121 OR `m`.`type_alias` <> 'com_content.article') AND `cc`.`core_state` = 1 AND (`cc`.`core_publish_up`='0000-00-00 00:00:00' OR `cc`.`core_publish_up`<='2015-05-22 21:15:05') AND (`cc`.`core_publish_down`='0000-00-00 00:00:00' OR `cc`.`core_publish_down`>='2015-05-22 21:15:05') AND cc.core_catid IN () GROUP BY `m`.`core_content_id`,`m`.`content_item_id`,`m`.`type_alias`,`ct`.`router`,`cc`.`core_title`,`cc`.`core_alias`,`cc`.`core_catid`,`cc`.`core_language`,`cc`.`core_params` ORDER BY `count` DESC LIMIT 0, 20Да и зачем это условие? Я так понял, оно объединяет массив из $catid в строку, но не решает главного - фильтрации материалов по категории.
В модуле "Список материалов категории" вроде вычленил код сортировки, но в данном модуле он похоже работать не будет.

*

Оффлайн midav

Не знаю, что Вы там наворотили, у меня всё работает . Условие where выбирает из базы только те материалы, которые принадлежат к указанной категории .
Код файла helper.php :
Код: (php) [Выделить]
<?php
/**
 * @package     Joomla.Site
 * @subpackage  mod_tags_popular
 *
 * @copyright   Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

use 
Joomla\Registry\Registry;

/**
 * Helper for mod_tags_popular
 *
 * @package     Joomla.Site
 * @subpackage  mod_tags_popular
 * @since       3.1
 */
abstract class ModTagssimilarHelper
{
/**
 * Get a list of tags
 *
 * @param   Registry  &$params  Module parameters
 *
 * @return  mixed  Results array / null
 */
public static function getList(&$params)
{
$app        JFactory::getApplication();
$option     $app->input->get('option');
$view       $app->input->get('view');

// For now assume com_tags and com_users do not have tags.
// This module does not apply to list views in general at this point.
if ($option == 'com_tags' || $view == 'category' || $option == 'com_users')
{
return;
}

$db         JFactory::getDbo();
$user       JFactory::getUser();
$groups     implode(','$user->getAuthorisedViewLevels());
$matchtype  $params->get('matchtype''all');
$maximum    $params->get('maximum'5);
$ordering   $params->get('ordering''count');
$tagsHelper = new JHelperTags;
$prefix     $option '.' $view;
$id         $app->input->getInt('id');
$now        JFactory::getDate()->toSql();
$nullDate   $db->getNullDate();
$catid $params->get('catid');

$tagsToMatch $tagsHelper->getTagIds($id$prefix);

if (!$tagsToMatch || is_null($tagsToMatch))
{
return;
}

$tagCount substr_count($tagsToMatch',') + 1;

$query $db->getQuery(true)
->select(
array(
$db->quoteName('cc.core_images''images'),
$db->quoteName('m.core_content_id'),
$db->quoteName('m.content_item_id'),
$db->quoteName('m.type_alias'),
'COUNT( ' $db->quoteName('tag_id'). ') AS ' $db->quoteName('count'),
$db->quoteName('ct.router'),
$db->quoteName('cc.core_title'),
$db->quoteName('cc.core_alias'),
$db->quoteName('cc.core_catid'),
$db->quoteName('cc.core_language'),
$db->quoteName('cc.core_params'),
)
);

$query->from($db->quoteName('#__contentitem_tag_map''m'));

$query->join('INNER'$db->quoteName('#__tags''t'). ' ON m.tag_id = t.id')
->join('INNER'$db->quoteName('#__ucm_content''cc'). ' ON m.core_content_id = cc.core_content_id')
->join('INNER'$db->quoteName('#__content_types''ct'). ' ON m.type_alias = ct.type_alias');

$query->where($db->quoteName('m.tag_id'). ' IN (' $tagsToMatch ')');
$query->where('t.access IN (' $groups ')');
$query->where('(cc.core_access IN (' $groups ') OR cc.core_access = 0)');

if(!empty($catid)){
$query->where('cc.core_catid IN (' implode(','$catid). ')'); 
}



// Don't show current item
$query->where('(' $db->quoteName('m.content_item_id'). ' <> ' $id
' OR ' $db->quoteName('m.type_alias'). ' <> ' $db->quote($prefix). ')');

// Only return published tags
$query->where($db->quoteName('cc.core_state'). ' = 1 ')
->where('(' $db->quoteName('cc.core_publish_up'). '=' $db->quote($nullDate). ' OR '
$db->quoteName('cc.core_publish_up'). '<=' $db->quote($now). ')')
->where('(' $db->quoteName('cc.core_publish_down'). '=' $db->quote($nullDate). ' OR '
$db->quoteName('cc.core_publish_down'). '>=' $db->quote($now). ')');

// Optionally filter on language
$language JComponentHelper::getParams('com_tags')->get('tag_list_language_filter''all');

if ($language != 'all')
{
if ($language == 'current_language')
{
$language JHelperContent::getCurrentLanguage();
}

$query->where($db->quoteName('cc.core_language'). ' IN (' $db->quote($language). ', ' $db->quote('*'). ')');
}

$query->group(
$db->quoteName(
array('m.core_content_id''m.content_item_id''m.type_alias''ct.router''cc.core_title',
'cc.core_alias''cc.core_catid''cc.core_language''cc.core_params')
)
);

if ($matchtype == 'all' && $tagCount 0)
{
$query->having('COUNT( ' $db->quoteName('tag_id'). ')  = ' $tagCount);
}
elseif ($matchtype == 'half' && $tagCount 0)
{
$tagCountHalf ceil($tagCount 2);
$query->having('COUNT( ' $db->quoteName('tag_id'). ')  >= ' $tagCountHalf);
}

if ($ordering == 'count' || $ordering == 'countrandom')
{
$query->order($db->quoteName('count'). ' DESC');
}

if ($ordering == 'random' || $ordering == 'countrandom')
{
$query->order('RAND()');
}

$db->setQuery($query0$maximum);
$results $db->loadObjectList();

foreach ($results as $result)
{
$explodedAlias explode('.'$result->type_alias);
$result->link 'index.php?option=' $explodedAlias[0] . '&view=' $explodedAlias[1]
'&id=' $result->content_item_id '-' $result->core_alias;

$result->core_params = new Registry($result->core_params);
}

return $results;
}
}

Ответы на вопросы по CSS . Откройте для себя Firebug

*

Оффлайн ALEHAN

Долго ломал голову, перебирал каждую строчку кода, сравнивал с исходным модулем, что только не перепробовал, и когда уже решил писать сюда, что ничего не выходит, зашел в настройки модуля и пересохранил. Все заработало! Спасибо тебе огромное! Почти месяц мытарств закончился!

*

Оффлайн ALEHAN

все, разобрался, если кому понадобится пишите, в сборе выложу архив модуля.
« Последнее редактирование: 23.05.2015, 17:35:45 от ALEHAN »

*

Оффлайн ALEHAN

midav, вот у меня уже 10 сообщений набралось, теперь могу плюсовать, чем и воспользовался. Сделал установочный пакет, теперь модуль ставится как любой другой. Пользуйтесь
https://yadi.sk/d/rtXKkasOgpjL4

*

Оффлайн Vergily

Подскажите, как в этом модуле убрать ограничение на количество выводимых материалов. Например в списке  Кол-во элементов добавить
 0 - без ограничений по количеству?

*

Оффлайн midav

В XML файле модуля в параметре maximum - first  указать начальное значение 0 .
Код: (xml) [Выделить]
<fieldset name="basic">
<field
name="maximum"
type="integer"
default="5"
first="0"
Ответы на вопросы по CSS . Откройте для себя Firebug

*

Оффлайн Vergily


*

Оффлайн Vergily

« Последнее редактирование: 13.11.2015, 18:22:47 от Vergily »