Новости Joomla

👩‍💻 ИИ-админ для 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

Вышли релизы безопасности Joomla 6.0.4 и Joomla 5.4.4

Релиз безопасности Joomla 6.0.4 и Joomla 5.4.4

Проект Joomla! рад сообщить о выходе Joomla 6.0.4 и Joomla 5.4.4. Это релизы безопасности и исправления ошибок для серий 5.x и 6.x.

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

csusha

  • Осваиваюсь на форуме
  • 34
  • 0 / 0
Добрый день. Очень нужна ваша помощь. Сломала всю голову уже. Работала кнопка Позвонить для запроса цены. Но в какой-то момент во всплывающем окне вместо формы начало загружаться описание товара из карточки. Вот сайт http://region-td.ru/derevyannye-zabory.html?Itemid=0  и код в файле default.php
Код
<div class="product-neighbours">
    <?php
    if (!empty($this->product->neighbours ['previous'][0])) {
$prev_link = JRoute::_('index.php?option=com_virtuemart&view=productdetails&virtuemart_product_id=' . $this->product->neighbours ['previous'][0] ['virtuemart_product_id'] . '&virtuemart_category_id=' . $this->product->virtuemart_category_id, FALSE);
echo JHtml::_('link', $prev_link, $this->product->neighbours ['previous'][0]
['product_name'], array('rel'=>'prev', 'class' => 'previous-page','data-dynamic-update' => '1'));
    }
    if (!empty($this->product->neighbours ['next'][0])) {
$next_link = JRoute::_('index.php?option=com_virtuemart&view=productdetails&virtuemart_product_id=' . $this->product->neighbours ['next'][0] ['virtuemart_product_id'] . '&virtuemart_category_id=' . $this->product->virtuemart_category_id, FALSE);
echo JHtml::_('link', $next_link, $this->product->neighbours ['next'][0] ['product_name'], array('rel'=>'next','class' => 'next-page','data-dynamic-update' => '1'));
    }
    ?>
    <div class="clear"></div>
        </div>
    <?php } // Product Navigation END
    ?>
*

gartes

  • Завсегдатай
  • 1859
  • 142 / 6
  • Е = mс²
Ну это слегка не тот код.
это следующий продукт и предыдущий и карточке продукта.

Ошибка тут.
http://region-td.ru/derevyannye-zabory/zabor-iz-derevyannogo-shtaketnika.html/askquestion.html?tmpl=component
*

csusha

  • Осваиваюсь на форуме
  • 34
  • 0 / 0
Да я поняла что вставила нет тот кусок когда уже опубликовала. И как исправить ошибку?
*

gartes

  • Завсегдатай
  • 1859
  • 142 / 6
  • Е = mс²
Ну я так не скажу Вам. Нужно посмотреть как создается ссылка на эту кнопку.
Вы сможете сами найти ?
 
*

csusha

  • Осваиваюсь на форуме
  • 34
  • 0 / 0
У меня вообще проблема ссылками VirtueMart на этом сайте после того как перешла с Joomla 2.5 на 3. Вот даже кнопки следующий/предыдущий товар выдают кракозяблу. Раньше все пункты меню с VirtueMart такое выдавали, но проблему решила с помощью скрытого меню и псевдонимов меню. Вы мне объясните если сможете где посмотреть создание этой ссылки.
*

gartes

  • Завсегдатай
  • 1859
  • 142 / 6
  • Е = mс²
Ну если Joomla 3 тогда тут
/components/com_virtuemart/sublayouts/products.php
Или еще тут
/templates/..ВАШ ШАБЛОН../html/com_virtuemart/sublayouts/products.php
*

csusha

  • Осваиваюсь на форуме
  • 34
  • 0 / 0
Вот содержание файла products.php
Код
<?php

defined('_JEXEC') or die('Restricted access');
$products_per_row = empty($viewData['products_per_row'])? 1:$viewData['products_per_row'] ;
$currency = $viewData['currency'];
$showRating = $viewData['showRating'];
$verticalseparator = " vertical-separator";
echo shopFunctionsF::renderVmSubLayout('askrecomjs');

$ItemidStr = '';
$Itemid = shopFunctionsF::getLastVisitedItemId();
if(!empty($Itemid)){
$ItemidStr = '&Itemid='.$Itemid;
}

$dynamic = false;
if (vRequest::getInt('dynamic',false)) {
$dynamic = true;
}

foreach ($viewData['products'] as $type => $products ) {

$col = 1;
$nb = 1;
$row = 1;

if($dynamic){
$rowsHeight[$row]['product_s_desc'] = 1;
$rowsHeight[$row]['price'] = 1;
$rowsHeight[$row]['customfields'] = 1;
$col = 2;
$nb = 2;
} else {
$rowsHeight = shopFunctionsF::calculateProductRowsHeights($products,$currency,$products_per_row);

if( (!empty($type) and count($products)>0) or (count($viewData['products'])>1 and count($products)>0)){
$productTitle = vmText::_('COM_VIRTUEMART_'.strtoupper($type).'_PRODUCT'); ?>
<div class="<?php echo $type ?>-view">
  <h4><?php echo $productTitle ?></h4>
<?php // Start the Output
}
}

// Calculating Products Per Row
$cellwidth = ' width'.floor ( 100 / $products_per_row );

$BrowseTotalProducts = count($products);


foreach ( $products as $product ) {
if(!is_object($product) or empty($product->link)) {
vmdebug('$product is not object or link empty',$product);
continue;
}
// Show the horizontal seperator
if ($col == 1 && $nb > $products_per_row) { ?>
<div class="horizontal-separator"></div>
<?php }

// this is an indicator wether a row needs to be opened or not
if ($col == 1) { ?>
<div class="row">
<?php }

// Show the vertical seperator
if ($nb == $products_per_row or $nb % $products_per_row == 0) {
$show_vertical_separator = ' ';
} else {
$show_vertical_separator = $verticalseparator;
}

    // Show Products ?>
<div class="product vm-col<?php echo ' vm-col-' . $products_per_row . $show_vertical_separator ?>">
<div class="spacer product-container">
<div class="vm-product-media-container">

<a title="<?php echo $product->product_name ?>" href="<?php echo $product->link.$ItemidStr; ?>">
<?php
echo $product->images[0]->displayMediaThumb('class="browseProductImage"', false);
?>
</a>

</div>

<div class="vm-product-rating-container">
<?php echo shopFunctionsF::renderVmSubLayout('rating',array('showRating'=>$showRating, 'product'=>$product));
if ( VmConfig::get ('display_stock', 1)) { ?>
<span class="vmicon vm2-<?php echo $product->stock->stock_level ?>" title="<?php echo $product->stock->stock_tip ?>"></span>
<?php }
echo shopFunctionsF::renderVmSubLayout('stockhandle',array('product'=>$product));
?>
</div>


<div class="vm-product-descr-container-<?php echo $rowsHeight[$row]['product_s_desc'] ?>">
<h2><?php echo JHtml::link ($product->link.$ItemidStr, $product->product_name); ?></h2>
<?php if(!empty($rowsHeight[$row]['product_s_desc'])){
?>
<p class="product_s_desc">
<?php // Product Short Description
if (!empty($product->product_s_desc)) {
echo shopFunctionsF::limitStringByWord ($product->product_s_desc, 60, ' ...')?>
<?php } ?>
</p>
<?php  } ?>
</div>


<?php //echo $rowsHeight[$row]['price'] ?>
<div class="vm3pr-<?php echo $rowsHeight[$row]['price'] ?>"> <?php
echo shopFunctionsF::renderVmSubLayout('prices',array('product'=>$product,'currency'=>$currency)); ?>
<div class="clear"></div>
</div>
<?php //echo $rowsHeight[$row]['customs'] ?>
<div class="vm3pr-<?php echo $rowsHeight[$row]['customfields'] ?>"> <?php
echo shopFunctionsF::renderVmSubLayout('addtocart',array('product'=>$product,'rowHeights'=>$rowsHeight[$row], 'position' => array('ontop', 'addtocart'))); ?>
</div>

<div class="vm-details-button">
<?php // Product Details Button
$link = empty($product->link)? $product->canonical:$product->link;
echo JHtml::link($link.$ItemidStr,vmText::_ ( 'COM_VIRTUEMART_PRODUCT_DETAILS' ), array ('title' => $product->product_name, 'class' => 'product-details' ) );
//echo JHtml::link ( JRoute::_ ( 'index.php?option=com_virtuemart&view=productdetails&virtuemart_product_id=' . $product->virtuemart_product_id . '&virtuemart_category_id=' . $product->virtuemart_category_id , FALSE), vmText::_ ( 'COM_VIRTUEMART_PRODUCT_DETAILS' ), array ('title' => $product->product_name, 'class' => 'product-details' ) );
?>
</div>
<?php if(vRequest::getInt('dynamic')){
echo vmJsApi::writeJS();
} ?>
</div>
</div>

<?php
    $nb ++;

      // Do we need to close the current row now?
      if ($col == $products_per_row || $nb>$BrowseTotalProducts) { ?>
    <div class="clear"></div>
  </div>
      <?php
      $col = 1;
$row++;
    } else {
      $col ++;
    }
  }

      if(!empty($type)and count($products)>0){
        // Do we need a final closing row tag?
        //if ($col != 1) {
      ?>
    <div class="clear"></div>
  </div>
    <?php
    // }
    }
  }
Только где тут что не знаю.
*

gartes

  • Завсегдатай
  • 1859
  • 142 / 6
  • Е = mс²
Код: php
echo shopFunctionsF::renderVmSubLayout('addtocart',array('product'=>$product,'rowHeights'=>$rowsHeight[$row], 'position' => array('ontop', 'addtocart')));
Ой. Ну да. Я прошу прощение.
Теперь нам нужен файл и той же папки SubLayout но только с названием
Код
prices.php
Где то с такого текста
Код
$askquestion_url.........
*

csusha

  • Осваиваюсь на форуме
  • 34
  • 0 / 0
Вот код из файла price.php
Код
<?php
defined ('_JEXEC') or die('Restricted access');
$product = $viewData['product'];
$currency = $viewData['currency'];
?>
<div class="product-price" id="productPrice<?php echo $product->virtuemart_product_id ?>">
<?php
if (!empty($product->prices['salesPrice'])) {
//echo '<div class="vm-cart-price">' . vmText::_ ('COM_VIRTUEMART_CART_PRICE'). '</div>';
}

if ($product->prices['salesPrice']<=0 and VmConfig::get ('askprice', 1) and isset($product->images[0]) and !$product->images[0]->file_is_downloadable) {
$askquestion_url = JRoute::_('index.php?option=com_virtuemart&view=productdetails&task=askquestion&virtuemart_product_id=' . $product->virtuemart_product_id . '&virtuemart_category_id=' . $product->virtuemart_category_id . '&tmpl=component', FALSE);
?>
<a class="ask-a-question bold" href="<?php echo $askquestion_url ?>" rel="nofollow" ><?php echo vmText::_ ('COM_VIRTUEMART_PRODUCT_ASKPRICE')?></a>
<?php
} else {
//if ($showBasePrice) {
echo $currency->createPriceDiv ('basePrice', 'COM_VIRTUEMART_PRODUCT_BASEPRICE', $product->prices);
//if (round($product->prices['basePrice'],$currency->_priceConfig['basePriceVariant'][1])!= $product->prices['basePriceVariant']) {
echo $currency->createPriceDiv ('basePriceVariant', 'COM_VIRTUEMART_PRODUCT_BASEPRICE_VARIANT', $product->prices);
//}

//}
echo $currency->createPriceDiv ('variantModification', 'COM_VIRTUEMART_PRODUCT_VARIANT_MOD', $product->prices);
if (round($product->prices['basePriceWithTax'],$currency->_priceConfig['salesPrice'][1])!= round($product->prices['salesPrice'],$currency->_priceConfig['salesPrice'][1])) {
echo '<span class="price-crossed" >' . $currency->createPriceDiv ('basePriceWithTax', 'COM_VIRTUEMART_PRODUCT_BASEPRICE_WITHTAX', $product->prices). "</span>";
}
if (round($product->prices['salesPriceWithDiscount'],$currency->_priceConfig['salesPrice'][1])!= round($product->prices['salesPrice'],$currency->_priceConfig['salesPrice'][1])) {
echo $currency->createPriceDiv ('salesPriceWithDiscount', 'COM_VIRTUEMART_PRODUCT_SALESPRICE_WITH_DISCOUNT', $product->prices);
}
echo $currency->createPriceDiv ('salesPrice', 'COM_VIRTUEMART_PRODUCT_SALESPRICE', $product->prices);
if ($product->prices['discountedPriceWithoutTax'] != $product->prices['priceWithoutTax']) {
echo $currency->createPriceDiv ('discountedPriceWithoutTax', 'COM_VIRTUEMART_PRODUCT_SALESPRICE_WITHOUT_TAX', $product->prices);
} else {
echo $currency->createPriceDiv ('priceWithoutTax', 'COM_VIRTUEMART_PRODUCT_SALESPRICE_WITHOUT_TAX', $product->prices);
}
echo $currency->createPriceDiv ('discountAmount', 'COM_VIRTUEMART_PRODUCT_DISCOUNT_AMOUNT', $product->prices);
echo $currency->createPriceDiv ('taxAmount', 'COM_VIRTUEMART_PRODUCT_TAX_AMOUNT', $product->prices);
$unitPriceDescription = vmText::sprintf ('COM_VIRTUEMART_PRODUCT_UNITPRICE', vmText::_('COM_VIRTUEMART_UNIT_SYMBOL_'.$product->product_unit));
echo $currency->createPriceDiv ('unitPrice', $unitPriceDescription, $product->prices);
}
?>
</div>

ссылка с начала $askquestion тут есть. И что в ней может быть не так?
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Расчёт стоимости товара в VirtueMart за периметр

Автор NIKOLY

Ответов: 0
Просмотров: 2036
Последний ответ 04.07.2025, 09:18:31
от NIKOLY
VirtueMart 3 Отображать только товары в наличии!

Автор GaziroFFka

Ответов: 4
Просмотров: 5600
Последний ответ 06.06.2023, 13:55:13
от Akeksandr
Нули где нет цены

Автор Stasweb

Ответов: 2
Просмотров: 2660
Последний ответ 17.05.2023, 12:56:43
от Stasweb
SP VirtueMart Category Search

Автор ve1006

Ответов: 10
Просмотров: 9401
Последний ответ 18.01.2023, 10:39:10
от AzMandius
Как вывести модуль в страницу VirtueMart?

Автор harddrop

Ответов: 11
Просмотров: 6478
Последний ответ 13.11.2022, 13:11:37
от Evgen Kulibin