Новости Joomla

Перевод и публикация интервью на греческом портале Joomla Утро, просматриваешь входящие письма и...

Перевод и публикация интервью на греческом портале Joomla 🇬🇷Утро, просматриваешь входящие письма и изучаешь новости и внезапно обнаруживаешь, что инициатива, которую ты начал, подхватывается другими людьми. 🎉Недавно я взял интервью у Билла (Василиса) Коциаса - руководителя студии, читающего лекции в университете и популяризатора Joomla в Греции.Это интервью из журнала NorrNext, в оригинале на английском, теперь доступно на греческом языке и опубликовано на портале joomla.gr. 🎉До чего же приятно… 😇😊 Работа замечена и с ней посчитали необходимым ознакомить аудиторию страны, в которой Билл читает лекции. И это солнечная Греция - страна, страна, с которой Россию многое связывает. 🇬🇷🇷🇺🕊Смотрю на греческий алфавит и тут же рисуются картины белоснежных зданий в окружении винограда и амфор, красивых женщин в сандалиях и мужественных воинов, охраняющих покой полисов, в которых ученые мужи работают над трудами, позже вошедшими в века. Красиво! 😇Но вернемся к интервью. Из него вы узнаете, что в Греции доля Joomla среди CMS занимает порядка 30-40%. По моему мнению это - самый высокий показатель во всем мире. Также чтение лекций о Joomla в университетах позволит привести новых пользователей и к тому же молодое поколение. Ну и огромное кол-во сертификтатов Билла на стене (смотрим фото в статье) свидетельствует о том, что Joomla может применяться как профессиональный инструмент. 🇬🇷 Интервью на греческом портале (joomla.gr)🌐 Оригинальное интервью (на английском)Что насчет перевода на русский? Увы, времени всего 24 часа в сутках. Я продолжаю готовить новые интервью. Возможно, после завершения выпуска журнала, рассмотрю перевод некоторых интервью на русский. Но я об этом не говорил. 😊 В блоге @eugenius_blog публикую анонсы интересных событий из мира Joomla, интервью, уроки и полезные советы, а также делюсь мыслями:, связанными с разработкой и веб-дизайном.

Обработка HTTP ответа в Joomla 6+. Изменения по сравнению с Joomla 3 - Joomla 5

👩‍💻 Обработка HTTP ответа в Joomla 6+. Изменения по сравнению с Joomla 3 - Joomla 5.В Joomla для выполнения внешних запросов из PHP к сторонним API используется класс Joomla\Http\Http напрямую или же Joomla\Http\HttpFactory, который возвращает для работы преднастроенный по умолчанию класс Http. О работе с HTTP-запросами подробно рассказывалось в статье 2021 года Создание внешних запросов с использованием HttpFactory (Joomla). Некоторые изменения касаются работы с ответами на запросы. Например, наш запрос:
use Joomla\Http\HttpFactory;$http = (new HttpFactory)->getHttp($options, ['curl', 'stream']);$response = $http->get('https://any-url.ru/api/any/endpoint');
Раньше можно было получить код ответа или тело ответа как свойство $response - $response->code или $response->body. Однако, Joomla, начиная с Joomla 4 во многом переходит на стандарты PSR. В частности для работы с HTTP-ответами - на PSR-7. Также хорошая статья на Хабре о PSR-7: PSR-7 в примерах.
Прямое обращение к свойствам code, headers, body объявлено устаревшим в Joomla 6.0.0 и обещают удалить в Joomla 7.0.0.
Вместо этого нужно работать с HTTP-ответом по стандартам PSR-7. Код ответа.Было $response->code. Стало $response->getStatusCode().Заголовки ответа.Было $response->headers. Стало $response->getHeaders().Тело ответа.Было $response->body. Стало (string)$response->getContents().В тело ответа теперь приходит не строка, а поток - объект класса Laminas\Diactoros\Stream. Поэтому его нужно привести к строке (если это json, к примеру): (string)$response->getContents(). Чаще всего в коде Joomla встречается именно такой вариант. Однако, есть и вариант с перемещением указателя чтения на начало потока:
// Получили ответ в виде потока$stream = $response->getBody();// "перемотали" на начало$stream->rewind();// Получили строковый ответ$json = $stream->getContents();
В итоге результат одинаковый.@joomlafeed#joomla #разработка #php

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

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 »
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Не удается разблокировать в менеджере материалов.

Автор vityavoluevich

Ответов: 4
Просмотров: 2186
Последний ответ 24.05.2025, 09:20:18
от azm1n
Вывести модуль в модуле

Автор jimka

Ответов: 2
Просмотров: 1664
Последний ответ 18.04.2025, 15:39:36
от fbr
Не работает менеджер материалов, ошибка 500 SSL certificate problem

Автор Екатерина М

Ответов: 5
Просмотров: 1959
Последний ответ 06.04.2025, 09:27:20
от wishlight
Поменять порядок материалов

Автор tatyana34

Ответов: 3
Просмотров: 1011
Последний ответ 11.12.2024, 16:10:41
от nikolakovach8619
Перенести описание категории вниз страницы

Автор jimka

Ответов: 1
Просмотров: 1218
Последний ответ 18.07.2024, 08:02:46
от Vastriet