Новости Joomla

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

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

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

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

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

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

goga_pgasovav

  • Захожу иногда
  • 445
  • 6 / 0
  • Внимательный джумловод
Есть ли какая-то альтернатива плагину HP Router?
Может как-то можно изменить стандартный SEF таким образом, чтобы он не выводил ID материала в урле?
Я имею ввиду:
чтобы URL mysite.com/news/22-good-news выглядел как mysite.com/news/good-news

HP Router отлично справлялся со своей задачей, до тех пор пока не потребовалась многоязычность, и в связке с JoomFish начались траблы.
*

goga_pgasovav

  • Захожу иногда
  • 445
  • 6 / 0
  • Внимательный джумловод
очень долго искал информацию для решения этой задачи.
Лишь на одном забугорном сайте добрый человек по имени Marvin Ryan выложил модифицированный router.php который как раз таки и делает то, что мне нужно!

1. Идем в components/com_content и находим там файл router.php
2. Заменяем все его содержимое на:

Код
<?php
/**
* @version $Id: router.php 14401 2010-01-26 14:10:00Z louis $
* @package Joomla
* @copyright Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
* @license GNU/GPL, see LICENSE.php
* Joomla! is free software. This version may have been modified pursuant
* to the GNU General Public License, and as distributed it includes or
* is derivative of works licensed under the GNU General Public License or
* other free or open source software licenses.
* See COPYRIGHT.php for copyright notices and details.
*/

function ContentBuildRoute(&$query)
{
$segments = array();

$menu = &JSite::getMenu();
if (empty($query['Itemid'])) {
$menuItem = &$menu->getActive();
} else {
$menuItem = &$menu->getItem($query['Itemid']);
}
$mView = (empty($menuItem->query['view']))? null : $menuItem->query['view'];
$mCatid = (empty($menuItem->query['catid']))? null : $menuItem->query['catid'];
$mId = (empty($menuItem->query['id']))? null : $menuItem->query['id'];

if(isset($query['task'])) {
return $segments;
}

if(isset($query['view']))
{
$view = $query['view'];
if(empty($query['Itemid'])) {
$segments[] = $query['view'];
}
unset($query['view']);
};

if (($mView == 'article') and (isset($query['id'])) and ($mId == intval($query['id']))) {
unset($query['view']);
unset($query['catid']);
unset($query['id']);
}

if (isset($view) and ($view == 'section' && !empty($query['Itemid']))) {
if (($mView != 'section') or ($mView == 'section' and $mId != intval($query['id']))) {
$segments[] = 'section';
unset($query['Itemid']);
}
}

if (isset($view) and $view == 'category') {
if ($mId != intval($query['id']) || $mView != $view) {
$temp = explode(':',$query['id']);
if(count($temp) > 1)
{
$query['id'] = $temp[1];
}

$segments[] = $query['id'];
}
unset($query['id']);
}

if (isset($query['catid'])) {

if ((($view == 'article') and ($mView != 'category') and ($mView != 'article') and ($mCatid != intval($query['catid'])))) {
$temp = explode(':',$query['catid']);
if(count($temp) > 1)
{
$query['catid'] = $temp[1];
}

$segments[] = $query['catid'];
}
unset($query['catid']);
};

if(isset($query['id'])) {
if (empty($query['Itemid'])) {
$temp = explode(':',$query['id']);
if(count($temp) > 1)
{
$query['id'] = $temp[1];
}

$segments[] = $query['id'];
} else {
if (isset($menuItem->query['id'])) {
if($query['id'] != $mId) {
$temp = explode(':',$query['id']);
if(count($temp) > 1)
{
$query['id'] = $temp[1];
}

$segments[] = $query['id'];
}
} else {
$temp = explode(':',$query['id']);
if(count($temp) > 1)
{
$query['id'] = $temp[1];
}

$segments[] = $query['id'];
}
}
unset($query['id']);
};

if(isset($query['year'])) {

if(!empty($query['Itemid'])) {
$segments[] = $query['year'];
unset($query['year']);
}
};

if(isset($query['month'])) {

if(!empty($query['Itemid'])) {
$segments[] = $query['month'];
unset($query['month']);
}
};

if(isset($query['layout']))
{
if(!empty($query['Itemid']) && isset($menuItem->query['layout'])) {
if ($query['layout'] == $menuItem->query['layout']) {

unset($query['layout']);
}
} else {
if($query['layout'] == 'default') {
unset($query['layout']);
}
}
};

return $segments;
}

function ContentParseRoute($segments)
{
$vars = array();

$menu =& JSite::getMenu();
$item =& $menu->getActive();
$db =& JFactory::getDBO();
$count = count($segments);


if(!isset($item))
{
$vars['view']  = $segments[0];
$vars['id']    = $segments[$count - 1];
if($vars['view'] == 'article')
{
$query = 'SELECT id FROM #__content WHERE alias = '.$db->Quote($vars['id']);
} elseif($vars['view'] == 'category') {
$query = 'SELECT id FROM #__categories WHERE section > 0 && alias = '.$db->Quote($vars['id']);
}
$db->setQuery($query);
$vars['id'] = $db->loadResult();
return $vars;
}

switch($item->query['view'])
{
case 'section' :
{
if($count == 1) {
$vars['view'] = 'category';

if(isset($item->query['layout']) && $item->query['layout'] == 'blog') {
$vars['layout'] = 'blog';
}
}

if($count == 2) {
$vars['view']  = 'article';
$vars['catid'] = $segments[$count-2];
}

$vars['id']    = $segments[$count-1];

} break;

case 'category'   :
{
$vars['id']   = $segments[$count-1];
$vars['view'] = 'article';

} break;

case 'frontpage'   :
{
$vars['id']   = $segments[$count-1];
$vars['view'] = 'article';

} break;

case 'article' :
{
$vars['id']   = $segments[$count-1];
$vars['view'] = 'article';
} break;

case 'archive' :
{
if($count != 1)
{
$vars['year']  = $count >= 2 ? $segments[$count-2] : null;
$vars['month'] = $segments[$count-1];
$vars['view']  = 'archive';
} else {
$vars['id']   = $segments[$count-1];
$vars['view'] = 'article';
}
}
}

$alias = explode(':', $vars['id']);
if((int) $alias[0] > 0)
{
$vars['id'] = $alias[0];
} else {
if(count($alias) > 1)
{
$vars['id'] = $alias[0].'-'.$alias[1];
}

if($vars['view'] == 'article')
{
$query = 'SELECT id FROM #__content WHERE alias = '.$db->Quote($vars['id']);
} elseif($vars['view'] == 'category') {
$query = 'SELECT id FROM #__categories WHERE section > 0 && alias = '.$db->Quote($vars['id']);
}
$db->setQuery($query);
$vars['id'] = $db->loadResult();
}

return $vars;
}
3. Всё прекрасно работает...
... но. В переключателе языков JoomFish теперь ссылки вроде: mysite.com/news/22
т.е. с точностью до наоборот, остался один лишь ID материала...
может приведенный выше код поможет исправить данную проблему?
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Ошибка 404 категория материалов Артио

Автор ReefTank

Ответов: 0
Просмотров: 4290
Последний ответ 01.07.2019, 10:23:50
от ReefTank
После переноса материалов из Joomla 1.5 в Joomla 3.8 появились вопросы по работе

Автор WeX

Ответов: 0
Просмотров: 1862
Последний ответ 20.11.2017, 11:42:16
от WeX
Alias для меню и материалов

Автор huligan

Ответов: 0
Просмотров: 1633
Последний ответ 25.05.2015, 12:40:03
от huligan
Изменение SEF через правку router.php

Автор jouser

Ответов: 3
Просмотров: 1678
Последний ответ 05.12.2014, 11:27:25
от kitSS
Router SEF

Автор MadChild

Ответов: 0
Просмотров: 1248
Последний ответ 24.07.2014, 16:53:05
от MadChild