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

AlexSims

  • Захожу иногда
  • 314
  • 38 / 0
  • кручу верчу
AdsManager старый 2.2

так как у меня на сайте недавно появилась перелинковка-"сортировка" ( по городам, по станциям метро) путем создании новой страницы.
Видел на каком то сайте и решил себе сделать.
Для этого выбрал кротчайший вариант -
ссылки вида
Код
/page=show_result&ad_metro=Китай-Город  
/page=show_result&ad_city=Москва

появилась немыслимая вариация новых страниц, а писать к каждому Title, keywords, descr это проще застрелиться ( для категорий отдельно на создавал вручную, но теперь думаю переделать под шаблон), а если не писать то берется стандартное с сайта, что ни есть гуд

Для начала думал создать отдельную функцию под такие страницы, но что то там не срасталось в итоге исправил существующие.
 ( возможно не оптимальный вариант. Буду рад предложениям. ну какой созрел)

все добавления делаются в файлах lang.php и AdsManager.php

фаил lang.php добавляем

Код
//List CITY
DEFINE( "ADSMANAGER_LIST_CITY", "Недвижимость в городе ");

//List Metro
DEFINE( "ADSMANAGER_LIST_METRO", "Недвижимость у станции метро ");


фаил AdsManager.php добавляем и изменяем
в самом начале добавляем
Код
//keyword+discr
$ad_city            = mosGetParam( $_GET, 'ad_city', "" );
$ad_metro            = mosGetParam( $_GET, 'ad_metro', "");

чуть ниже добавляем аргументы $ad_metro, $ad_city, а в других 0 0( в противном случае будут ошибки, так как к show_all обращаются)
 в секциях switch ($page)

Код
case 'show_result':
//keywords - metro
 /*   if ((($ad_city !="")||($ad_metro !=""))&&(($catid == 0)||(!isset($catid))))
        show_result($option,$ad_city,$ad_metro,$order,$limitstart);
*////kew
/* else*/

//keyw 2 arg v konce
    if (($catid == 0)||(!isset($catid)))
show_all($option,$expand,$text_search,$order,$limitstart,$ad_city,$ad_metro);
else
show_category($catid,$option,$expand,$text_search,$order,$limitstart);
break;

  case 'show_all': {
//keyw 2 arg v konce
$cache->call( 'show_all',$option,$expand,$text_search,$order,$limitstart,0,0);

    break;
  }

case 'search': {
if ($catid == 0)
   //keyw 2 arg v konce
$cache->call( 'show_all',$option,$expand,$text_search,$order,$limitstart,0,0);
else
$cache->call( 'show_category',$catid,$option,$expand,$text_search,$order,$limitstart);
    break;
  
  }



тот же фаил функция show_all

было ( возможно некоторых пунктов у вас нет, так как функция уже менялась под поиск)
Код
function show_all($option,$expand,$text_search,$order,$limitstart)
{
global $mainframe,$database,$mosConfig_absolute_path,$mosConfig_live_site;

$itemid          = intval( mosGetParam( $_GET, 'Itemid', 0 ));
//Поиск по цене
$cenot = intval( mosGetParam( $_GET, 'pr_ot', 0 ));
$cendo = intval( mosGetParam( $_GET, 'pt_do', 0 ));

//Поиск по цене

//Поиск по общей площади
    $areaot = intval( mosGetParam( $_GET, 'area_ot', 0 ));
$areado = intval( mosGetParam( $_GET, 'area_do', 0 ));

//Поиск по площади участка
    $s_ot  = intval( mosGetParam( $_GET, 'site_ot', 0 ));
    $s_do  = intval( mosGetParam( $_GET, 'site_do', 0 ));

//



// Dynamic Page Title
$mainframe->SetPageTitle( ADSMANAGER_LIST_TEXT );

//Pathway
$database->setQuery( "SELECT c.id, c.name,c.parent ".
" FROM #__adsmanager_categories as c ".
"WHERE c.published = 1 ORDER BY c.parent,c.ordering");
$list = $database->loadObjectList();
getSubCatsList($list,0,$subcats,$itemid,$option,$order,$expand);
$paths[0]->text = ADSMANAGER_ROOT_TITLE;
$paths[0]->link = sefRelToAbs('index.php?option='.$option.'&Itemid='.$itemid);
adsmanager_html::show_pathway($paths,$option);
adsmanager_html::show_subcats($subcats);

//List
if (isset($text_search))
$url_text_search = "&text_search=".$text_search;
$url ="index.php?option=$option&page=show_all".$url_text_search."&order=".$order."&area_ot=".$area_ot."&area_do=".$area_do."&site_ot=".$s_ot."&site_do=".$s_do."&pr_ot=".$cenot."&pr_do=".$cendo;//Пагинация поиска
adsList(ADSMANAGER_LIST_TEXT,"",$url,"show_all","1",$text_search,$expand,$order,0,$option,$limitstart);
}


стало ( описание и ключевые для простой пагинации по списку не стал писать ( тут надо придумать что было разное описание, так как ругаются гуглы и яши)


Код


function show_all($option,$expand,$text_search,$order,$limitstart,$ad_city,$ad_metro)
{
global $mainframe,$database,$mosConfig_absolute_path,$mosConfig_live_site;

$itemid          = intval( mosGetParam( $_GET, 'Itemid', 0 ));
//Поиск по цене
$cenot = intval( mosGetParam( $_GET, 'pr_ot', 0 ));
$cendo = intval( mosGetParam( $_GET, 'pt_do', 0 ));

//Поиск по цене

//Поиск по общей площади
    $areaot = intval( mosGetParam( $_GET, 'area_ot', 0 ));
$areado = intval( mosGetParam( $_GET, 'area_do', 0 ));

//Поиск по площади участка
    $s_ot  = intval( mosGetParam( $_GET, 'site_ot', 0 ));
    $s_do  = intval( mosGetParam( $_GET, 'site_do', 0 ));

//
///модификация под метро и город
    if($ad_city){
     $title = ADSMANAGER_LIST_CITY . $ad_city;
     $keyw = ADSMANAGER_LIST_CITY . $ad_city . ", квартиры в городе " . $ad_city;
     $disc = ADSMANAGER_LIST_CITY . $ad_city . ". Все объекты недвижимости по продаже, покупке, аренде в городе " . $ad_city;

            }
    elseif($ad_metro) {
    $title = ADSMANAGER_LIST_METRO . $ad_metro;
    $keyw = ADSMANAGER_LIST_METRO . $ad_metro .", квартиры у станции " . $ad_metro;
    $disc = ADSMANAGER_LIST_METRO . $ad_metro .". Все объекты недвижимости находящиеся около метро " . $ad_metro;
}

    else  {
    $title = ADSMANAGER_LIST_TEXT;
    

}
// Dynamic Page Title
    $mainframe->SetPageTitle( $title );
    $mainframe->prependMetaTag( "description", $disc );
    $mainframe->prependMetaTag( "keywords" , $keyw );



//Pathway
$database->setQuery( "SELECT c.id, c.name,c.parent ".
" FROM #__adsmanager_categories as c ".
"WHERE c.published = 1 ORDER BY c.parent,c.ordering");
$list = $database->loadObjectList();
getSubCatsList($list,0,$subcats,$itemid,$option,$order,$expand);
$paths[0]->text = ADSMANAGER_ROOT_TITLE;
$paths[0]->link = sefRelToAbs('index.php?option='.$option.'&Itemid='.$itemid);
adsmanager_html::show_pathway($paths,$option);
adsmanager_html::show_subcats($subcats);

//List
if (isset($text_search))
$url_text_search = "&text_search=".$text_search;
$url ="index.php?option=$option&page=show_all".$url_text_search."&order=".$order."&area_ot=".$area_ot."&area_do=".$area_do."&site_ot=".$s_ot."&site_do=".$s_do."&pr_ot=".$cenot."&pr_do=".$cendo;//Пагинация поиска
adsList($title,$disc,$url,"show_all","1",$text_search,$expand,$order,0,$option,$limitstart);
}



Вот как то так.
Буду рад советам по оптимизации.
Может потом созрею на полное авто мета описание под сами объекты и категории.






« Последнее редактирование: 03.12.2014, 05:46:20 от AlexSims »
С фантазией плохо.
*

Grendy

  • Захожу иногда
  • 247
  • 26 / 0
Код
$title = ADSMANAGER_LIST_CITY . $ad_city;
$keyw = ADSMANAGER_LIST_CITY . $ad_city . ", квартиры в городе " . $ad_city;
$disc = ADSMANAGER_LIST_CITY . $ad_city . ". Все объекты недвижимости по продаже, покупке, аренде в городе " . $ad_city;

можно записать более коротко, раз данные повторяются

Код
$title = ADSMANAGER_LIST_CITY.$ad_city;
$keyw = "$title, квартиры в городе $ad_city";
$disc = "$title. Все объекты недвижимости по продаже, покупке, аренде в городе $ad_city";

А подобное

Код
$disc = ADSMANAGER_LIST_CITY . $ad_city . ". Все объекты недвижимости по продаже, покупке, аренде в городе " . $ad_city;

эстетичнее смотрелось бы и удобнее было бы редактировать, будь оно отформатировано с помощью той же функцией sprintf(). К тому же, вставлять в код произвольный текст - не комильфо.

Насчёт постраничной навигации, кому как, а я бы запретил такие страницы к индексации. Фактически они лишь мешают продвижению «главной» (первой страницы категории). А если уж сильно хочется втюхивать такие странички поисковикам, проверяем по переменной $limitstart, находимся ли мы на первой странице, и если находимся, выводим одно описание, в противном случае - другое либо добавляем через тире «страницы N».
Плюс в репутацию больше говорит о благодарности, чем слово "Спасибо" в теме, которую повторно, возможно, никогда уже не посетишь.
*

AlexSims

  • Захожу иногда
  • 314
  • 38 / 0
  • кручу верчу
Код
$title = ADSMANAGER_LIST_CITY . $ad_city;
$keyw = ADSMANAGER_LIST_CITY . $ad_city . ", квартиры в городе " . $ad_city;
$disc = ADSMANAGER_LIST_CITY . $ad_city . ". Все объекты недвижимости по продаже, покупке, аренде в городе " . $ad_city;

можно записать более коротко, раз данные повторяются

Код
$title = ADSMANAGER_LIST_CITY.$ad_city;
$keyw = "$title, квартиры в городе $ad_city";
$disc = "$title. Все объекты недвижимости по продаже, покупке, аренде в городе $ad_city";

А подобное

Код
$disc = ADSMANAGER_LIST_CITY . $ad_city . ". Все объекты недвижимости по продаже, покупке, аренде в городе " . $ad_city;

эстетичнее смотрелось бы и удобнее было бы редактировать, будь оно отформатировано с помощью той же функцией sprintf(). К тому же, вставлять в код произвольный текст - не комильфо.

Насчёт постраничной навигации, кому как, а я бы запретил такие страницы к индексации. Фактически они лишь мешают продвижению «главной» (первой страницы категории). А если уж сильно хочется втюхивать такие странички поисковикам, проверяем по переменной $limitstart, находимся ли мы на первой странице, и если находимся, выводим одно описание, в противном случае - другое либо добавляем через тире «страницы N».
- спасибо за подсказку ( я что то не додумался сократить так).
- со sprintf() надо еще разбираться _))

в последнем случае так и сделал - дописал слово Страница № и от переменной $limitstart номер получил.

С фантазией плохо.
*

Grendy

  • Захожу иногда
  • 247
  • 26 / 0
- со sprintf() надо еще разбираться _))

Код
DEFINE( "ADSMANAGER_LIST_CITY", "Недвижимость в городе %s. Все объекты недвижимости по продаже, покупке, аренде в городе %s.");

В результате выполнения

Код
sprintf(ADSMANAGER_LIST_CITY, $ad_city, $ad_city)

Получим вывод нужного текста с подставленными на места %s переменными $ad_city.

А можно ещё вот так:
Код
$ad_city            = mosGetParam( $_GET, 'ad_city', 'любой' );
$ad_metro            = mosGetParam( $_GET, 'ad_metro', 'любая станция');

Код
sprintf(ADSMANAGER_LIST_CITY, $ad_city, $ad_metro)

Код
DEFINE( "ADSMANAGER_LIST_CITY", "Город: %s. Все объекты недвижимости по продаже, покупке, аренде рядом с метро: %s.");

Так, если оба параметра могут присутствовать в адресе страницы, и станция учтена будет, и город :)
Плюс в репутацию больше говорит о благодарности, чем слово "Спасибо" в теме, которую повторно, возможно, никогда уже не посетишь.
*

AlexSims

  • Захожу иногда
  • 314
  • 38 / 0
  • кручу верчу
теперь осталось придумать как запихнуть эти новые ссылки в Xmap (sitemap), а то Яндекс не хочет индексировать их почему то.
С фантазией плохо.
*

AlexSims

  • Захожу иногда
  • 314
  • 38 / 0
  • кручу верчу
запихнул я эти ссылки ( метро + города, область)
проблема была еще в том что они идут через запятую в строке ( ее решил )
теперь осталось найти решение как:
- устранить "пробелы" после запятой которые указывали
- и с регистром букв разобраться ( так как много дублей может на создаваться)

Решение такое

в файле com_adsmanager.php ( что лежит в папке components/com_xmap/extensions )

в функции &getTree после кода
Код
[b] $params['include_ads'] = $include_ads;[/b]

добавляем ( это нужно чтоб можно было выбирать в какой форме выводить и приоритет и частоту сканирования поисковиком)
Спойлер
[свернуть]


далее в этом же файле в функции getCategories
после кода
Спойлер
[свернуть]

добавляем свой код - метро+город  ( долго не мог понять почему не работало, пока условие and category = $catid не добавил в запросе )

Спойлер
[свернуть]


в файле com_adsmanager.xml ( в той же папке )

добавляем

Код
<param name="include_ads_mc" type="list" default="1" label="metro-city" description="Should we include ads into the sitemap?">
                        <option value="0">Never</option>
                        <option value="1">Always</option>
                        <option value="2">In XML Sitemap Only</option>
                        <option value="3">In Site Sitemap Only</option>
</param>


и чуть ниже

Спойлер
[свернуть]




изначально было около 4600 ссылок в этой sitemape( объявы и категории)
теперь стало 5940 ( с городами и метро) - надо как-нибудь придумать как в отдельный фаил Sitemap их запихать


пробелы и точки вначале и конце каждого слова подрезал ( - 100 лишних ссылок)
« Последнее редактирование: 24.12.2014, 01:44:42 от AlexSims »
С фантазией плохо.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Модуль поиска - не сбрасываются результаты при переходе на другие страницы

Автор Ingener

Ответов: 9
Просмотров: 2699
Последний ответ 13.11.2016, 21:20:21
от moonaway
создание второй страницы с AdsManager

Автор SerGunSter

Ответов: 0
Просмотров: 1404
Последний ответ 14.01.2016, 16:42:23
от SerGunSter
AdsManager 2.8.0 Stable. Название родительских категорий в <title>

Автор lustoff

Ответов: 0
Просмотров: 1491
Последний ответ 07.01.2016, 12:15:27
от lustoff
Некорректное отображение страницы подачи нового объявления

Автор Lenko.A.N

Ответов: 0
Просмотров: 1160
Последний ответ 24.06.2015, 16:02:02
от Lenko.A.N
Добавление в title номера страницы

Автор Serafon

Ответов: 5
Просмотров: 2912
Последний ответ 24.07.2014, 14:17:19
от Serafon