Новости 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 Гость просматривают эту тему.
  • 9 Ответов
  • 4688 Просмотров
*

chernblx

  • Захожу иногда
  • 262
  • 2 / 0
На версии 2.5 проблему решили, к 2.6 не подходит... Помогите решить эту проблему... Не вижу смысла в строку выводить пустые названия полей поочереди...
*

Alex89

  • Давно я тут
  • 555
  • 198 / 1
  • Joomlaman :)
пробуйте!
Код
function showFieldValue($content,$field)
{
$return = "";
if ((strpos($field->catsid, ",".$content->catid.",")!== false)||(strpos($field->catsid, ",-1,")!== false))
{
if ($field->title)
$name = $field->name;

$value = "";
$content = $content;
$val = "\$content->".$field->name;
$fieldname = $field->name;
eval("if (isset($val)) \$value = \"$val\";");
$value = JText::_($value);

if (($field->type != 'multiselect')&&($field->type != 'checkbox')&&(($field->display_title & $this->mode) == $this->mode))
{
if ($value) $return .= "<b>".JText::_($field->title).":</b> ";
}
if (($field->type == 'multiselect')&&(($field->display_title & $mode) == $mode)) {
$valsel= str_replace(',','',$value);
if ($valsel != '') $return .= "<b>".JText::_($field->title).":</b> ";
}

switch($field->type)
{
case 'checkbox':
if (($field->display_title & $this->mode) == $this->mode)
{
$return .= JText::_($field->title);
if ($value == 1)
$return .= ":&nbsp;".JText::_('ADSMANAGER_YES')."<br />";
else
$return .= ":&nbsp;".JText::_('ADSMANAGER_NO')."<br />";
}
else if ($value == 1)
{
$return .= JText::_($field->title)."<br />";
}
break;

case 'multicheckbox':
case 'multicheckboximage':
for($i=0,$nb=count($this->field_values[$field->fieldid]);$i < $nb ;$i++)
{
$fieldvalue = @$this->field_values[$field->fieldid][$i]->fieldvalue;
$fieldtitle = @$this->field_values[$field->fieldid][$i]->fieldtitle;

if (strpos($value, ",".$fieldvalue.",")!== false)
{
if ($field->type == 'multicheckbox') {
$title .= JText::_($fieldtitle);
if ($title) $return[] = $title; }
else
if ($fieldtitle) $return[] = "<img src='".$this->baseurl."/images/com_adsmanager/fields/".$fieldtitle."' alt='$fieldtitle' />";
}
}
for($i=0,$nb=count($return);$i < $nb ;$i++)
if ($i < ($nb - 1)) echo $return[$i].","; else echo $return[$i].".";
break;

case 'url':
if ((isset($field->link_text))&&($field->link_text != ""))
$linkObj = $field->link_text;
else if ((isset($field->link_image))&&(file_exists(JPATH_BASE."/images/com_adsmanager/fields/".$field->link_image)))
$linkObj = "<img src='".$this->baseurl."/images/com_adsmanager/fields/".$field->link_image."' />";
else
{
$linkObj = $value;
}
if ($value != "")
{
$return .= "<a href='http://$value' target='_blank'>$linkObj</a><br />";
}
break;

case 'date':
$return = $value;
$return .= $return;
break;

case 'select':
if (isset($this->field_values[$field->fieldid])) {
foreach($this->field_values[$field->fieldid] as $v)
{
if ($value == $v->fieldvalue)
{
$return .= JText::_($v->fieldtitle);
if ($v->fieldtitle) $return .= "<br />";
}
}
}
break;

case 'multiselect':
if (isset($this->field_values[$field->fieldid])) {
foreach($this->field_values[$field->fieldid] as $v)
{
if (strpos($value, ",".$v->fieldvalue.",") === false)
{
}
else
{
$return .= JText::_($v->fieldtitle);
if ($v->fieldtitle) $return .= "<br />";
}
}
}
break;

case 'emailaddress':
if ($value != "")
{
switch($this->conf->email_display) {
case 2:
$emailForm = JRoute::_("index.php?option=com_adsmanager&view=message&contentid=".$content->id."&catid=".$content->catid."&Itemid=".$this->itemid);
$return .= '<a href="'.$emailForm.'">'.JText::_('ADSMANAGER_EMAIL_FORM').'</a><br />';
break;
case 1:
$return .= $this->Txt2Png($value)."<br/>";
break;
default:
$return .= JText::_('ADSMANAGER_FORM_EMAIL').": <a href='mailto:".$value."'>".$value."</a><br/>";
break;

}
}
break;

case 'textarea':
$return .= str_replace(array("\r\n", "\n", "\r"), "<br />", $value)."<br />";
break;

case 'editor':
case 'number':
case 'text':
$return .= $value;
if ($value) $return .= "<br />";
break;
case 'price':
if ($value != "") {
$return .= JText::sprintf('ADSMANAGER_DEVICE',$value);
$return .= "<br />"; }
break;
case 'radio':
case 'radioimage':
for($i=0,$nb=count($this->field_values[$field->fieldid]);$i < $nb ;$i++)
{
$fieldvalue = @$this->field_values[$field->fieldid][$i]->fieldvalue;
$fieldtitle = @$this->field_values[$field->fieldid][$i]->fieldtitle;
if ($value == $fieldvalue)
{
if ($field->type == 'radio')
$return .= $fieldtitle;
else
$return .= "<img src='".$this->baseurl."/images/com_adsmanager/fields/".$fieldtitle."' alt='$fieldtitle' />";
$return .= "<br/>";
}
}
break;
case 'file':
if ($value != "")
{
$return .= "<a href='$this->baseurl/images/com_adsmanager/files/$value' target='_blank'>".JText::_('ADSMANAGER_DOWNLOAD_FILE')."</a></b>";
$return .= "<br />";
}
break;

default:
if (isset($this->plugins[$field->type]))
{
if ($this->mode == 1)
$plug = $this->plugins[$field->type]->getListDisplay($content->id,$field );
else
$plug = $this->plugins[$field->type]->getDetailsDisplay($content->id,$field );
$return .= $plug;
}
break;
}
}
return $return;
}
« Последнее редактирование: 11.06.2011, 17:16:52 от Alex89 »
Увеличить посещаемость сайта помогут здесь - http://tinyurl.com/kpaprwy
Если помог, ткните "крестик" в репу!
*

chernblx

  • Захожу иногда
  • 262
  • 2 / 0
Спасибо всё получилось, но от компонента отказался...
*

kroshkafunt

  • Новичок
  • 8
  • 0 / 0
к сожалению для 2.6.4 не подходит , выдает белый экран с ошибкой.
Alex89 подскажите пожалуйста решение.
*

LS_D

  • Захожу иногда
  • 155
  • 16 / 0
Здравствуйте! Есть одна проблема, в колонке отображает название поля, хотя я его выключаю (в развернутом виде все норм работает). Можно как нибуть это устранить?
*

maxor

  • Осваиваюсь на форуме
  • 27
  • 5 / 0
Up!
Очень интересует ответ на последний вопрос. Есть знающие, кто может помочь?

PS. AdsManager 2.6.5
« Последнее редактирование: 30.06.2012, 23:31:06 от maxor »
*

maxor

  • Осваиваюсь на форуме
  • 27
  • 5 / 0
Нашёл решение.

Нужно в коде от Alex89, в строке:
if (($field->type != 'multiselect')&&($field->type != 'checkbox')&&(($field->display_title & $this->mode) == $this->mode))

Поменять 'mode' на 'modetitle':
if (($field->type != 'multiselect')&&($field->type != 'checkbox')&&(($field->display_title & $this->modetitle) == $this->modetitle))

Всем удачи.
« Последнее редактирование: 02.07.2012, 01:19:12 от maxor »
*

LS_D

  • Захожу иногда
  • 155
  • 16 / 0
Нашёл решение.

Нужно в коде от Alex89, в строке:
if (($field->type != 'multiselect')&&($field->type != 'checkbox')&&(($field->display_title & $this->mode) == $this->mode))

Поменять 'mode' на 'modetitle':
if (($field->type != 'multiselect')&&($field->type != 'checkbox')&&(($field->display_title & $this->modetitle) == $this->modetitle))

Всем удачи.
Спасибо! Все работатет
*

niceteam

  • Захожу иногда
  • 169
  • 2 / 2
В каком файле заменить надо?
Попробовал в файле field.php сделать замену, в карточке объявления слетели стили почемуто. Объявления стали показываться на белом листе.
*

real-man

  • Захожу иногда
  • 84
  • 4 / 0
После замена кода пропал фильтр отображения цены "от" и "до" в расширенном поиске, кракозяблы вместо поля отображаются  :(
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

[Решено]Дублирования ссылки "объвления" в breadcrumb, в компоненте AdsManager

Автор nicklas

Ответов: 4
Просмотров: 9720
Последний ответ 25.04.2024, 23:13:18
от Rinat abzyi
AdsManager вывод нужных полей по отдельности

Автор klekovkinandrey

Ответов: 2
Просмотров: 20444
Последний ответ 06.04.2024, 09:54:15
от Rinat abzyi
AdsManager загрузка файлов

Автор FlexNL

Ответов: 1
Просмотров: 8737
Последний ответ 21.10.2021, 17:20:09
от khan-alex
Проблема с RSS

Автор uf1976

Ответов: 17
Просмотров: 8922
Последний ответ 14.07.2020, 12:31:40
от khan-alex
AdsManager 2.9.13 Есть ли возможность добавить функцию снять с публикации по мимо редактировать и уд

Автор murovoz

Ответов: 11
Просмотров: 19338
Последний ответ 27.03.2020, 22:39:23
от Pavel