Форум русской поддержки Joomla!® CMS
09.12.2016, 19:30:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

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

 (Прочитано 675 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ALEHAN
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 29


« : 18.05.2015, 17:07:46 »

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

Репутация: +1/-0
Offline Offline

Сообщений: 29


« Ответ #1 : 22.05.2015, 13:45:42 »

Знатоки SQL подскажите пожалуйста!
helper.php из модуля mod_tags_similar (похожие метки)
Код
$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 добавил строки
Код
<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 добавил
Код
...
$ordering   = $params->get('ordering', 'count');
$catid = $params->get('catid'); // мой код
$tagsHelper = new JHelperTags;
...;
То есть теперь если не ошибаюсь $catid содержит значение из поля "категория" в настройках модуля.
Как теперь заставить это заработать?)
Помогите несмышленышу.

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

Репутация: +113/-1
Offline Offline

Пол: Мужской
Сообщений: 946



« Ответ #2 : 22.05.2015, 22:30:25 »

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

cc.core_catid это таки категория материала, а не меток  Smiley
Записан
ALEHAN
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 29


« Ответ #3 : 23.05.2015, 01:24:49 »

В XML файле можно указать multiple="true" , тогда можно будет выбирать несколько категорий из списка, а не одну .
Изначально так и было, изменил, что бы по проще было.
В хелпере в запросе добавить условие where :
Код
if(!empty($catid)){
$query->where('cc.core_catid IN (' . implode(',', $catid). ')');
}
 
А вот тут можно поподробнее? куда бы не вставлял код либо без реакции, либо ошибка в строке, либо SQL ошибка с текстом
Код
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
Живу я здесь
******

Репутация: +113/-1
Offline Offline

Пол: Мужской
Сообщений: 946



« Ответ #4 : 23.05.2015, 09:33:33 »

Не знаю, что Вы там наворотили, у меня всё работает . Условие where выбирает из базы только те материалы, которые принадлежат к указанной категории .
Код файла helper.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($query, 0, $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;
}
}
 
 
Записан
ALEHAN
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 29


« Ответ #5 : 23.05.2015, 15:35:27 »

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

Репутация: +1/-0
Offline Offline

Сообщений: 29


« Ответ #6 : 23.05.2015, 16:23:50 »

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

Репутация: +1/-0
Offline Offline

Сообщений: 29


« Ответ #7 : 23.05.2015, 20:34:55 »

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

Репутация: +5/-0
Offline Offline

Пол: Мужской
Сообщений: 60


« Ответ #8 : 12.11.2015, 15:18:45 »

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

Репутация: +113/-1
Offline Offline

Пол: Мужской
Сообщений: 946



« Ответ #9 : 12.11.2015, 22:52:15 »

В XML файле модуля в параметре maximum - first  указать начальное значение 0 .
Код
			<fieldset name="basic">
<field
name="maximum"
type="integer"
default="5"
first="0"
 
Записан
Vergily
Осваиваюсь на форуме
***

Репутация: +5/-0
Offline Offline

Пол: Мужской
Сообщений: 60


« Ответ #10 : 13.11.2015, 15:47:42 »

Спасибо!!
Записан
Vergily
Осваиваюсь на форуме
***

Репутация: +5/-0
Offline Offline

Пол: Мужской
Сообщений: 60


« Ответ #11 : 13.11.2015, 16:58:39 »

Все работает
« Последнее редактирование: 13.11.2015, 17:22:47 от Vergily » Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet