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

beliyadm

  • Легенда
  • 9758
  • 1665 / 66
  • Севастополь, Россия
Несколько раз поднимался вопрос - как сделать несколько изображений в описании товара, причем не убогим способом, как реализовано стандартно, но иначе. Возникла необходимость, потому выложу свою модификацию.
Основная часть хака взята с форума virtuemart.ru (к сожалению что то не работает, потому не могу привести автора)
Файл shop.product_details.php, находим строку с /** AVAILABILITY **/ и перед ней добавляем следующий код:
Код
/* MORE IMAGES (Дополнительные изображения) */
$gavMore_Images = "";
$gavMore_Imagess = "";
 if( !empty($images->images) )
   {
    $gavMore_Images = "<hr /><div style=\"font-weight:bold;float:left;\">Дополнительные изображения&nbsp;</div> (нажмите, чтобы увеличить):<br />";
    $database->setQuery( "SELECT * FROM #__vm_product_files WHERE file_product_id='$product_id' AND file_is_image='1'" );
    $images = $database->loadObjectList();
    $i = 1;
    foreach( $images as $image )
     {
       $info = pathinfo( $image->file_name );
       $src = dirname($image->file_url) ."/resized/". basename($image->file_name, ".".$info["extension"])."_".PSHOP_IMG_WIDTH."x".PSHOP_IMG_HEIGHT.".".$info["extension"];
       $alt = $image->file_title;
       $height = empty($image->file_image_thumb_height) ? PSHOP_IMG_HEIGHT : $image->file_image_thumb_height;
       $width = empty($image->file_image_thumb_width) ? PSHOP_IMG_WIDTH : $image->file_image_thumb_width;
       $src_full = str_replace( $mosConfig_absolute_path, $mosConfig_live_site, $image->file_name );
       if( strstr( $src, $mosConfig_live_site.$image->file_name))
       $src_full = str_replace( $mosConfig_live_site.$image->file_name, $mosConfig_live_site."/".$image->file_name, $src_full );
       $alt_full = $image->file_title;
       $height_full = $image->file_image_height+29;
       $width_full = $image->file_image_width+34;
      $border = 1;
      $titlewsp = str_replace(".", "", basename($image->file_name));
      $title = $image->file_title;
      $gavMore_Images .= "<a href=\"javascript:doPic('$src');\" style=\"cursor:hand;cursor:pointer;\"><img src=\"$src\" width=\"$width\" border=0/></a>";     
      ++$i;
     }//end foreach
   }
  /* END MORE IMAGES (Дополнительные изображения) */
?>
<SCRIPT LANGUAGE="JavaScript">
<!-- Begin
browserName = navigator.appName;
browserVer = parseInt(navigator.appVersion);

ns3up = (browserName == "Netscape" && browserVer >= 3);
ie4up = (browserName.indexOf("Microsoft") >= 0 && browserVer >= 4);

function doPic(imgName) {
if (ns3up || ie4up) {
imgOn = ("" + imgName);
document.mainpic.src = imgOn;
   }
}
//  End -->
</script>
<?php
$gavMore_Imagess .= "<img name=\"mainpic\" src=\"$imageurl\" width=\"$width_full\"  border=\"0\">";

Далее здесь же находим блок /** NOW LET'S BEGIN AND FILL THE TEMPLATE **/ и добавляем две строки:
Код
$template = str_replace( "{gavMore_Images}", $gavMore_Images, $template );
$template = str_replace( "{gavMore_Imagess}", $gavMore_Imagess, $template );
Теперь можем открыть файл flypage.php и оформить вывод наших двух заглушек, у себя сделал так:
Код
<table border="0">
<tr>
<td>{gavMore_Imagess}</td>
</tr>
<tr>
<td>{gavMore_Images}</td>
</tr>
</table>

немного комментариев:
$gavMore_Images - выведет нам из полученного массива картинки дополнительных изображений (которые управляются через добавление файлов)
$gavMore_Imagess - непосредственно изображение товара

[вложение удалено Администратором]
Все истины, которые я хочу вам изложить, — бесстыдная ложь. Сделать всё хорошо
TLG: @Beliyadm

 !!!???!!!А Вы не в курсе я вывести только 3 дополнительное изображение или только второе, т.е. конкретная задача в том чтобы в {$gavMore_Images2} вывести дополнительные изображения с первого по второе, а {$gavMore_Images3} вывести только 3.
Заранее спасибо. ;D
*

beliyadm

  • Легенда
  • 9758
  • 1665 / 66
  • Севастополь, Россия
сразу не скажу, но если поковыряться то можно и так вывести
Все истины, которые я хочу вам изложить, — бесстыдная ложь. Сделать всё хорошо
TLG: @Beliyadm

Дайте плз хотябы идею, а то ничего не получается.

Подскажите, а как данную вещь изменить для Joomla 13 и ВМРЕ 13?
Очень нужно... не работает
*

ninJo

  • Новичок
  • 4
  • 0 / 0
СУПЕР, то что надо

a это для какой джумлы?
*

beliyadm

  • Легенда
  • 9758
  • 1665 / 66
  • Севастополь, Россия
a это для какой джумлы?
к движку хак отношения не имеет, версию компонента не помню, BMPE последняя на тот момент
Все истины, которые я хочу вам изложить, — бесстыдная ложь. Сделать всё хорошо
TLG: @Beliyadm
*

-L-

  • Осваиваюсь на форуме
  • 31
  • 1 / 0
а можешь выложить только ту часть кода которая отвечает за вывод маленькой картинки без ссылки на большую, а то я в php не силен
*

SolopoV

  • Давно я тут
  • 577
  • 16 / 0
  • зеленею...
Несколько раз поднимался вопрос - как сделать несколько изображений в описании товара, причем не убогим способом, как реализовано стандартно, но иначе. Возникла необходимость, потому выложу свою модификацию.
Основная часть хака взята с форума virtuemart.ru (к сожалению что то не работает, потому не могу привести автора)
Файл shop.product_details.php, находим строку с /** AVAILABILITY **/ и перед ней добавляем следующий код:
Код
/* MORE IMAGES (Дополнительные изображения) */
$gavMore_Images = "";
$gavMore_Imagess = "";
 if( !empty($images->images) )
   {
    $gavMore_Images = "<hr /><div style=\"font-weight:bold;float:left;\">Дополнительные изображения&nbsp;</div> (нажмите, чтобы увеличить):<br />";
    $database->setQuery( "SELECT * FROM #__vm_product_files WHERE file_product_id='$product_id' AND file_is_image='1'" );
    $images = $database->loadObjectList();
    $i = 1;
    foreach( $images as $image )
     {
       $info = pathinfo( $image->file_name );
       $src = dirname($image->file_url) ."/resized/". basename($image->file_name, ".".$info["extension"])."_".PSHOP_IMG_WIDTH."x".PSHOP_IMG_HEIGHT.".".$info["extension"];
       $alt = $image->file_title;
       $height = empty($image->file_image_thumb_height) ? PSHOP_IMG_HEIGHT : $image->file_image_thumb_height;
       $width = empty($image->file_image_thumb_width) ? PSHOP_IMG_WIDTH : $image->file_image_thumb_width;
       $src_full = str_replace( $mosConfig_absolute_path, $mosConfig_live_site, $image->file_name );
       if( strstr( $src, $mosConfig_live_site.$image->file_name))
       $src_full = str_replace( $mosConfig_live_site.$image->file_name, $mosConfig_live_site."/".$image->file_name, $src_full );
       $alt_full = $image->file_title;
       $height_full = $image->file_image_height+29;
       $width_full = $image->file_image_width+34;
      $border = 1;
      $titlewsp = str_replace(".", "", basename($image->file_name));
      $title = $image->file_title;
      $gavMore_Images .= "<a href=\"javascript:doPic('$src');\" style=\"cursor:hand;cursor:pointer;\"><img src=\"$src\" width=\"$width\" border=0/></a>";     
      ++$i;
     }//end foreach
   }
  /* END MORE IMAGES (Дополнительные изображения) */
?>
<SCRIPT LANGUAGE="JavaScript">
<!-- Begin
browserName = navigator.appName;
browserVer = parseInt(navigator.appVersion);

ns3up = (browserName == "Netscape" && browserVer >= 3);
ie4up = (browserName.indexOf("Microsoft") >= 0 && browserVer >= 4);

function doPic(imgName) {
if (ns3up || ie4up) {
imgOn = ("" + imgName);
document.mainpic.src = imgOn;
   }
}
//  End -->
</script>
<?php
$gavMore_Imagess .= "<img name=\"mainpic\" src=\"$imageurl\" width=\"$width_full\"  border=\"0\">";

Далее здесь же находим блок /** NOW LET'S BEGIN AND FILL THE TEMPLATE **/ и добавляем две строки:
Код
$template = str_replace( "{gavMore_Images}", $gavMore_Images, $template );
$template = str_replace( "{gavMore_Imagess}", $gavMore_Imagess, $template );
Теперь можем открыть файл flypage.php и оформить вывод наших двух заглушек, у себя сделал так:
Код
<table border="0">
<tr>
<td>{gavMore_Imagess}</td>
</tr>
<tr>
<td>{gavMore_Images}</td>
</tr>
</table>

немного комментариев:
$gavMore_Images - выведет нам из полученного массива картинки дополнительных изображений (которые управляются через добавление файлов)
$gavMore_Imagess - непосредственно изображение товара

Существует ли решение данного вопроса для VM версии 1.1.0 ??
*

laked

  • Новичок
  • 5
  • 0 / 0
Спасибо огромное за мудрый скрипт, но у меня версия магазина : ВМРЕ 1.0.15b Стабильный  [Голодный воробей] (если это имеет вообще значение) и благодаря твоему скрипту получается следующее, всё работает, но при нажатии на дополнительное изображение, оно открывается в большом формате, тупо растянув маленькое изображение, и всё дико пикселит. Подскажи плиз в чем заминка, почему не подгружается большая картинка, а растягивается маленькая?
*

laked

  • Новичок
  • 5
  • 0 / 0
разобралась сама поставила вместо $src_full, $src.. Только вот ещё одна заминка: когда листаешь привьюшки, пропадает gavMore_Imagess, и уже вернуть её нельзя, т.к. в привьюшках она отсутствует. Как её внести в списочек привьюшек, что бы как все просматривать и перелистывать?
*

Ole888

  • Осваиваюсь на форуме
  • 35
  • 0 / 0
а не подскажете, как сделать, что если доп. изображений нету, то чтобы  выводилось, скажем, что картинок нет..
*

oleizey

  • Осваиваюсь на форуме
  • 17
  • 0 / 0
Мучала долго, но все решила. Спасибо большое.
Но текст теперь сдвинулся вниз под все фотографии, а нужно чтобы он был справа.
Баловалась долго с colspan rowspan ничего не меняется.
Может подскажете в чем дело?  :(
*

Alex Revo

  • Завсегдатай
  • 1995
  • 109 / 0
В Опере переключение картинок не работает, только если убрать проверку браузера: if (ns3up || ie4up) { }
« Последнее редактирование: 19.11.2008, 13:42:30 от Alex Revo »
*

Yyqq

  • Новичок
  • 7
  • 2 / 0
Те кто долго мучились, но все решили, подскажите пожалуйста...
Может можно выложить уже исправленный код?
В последней версии VirtueMart не нашел в данном файле именно таких комментариев, пытался вставлял всё это куда то, но ничего так и не вышло хорошего :(
*

oleizey

  • Осваиваюсь на форуме
  • 17
  • 0 / 0
У меня Вирт 1.0.15. для новых видимо совсем иные изменения
*

Denis E

  • Новичок
  • 7
  • 0 / 0
В Опере переключение картинок не работает, только если убрать проверку браузера: if (ns3up || ie4up) { }

Убираю проверку, перестает работать везде) кто знает как сделать чтоб в опере работало подскажите плииииз!
*

Alex Revo

  • Завсегдатай
  • 1995
  • 109 / 0
Вот мой файл.

[вложение удалено Администратором]
*

Denis E

  • Новичок
  • 7
  • 0 / 0
ну с вашим файлом они у меня открываются в новом окне(картинки)... вариант переключения конечно намного интереснее, вот бы только в опере работал  >:(
*

Alex Revo

  • Завсегдатай
  • 1995
  • 109 / 0
Да, я забыл просто что там с просмотром.
Я делал так чтобы они менялись в ожном окне, но там возникла сложность с возвратом основной картинки, поэтому решил оставить так.
*

Denis E

  • Новичок
  • 7
  • 0 / 0
а я основную картинку тоже в файлы прикрепил и отлично!


Не в тему:
может вы случайно знаете ещё ответ на этот вопрос http://joomlaforum.ru/index.php/topic,40768.new.html ))))
*

Denis E

  • Новичок
  • 7
  • 0 / 0
Alex Revo а может вы знаете как хотябы сделать проверку браузера, и в случае если опера чтоб открывались в окошках а не переключались?
*

Alex Revo

  • Завсегдатай
  • 1995
  • 109 / 0
Покажите свой текущий код
*

Denis E

  • Новичок
  • 7
  • 0 / 0
НУ собстно вот он
Код
<?php 
defined( '_VALID_MOS' ) or die( 'Direct Access to this location is not allowed.' );
/**
*
* @version $Id: shop.product_details.php 1188 2008-01-25 19:39:58Z soeren_nb $
* @package VirtueMart
* @subpackage html
* @copyright Copyright (C) 2004-2005 Soeren Eberhardt. All rights reserved.
* @license http://www.gnu.org/copyleft/gpl.html GNU/GPL, see LICENSE.php
* VirtueMart 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 /administrator/components/com_virtuemart/COPYRIGHT.php for copyright notices and details.
*
* http://virtuemart.net
*/
mm_showMyFileName( __FILE__ );

require_once(CLASSPATH . 'ps_product_files.php' );
require_once(CLASSPATH . 'ps_product.php' );
$ps_product = new ps_product;

require_once(CLASSPATH . 'ps_product_category.php' );
$ps_product_category = new ps_product_category;

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;
require_once(CLASSPATH . 'ps_reviews.php' ); 

/* Flypage Parameter has old page syntax: shop.flypage
* so let's get the second part - flypage */
$flypage = mosGetParam($_REQUEST, "flypage", FLYPAGE);

$flypage = str_replace( 'shop.', '', $flypage);

$product_id = intval( mosgetparam($_REQUEST, "product_id", null) );
$product_sku = $db->getEscaped( mosgetparam($_REQUEST, "sku", '' ) );
$category_id = mosgetparam($_REQUEST, "category_id", null);
$manufacturer_id = mosgetparam($_REQUEST, "manufacturer_id", null);
$Itemid = $sess->getShopItemid();
$db_product = new ps_DB;

// Get the product info from the database
$q = "SELECT * FROM `#__{vm}_product` WHERE ";
if( !empty($product_id)) {
$q .= "`product_id`=$product_id";
}
elseif( !empty($product_sku )) {
$q .= "`product_sku`='$product_sku'";
}
else {
mosRedirect( $_SERVER['PHP_SELF']."?option=com_virtuemart&keyword=".urlencode($_SESSION['keyword'])."&category_id={$_SESSION['category_id']}&limitstart={$_SESSION['limitstart']}", $VM_LANG->_PHPSHOP_PRODUCT_NOT_FOUND );
}

if( !$perm->check("admin,storeadmin") ) {
  $q .= " AND `product_publish`='Y'";
  if( CHECK_STOCK && PSHOP_SHOW_OUT_OF_STOCK_PRODUCTS != "1") {
    $q .= " AND `product_in_stock` > 0 ";
  }
}
$db_product->query( $q );

// Redirect back to Product Browse Page on Error
if( !$db_product->next_record() ) {
  $vmLogger->err( $VM_LANG->_PHPSHOP_PRODUCT_NOT_FOUND );
return;
}
if( empty($product_id)) {
$product_id = $db_product->f('product_id');
}
$product_parent_id = $db_product->f("product_parent_id");
if ($product_parent_id != 0) {
$dbp= new ps_DB;
$dbp->query("SELECT * FROM #__{vm}_product WHERE product_id='$product_parent_id'" );
$dbp->next_record();
}

// Let's have a look wether the product has images.
if( $product_parent_id != 0 ) {
  $db->query( "SELECT COUNT(file_id) AS images FROM #__{vm}_product_files WHERE file_product_id=$product_parent_id AND file_is_image=1" );
}
else {
  $db->query( "SELECT COUNT(file_id) AS images FROM #__{vm}_product_files WHERE file_product_id=$product_id AND file_is_image=1" );
}
$db->next_record();
$images = new stdClass();
$images->images = $db->f("images");

// Let's have a look wether the product has related products.
  $q = "SELECT product_sku, related_products FROM #__{vm}_product,#__{vm}_product_relations ";
  $q .= "WHERE #__{vm}_product_relations.product_id='$product_id' AND product_publish='Y' ";
  $q .= "AND FIND_IN_SET(#__{vm}_product.product_id, REPLACE(related_products, '|', ',' )) LIMIT 0, 4";
  $db->query( $q );
/*// This shows randomly selected products from the products table
  // if you don't like to set up related products for each product
  $q = "SELECT product_sku FROM #__{vm}_product ";
  $q .= "WHERE product_publish='Y' AND product_id != $product_id ";
  $q .= "ORDER BY RAND() LIMIT 0, 4";
  $db->query( $q );*/
 
  $related_product_html = "";
  if( $db->num_rows() > 0 ) {
    $related_product_html .= "<hr/>\n";
    $related_product_html .= "<h3>".$VM_LANG->_PHPSHOP_RELATED_PRODUCTS_HEADING.":</h3>\n";
    $related_product_html .= "<table width=\"100%\" align=\"center\"><tr>\n";
    while( $db->next_record() ) {
      $related_product_html .= "<td valign=\"top\">".$ps_product->product_snapshot( $db->f('product_sku') )."</td>\n";
}
    $related_product_html .= "</tr></table>\n";
  }
 
/** GET THE PRODUCT NAME **/
  $product_name = shopMakeHtmlSafe( $db_product->f("product_name") );
  if( $db_product->f("product_publish") == "N" )
    $product_name .= " (".$VM_LANG->_CMN_UNPUBLISHED.")";
  $product_description = $db_product->f("product_desc"); 
  if( (str_replace("<br />", "" , $product_description)=='') && ($product_parent_id!=0) ) {
    $product_description = $dbp->f("product_desc"); // Use product_desc from Parent Product
  }
 
/** Get the CATEGORY NAVIGATION **/
  $navigation_pathway = "";
  $navigation_childlist = "";
  $pathway_appended = false;
  if (empty($category_id))  {
    $q = "SELECT category_id FROM #__{vm}_product_category_xref WHERE product_id = '$product_id' LIMIT 0,1";
    $db->query( $q );
    $db->next_record();
    if( !$db->f("category_id") ) {
      // The Product Has no category entry and must be a Child Product
      // So let's get the Parent Product
      $q = "SELECT product_id FROM #__{vm}_product WHERE product_id = '".$db_product->f("product_parent_id")."' LIMIT 0,1";
      $db->query( $q );
      $db->next_record();
     
      $q = "SELECT category_id FROM #__{vm}_product_category_xref WHERE product_id = '".$db->f("product_id")."' LIMIT 0,1";
      $db->query( $q );
      $db->next_record();
    }
    $_GET['category_id'] = $category_id = $db->f("category_id");
  }
  $navigation_pathway .= $ps_product_category->get_navigation_list($category_id);
  $navigation_pathway .= " ".$ps_product_category->pathway_separator()." ". $product_name;

  if ($ps_product_category->has_childs($category_id) ) {
    $navigation_childlist .= $ps_product_category->get_child_list($category_id);
  }
 
  /* Set Dynamic Pathway */
    $mainframe->appendPathWay( $navigation_pathway );
 
  /* Set Dynamic Page Title */
    $mainframe->setPageTitle( html_entity_decode( substr($product_name, 0, 60 ), ENT_QUOTES ));

  /* Prepend Product Short Description Meta Tag "description" */
    $mainframe->prependMetaTag( "description", strip_tags( $db_product->f("product_s_desc")) );


/** Show an "Edit PRODUCT"-Link ***/
  if ($perm->check("admin,storeadmin")) {
    $edit_link = "<a href=\"". sefRelToAbs($mosConfig_live_site."/index2.php?page=product.product_form&next_page=shop.product_details&product_id=$product_id&option=com_virtuemart&Itemid=$Itemid")."\">
      <img src=\"images/M_images/edit.png\" width=\"16\" height=\"16\" alt=\"". $VM_LANG->_PHPSHOP_PRODUCT_FORM_EDIT_PRODUCT ."\" border=\"0\" /></a>";
  }
  else {
    $edit_link = "";
  }
 
/** LINK TO MANUFACTURER POP-UP **/
  $manufacturer_id = $ps_product->get_manufacturer_id($product_id);
  $manufacturer_name = $ps_product->get_mf_name($product_id);
  $manufacturer_link = "";
  if( $manufacturer_id && !empty($manufacturer_name) ) {
    $link = "$mosConfig_live_site/index2.php?page=shop.manufacturer_page&amp;manufacturer_id=$manufacturer_id&amp;output=lite&amp;option=com_virtuemart&amp;Itemid=".$Itemid;
$text = '( '.$manufacturer_name.' )';
    $manufacturer_link .= vmPopupLink( $link, $text );

    // Avoid JavaScript on PDF Output                           
    if( @$_REQUEST['output'] == "pdf" )
      $manufacturer_link = "<a href=\"$link\" target=\"_blank\" title=\"$text\">$text</a>";
  }
/** PRODUCT PRICE **/
  if (_SHOW_PRICES == '1') { /** Change - Begin */
    if( $db_product->f("product_unit") && VM_PRICE_SHOW_PACKAGING_PRICELABEL)
      $product_price = "<strong>". $VM_LANG->_PHPSHOP_CART_PRICE_PER_UNIT.' ('.$db_product->f("product_unit")."):</strong>";
    else /** Change - End */
      $product_price = "<strong>". $VM_LANG->_PHPSHOP_CART_PRICE. ": </strong>";
    $product_price .= $ps_product->show_price( $product_id );
  }
  else
    $product_price = "";
 
/** Change Packaging - Begin */
/** PRODUCT PACKAGING **/
if (  $db_product->f("product_packaging") ) {
        $packaging = $db_product->f("product_packaging") & 0xFFFF;
        $box = ($db_product->f("product_packaging") >> 16) & 0xFFFF;
        $product_packaging = "";
        if ( $packaging ) {
            $product_packaging .= $VM_LANG->_PHPSHOP_PRODUCT_PACKAGING1.$packaging;
            if( $box ) $product_packaging .= "<br/>";
        }
        if ( $box )
            $product_packaging .= $VM_LANG->_PHPSHOP_PRODUCT_PACKAGING2.$box;
           
        $product_packaging = str_replace("{unit}",$db_product->f("product_unit")?$db_product->f("product_unit") : $VM_LANG->_PHPSHOP_PRODUCT_FORM_UNIT_DEFAULT,$product_packaging);
    }
    else
        $product_packaging = "";
/** Change Packaging - End */

/** PRODUCT IMAGE **/
  $product_image = "";
  $full_image = $db_product->f("product_full_image");
  $full_image = $product_parent_id!=0 && !$db_product->f("product_full_image") ?
  $dbp->f("product_full_image") : $db_product->f("product_full_image"); // Change
  $product_thumb_image = $product_parent_id!=0 && !$db_product->f("product_thumb_image") ?
  $dbp->f("product_thumb_image") : $db_product->f("product_thumb_image"); // Change

  /* Wrap the Image into an URL when applicable */
  if ( $db_product->f("product_url") ) {
    $product_image = "<a href=\"". $db_product->f("product_url")."\" title=\"".$product_name."\" target=\"_blank\">";
    $product_image .= $ps_product->image_tag($full_image, "alt=\"".$product_name."\"", 0);
    $product_image .= "</a>";
  }
  /* Show the Thumbnail with a Link to the full IMAGE */
  elseif( !$db_product->f("product_url") ) {
    if( empty($full_image ) ) {
      $product_image = "<img src=\"".IMAGEURL.NO_IMAGE."\" alt=\"".$product_name."\" border=\"0\" />";
    }
    else {
      // file_exists doesn't work on remote files,
      // so returns false on remote files
      // This should fix the "Long Page generation bug"
      if( file_exists( IMAGEPATH."product/$full_image" )) {
     
        /* Get image width and height */
        if( $image_info = @getimagesize(IMAGEPATH."product/$full_image") ) {
          $width = $image_info[0] + 20;
          $height = $image_info[1] + 20;
        }
      }
      else {
        $width = 640;
        $height= 480;
      }
      if( stristr( $full_image, "http" ) ) {
        $imageurl = $full_image;
      }
      else {
        $imageurl = IMAGEURL."product/$full_image";
      }
      /* Build the "See Bigger Image" Link */
      if( @$_REQUEST['output'] != "pdf" ) {
$link = $imageurl;
$text = $ps_product->image_tag($product_thumb_image, "alt=\"".$product_name."\"", 1)."<br/>".$VM_LANG->_PHPSHOP_FLYPAGE_ENLARGE_IMAGE;
// vmPopupLink can be found in: htmlTools.class.php
$product_image = vmPopupLink( $link, $text, $width, $height );
      }
      else {
        $product_image = "<a href=\"$imageurl\" target=\"_blank\">".$ps_product->image_tag($product_thumb_image, "alt=\"".$product_name."\"", 1)."</a>";
      }
    }
  }

  /* MORE IMAGES ??? */
    $more_images = "";
  if( !empty($images->images) ) {
    /* Build the JavaScript Link */
    $more_images = "<a href=\"$mosConfig_live_site/index.php?option=com_virtuemart&page=shop.view_images&flypage=".mosGetParam($_REQUEST, 'flypage')."&product_id=$product_id&category_id=$category_id&Itemid=$Itemid\">";
    $more_images .= "<img src=\"".IMAGEURL."ps_image/more_images.png\" width=\"16\" height=\"16\" border=\"0\" alt=\"".$VM_LANG->_PHPSHOP_MORE_IMAGES ." (".$images->images.")\" />";
    $more_images .= "<br />".$VM_LANG->_PHPSHOP_MORE_IMAGES." (".$images->images.")</a>";
  }
  /* Files? */
  $file_list = ps_product_files::get_file_list( $product_id );
  /* MORE IMAGES (?????????????? ???????????) */
$gavMore_Images = "";
$gavMore_Imagess = "";
 if( !empty($images->images) )
   {
    $gavMore_Images = "<br />";
    $database->setQuery( "SELECT * FROM #__vm_product_files WHERE file_product_id='$product_id' AND file_is_image='1'" );
    $images = $database->loadObjectList();
    $i = 1;
    foreach( $images as $image )
     {
       $info = pathinfo( $image->file_name );
       $src = dirname($image->file_url) ."/resized/". basename($image->file_name, ".".$info["extension"])."_".PSHOP_IMG_WIDTH."x".PSHOP_IMG_HEIGHT.".".$info["extension"];
       $alt = $image->file_title;
       $height = empty($image->file_image_thumb_height) ? PSHOP_IMG_HEIGHT : $image->file_image_thumb_height;
       $width = empty($image->file_image_thumb_width) ? PSHOP_IMG_WIDTH : $image->file_image_thumb_width;
       $src = str_replace( $mosConfig_absolute_path, $mosConfig_live_site, $image->file_name );
       if( strstr( $src, $mosConfig_live_site.$image->file_name))
       $src_full = str_replace( $mosConfig_live_site.$image->file_name, $mosConfig_live_site."/".$image->file_name, $src_full );
       $alt_full = $image->file_title;
       $height_full = $image->file_image_height+29;
       $width_full = $image->file_image_width+34;
      $border = 1;
      $titlewsp = str_replace(".", "", basename($image->file_name));
      $title = $image->file_title;
      $gavMore_Images .= "<a href=\"javascript:doPic('$src');\" style=\"cursor:hand;cursor:pointer;padding:5px\"><img src=\"$src\" height=\"70px\" border=1/></a>";     
      ++$i;
     }//end foreach
   }
  /* END MORE IMAGES (?????????????? ???????????) */
?>
<SCRIPT LANGUAGE="JavaScript">
<!-- Begin
browserName = navigator.appName;
browserVer = parseInt(navigator.appVersion);

ns3up = (browserName == "Netscape" && browserVer >= 3);
ie4up = (browserName.indexOf("Microsoft") >= 0 && browserVer >= 4);

function doPic(imgName) {
if (ns3up || ie4up) {
imgOn = ("" + imgName);
document.mainpic.src = imgOn;
   }
}
//  End -->
</script>
<?php
$gavMore_Imagess .= "<img name=\"mainpic\" src=\"$imageurl\" height=\"300px\"  border=\"0\">";
/** AVAILABILITY **/
  // This is the place where it shows:
  // Availability: 24h, In Stock: 5 etc.
  // You can make changes to this functionality in the file: classes/ps_product.php
  if( @$_REQUEST['output'] != "pdf" )
    $product_availability = $ps_product->get_availability($product_id);
   
/* SHOW RATING */
  $product_rating = "";
  if (PSHOP_ALLOW_REVIEWS == '1') {
    $product_rating = "<span class=\"contentheading\">".$VM_LANG->_PHPSHOP_CUSTOMER_RATING.":</span><br />";
    $product_rating .= ps_reviews::allvotes( $product_id );
  }

/* ADD-TO-CART */
  $addtocart = "<div>
    <form action=\"". $mm_action_url."index.php\" method=\"post\" name=\"addtocart\" id=\"addtocart\">"
          .$ps_product_attribute->list_attribute($product_id)
          // added for the advanced attribute modification
          .$ps_product_attribute->list_advanced_attribute($product_id)
          // end added for advanced attribute modification
          .$ps_product_attribute->list_custom_attribute($product_id);
          // end added for custom attribute modification
if (USE_AS_CATALOGUE != '1'
&& $product_price != ""
&& !stristr( $product_price, $VM_LANG->_PHPSHOP_PRODUCT_CALL )
&& $auth['show_prices']) {
$quantity = mosGetParam( $_REQUEST, 'quantity', 1 );
        $addtocart .= "
        <p><label for=\"quantity\" style=\"vertical-align: middle;\">".$VM_LANG->_PHPSHOP_CART_QUANTITY.":</label>
            <input type=\"text\" class=\"inputbox\" size=\"4\" id=\"quantity\" name=\"quantity\" value=\"$quantity\" style=\"vertical-align: middle;\" />&nbsp;
            <input type=\"submit\" ";
        $addtocart .= "style=\"text-align:center;background-position:bottom left;width:160px;height:35px;cursor:pointer;border:none;font-weight:bold;font-family:inherit;background: url('". IMAGEURL ."ps_image/".PSHOP_ADD_TO_CART_STYLE ."') no-repeat left center transparent;vertical-align: middle;\" ";
        $addtocart .= "value=\"".$VM_LANG->_PHPSHOP_CART_ADD_TO ."\" title=\"".$VM_LANG->_PHPSHOP_CART_ADD_TO."\" />
          </p>
      <input type=\"hidden\" name=\"flypage\" value=\"shop.$flypage\" />
      <input type=\"hidden\" name=\"page\" value=\"shop.cart\" />
      <input type=\"hidden\" name=\"manufacturer_id\" value=\"$manufacturer_id\" />
      <input type=\"hidden\" name=\"category_id\" value=\"$category_id\" />
      <input type=\"hidden\" name=\"func\" value=\"cartAdd\" />
      <input type=\"hidden\" name=\"option\" value=\"$option\" />
      <input type=\"hidden\" name=\"Itemid\" value=\"$Itemid\" />";
}
    $addtocart .= "</form>
    </div>";

/* LIST ALL REVIEWS **/
  if (PSHOP_ALLOW_REVIEWS == '1') {
      /*** Show all reviews available ***/
      $product_reviews = ps_reviews::product_reviews( $product_id );
      /*** Show a form for writing a review ***/
      $product_reviewform = ps_reviews::reviewform( $product_id );
  }
  else {
    $product_reviews = $product_reviewform = "";
  }
/* LINK TO VENDOR-INFO POP-UP **/
  $vend_id = $ps_product->get_vendor_id($product_id); 
  $vend_name = $ps_product->get_vendorname($product_id);
 
  $link = "$mosConfig_live_site/index2.php?page=shop.infopage&amp;vendor_id=$vend_id&amp;output=lite&amp;option=com_virtuemart&amp;Itemid=".$Itemid;
  $text = $VM_LANG->_PHPSHOP_VENDOR_FORM_INFO_LBL;
  $vendor_link = vmPopupLink( $link, $text );
 
  // Avoid JavaScript on PDF Output
  if( @$_REQUEST['output'] == "pdf" )
    $vendor_link = "<a href=\"$link\" target=\"_blank\" title=\"$text\">$text</a>";
 
  if ($product_parent_id!=0 && !$ps_product_type->product_in_product_type($product_id)) {
  $product_type = $ps_product_type->list_product_type($product_parent_id);
  }
  else {
$product_type = $ps_product_type->list_product_type($product_id);
  }

/**
*   Read the template file into a String variable.
*   Then replace the placeholders with HTML formatted product details
*
* function read_file( $file, $defaultfile='') ***/
$template = read_file( PAGEPATH.'templates/product_details/'.basename($flypage).'.php', PAGEPATH.'templates/product_details/flypage.php');

/** NOW LET'S BEGIN AND FILL THE TEMPLATE **/
$template = str_replace( "{gavMore_Images}", $gavMore_Images, $template );
$template = str_replace( "{gavMore_Imagess}", $gavMore_Imagess, $template );
$template = str_replace( "{navigation_pathway}", $navigation_pathway, $template );
$template = str_replace( "{navigation_childlist}", $navigation_childlist, $template );
$template = str_replace( "{product_name}", $product_name, $template );
$template = str_replace( "{product_image}", $product_image, $template );
$template = str_replace( "{full_image}", $full_image, $template ); // to display the full image on flypage
$template = str_replace( "{more_images}", $more_images, $template );
$template = str_replace( "{file_list}", $file_list, $template );
$template = str_replace( "{edit_link}", $edit_link, $template );
$template = str_replace( "{manufacturer_link}", $manufacturer_link, $template );
$template = str_replace( "{product_price}", $product_price, $template );
$template = str_replace( "{product_s_desc}", $db_product->f("product_s_desc"), $template );
$template = str_replace( "{product_description}", $product_description, $template );
$template = str_replace( "{product_weight}", $db_product->f("product_weight"), $template );
$template = str_replace( "{product_sku}", $db_product->f("product_sku"), $template );
$template = str_replace( "{addtocart}", $addtocart, $template );
$template = str_replace( "{product_reviews}", $product_reviews, $template );
$template = str_replace( "{product_reviewform}", $product_reviewform, $template );
$template = str_replace( "{product_availability}", $product_availability, $template );
$template = str_replace( "{vendor_link}", $vendor_link, $template );
$template = str_replace( "{mosConfig_live_site}", $mosConfig_live_site, $template );
$template = str_replace( "{related_products}", $related_product_html, $template );
$template = str_replace( "{product_type}", $product_type, $template ); // Changed Product Type
$template = str_replace( "{product_packaging}", $product_packaging, $template ); // Changed Packaging
$template = str_replace( "{product_width}", $db_product->f("product_width"), $template ); // ??????
$template = str_replace( "{product_height}", $db_product->f("product_height"), $template ); // ??????
$template = str_replace( "{product_length}", $db_product->f("product_length"), $template ); // ?????

/*
  Really cool regular expression that let's you easily translate the flypage
  Usage:
   {vm_lang:_PHPSHOP__PHPSHOP_ACCOUNT_TITLE}
   will print the content of $VM_LANG->_PHPSHOP_ACCOUNT_TITLE
   from the current language
*/
$template = preg_replace("/{vm_lang:([^}]*)}/ie", "\$VM_LANG->\\1", $template);

/* Finish and Print out the Page */
echo $template;

?>
*

Alex Revo

  • Завсегдатай
  • 1995
  • 109 / 0
Попробуй вставить скрипт в таком варианте:
Код
<SCRIPT LANGUAGE="JavaScript">
browserName = navigator.appName;
browserVer = parseInt(navigator.appVersion);
ns3up = (browserName == "Netscape" && browserVer >= 3);
ie4up = (browserName.indexOf("Microsoft") >= 0 && browserVer >= 4);

function doPic(imgName) {
imgOn = ("" + imgName);
document.mainpic.src = imgOn;
}
</script>

Всем привет!
Все сделал так как описано в этом топике. Немного переделал под свои нужды. Все классно. Но!!!
Но качество большого изображения стало хуже. Это хорошо видно на картинках с изгибами, особенно в ИЕ (они как будто надорваны). Помогите решить эту проблему.
*

unchowam

  • Новичок
  • 7
  • 0 / 0
Если я правильно понимаю то для joomla 1.5.9 и VM 1.13 ваш код нужно вставить в файл theme.php. Не подскажите как правильно это реализовать?Я не силен в РНР ,но мне кажется что в theme.php описывается class, и там есть уже две крутых  функции: function vmlistAdditionalImages и function vmMoreImagesLink , ваш код нужно добавить как новую функцию?Или функцию vmlistAdditionalImages преоброзовать как нибудь?Или я не прав?
Помогите разобраться разобраться с этим очень прошу?



[вложение удалено Администратором]
*

kewlman

  • Захожу иногда
  • 50
  • 3 / 0
Нашел сам , кому понадобится пользуйтесь

http://forum.virtuemart.net/index.php?action=dlattach;topic=39569.0;attach=6843
просто заменить все файлы.
*

unchowam

  • Новичок
  • 7
  • 0 / 0
Нашел сам , кому понадобится пользуйтесь

http://forum.virtuemart.net/index.php?action=dlattach;topic=39569.0;attach=6843
просто заменить все файлы.

Не подскажешь где можно посмотреть как все это работает?
*

unchowam

  • Новичок
  • 7
  • 0 / 0
После просмотра сайта, и просмотра файлов темы так я и не понял в чем отличие  от темы default.Может я туплю?
Мне нужно вывести дополнительные изображения товара на одну страницу с основным  как описано в этой теме выше.
Может подскажешь как это сделать?
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Вывод товара из дочерних категорий в родительскую

Автор B0nG

Ответов: 0
Просмотров: 3061
Последний ответ 03.08.2014, 15:13:57
от B0nG
ID товара вместо cdata

Автор newsky

Ответов: 0
Просмотров: 2766
Последний ответ 01.07.2014, 13:05:12
от newsky
Расширенный Ajax-поиск по характеристикам товара VirtueMart

Автор Arkadiy

Ответов: 990
Просмотров: 216989
Последний ответ 27.06.2014, 16:47:52
от DeLight
Не могу убрать форму "Задайте вопрос..." на странице товара

Автор abrodski

Ответов: 1
Просмотров: 2886
Последний ответ 20.05.2014, 14:30:44
от abrodski
Свойства товара без подтягивания скидки

Автор One

Ответов: 0
Просмотров: 2284
Последний ответ 13.05.2014, 16:53:53
от One