Новости Joomla

Вышли релизы безопасности Joomla 6.1.3 и Joomla 5.4.8

Релиз безопасности Joomla 6.1.3 и Joomla 5.4.8

Проект Joomla! рад сообщить о выходе Joomla 6.1.3 и Joomla 5.4.8. Это релизы безопасности и исправления ошибок для серий 5.x и 6.x.

👩‍💻 WT Otpravkapochtaru - библиотека сервиса Отправка Почты России для Joomla-разработчиков.

👩‍💻 WT Otpravkapochtaru - библиотека сервиса Отправка Почты России для Joomla-разработчиков.

Joomla 5+ пакет для интеграции с API Почты России: нормализация данных, расчёт доставки, создание отправлений, партии, документы, возвраты, поиск отделений, справочники и SOAP-отслеживание.

v.3.0.0. Что нового?
Это дальнейшее развитие ранее закрытой Joomla-библиотеки для работы с API сервиса Отправка (для бизнеса) Почты России. Поэтому версия не 1.0.0, а 3.0.0.

Сейчас эта библиотека ушла от собственных реализаций и стала Joomla-обёрткой известного PHP SDK от Lapay Group.

Возможности библиотеки.
- получение настроек аккаунта, точек сдачи и текущего остатка запросов к API;
- нормализация адресов, ФИО и телефонов перед созданием отправления;
- расчёт тарифа и срока доставки;
- создание, поиск, изменение, удаление и возврат заказов в состояние «Новые»;
- проверка надёжности получателя;
- создание партий, просмотр партий и заказов внутри партии;
- генерация пакета печатных документов и формы Ф103;
- создание, изменение и удаление возвратных отправлений;
- поиск отделений по индексу, адресу и координатам, получение сервисов отделения;
- локальный список стран;
- SOAP-отслеживание операций по РПО и работа с билетами пакетного трекинга.

👩‍💻 Joomla-возможности.
В пакете библиотеки WT Otpravkapochtaru есть поля Joomla Form для расширений. Они позволяют работать в интерфейсе Joomla с некоторыми типами данных, получаемых по API из вашего личного кабинета в ЛК Почты России для бизнеса.
На данный момент в библиотеке доступны 3 поля списков, которые отображают доступные в аккаунте ОПС, типы и категории отправлений.
Поддерживаются зависимые списки: значение одного поля обновляется при изменении другого.

Системные требования.
Системные требования в основном связаны с системными требованиями апстрима библиотеки - LapayGroup PHP SDK.
- Joomla 5+
- PHP 8.3+
- Расширения PHP:
-- ext-mbstring
-- ext-simplexml
-- ext-soap (опционально, для трекинга)
-- ext-zip

Ссылки:
- Страница расширения
- GitHub библиотеки и документация

@joomlafeed

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

matro-skin

  • Осваиваюсь на форуме
  • 11
  • 0 / 0
Добрый день!
Прошу помощи.
Joomla 3.4.8
Компонент JComments
Использую модуль К2 Content для отображения материалов.
При использовании фильтра "Самые обсуждаемые", К2 Content не отображает материалов.
Скорее всего потому, что видеть должен только комментарии оставленные штатными комментариями от К2.
Но, я то использую JComments.
Подскажте пожалуйста как быть, что делать.
Спасибо!
*

voland

  • Легенда
  • 11026
  • 588 / 112
  • Эта строка съедает место на вашем мониторе
*

matro-skin

  • Осваиваюсь на форуме
  • 11
  • 0 / 0
Использовать другой модуль или переписать этот.
Отличный совет :-)
Может что-то по оригинальнее есть? :-)
*

matro-skin

  • Осваиваюсь на форуме
  • 11
  • 0 / 0
Кстати, какой переписать?
 К2 Content, или JComments?  ^-^
*

voland

  • Легенда
  • 11026
  • 588 / 112
  • Эта строка съедает место на вашем мониторе
*

matro-skin

  • Осваиваюсь на форуме
  • 11
  • 0 / 0
Оригинальное - надо писать.
А может в нужном месте попробовать заменить запросы с #__k2_comments на #__jcomments ?
*

matro-skin

  • Осваиваюсь на форуме
  • 11
  • 0 / 0
Сделал.
Замените свой k2_comments (helper)
на этот:
Код
<?php
/**
 * @version 2.6.x
 * @package K2
 * @author JoomlaWorks http://www.joomlaworks.net
 * @copyright Copyright (c) 2006 - 2014 JoomlaWorks Ltd. All rights reserved.
 * @license GNU/GPL license: http://www.gnu.org/copyleft/gpl.html
 */

// no direct access
defined('_JEXEC') or die;

require_once (JPATH_SITE.DS.'components'.DS.'com_k2'.DS.'helpers'.DS.'route.php');
require_once (JPATH_SITE.DS.'components'.DS.'com_k2'.DS.'helpers'.DS.'utilities.php');

class modK2ContentHelper
{

public static function getItems(&$params, $format = 'html')
{

jimport('joomla.filesystem.file');
$mainframe = JFactory::getApplication();
$limit = $params->get('itemCount', 5);
$cid = $params->get('category_id', NULL);
$ordering = $params->get('itemsOrdering', '');
$componentParams = JComponentHelper::getParams('com_k2');
$limitstart = JRequest::getInt('limitstart');

$user = JFactory::getUser();
$aid = $user->get('aid');
$db = JFactory::getDBO();

$jnow = JFactory::getDate();
$now =  K2_JVERSION == '15'?$jnow->toMySQL():$jnow->toSql();
$nullDate = $db->getNullDate();

if ($params->get('source') == 'specific')
{

$value = $params->get('items');
$current = array();
if (is_string($value) && !empty($value))
$current[] = $value;
if (is_array($value))
$current = $value;

$items = array();

foreach ($current as $id)
{

$query = "SELECT i.*, c.name AS categoryname,c.id AS categoryid, c.alias AS categoryalias, c.params AS categoryparams
FROM #__k2_items as i
LEFT JOIN #__k2_categories c ON c.id = i.catid
WHERE i.published = 1 ";
if (K2_JVERSION != '15')
{
$query .= " AND i.access IN(".implode(',', $user->getAuthorisedViewLevels()).") ";
}
else
{
$query .= " AND i.access<={$aid} ";
}
$query .= " AND i.trash = 0 AND c.published = 1 ";
if (K2_JVERSION != '15')
{
$query .= " AND c.access IN(".implode(',', $user->getAuthorisedViewLevels()).") ";
}
else
{
$query .= " AND c.access<={$aid} ";
}
$query .= " AND c.trash = 0
AND ( i.publish_up = ".$db->Quote($nullDate)." OR i.publish_up <= ".$db->Quote($now)." )
AND ( i.publish_down = ".$db->Quote($nullDate)." OR i.publish_down >= ".$db->Quote($now)." )
AND i.id={$id}";
if (K2_JVERSION != '15')
{
if ($mainframe->getLanguageFilter())
{
$languageTag = JFactory::getLanguage()->getTag();
$query .= " AND c.language IN (".$db->Quote($languageTag).", ".$db->Quote('*').") AND i.language IN (".$db->Quote($languageTag).", ".$db->Quote('*').")";
}
}
$db->setQuery($query);
$item = $db->loadObject();
if ($item)
$items[] = $item;

}
}

else
{
$query = "SELECT i.*,";

if ($ordering == 'modified')
{
$query .= " CASE WHEN i.modified = 0 THEN i.created ELSE i.modified END as lastChanged,";
}

$query .= "c.name AS categoryname,c.id AS categoryid, c.alias AS categoryalias, c.params AS categoryparams";

if ($ordering == 'best')
$query .= ", (r.rating_sum/r.rating_count) AS rating";

if ($ordering == 'comments')
$query .= ", COUNT(comments.id) AS numOfComments";

$query .= " FROM #__k2_items as i RIGHT JOIN #__k2_categories c ON c.id = i.catid";

if ($ordering == 'best')
$query .= " LEFT JOIN #__k2_rating r ON r.itemID = i.id";

if ($ordering == 'comments')
$query .= " LEFT JOIN #__jcomments comments ON comments.object_id = i.id";

if (K2_JVERSION != '15')
{
$query .= " WHERE i.published = 1 AND i.access IN(".implode(',', $user->getAuthorisedViewLevels()).") AND i.trash = 0 AND c.published = 1 AND c.access IN(".implode(',', $user->getAuthorisedViewLevels()).")  AND c.trash = 0";
}
else
{
$query .= " WHERE i.published = 1 AND i.access <= {$aid} AND i.trash = 0 AND c.published = 1 AND c.access <= {$aid} AND c.trash = 0";
}

$query .= " AND ( i.publish_up = ".$db->Quote($nullDate)." OR i.publish_up <= ".$db->Quote($now)." )";
$query .= " AND ( i.publish_down = ".$db->Quote($nullDate)." OR i.publish_down >= ".$db->Quote($now)." )";

if ($params->get('catfilter'))
{
if (!is_null($cid))
{
if (is_array($cid))
{
if ($params->get('getChildren'))
{
$itemListModel = K2Model::getInstance('Itemlist', 'K2Model');
$categories = $itemListModel->getCategoryTree($cid);
$sql = @implode(',', $categories);
$query .= " AND i.catid IN ({$sql})";

}
else
{
JArrayHelper::toInteger($cid);
$query .= " AND i.catid IN(".implode(',', $cid).")";
}

}
else
{
if ($params->get('getChildren'))
{
$itemListModel = K2Model::getInstance('Itemlist', 'K2Model');
$categories = $itemListModel->getCategoryTree($cid);
$sql = @implode(',', $categories);
$query .= " AND i.catid IN ({$sql})";
}
else
{
$query .= " AND i.catid=".(int)$cid;
}

}
}
}

if ($params->get('FeaturedItems') == '0')
$query .= " AND i.featured != 1";

if ($params->get('FeaturedItems') == '2')
$query .= " AND i.featured = 1";

if ($params->get('videosOnly'))
$query .= " AND (i.video IS NOT NULL AND i.video!='')";

if ($ordering == 'comments')
$query .= " AND comments.published = 1";

if (K2_JVERSION != '15')
{
if ($mainframe->getLanguageFilter())
{
$languageTag = JFactory::getLanguage()->getTag();
$query .= " AND c.language IN (".$db->Quote($languageTag).", ".$db->Quote('*').") AND i.language IN (".$db->Quote($languageTag).", ".$db->Quote('*').")";
}
}

switch ($ordering)
{

case 'date' :
$orderby = 'i.created ASC';
break;

case 'rdate' :
$orderby = 'i.created DESC';
break;

case 'alpha' :
$orderby = 'i.title';
break;

case 'ralpha' :
$orderby = 'i.title DESC';
break;

case 'order' :
if ($params->get('FeaturedItems') == '2')
$orderby = 'i.featured_ordering';
else
$orderby = 'i.ordering';
break;

case 'rorder' :
if ($params->get('FeaturedItems') == '2')
$orderby = 'i.featured_ordering DESC';
else
$orderby = 'i.ordering DESC';
break;

case 'hits' :
if ($params->get('popularityRange'))
{
$datenow = JFactory::getDate();
$date =  K2_JVERSION == '15'?$datenow->toMySQL():$datenow->toSql();
$query .= " AND i.created > DATE_SUB('{$date}',INTERVAL ".$params->get('popularityRange')." DAY) ";
}
$orderby = 'i.hits DESC';
break;

case 'rand' :
$orderby = 'RAND()';
break;

case 'best' :
$orderby = 'rating DESC';
break;

case 'comments' :
if ($params->get('popularityRange'))
{
$datenow = JFactory::getDate();
$date =  K2_JVERSION == '15'?$datenow->toMySQL():$datenow->toSql();
$query .= " AND i.created > DATE_SUB('{$date}',INTERVAL ".$params->get('popularityRange')." DAY) ";
}
$query .= " GROUP BY i.id ";
$orderby = 'numOfComments DESC';
break;

case 'modified' :
$orderby = 'lastChanged DESC';
break;

case 'publishUp' :
$orderby = 'i.publish_up DESC';
break;

default :
$orderby = 'i.id DESC';
break;
}

$query .= " ORDER BY ".$orderby;
$db->setQuery($query, 0, $limit);
$items = $db->loadObjectList();
}

$model = K2Model::getInstance('Item', 'K2Model');

if (count($items))
{

foreach ($items as $item)
{
   $item->event = new stdClass;

//Clean title
$item->title = JFilterOutput::ampReplace($item->title);

//Images
if ($params->get('itemImage'))
{

$date = JFactory::getDate($item->modified);
$timestamp = '?t='.$date->toUnix();

if (JFile::exists(JPATH_SITE.DS.'media'.DS.'k2'.DS.'items'.DS.'cache'.DS.md5("Image".$item->id).'_XS.jpg'))
{
$item->imageXSmall = JURI::base(true).'/media/k2/items/cache/'.md5("Image".$item->id).'_XS.jpg';
if ($componentParams->get('imageTimestamp'))
{
$item->imageXSmall .= $timestamp;
}
}

if (JFile::exists(JPATH_SITE.DS.'media'.DS.'k2'.DS.'items'.DS.'cache'.DS.md5("Image".$item->id).'_S.jpg'))
{
$item->imageSmall = JURI::base(true).'/media/k2/items/cache/'.md5("Image".$item->id).'_S.jpg';
if ($componentParams->get('imageTimestamp'))
{
$item->imageSmall .= $timestamp;
}
}

if (JFile::exists(JPATH_SITE.DS.'media'.DS.'k2'.DS.'items'.DS.'cache'.DS.md5("Image".$item->id).'_M.jpg'))
{
$item->imageMedium = JURI::base(true).'/media/k2/items/cache/'.md5("Image".$item->id).'_M.jpg';
if ($componentParams->get('imageTimestamp'))
{
$item->imageMedium .= $timestamp;
}
}

if (JFile::exists(JPATH_SITE.DS.'media'.DS.'k2'.DS.'items'.DS.'cache'.DS.md5("Image".$item->id).'_L.jpg'))
{
$item->imageLarge = JURI::base(true).'/media/k2/items/cache/'.md5("Image".$item->id).'_L.jpg';
if ($componentParams->get('imageTimestamp'))
{
$item->imageLarge .= $timestamp;
}
}

if (JFile::exists(JPATH_SITE.DS.'media'.DS.'k2'.DS.'items'.DS.'cache'.DS.md5("Image".$item->id).'_XL.jpg'))
{
$item->imageXLarge = JURI::base(true).'/media/k2/items/cache/'.md5("Image".$item->id).'_XL.jpg';
if ($componentParams->get('imageTimestamp'))
{
$item->imageXLarge .= $timestamp;
}
}

if (JFile::exists(JPATH_SITE.DS.'media'.DS.'k2'.DS.'items'.DS.'cache'.DS.md5("Image".$item->id).'_Generic.jpg'))
{
$item->imageGeneric = JURI::base(true).'/media/k2/items/cache/'.md5("Image".$item->id).'_Generic.jpg';
if ($componentParams->get('imageTimestamp'))
{
$item->imageGeneric .= $timestamp;
}
}

$image = 'image'.$params->get('itemImgSize', 'Small');
if (isset($item->$image))
$item->image = $item->$image;

}

//Read more link
$item->link = urldecode(JRoute::_(K2HelperRoute::getItemRoute($item->id.':'.urlencode($item->alias), $item->catid.':'.urlencode($item->categoryalias))));

//Tags
if ($params->get('itemTags'))
{
$tags = $model->getItemTags($item->id);
for ($i = 0; $i < sizeof($tags); $i++)
{
$tags[$i]->link = JRoute::_(K2HelperRoute::getTagRoute($tags[$i]->name));
}
$item->tags = $tags;
}

//Category link
if ($params->get('itemCategory'))
$item->categoryLink = urldecode(JRoute::_(K2HelperRoute::getCategoryRoute($item->catid.':'.urlencode($item->categoryalias))));

//Extra fields
if ($params->get('itemExtraFields'))
{
$item->extra_fields = $model->getItemExtraFields($item->extra_fields, $item);
}

//Comments counter
if ($params->get('itemComments'))
$item->numOfComments = $model->countItemComments($item->id);

//Attachments
if ($params->get('itemAttachments'))
$item->attachments = $model->getItemAttachments($item->id);

//Import plugins
if ($format != 'feed')
{
$dispatcher = JDispatcher::getInstance();
JPluginHelper::importPlugin('content');
}

//Video
if ($params->get('itemVideo') && $format != 'feed')
{
$params->set('vfolder', 'media/k2/videos');
$params->set('afolder', 'media/k2/audio');
$item->text = $item->video;
           if (K2_JVERSION == '15')
            {
                $dispatcher->trigger('onPrepareContent', array(&$item, &$params, $limitstart));
            }
            else
            {
                $dispatcher->trigger('onContentPrepare', array('mod_k2_content.', &$item, &$params, $limitstart));
            }
$item->video = $item->text;
}

// Introtext
$item->text = '';
if ($params->get('itemIntroText'))
{
// Word limit
if ($params->get('itemIntroTextWordLimit'))
{
$item->text .= K2HelperUtilities::wordLimit($item->introtext, $params->get('itemIntroTextWordLimit'));
}
else
{
$item->text .= $item->introtext;
}
}

if ($format != 'feed')
{

$params->set('parsedInModule', 1);
// for plugins to know when they are parsed inside this module

$item->event = new stdClass;
$item->event->BeforeDisplay = '';
$item->event->AfterDisplay = '';
$item->event->AfterDisplayTitle = '';
$item->event->BeforeDisplayContent = '';
$item->event->AfterDisplayContent = '';

if ($params->get('JPlugins', 1))
{
//Plugins
if (K2_JVERSION != '15')
{

$item->event->BeforeDisplay = '';
$item->event->AfterDisplay = '';

$dispatcher->trigger('onContentPrepare', array('mod_k2_content', &$item, &$params, $limitstart));

$results = $dispatcher->trigger('onContentAfterTitle', array('mod_k2_content', &$item, &$params, $limitstart));
$item->event->AfterDisplayTitle = trim(implode("\n", $results));

$results = $dispatcher->trigger('onContentBeforeDisplay', array('mod_k2_content', &$item, &$params, $limitstart));
$item->event->BeforeDisplayContent = trim(implode("\n", $results));

$results = $dispatcher->trigger('onContentAfterDisplay', array('mod_k2_content', &$item, &$params, $limitstart));
$item->event->AfterDisplayContent = trim(implode("\n", $results));
}
else
{
$results = $dispatcher->trigger('onBeforeDisplay', array(&$item, &$params, $limitstart));
$item->event->BeforeDisplay = trim(implode("\n", $results));

$results = $dispatcher->trigger('onAfterDisplay', array(&$item, &$params, $limitstart));
$item->event->AfterDisplay = trim(implode("\n", $results));

$results = $dispatcher->trigger('onAfterDisplayTitle', array(&$item, &$params, $limitstart));
$item->event->AfterDisplayTitle = trim(implode("\n", $results));

$results = $dispatcher->trigger('onBeforeDisplayContent', array(&$item, &$params, $limitstart));
$item->event->BeforeDisplayContent = trim(implode("\n", $results));

$results = $dispatcher->trigger('onAfterDisplayContent', array(&$item, &$params, $limitstart));
$item->event->AfterDisplayContent = trim(implode("\n", $results));

$dispatcher->trigger('onPrepareContent', array(&$item, &$params, $limitstart));
}

}
//Init K2 plugin events
$item->event->K2BeforeDisplay = '';
$item->event->K2AfterDisplay = '';
$item->event->K2AfterDisplayTitle = '';
$item->event->K2BeforeDisplayContent = '';
$item->event->K2AfterDisplayContent = '';
$item->event->K2CommentsCounter = '';

if ($params->get('K2Plugins', 1))
{
//K2 plugins
JPluginHelper::importPlugin('k2');
$results = $dispatcher->trigger('onK2BeforeDisplay', array(&$item, &$params, $limitstart));
$item->event->K2BeforeDisplay = trim(implode("\n", $results));

$results = $dispatcher->trigger('onK2AfterDisplay', array(&$item, &$params, $limitstart));
$item->event->K2AfterDisplay = trim(implode("\n", $results));

$results = $dispatcher->trigger('onK2AfterDisplayTitle', array(&$item, &$params, $limitstart));
$item->event->K2AfterDisplayTitle = trim(implode("\n", $results));

$results = $dispatcher->trigger('onK2BeforeDisplayContent', array(&$item, &$params, $limitstart));
$item->event->K2BeforeDisplayContent = trim(implode("\n", $results));

$results = $dispatcher->trigger('onK2AfterDisplayContent', array(&$item, &$params, $limitstart));
$item->event->K2AfterDisplayContent = trim(implode("\n", $results));

$dispatcher->trigger('onK2PrepareContent', array(&$item, &$params, $limitstart));

if ($params->get('itemComments'))
{
$results = $dispatcher->trigger('onK2CommentsCounter', array(&$item, &$params, $limitstart));
$item->event->K2CommentsCounter = trim(implode("\n", $results));
}

}

}

                // Restore the intotext variable after plugins execution
                $item->introtext = $item->text;

//Clean the plugin tags
$item->introtext = preg_replace("#{(.*?)}(.*?){/(.*?)}#s", '', $item->introtext);

//Author
if ($params->get('itemAuthor'))
{
if (!empty($item->created_by_alias))
{
$item->author = $item->created_by_alias;
$item->authorGender = NULL;
$item->authorDescription = NULL;
if ($params->get('itemAuthorAvatar'))
$item->authorAvatar = K2HelperUtilities::getAvatar('alias');
$item->authorLink = Juri::root(true);
}
else
{
$author = JFactory::getUser($item->created_by);
$item->author = $author->name;

$query = "SELECT `description`, `gender` FROM #__k2_users WHERE userID=".(int)$author->id;
$db->setQuery($query, 0, 1);
$result = $db->loadObject();
if ($result)
{
$item->authorGender = $result->gender;
$item->authorDescription = $result->description;
}
else
{
$item->authorGender = NULL;
$item->authorDescription = NULL;
}

if ($params->get('itemAuthorAvatar'))
{
$item->authorAvatar = K2HelperUtilities::getAvatar($author->id, $author->email, $componentParams->get('userImageWidth'));
}
//Author Link
$item->authorLink = JRoute::_(K2HelperRoute::getUserRoute($item->created_by));
}
}

// Extra fields plugins
if (is_array($item->extra_fields))
{
foreach ($item->extra_fields as $key => $extraField)
{
if ($extraField->type == 'textarea' || $extraField->type == 'textfield')
{
$tmp = new JObject();
$tmp->text = $extraField->value;
if ($params->get('JPlugins', 1))
{
if (K2_JVERSION != '15')
{
$dispatcher->trigger('onContentPrepare', array('mod_k2_content', &$tmp, &$params, $limitstart));
}
else
{
$dispatcher->trigger('onPrepareContent', array(&$tmp, &$params, $limitstart));
}
}
if ($params->get('K2Plugins', 1))
{
$dispatcher->trigger('onK2PrepareContent', array(&$tmp, &$params, $limitstart));
}
$extraField->value = $tmp->text;
}
}
}

$rows[] = $item;
}

return $rows;

}

}

}
« Последнее редактирование: 25.01.2016, 12:22:01 от matro-skin »
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Jcomments 5

Автор ProtectYourSite

Ответов: 1
Просмотров: 2093
Последний ответ 28.06.2026, 10:09:38
от ProtectYourSite
Обсуждение JComments 3.0

Автор smart

Ответов: 261
Просмотров: 112209
Последний ответ 14.04.2026, 10:13:11
от alex54
Не отправляются комментарии из JComments 3.0.7.9

Автор akteon25

Ответов: 1
Просмотров: 3709
Последний ответ 21.02.2025, 12:41:06
от NewUsers
152-ФЗ jcomments электронная почта комментатора

Автор basn

Ответов: 1
Просмотров: 3537
Последний ответ 12.02.2025, 12:01:20
от basn
Как отключить капчу в jcomments 4?

Автор Алено4ка

Ответов: 1
Просмотров: 4564
Последний ответ 02.08.2024, 20:53:02
от ProtectYourSite