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

ALEHAN

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

ALEHAN

  • Осваиваюсь на форуме
  • 30
  • 1 / 0
Знатоки 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, 15:08:21 от ALEHAN »
*

midav

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

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

ALEHAN

  • Осваиваюсь на форуме
  • 30
  • 1 / 0
В 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

  • Давно я тут
  • 926
  • 115 / 1
Не знаю, что Вы там наворотили, у меня всё работает . Условие 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($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;
}
}

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

ALEHAN

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

ALEHAN

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

ALEHAN

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

Vergily

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

midav

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

Vergily

  • Захожу иногда
  • 59
  • 5 / 0
*

Vergily

  • Захожу иногда
  • 59
  • 5 / 0
« Последнее редактирование: 13.11.2015, 16:22:47 от Vergily »
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Как вставить модуль в код нужной страницы php?

Автор zvi

Ответов: 9
Просмотров: 3864
Последний ответ 21.02.2024, 11:03:08
от saynez
Не удается разблокировать в менеджере материалов.

Автор vityavoluevich

Ответов: 0
Просмотров: 238
Последний ответ 10.01.2024, 09:05:30
от vityavoluevich
Убрать из модуля новостей ссылку на статью, на которой выводится модуль

Автор zeus07

Ответов: 3
Просмотров: 722
Последний ответ 08.11.2023, 21:17:26
от GrayAn
Поиск в Материал- Блог категории

Автор mag_num83

Ответов: 1
Просмотров: 322
Последний ответ 14.09.2023, 20:36:34
от beliyadm
Модуль Похожие метки – только более ранние статьи!

Автор Gerostrat

Ответов: 6
Просмотров: 457
Последний ответ 24.08.2023, 21:56:09
от sivers