Новости Joomla

Вышел плагин CFI v.2.0.0 - экспорт/импорт материалов Joomla в таблицы.

Вышел плагин CFI v.2.0.0 - экспорт/импорт материалов Joomla в таблицы.

Плагин позволяет делать экспорт материалов Joomla в CSV файл, после чего вы можете отредактировать данные в табличном редакторе (например, Excel или OpenOffice Calc) и затем загрузить файл обратно. В некоторых случаях это удобнее и быстрее.

Плагин позволяет выгружать ID тегов, а также работать с пользовательскими полями материалов Joomla и обычно нередактируемыми свойствами материалов: просмотры, дата изменения и т.д.

Первые версии плагина CFI создал разработчик AlekVolsk для Joomline. Он разработал версии 1.0.0–1.0.16 для Joomla 3. Затем, в 2026 году, плагин был передан компании WebTolk для дальнейшего развития.

CFI v.2.0.0 — Что нового?

  1. Рефакторинг. Плагин полностью переписан заново.
  2. Новый интерфейс импорта/экспорта. Экспорт и импорт открываются в модальном окне. Появилась возможность выбора свойств материала, тегов и пользовательских полей для экспорта непосредственно перед началом экспорта.
  3. Фильтрация материалов при экспорте. Вы можете отфильтровать нужные материалы с помощью стандартных параметров поиска в панели администратора и экспортировать только их: избранные, опубликованные, материалы из определённых категорий, с заданным тегом и т.д.
  4. Импорт и экспорт всех данных материала. Ранее плагин позволял экспортировать только часть данных. Теперь можно изменять все данные материала, доступные в форме редактирования, включая нередактируемые (просмотры, дата изменения и др.). Это позволяет быстро обновлять meta-description или только данные пользовательских полей.
  5. Импорт только пользовательских полей. Обязательным полем для импорта остаётся только articleid. Это позволяет импортировать исключительно данные пользовательских полей без изменения основного содержимого материала.
  6. Joomla 6. Плагин переписан в соответствии с актуальной архитектурой Joomla 4+ и успешно протестирован на Joomla 6.
  7. Для разработчиков: предобработка плагинами. Возможна обработка данных собственными плагинами группы cfi непосредственно перед импортом или экспортом. Доступные события:
    • onExportPrepareData($event)
    • onImportPrepareArticleData($event)

Системные требования

  • Joomla 4.3+
  • PHP 8.1+

Для обновления со старых версий выпущен релиз 1.0.16, в котором добавлен новый сервер обновлений.

Ссылки

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

antarey

  • Захожу иногда
  • 168
  • 1 / 0
В статье есть дополнительное поле.
Для фильтра использую JL Content Fields Filter https://joomline.ru/rasshirenija/moduli/jlcontentfieldsfilter.html
Как бы работает, но у меня есть статьи в архиве, и модуль их в упор не видит.
Как переделать запрос, чтобы выводились статьи из архива?
вот код mod_jlcontentfieldsfilter.php
Код
<?php
/**
 * JL Content Fields Filter
 *
 * @version 1.7.0
 * @author Joomline
 * [member=126442]copyright[/member] (C) 2017-2019 Arkadiy Sedelnikov, Joomline. All rights reserved.
 * @license GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

// Include the helper.
require_once __DIR__ . '/helper.php';
require_once JPATH_ROOT. '/components/com_content/helpers/route.php';

$app = JFactory::getApplication();
$input = $app->input;

$option = $input->getString('option', '');
$view = $input->getString('view', '');
$catid = $input->getInt('catid', 0);
$id = $input->getInt('id', 0);

if($view == 'category')
{
$catid = $id;
}

$jlContentFieldsFilter = $app->getUserStateFromRequest($option.'.cat_'.$catid.'.jlcontentfieldsfilter', 'jlcontentfieldsfilter', array(), 'array');

$allowedCats = $params->get('categories', array());
$allowedContactCats = $params->get('contact_categories', array());
$moduleclass_sfx = $params->get('moduleclass_sfx', '');
$form_method = $params->get('form_method', 'post');
$autho_send = (int)$params->get('autho_send', 0);
$ajax = (int)$params->get('ajax', 0);
$ajax_selector = $params->get('ajax_selector', '#content');
$enableOrdering = $params->get('enable_ordering', 0);
$ajax_loader = $params->get('ajax_loader', '');
$ajax_loader = !empty(($ajax_loader))? JUri::root().$ajax_loader : '';
$ajax_loader_width = (int)$params->get('ajax_loader_width', 32);

if(
!in_array($option, array('com_content', 'com_contact'))
    || ($option == 'com_content' && !(!count($allowedCats) || in_array($catid, $allowedCats) || $allowedCats[0] == -1))
    || ($option == 'com_contact' && !(!count($allowedContactCats) || in_array($catid, $allowedContactCats) || $allowedContactCats[0] == -1))
|| $catid == 0
)
{
    return;
}
if($option == 'com_content'){
$action = JRoute::_(ContentHelperRoute::getCategoryRoute($catid));
}
else{
$action = JRoute::_(ContactHelperRoute::getCategoryRoute($catid));
}

$fields = ModJlContentFieldsFilterHelper::getFields($params, $catid, $jlContentFieldsFilter, $module->id, $option);

if(count($fields)){
if($enableOrdering){
$selectedOrdering = !empty($jlContentFieldsFilter['ordering'])? $jlContentFieldsFilter['ordering'] : '';
$orderingSelect = ModJlContentFieldsFilterHelper::getOrderingSelect($selectedOrdering, $module->id, $option);
}
require JModuleHelper::getLayoutPath('mod_jlcontentfieldsfilter', $params->get('layout', 'default'));
}

и хелпер
Код
<?php
/**
 * JL Content Fields Filter
 *
 * @version 1.7.0
 * @author Joomline
 * [member=126442]copyright[/member] (C) 2017-2019 Arkadiy Sedelnikov, Joomline. All rights reserved.
 * @license GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

require_once JPATH_ROOT. '/administrator/components/com_fields/helpers/fields.php';

class ModJlContentFieldsFilterHelper
{
public static function getFields($params, $category_id, $values, $moduleId, $option)
{
$app = JFactory::getApplication();
$fields = array();
$template = $app->getTemplate();

$context = '';

if($option == 'com_content'){
$context = 'com_content.article';
}
else if($option == 'com_contact'){
$context = 'com_contact.contact';
}


$item = new stdClass();
$item->language = $app->getLanguage()->getTag();
$item->catid = $category_id;

$fields = FieldsHelper::getFields($context, $item);
if(count($fields)){
$fieldIds = array_map(
function ($f)
{
return $f->id;
},
$fields
);

$new = array();
            $usedFieldIds = array();

foreach ($fields as $key => $original)
{
    if(in_array($original->id, $usedFieldIds)){
        continue;
                }
                $usedFieldIds[] = $original->id;
$field = clone $original;
$field->value = isset($values[$field->id])? $values[$field->id] : '';
$field->rawvalue = $field->value;

$content_filter = $original->params->get('content_filter', '');

$disabled_categories = $original->params->get('disabled_categories', array());
if (in_array($category_id, $disabled_categories))
{
continue;
}

if(empty($content_filter)){
unset($fieldIds[$key]);
continue;
}

$filter_layout = $original->params->get('filter_layout', '');
if(!empty($filter_layout)) {
$filter_layout = explode(':', $filter_layout);
$src = $filter_layout[0];
$layout = $filter_layout[1];
}
else {
$layout = $content_filter;
$src = '_';
}

$basePath = $src === '_'
? (
is_file(JPATH_ROOT.'/templates/'.$template.'/html/layouts/mod_jlcontentfieldsfilter/'.$layout.'.php')
? JPATH_ROOT.'/templates/'.$template.'/html/layouts'
: JPATH_ROOT.'/modules/mod_jlcontentfieldsfilter/layouts'
)
: (
is_file(JPATH_ROOT.'/templates/'.$src.'/html/layouts/mod_jlcontentfieldsfilter/'.$layout.'.php')
? JPATH_ROOT.'/templates/'.$src.'/html/layouts'
: JPATH_ROOT.'/modules/mod_jlcontentfieldsfilter/layouts'
);

$displayData = array('field' => $field, 'params' => $params, 'moduleId' => $moduleId, 'rangedata' => array());

if(preg_match("/^range?.*?$/isu", $layout)) {
$displayData = self::addRangeData($displayData, $category_id, $option);
}

$new[$key] = JLayoutHelper::render(
'mod_jlcontentfieldsfilter.'.$layout,
$displayData,
$basePath,
array('component' => 'auto', 'client' => 0, 'suffixes' => array())
);
}
$fields = $new;
}
return $fields;
}

private static function addRangeData($displayData, $category_id, $option){
$field = $displayData['field'];
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('MIN(CAST(`value` AS SIGNED)) AS `min`, MAX(CAST(`value` AS SIGNED)) AS `max`')
      ->from('`#__fields_values`')
      ->where('`field_id` ='.(int)$field->id)
      ->where('`field_id` ='.(int)$field->id)
;
$subquery = '';
if($option == 'com_content'){
$subquery = 'SELECT `id` FROM `#__content` WHERE `catid` = '.(int)$category_id;
}
else if($option == 'com_contact'){
$subquery = 'SELECT `id` FROM `#__contact_details` WHERE `catid` = '.(int)$category_id;
}
if(!empty($subquery)){
$query->where('`item_id` IN ('.$subquery.')');
}
$result = $db->setQuery($query)->loadObject();
$displayData['min'] = !empty($result->min)? (int)$result->min : '';
$displayData['max'] = !empty($result->max)? (int)$result->max : '';
return $displayData;
}

public static function getOrderingSelect($selectedOrdering, $moduleId, $option){
$app = JFactory::getApplication();
$template = $app->getTemplate();

$options = array();
if($option == 'com_content'){
$options[] = JHtml::_('select.option', '', JText::_('MOD_JLCONTENTFIELDSFILTER_ORDERING_DEFAULT'));
$options[] = JHtml::_('select.option', 'ordering.asc', JText::_('MOD_JLCONTENTFIELDSFILTER_ORDERING_ASC'));
$options[] = JHtml::_('select.option', 'ordering.desc', JText::_('MOD_JLCONTENTFIELDSFILTER_ORDERING_DESC'));
$options[] = JHtml::_('select.option', 'title.asc', JText::_('MOD_JLCONTENTFIELDSFILTER_TITLE_ASC'));
$options[] = JHtml::_('select.option', 'title.desc', JText::_('MOD_JLCONTENTFIELDSFILTER_TITLE_DESC'));
$options[] = JHtml::_('select.option', 'created.asc', JText::_('MOD_JLCONTENTFIELDSFILTER_CREATED_ASC'));
$options[] = JHtml::_('select.option', 'created.desc', JText::_('MOD_JLCONTENTFIELDSFILTER_CREATED_DESC'));
$options[] = JHtml::_('select.option', 'created_by.asc', JText::_('MOD_JLCONTENTFIELDSFILTER_CREATED_BY_ASC'));
$options[] = JHtml::_('select.option', 'created_by.desc', JText::_('MOD_JLCONTENTFIELDSFILTER_CREATED_BY_DESC'));
$options[] = JHtml::_('select.option', 'hits.asc', JText::_('MOD_JLCONTENTFIELDSFILTER_HITS_ASC'));
$options[] = JHtml::_('select.option', 'hits.desc', JText::_('MOD_JLCONTENTFIELDSFILTER_HITS_DESC'));
}
else if($option == 'com_contact'){
$options[] = JHtml::_('select.option', '', JText::_('MOD_JLCONTENTFIELDSFILTER_ORDERING_DEFAULT'));
$options[] = JHtml::_('select.option', 'ordering.asc', JText::_('MOD_JLCONTENTFIELDSFILTER_ORDERING_ASC'));
$options[] = JHtml::_('select.option', 'ordering.desc', JText::_('MOD_JLCONTENTFIELDSFILTER_ORDERING_DESC'));
$options[] = JHtml::_('select.option', 'name.asc', JText::_('MOD_JLCONTENTFIELDSFILTER_NAME_ASC'));
$options[] = JHtml::_('select.option', 'name.desc', JText::_('MOD_JLCONTENTFIELDSFILTER_NAME_DESC'));
$options[] = JHtml::_('select.option', 'position.asc', JText::_('MOD_JLCONTENTFIELDSFILTER_POSITION_ASC'));
$options[] = JHtml::_('select.option', 'position.desc', JText::_('MOD_JLCONTENTFIELDSFILTER_POSITION_DESC'));
$options[] = JHtml::_('select.option', 'hits.asc', JText::_('MOD_JLCONTENTFIELDSFILTER_HITS_ASC'));
$options[] = JHtml::_('select.option', 'hits.desc', JText::_('MOD_JLCONTENTFIELDSFILTER_HITS_DESC'));
}

$basePath = is_file(JPATH_ROOT.'/templates/'.$template.'/html/layouts/mod_jlcontentfieldsfilter/ordering.php')
? JPATH_ROOT.'/templates/'.$template.'/html/layouts'
: JPATH_ROOT.'/modules/mod_jlcontentfieldsfilter/layouts';

$html = JLayoutHelper::render(
'mod_jlcontentfieldsfilter.ordering',
array('options' => $options, 'selected' => $selectedOrdering, 'moduleId' => $moduleId),
$basePath,
array('component' => 'auto', 'client' => 0)
);

return $html;
}
}

*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
Тут запрос в базу менять надо.
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

antarey

  • Захожу иногда
  • 168
  • 1 / 0
@Septdir
ето я понял, только на какой, и где? В самом модуле или в joomle?
Архивные статьи от обычных отличаются в поле state=2. Пробовал изменить запрос - не вышло ничего
*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
@Septdir
ето я понял, только на какой, и где? В самом модуле или в joomle?
Архивные статьи от обычных отличаются в поле state=2. Пробовал изменить запрос - не вышло ничего
В плагине https://github.com/Joomline/JlContentFieldsFilter/blob/master/plg_system_jlcontentfieldsfilter/models/com_content/category.php
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

antarey

  • Захожу иногда
  • 168
  • 1 / 0
@Septdir
Спасибо завтра посмотрю.
Если я правильно понял - ето переоредиление com_content?
*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
@Septdir
Спасибо завтра посмотрю.
Если я правильно понял - ето переоредиление com_content?
Оно самое
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

antarey

  • Захожу иногда
  • 168
  • 1 / 0
@Septdir
Спасибо.
Если можна, поморочу еще немного голову.
Можете указать с какой по какую строку меняли, чтобы не сравнивать весь код.
У меня первично идет фильтр по доп.полю а потом выбор категории статей- как сработает выборка из базы если в фильтре укажу доп.поле статьи из архива и конкретную категорию? Покажутся только категории архива с доп.полем или все статьи с етой категории?
И последний вопрос - можно как-то задать для данного модуля JL Content Fields Filter значение по умолчанию при загрузке страницы?
Заранее спасибо.
*

antarey

  • Захожу иногда
  • 168
  • 1 / 0
Я так понял Вы разработчик расширения?
*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
Я так понял Вы разработчик расширения?
Не. Просто знаю как оно работает.
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

antarey

  • Захожу иногда
  • 168
  • 1 / 0
@Septdir
Я сравнил два файла - все чем они отличаются так ето версией. Вы точно в category.php правили?
*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
@Septdir
Я сравнил два файла - все чем они отличаются так ето версией. Вы точно в category.php правили?
Я ничего и не правил. Вам просто скинул файл. Хотя скорее всего придётся вообще articles php переопределять
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

antarey

  • Захожу иногда
  • 168
  • 1 / 0
В смысле articles php самой Joomla?
*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
В смысле articles php самой Joomla?
Да потому что сам запрос там.
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

antarey

  • Захожу иногда
  • 168
  • 1 / 0
Ясно. Спасибо
*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
@antarey я тут подумал. Теоритически можно тут передвать массив (1,2) и тогда будет и архивные выводиться.
https://github.com/Joomline/JlContentFieldsFilter/blob/master/plg_system_jlcontentfieldsfilter/models/com_content/category.php#L242
Но только в условия какие нибудь оберните.
« Последнее редактирование: 11.04.2019, 19:49:40 от Septdir »
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

antarey

  • Захожу иногда
  • 168
  • 1 / 0
category_id ето ж вроде категория а не стус архив/не архив
*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
category_id ето ж вроде категория а не стус архив/не архив
На одну строку ниже
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

Mitriy

  • Захожу иногда
  • 86
  • 0 / 0
Фильтрация происходит с условием AND, а можно ли поменять на OR?
То есть, выводить материалы в которых есть хотя бы одно нужное поле
*

Mitriy

  • Захожу иногда
  • 86
  • 0 / 0

Не. Просто знаю как оно работает.
Фильтрация происходит с условием AND, а можно ли поменять на OR?
То есть, выводить материалы в которых есть хотя бы одно нужное поле
*

Vastriet

  • Захожу иногда
  • 405
  • 11 / 0
посмотрите файлы там поменяйте условие
но если память не тзменяет был выбор и или
*

Mitriy

  • Захожу иногда
  • 86
  • 0 / 0
посмотрите файлы там поменяйте условие
но если память не тзменяет был выбор и или
прошел по файлам - не нашел. Подскажите в каком именно. Есть же модуль, плагин, компонент
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

[Решено] Вывод значений из custom fields материала в модуле по имени поля

Автор goga_pgasovav

Ответов: 3
Просмотров: 1566
Последний ответ 30.12.2024, 13:22:11
от goga_pgasovav
Делаю запрос к базе к полю images, выдает пустые значения а они есть там

Автор Dolphin4ik_1

Ответов: 1
Просмотров: 706
Последний ответ 14.07.2022, 12:48:33
от sivers
Допилить интернет магазин

Автор joker992

Ответов: 1
Просмотров: 618
Последний ответ 02.05.2022, 08:33:14
от NewUsers
Как посчитать материалы в модуле с учетом плагина Content Multicategories?

Автор R31rus

Ответов: 0
Просмотров: 672
Последний ответ 24.11.2021, 13:23:03
от R31rus
Сохранить не удалось из-за ошибки: The content exceeds allowed limits

Автор alexbbb

Ответов: 0
Просмотров: 821
Последний ответ 28.09.2021, 15:02:31
от alexbbb