Новости Joomla

👩‍💻 Компонент "CS Афиши" для Joomla.

👩‍💻 Компонент "CS Афиши" для Joomla.

Расширение "CS Афиши" позволяет выводить список мероприятий, фильтровать их по датам, поиск по заголовкам и описанию.

В состав пакета расширений входят:
- Компонент "CS Афиши"
- Модуль "Календарь событий"
- Модуль "Предстоящие события"
- Библиотека "ImgResize"

Расширение "CS Афиши" позволяет выводить список мероприятий, фильтровать их по датам, поиск по заголовкам и описанию.

Модуль "Календарь событий" отображает предстоящие и прошедшие мероприятие на календаре, с отображением мероприятий на конкретную дату во всплывающем окне.

Модуль "Предстоящие события" показывает список предстоящий событий по порядку их наступления.

P.S. Расширение платное, но плата символическая, чисто для отработки приема платежей. Ключи без ограничения по времени, купившие сейчас - смогут обновляться без ограничений.

Разработчик - участник нашего сообщества Дмитрий Денисов (@codersite).

Страница расширения
Демо

Яндекс выпустил инструмент Видимость сайта в Алисе AI.

Яндекс выпустил инструмент Видимость сайта в Алисе AI.

С тех пор, как в поисковиках появились нейроответы ИИ, трафик на сайты стал гораздо меньше, так как пользователь стал получать информацию непосредственно на странице поисковика без перехода на сайт. Но при генерации ответа ИИ указывает источники - ссылки на сайты, информация которых была использована для генерации ответа.

Долгое время у всех был немой вопрос: "Как же теперь оценивать эффективность сайта?". Теперь этот на этот вопрос отчасти отвечает новый инструмент аналитики.
Процитируем справку Яндекса по инструменту:
На запросы пользователей в Поиске может отвечать Алиса AI. Ответы появляются в поисковой выдаче, в объектных ответах и на отдельной вкладке Поиска. В них чаще всего упоминаются страницы сайтов, на которые Алиса AI опиралась при подготовке ответа.

С помощью инструмента Видимость сайта в Алисе AI в Яндекс Вебмастере вы можете:
- узнать долю упоминаний сайта среди источников в ответах Алисы AI в Поиске и отследить динамику изменений;
- посмотреть примеры запросов, по которым страницы сайта показываются в ответах Алисы AI;
- посмотреть примеры сайтов той же тематики, которые часто упоминаются в генеративной выдаче.
Данные отображаются за последние 3 месяца и обновляются каждую неделю.

Статистика собирается только по тем запросам, по которым ваш сайт уже находится достаточно высоко в поисковой выдаче. Это позволяет анализировать видимость именно в той нише, где вы заинтересованы в продвижении, и избегать «размытия» по малозначимым для вас запросам.

Кроме того, такой подход обусловлен работой Алисы AI: она строит ответ с опорой на самые релевантные, информативные и качественные страницы, которые обычно занимают высокие позиции в Поиске.

Чтобы увидеть статистику вашего сайта в меню Яндекс.Вебмастера перейдите в раздел "Эффективность" и далее в "Показы сайта в Алисе AI".

В начале февраля 2026г. был вебинар с Михаилом Сливинским - амбассадором Поиска Яндекса, и в рамках вебинара была озвучена просьба сделать такой инструмент. Скорее всего разработка на тот момент уже велась, потому что от просьбы до релиза прошло около 2-х месяцев. В любом случае хорошо, что такая статистика появилась.

Показы сайта в Алисе AI в вашем Яндекс,Вебмастере.

@joomlafeed

👩‍💻 ИИ-админ для Joomla ближе, чем вы думаете: Joomla MCP.

👩‍💻 ИИ-админ для Joomla ближе, чем вы думаете: Joomla MCP.

В февральском номере Joomla Community Magazine в статье Evolving Joomla - Joomla CMS MCP Server: Opening the Door to AI-Powered Administration рассказывается о работе команды разработчиков над внедрением в ядро Joomla MCP-сервера.

Что такое MCP-сервер?
Последние годы всех захватывает бум ИИ-технологий. Появились ИИ-агенты - программы, устанавливаемые на сервер или компьютер, которые получают от вас запрос или задачу в человеческом виде и могут выполнять действия с файлами, ходить по сайтам, создавать сайты, программировать и т.д. Люди используют ИИ-агентов в самых разных ситуациях: от написания и проверки кода (даже там, где язык программирования не знаете совсем) до планирования путешествий и бронирования гостиницы.

ИИ-агенты могут использовать различные программные инструменты по протоколу Model Context Protocol (MCP). Для этого разработчик программы должен внедрить MCP в свой продукт или сервис. Так, например, ваш ИИ-агент может ходить по сайтам через браузер и собирать нужную информацию, управляя браузером через MCP-сервер. Или использовать функционал IDE PHP Storm для написания кода, сбора и отладки ошибок, использовать поиск PHP Storm по кодовой базе, а не простой текстовый поиск по файлам. MCP предоставляет набор функций для полноценного управления программным обеспечением.

В случае с Joomla, сервер MCP может предоставить администраторам следующие возможности:
- Автоматическое создание категорий, материалов и меню на основе карты сайта или PDF-файла.
- Создавайть SEO-оптимизированные заголовки и метаописания в пакетном режиме.
- Обновлять расширения на нескольких сайтах одновременно
- Создание посадочные страницы.

Важно отметить, что сервер MCP не задумывался как функция, доступная только «супер-администраторам». Цель инициативы — создать решение, которое будет простым в настройке, маломощным и доступным для широкого круга пользователей.

В процессе разработки точка входа Joomla (аналогично Site, Administrator, Api, Cli), которая будет работать с Streamable HTTP, необходимым для MCP. Аутентификация пока что предполагается на токенах, но затем планируется создание универсального OAuth-сервера для Joomla.
Фактические возможности MCP — инструменты, ресурсы и подсказки — реализованы в виде плагинов для обеспечения расширяемости. Таким образом ожидаем, что и сторонние разработчики смогут создавать MCP-плагины для внедрения поддержки своих расширений Joomla для работы с ИИ.

@joomlafeed

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

Servelatin

  • Захожу иногда
  • 132
  • 1 / 0
product_type на shop.browse
« : 26.05.2011, 16:06:03 »
Как и большинство личностей, пользующихся VM, столкнулся с задачей требующей вывода определенного типа товара в категории.
Решений не нашел ни в одном ру\инг-нете. Но нашел интересное решение на одном украинском сайте. Собственно заюзал, но одно место в коде у меня не проходит, поэтому возможно с чей то помощью найдется фри решение для риторического вопроса.
---------------------------------------------------------------------------
-------------------- У меня: VM 1.1.8 | JM 1.5.22 --------------------
---------------------------------------------------------------------------
файл shop.browse.php

После
require_once(CLASSPATH . 'ps_product_attribute.php' );
$ps_product_attribute = new ps_product_attribute;

добавить
require_once(CLASSPATH . 'ps_product_type.php' );
$ps_product_type = new ps_product_type;

после
$product_s_desc = $db_browse->f("product_s_desc");
if( empty($product_s_desc) && $product_parent_id!=0 ) {
    $product_s_desc = $dbp->f("product_s_desc"); // Use product_s_desc from Parent Product
}

добавить
$flerd_product_id = $db_browse->f("product_id");
$product_type = $ps_product_type->list_product_type_shopbrowse($flerd_product_id);

после
$products[$i]['product_s_desc'] = $product_s_desc;

добавить
$products[$i]['product_type'] = $product_type;

файл browser_2.php (или другой файл который используется для отображения списка товаров)
<?php echo $product_type ?>

файл ps_product_type
class vm_ps_product_type {
/*  */
function list_product_type_shopbrowse($product_id) {
        global $VM_LANG;
        $tpl = vmTemplate::getInstance();
        if (!$this->product_in_product_type($product_id)) {
            return "";
        }
        // $dbag = product_types;
        $dbag = new ps_DB;
        // $dba = Attributes of product_type param, holds product_id and values assign to each param;
        $dba = new ps_DB;
        // $dbp = Parameters of product_type, holds definitions of each parameter, but not value ;
        $dbp = new ps_DB;
        $html ="";
        $q  = "SELECT * FROM #__{vm}_product_product_type_xref ";
        $q .= "LEFT JOIN #__{vm}_product_type USING (product_type_id) ";
        $q .= "WHERE product_id='$product_id' AND product_type_publish='Y' ";
        $q .= "ORDER BY product_type_list_order";
        $dbag->query( $q );
        $q  = "SELECT * FROM #__{vm}_product_type_parameter ";
        $q .= "WHERE product_type_id=";
        $pt = 0; //product_type counter;
        //print_r($dbag->loadObjectList());
        while ($dbag->next_record()) {
            $product_type_id = $dbag->f("product_type_id");
            $q2  = "SELECT * FROM #__{vm}_product_type_".$dbag->f("product_type_id");
            $q2 .= " WHERE product_id='$product_id'";
            $dbp->query($q2);
            $dba->query($q.$dbag->f("product_type_id")." ORDER BY parameter_list_order");
            $product_type_param = array();
            while ($dba->next_record()) {
                $obj_name = $dba->f("parameter_name");
               // print_r($obj_name."n");
                $product_type_param[$obj_name]["parameter_label"] = $dba->f("parameter_label");
                $product_type_param[$obj_name]["parameter_description"] = $dba->f("parameter_description");
                $product_type_param[$obj_name]["parameter_value"] = $dbp->f($dba->f("parameter_name"));
                $product_type_param[$obj_name]["parameter_unit"] = $dba->f("parameter_unit");
            }
            $product_types[$product_type_id] = $product_type_param;
        }
        $tpl->set( 'product_types', $product_types );
        $html .= $tpl->fetch( 'common/product_type_shopbrowse.tpl.php' );
            return $html;
    }
}

файл shop.browse в начало
    class fmx_parametr{
        var $product_types;
        var $product_type_id;
        var $product_type_parametr;
        function __construct($product_types, $product_type_id, $product_type_parametr){
            $this->product_types = $product_types;
            $this->product_type_id = $product_type_id;
            $this->product_type_parametr = $product_type_parametr;
        }
        function checktype($product_type_id){
            if(array_key_exists($product_type_id, $this->product_types)){
                return true;
            }
            return false;
        }
        function checkparametr(){
            $product_type_id = $this->product_type_id;
            $product_type_parametr = $this->product_type_parametr;
            if($this->checktype($product_type_id)){
                $params = $this->product_types[$product_type_id];
                if(array_key_exists($product_type_parametr, $params)){
                    if($params[$product_type_parametr]['parameter_value'] != ""){
                        return true;
                    }
                }
            }
            return false;
        }
        function val($name){
            $product_type_id = $this->product_type_id;
            $product_type_parametr = $this->product_type_parametr;
            return $this->product_types[$product_type_id][$product_type_parametr]["parameter_".$name];
        }
    }

файл common/product_type_shopbrowse.tpl.php
<?php if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' ); ?>
<?php if( empty($product_types)) return;
    $p1 = new fmx_parametr($product_types, 1, "otdelka");
    $p2 = new fmx_parametr($product_types, 1, "razmer");
?>
    <?php if($p2->checkparametr()):?>
        <div> <?php echo $p2->val("label")?>: <?php echo $p2->val("value"); ?></div>
    <?php endif; ?>
    <?php if($p1->checkparametr()):?>
        <div> <?php echo $p1->val("label")?>: <?php echo $p1->val("value"); ?></div>               
    <?php endif; ?>

-------------------------------------------------------------------------------------------------------
------------------------------- ТЕПЕРЬ МОЙ ОПЫТ ------------------------------------------------
-------------------------------------------------------------------------------------------------------
1. Для вывода категории использую таблицу однастрочную browse_listtable.tpl.php
2. Пункт где про файл ps_product_type и добавить class vm_ps_product_type...: У меня заработало только при вставке предлагаемого кода в заместо:
class vm_ps_product_type {
   /**
    * Validates the Input Parameters onBeforeProductTypeAdd
    * @author Zdenek Dvorak
    * @param array $d
    * @return boolean
    */
   function validate_add(&$d) {
      global $VM_LANG;
      
      if (empty($d["product_type_name"])) {
         $GLOBALS['vmLogger']->err( $VM_LANG->_('VM_PRODUCT_TYPE_ERR_NAME') );
         return False;
      }
      else {
         return True;
      }
   }

3. Файла common/product_type_shopbrowse.tpl.php у меня не существует, поэтому собственно создал (права поставил..)
4. В browse_listtable.tpl.php добавил:
$data[$row][] = $product['product_type'];
после
if( _SHOW_PRICES && $auth['show_prices'] ) {
         $data[$row][] = $product['product_price'];
      }
5. В итоге у меня отлично отображаются все параметры типа товара.
6. Текст без изменений от первоисточника ( ссыль нужна ?? )
 -------------------------------------------------------------------------------------------------------
------------------------------- СМЫСЛ ------------------------------------------------------------
-------------------------------------------------------------------------------------------------------
В предлагаемом коде понятно, что стандартный $product_type заменяется на $p1, $p2, что конечно очень заманчиво, но вот у меня например это не прокатывает. Поэтому надеюсь что местные золотые руки не из жопы не пройдут мимо поста и подведут к нему итог.
*

Gruz

  • Завсегдатай
  • 1275
  • 167 / 3
  • gruz@jabber.org | gruz.org.ua
Re: product_type на shop.browse
« Ответ #1 : 26.05.2011, 17:35:59 »
У меня здесь www.nasos4you.com.ua/shop/категория/7/насосы-бытовые-для-водоснабжения/наружные-самовсасывающие.html
реализовано таким образом.

В components/com_virtuemart/themes/THEME/theme.php добавлена функция в границах класса class vmTheme extends vmTemplate :

Код
	function get_product_id_by_sku($sku) {
$db = new ps_DBe;
// Get Product Types
$q  = "SELECT product_id FROM #__{vm}_product WHERE ";
$q .= 'product_sku = '.$db->Quote($sku);
$db->query($q);
if( $db->num_rows() ) {
return $db->loadResult();
}
else {
return false;
}
}

Далее в /components/com_virtuemart/themes/THEME/templates/browse/browse_1.php добавлено:

Код
require_once(CLASSPATH . 'ps_product_type.php' );
$ps_product_type = new ps_product_type;
$product_id = vmTheme::get_product_id_by_sku($product_sku);
echo $product_type = $ps_product_type->list_product_type($product_id);


По поводу правки самого шаблона вывода типов:
http://virtuemart.net/documentation/Developer_Manual/Finding_Files.html

По поводу невлезания в ядро ВМа:
http://www.vm-expert.com/virtuemart-expert-blog/80-extending-virtuemart-114
Життя має дві форми - горіння і гниття!
-
Со мной на "ты" - Вам лень развёрнуто формулировать вопрос? Нам лень отвечать. Правильный вопрос: - Версии J! и проблемного расширения? - Что хотел? - Что пробовал? - Что получилось и что не получилось? - Какие были ошибки?
*

Servelatin

  • Захожу иногда
  • 132
  • 1 / 0
Re: product_type на shop.browse
« Ответ #2 : 26.05.2011, 18:50:15 »
Ну ты же выводишь в категории product_type целиком. А задача в выводе отдельного параметра.
*

Gruz

  • Завсегдатай
  • 1275
  • 167 / 3
  • gruz@jabber.org | gruz.org.ua
Re: product_type на shop.browse
« Ответ #3 : 26.05.2011, 19:02:50 »
Ну я вывоже не целиком, а кое-что прячу. И делаю это в файле-шаблоне вывода типов. Там легко отфильтровать.

У меня есть внутренние типы, которые начинаются со звёздочки, их шаблон не выводит.
Ты можешь проверить на какой странице выводится шаблон, на page или browse - и обработать по-разному.

components/com_virtuemart/themes/THEME/templates/common/product_type.tpl.php

Правки обозначены ##my
Код
<?php if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' ); ?>
<?php if( empty($product_types)) return;
/**
* Available indexes:
*
* $product_type_params["parameter_label"] => The label for each product type parameter
* $product_type_params["parameter_description"] => The description of each product type parameter
* $product_type_params["tooltip"] => Same as above but wrapped in a tooltip
* $product_type_params["parameter_value"] => The actual value of the parameter for this product
* $product_type_params["parameter_unit"] => The unit of the parameter
* $product_type["product_type_name"] => The name of the product type
*
*/
?>
<!-- Tables of product_types -->

<?php
$kk = 0;

foreach( $product_types as $product_type ) { // Loop through all recent products
$kk++;
if ($kk>$product_type['product_type_count_params']) {
continue;
}
if (JString::substr($product_type['product_type_name'],0,1) == '*' ) {
continue;
}
foreach( $product_type as $attr => $val ) {
//echo $attr." - ".$val."<br />";
$this->set( $attr, $val );
}
$header_table = '
<table class="product_types" width="100%" cellspacing="0" summary="'.$this->get_cfg('flypage_parameters_name').'">
<caption>'.$this->get_cfg('flypage_parameters_name').'</caption>
<tr>
<th scope="col" abbr="'.$this->get_cfg('flypage_parameter_col_title').'" class="nobg">'.$this->get_cfg('flypage_parameter_col_title').'</th>
<th scope="col" abbr="'.$this->get_cfg('flypage_parameter_value_col_title').'">'.$this->get_cfg('flypage_parameter_value_col_title').'</th>
</tr>
';

$i = 0;
$print_header = true;
$print_footer = false;
if ( !empty( $product_type["parameters"] ) ) {
foreach( $product_type["parameters"] as $product_type_params ) {
/*##my14032011002911 {Added */
if(empty($product_type_params["parameter_value"]) || JString::substr($product_type_params["parameter_label"],0,1)== '*'){
continue;
}
if($print_header) {
$print_header = false;
$print_footer  = true;
echo $header_table;
}
/* ##my14032011002911 } */
foreach( $product_type_params as $attr => $val ) {
$this->set( $attr, $val );
}
if ( $i++ % 2 ) {
    $class = 'row1';
}
else {
    $class = 'row0';
}
if ( $i > $product_type["product_type_count_params"] ) {
break;
}

?><tr>
<th class="<?php echo $class;?>"><?php echo $product_type_params["parameter_label"];

if ( !empty($product_type_params["tooltip"] ) ) { ?>
&nbsp;<?php echo $product_type_params["tooltip"];
}
?>
</th>

<td class="<?php echo $class;?>"><?php /*##my12032011111649 {
It was:
echo $product_type_params["parameter_value"];
It became:*/
$product_params = explode(';',$product_type_params["parameter_value"]);
$product_params = implode(' &times; ',$product_params);
echo $product_params;
##my12032011111649 } */
if ( !empty($product_type_params["parameter_unit"] ) ) {
echo " ".$product_type_params["parameter_unit"];
} ?>
</td>
</tr>
<?php
}
}
if ($print_footer) {
echo '</table>';
$print_footer = false;
}

?>
    <?php
}
?>


Минус - больше запросов, чем нужно. Но можешь например в шаблон в theme.php вставить функцию, которая будет выбирать именно тот параметр, который нужен,  а не всё скопом. В любом случае будет проще и нагляднее, чем лезть в ядро колупаться.
Життя має дві форми - горіння і гниття!
-
Со мной на "ты" - Вам лень развёрнуто формулировать вопрос? Нам лень отвечать. Правильный вопрос: - Версии J! и проблемного расширения? - Что хотел? - Что пробовал? - Что получилось и что не получилось? - Какие были ошибки?
*

Servelatin

  • Захожу иногда
  • 132
  • 1 / 0
Re: product_type на shop.browse
« Ответ #5 : 26.05.2011, 21:02:33 »
Спасибо flyingspook, видел. Вывод параметра путем обрезания списка как-то не айс. Хочется то чтобы в нужном месте нужное значение...
*

Gruz

  • Завсегдатай
  • 1275
  • 167 / 3
  • gruz@jabber.org | gruz.org.ua
Re: product_type на shop.browse
« Ответ #6 : 26.05.2011, 21:07:18 »
Спасибо flyingspook, видел. Вывод параметра путем обрезания списка как-то не айс. Хочется то чтобы в нужном месте нужное значение...

По-моему, с тем, что я сюда кинул, по образу и подобию функции в этом посте http://joomlaforum.ru/index.php/topic,166048.msg896876.html#msg896876
не сложно сделать выборку. Один запрос.
« Последнее редактирование: 27.05.2011, 00:32:14 от Gruz »
Життя має дві форми - горіння і гниття!
-
Со мной на "ты" - Вам лень развёрнуто формулировать вопрос? Нам лень отвечать. Правильный вопрос: - Версии J! и проблемного расширения? - Что хотел? - Что пробовал? - Что получилось и что не получилось? - Какие были ошибки?
*

eLig

  • Осваиваюсь на форуме
  • 15
  • 0 / 0
Re: product_type на shop.browse
« Ответ #7 : 11.01.2012, 21:54:47 »
Добавлю чутка от себя.
Так как мне нужно параметры было разбросать по разным ячейкам таблицы я сделал следующие.
===========
Код
[b]файл common/product_type_shopbrowse.tpl.php[/b]
<?php if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' ); ?>
<?php if( empty($product_types)) return;
    $p1 = new fmx_parametr($product_types, 1, "otdelka");
    $p2 = new fmx_parametr($product_types, 1, "razmer");
?>
    <?php if($p2->checkparametr()):?>
       <?php echo $p2->val("value"); ?>
    <?php endif; ?>
    <?php if($p1->checkparametr()):?>
       /<?php echo $p1->val("value"); ?>              
    <?php endif; ?>
Убрал название параметра и поменял отображение на следующиий вид - Значение_1/Значение2

В browse_listtable.tpl.php вставил следующий код
Код
$perem = trim(str_replace(" ","",$product['product_type']));	
list($Per1, $Per2) = explode("/", $perem);
Первая строчка удаляет лишние пробелы между словами, а потом удаляет пробелы у начали и конца строки.
Далее в $Per1 помещается значение $p1, а  в $Per2 помещается значение $p2, значения разделаются /.
Выводится все это дело в нужном месте через echo.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Вывод зависимых товаров в категории (browse)

Автор Seeker

Ответов: 15
Просмотров: 10324
Последний ответ 23.02.2013, 02:38:12
от rezon
Функции из flypage в browse.

Автор fprefix

Ответов: 6
Просмотров: 3031
Последний ответ 23.01.2012, 18:55:26
от vtx
Различные browse для разных категорий

Автор Chikir87

Ответов: 7
Просмотров: 1822
Последний ответ 20.04.2011, 22:07:21
от Chikir87
Как добавить ссылки "добавить в корзину" в шаблон browse?

Автор Dolphin

Ответов: 0
Просмотров: 1342
Последний ответ 09.12.2010, 06:36:54
от Dolphin
Manufacturer в shop.browse

Автор inc!

Ответов: 5
Просмотров: 6015
Последний ответ 10.11.2010, 01:05:16
от yevrowl