Новости Joomla

Process Forge — фреймворк для создания AI-процессов.

Process Forge — фреймворк для создания AI-процессов.

На новогодних каникулах 2026 в одном из чатов Joomla-сообщества коллега по цеху поделился промптом для ИИ-агента и результатом этого промпта. За неделю до этого он впервые попробовал Gemini CLI. Я до этого ИИ пользовался только в веб версиях и в целом меня это устраивало. Увидев простыню текста, запрос в CLI и простыню ответа первое, что меня охватило: "Я НЕ ХОЧУ вот это всё изучать! Опять что-то новое, надоело...".

Потом были стадии проб и ошибок, попыток использовать готовые пакеты community skills с гитхаба с ролевым внушением "ты супер-пупер мега-бэкенд-Joomla разработчик с 40-летним опытом, сделай мне красиво". Где-то в середине этого полугодия я стал формализовать свои процессы (а это не только разработка, но и SEO, аналитика, бизнес-аналитика, проработка и выстраивание процессов и т.д., но в итоге это, как правило, или связано с или ведёт к сайту на Joomla). Формализация привела к моему пониманию некоторых базисов, которые общие для всех процессов. Об этом чуть ниже.

Теперь я хочу представить на суд уважаемой публике свои наработки по фреймворку для создания формализованных процессов работы для ИИ-агентов - Process Forge.

- Читать статью на Хабре
- Process Forge (GitHub)

@joomlafeed

Компонент Joomla 6: Генератор LLMs.txt.

Компонент Joomla 6: Генератор LLMs.txt.

Компонент Joomla 6: Генератор LLMs.txt.

Ещё один генератор ИИ-файлов llms.txt и llms-full.txt.

Основные особенности/возможности компонента:

  • Генерация по стандарту: Автоматическое создание файла-визитки llms.txt и расширенной версии llms-full.txt с аннотированным списком материалов.
  • Интеллектуальная работа с контентом: Компонент использует мета-описания (Meta Description) из статей и пунктов меню, превращая SEO-настройки сайта в качественный контекст для нейросетей.
  • Просмотреть результат генерации файлов можно сразу в рабочей области компонента. После внесения корректив (через Настройки компонента. При отладке лучше открыть три вкладки в браузере: Настройка — Геренация/Превью — Список Материалов/Категории/Меню.) — проводим перегенерацию, смотрим результат до полной «победы».
  • Автоматизация и безопасность: Синхронизация с sitemap.xml, группировка по категориям и автоматическое создание резервных копий (.bak) при каждой генерации.
  • Гибкое управление: Возможность исключения определенных категорий и/или статей и/или пунктов меню, а также простая настройка через стандартную админпанель Joomla.
  • Подробное руководство/справка: Пошаговая инструкция для пользователя в Настройках компонента для редакторов с базовым знанием администрирования Joomla.

👉 Важно учесть.
1️⃣ Компонент Генератор LLMs.txt изначально составляет базовый список ссылок на основе sitemap.xml и сверяется с ним на предмет: запрета индексации url в robots.txt, тегов noinex/nofollow. Это экономит время на проверку «закрыть от индексации», поскольку компонент генерации Sitemap.xml уже реализовал эту задачу. Посему, формирование ссылок для ИИ имеет комплексный подход, составление грамотного/валидного/релевантного sitemap.xml никто не отменял.

2️⃣ Тексты-описания ссылок формируются из Meta Description com_content (только компонент Материалы) и выбранных пользователем Меню сайта. Важно, чтобы Meta Description были уникальными и релевантными, соответствовали базовому seo. Составленные «на отшибись» Description для ИИ — «не катит» (впрочем, для поисковых систем они тоже «не канали»).

Разработчик - участник нашего сообщества Александр Кузнецов (@newvksan).

Страница расширения

@joomlafeed

#joomla #ии #ai

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

moonaway

  • Осваиваюсь на форуме
  • 26
  • 0 / 0
Как-то было делать нечего и я решил исправить ту вопиющую несправедливость, которая возникла с дружбой AdsManager и JomSocial. C CommunityBuilder дружит нативно, а с JomSocial нет. Казалось бы, что сложного брать поля из JS так же как из CB? Но на самом деле все упирается в то, что поля AdsManager изначально были построены по архитектуре поле CommunityBuilder - они имеют совершенно одинаковые таблицы! Засада, но мы не унываем и планомерно дорабатываем штатные функции до рабочего состояния.
Полную работоспособность данного решения я не гарантирую, но максимальную подгонку обещать могу.

Итак, дано: JomSoical 4.2.5 и AdsManager 3.1.6 Gold.

Что нам нужно?
- Чтобы вот тут в бекенде:

И на фронтенде соответственно брались нужные значения из указанных полей JS.

Делаем следующие:
1. берем файл \components\com_adsmanager\views\edit\view.html.php
и в строке, где берутся доп.поля профиля из CB мы берем поля из профиля JS новой функцией getJSProfile по аналогии с getCBProfile
Код
if ($conf->comprofiler == 0) {	
$profile = $usermodel->getProfile($user->id);
} else {
if (COMMUNITY_BUILDER == 1) {
$profile = $usermodel->getCBProfile($user->id);
}
if (JOMSICAL == 1) {
$profile = $usermodel->getJSProfile($user->id);
} else {
$profile = new stdClass();
}
}

2. Создаем новую функцию  getJSProfile рядом с getCBProfile в \administrator\components\com_adsmanager\models\user.php
Код
function getJSProfile($userid) {
$this->_db->setQuery("SELECT u.name AS name, u.email as email FROM #__users AS u WHERE u.id=".(int)$userid);
$user = $this->_db->loadObject();
$this->_db->setQuery("SELECT fv.value AS value, f.name AS cbname FROM d44qz_adsmanager_fields AS f LEFT JOIN d44qz_community_fields_values AS fv ON f.cb_field = fv.field_id WHERE f.cb_field !='-1' AND f.published = 1 AND fv.user_id =".(int)$userid);
$rows = $this->_db->loadObjectList();
$new = array();

foreach ($rows as $row) {
$new[$row->cbname] = $row->value;
}

$user = (object)(array_merge((array)$user, $new));

return $user;
}

3. в файле \administrator\components\com_adsmanager\models\content.php
находим getContents и дописываем условие для JS
Код
function getContents($filters = null,$limitstart=null,$limit=null,$filter_order=null,$filter_order_Dir=null,$admin=0,$favorite=0) {
$sql = "SELECT a.*, p.name as parent, p.id as parentid, c.name as cat, c.id as catid,u.username as user,u.name as fullname ".
" FROM #__adsmanager_ads as a ".
" INNER JOIN #__adsmanager_adcat as adcat ON adcat.adid = a.id ";
if (COMMUNITY_BUILDER == 1)
$sql .= " LEFT JOIN #__comprofiler as cb ON cb.user_id = a.userid ";
if (JOMSOCIAL == 1)
$sql .= " LEFT JOIN #__community_users as cb ON cb.userid = a.userid ";
$sql .= " LEFT JOIN #__users as u ON a.userid = u.id ".
" INNER JOIN #__adsmanager_categories as c ON adcat.catid = c.id ".
" LEFT JOIN #__adsmanager_categories as p ON c.parent = p.id ";
не помню зачем эта функция и работает ли она в моем случае специально не проверял)))) но, по логике должна...

4. \administrator\components\com_adsmanager\views\admin\view.html.php
Эта функция нужна для того, что в админке правильные поля выводились. В районе 811 строки находим получение значений функцией getAllCbFields() и дописываем условия
Код
$cb_fields = $fieldmodel->getAllCbFields();
$cbfields[] = JHTML::_('select.option', '-1', JText::_('ADSMANAGER_NOT_USED') );
if (isset($cb_fields))
{
foreach($cb_fields as $cb)
{
if (COMMUNITY_BUILDER == 1)
$cbfields[] = JHTML::_('select.option', $cb->fieldid, "(".$cb->fieldid.") ".$cb->name );
if (JOMSOCIAL == 1)
$cbfields[] = JHTML::_('select.option', $cb->id, "(".$cb->id.") ".$cb->name );
}
}
тут можно было, конечно, просто исправить функцию getAllCbFields(), чтобы она сразу отдавала базу с fieldid, а не id, но поздно дошло, а уже лень. Да и так проще понять как это всё работает:)

так же там есть в районе 461 строки кусок кода, которые получает значения полей
Код
foreach($fields as $field) {
if ($field->cbfieldvalues != "-1")
{
/*get CB value fields */
$cbfieldvalues = $fieldmodel->getCBFieldValues($field->cbfieldvalues);
$field_values[$field->fieldid] = $cbfieldvalues;
}
}
но его мы не правим. Просто любуемся и понимаем, что нужно менять ещё и getCBFieldValues();

5. вздыхаем и идём в \administrator\components\com_adsmanager\models\field.php
около 522 строки видим и правим вышеуказанные функции getAllCbFields() и getCBFieldValues()
Код
function getAllCbFields() {
$config = JFactory::getConfig();
$dbprefix = JOOMLA_J3 ? $config->get('dbprefix') : $config->getValue('config.dbprefix');

if (COMMUNITY_BUILDER == 1)
$this->_db->setQuery("SHOW TABLES LIKE '".$dbprefix."comprofiler_fields'"  );
if (JOMSOCIAL == 1)
$this->_db->setQuery("SHOW TABLES LIKE '".$dbprefix."community_fields'"  );
$tables = $this->_db-> loadObjectList();
if (count($tables) > 0) {
if (COMMUNITY_BUILDER == 1)
$this->_db->setQuery("SELECT * FROM #__comprofiler_fields WHERE 1"  );
if (JOMSOCIAL == 1)
$this->_db->setQuery("SELECT * FROM #__community_fields WHERE fieldcode !='' "  );
$cb_fields = $this->_db-> loadObjectList();
return $cb_fields;
}
else
return array();
}

Код
	function getCBFieldValues($fieldcbid) {
if (JOMSOCIAL == 1) {
$this->_db->setQuery( "SELECT * FROM #__community_fields WHERE id = ".(int)$fieldcbid." ORDER by ordering ");
$index = $this->_db->loadObject();
$values = explode("\n", $index->options);

$cbfieldvalues = array();
foreach ($values as $key => $val) {
$cbfieldvalues[$key] = new stdClass();
$cbfieldvalues[$key]->fieldvalueid = $key;
$cbfieldvalues[$key]->fieldid = $index->id;
$cbfieldvalues[$key]->fieldtitle = $val;
$cbfieldvalues[$key]->fieldlabel = '';
$cbfieldvalues[$key]->ordering = $key;
$cbfieldvalues[$key]->sys = 0;
$cbfieldvalues[$key]->fieldvalue = $val;
}
return $cbfieldvalues;
}
if (COMMUNITY_BUILDER == 1) {
$this->_db->setQuery( "SELECT *, fieldtitle as fieldvalue FROM #__comprofiler_field_values WHERE fieldid = ".(int)$fieldcbid." ORDER by ordering ");
$cbfieldvalues = $this->_db->loadObjectList();
return $cbfieldvalues;
}
}

а так же в районе строки 267 разглядываем функцию getFieldValues которой требуется getCBFieldValues(), но не трогаем. Так как и так всё хорошо:)


У меня в итоге из JS берется откуда надо и вставляется куда надо все поля по аналогии с CB.

Самая фигня состоит в том, что у таблиц полей JS и СB cовершенно разная архитектура. И если у значения поля CB есть и fieldtitle и fieldvalueid и ordering, тот в полях JS ничего этого нет. Поэтому в функции getCBFieldValues их проходится просто эмулировать:) Что совершенно не сказывается на работоспособности.
В функции getJSProfile же получится совершенно дикий запрос сразу к трем таблица, вместо двух последовательных к CB да и потом функция разворота массива не добавляет  красоты. Кто знает, как сделать это проще - прошу в комментарии
« Последнее редактирование: 11.11.2016, 21:06:49 от moonaway »
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Заглушки с http://placehold.it вместо картинок в списке объявлений

Автор efimov777

Ответов: 6
Просмотров: 7668
Последний ответ 12.04.2020, 07:25:59
от Pavel
Вывод картинки поля "radioimage"

Автор Pavel

Ответов: 7
Просмотров: 5357
Последний ответ 12.03.2019, 16:23:10
от Pavel
Не выводятся поля при просмотре с телефона

Автор Den85

Ответов: 0
Просмотров: 2406
Последний ответ 16.01.2019, 15:17:05
от Den85
Как вытащить id значения поля?

Автор Fetka

Ответов: 9
Просмотров: 2230
Последний ответ 20.02.2018, 15:41:55
от effrit
Как в Adsmanager'е выделить цветом объявление с определенным значением поля?

Автор Fetka

Ответов: 1
Просмотров: 16997
Последний ответ 20.02.2018, 00:30:44
от Fetka