Не отображается изображение при добавлении товара на ajax

Freeman Liberty

Постоялец
Регистрация
19 Май 2009
Сообщения
489
Реакции
173
В модуле корзины для virtuemart (Joomla) при добавлении или удалении товара не отображаются изображения продукта. Если страницу обновить изображения снова появляются.
Есть тот же модуль но с немного другим функционалом (нет возможности удалять товар из корзины, нет лимита по кол-ву отображаемых товаров ) в котором картинки отображаются как положено.
Был бы весьма признателен если бы кто-то разбирающийся в ajax подсказал бы в чем дело.
Хотелось бы чтобы заработал именно этот модуль.

Фалы рабочей и не рабочей корзины прилагаются.

Ссылка на сайт с корзиной
 

Вложения

  • mod_ice_virtuemart_cart.zip
    56,3 KB · Просмотры: 5
  • mod_ice_virtuemart_cart-s-rabochimi-izobrajeniyami.zip
    46,1 KB · Просмотры: 3
А сейчас на сайте рабочая корзина или нет?

Попробовал, товары из корзины не удаляются в принципе, хотя крестик для удаления вроде есть.
 
В каком браузере пробовал?
Я работаю через хром - все добавляется и удаляется, только картинки к товару появляются после перезагрузки страницы.
 
Chrome, аналогично. Только что попробовал еще раз. Добавил 2 товара, после чего попробовал удалить. Один удалился нормально, второй - нет. Канал хороший, из-за перебоев соединения такого быть не может. Глючит модуль.

Теперь по делу. Когда мы нажимаем кнопку "в корзину" отправляется ajax запрос к файлу ajax.php, который есть в обоих версиях модуля. В этом файле формируется блок корзины и отсылается нам обратно. Когда же страница обновляется, то блок этот формируется уже в файле /tmpl/default.php.

/* лирическое отступление begin */
Это дичайший маразм - когда код и шаблон смешаны в одну кучу. Да, ajax-корзину сложно сделать иначе, вынося шаблон в отдельные файлы, но в joomlа так смешано собственно говоря, все. Я, вообще не понимаю мазохистов, которые пишут, используют дорабатывают жумлу с архитектурой 15-летней давности.
/* лирическое отступление end */

Собственно вывод картинок находится в цикле

PHP:
foreach ($data->products as $product) {}
, который начинается на 148 строке (модуль 1). Картинка выводится вот тут:

PHP:
<div class="imag">
            <?php
            foreach($prodcart as $key=>$v){
                if($v->virtuemart_product_id == $product['product_vm_id']) {
                    $thumb = !empty($v->images[0]) ? $v->images[0]->displayMediaThumb('class="image"', false, 'class="modal"', true, true) : '';
                    echo $thumb;
                }
            }
            ?>
        </div>

А вот что это за foreach($prodcart as $key=>$v) - я вообще не понял. Какие-то переменные и функции из жумла-фреймворка. Я не знаю, в общем. Но явно картинку оно нифига не отображает.

Во втором модуле картинки в аякс-выдаче (ajax.php) выводятся вот так:

PHP:
foreach ($data->products as $product){
$product["image"] = JString::str_ireplace( 'modules/mod_ice_virtuemart_cart/', '', $product["image"]);
?><div style="clear:both;"></div>
<div class="lof_item">
<a href="<?php echo $product["link"];?>"><img src="<?php echo $product["image"]; ?>" alt="<?php print htmlspecialchars($product['product_name']);?>"/></a>

Но перед этим есть подготовка данных по товарам, начиная со строки 105 (модуль 2).

PHP:
if(!empty($data->products)){
    foreach($data->products as $key=>$value){
        $product = isset($tmp[$value["product_sku"]])?$tmp[$value["product_sku"]]:null;
        if(empty($product)){
            $product_name = strip_tags($value["product_name"]);
            $product_name = JFilterOutput::stringURLSafe($product_name);
            $product = isset($tmp2[$product_name])?$tmp2[$product_name]:null;
        }
        if(!empty($product)){
            $tmpArray = array();
     
            $data->products[$key]["virtuemart_product_id"] = $product->virtuemart_product_id;
            $data->products[$key]["product_name"] = $product->product_name;
            $data->products[$key]["product_in_stock"] = $product->product_in_stock;
            $data->products[$key]["virtuemart_media_id"] = $product->virtuemart_media_id;
            $data->products[$key]["categories"] = $product->categories;
            $data->products[$key]["virtuemart_category_id"] = $product->virtuemart_category_id;
            $data->products[$key]["link"] = $product->link;
            $data->products[$key]["image"] = "";
            $mediaModel = VmModel::getModel('Media');
            $tmpProduct = new stdClass;
            $tmpProduct->virtuemart_media_id = $data->products[$key]["virtuemart_media_id"];
            $mediaModel->attachImages($tmpProduct, "products", "image", 0);
            if(isset($tmpProduct->images) && !empty($tmpProduct->images)){
                $data->products[$key]["image"] = $tmpProduct->images[0]->file_url_thumb;
            }
            if(strpos( $data->products[$key]["image"], "http") === FALSE && strpos($data->products[$key]["image"], "https") === FALSE){
                $data->products[$key]["image"] = JURI::base().$data->products[$key]["image"];
            }
        }
    }
}






В общем, попробуйте заменить файл ajax.php:) Если не получится, попробуйте вставить код подготовки данных по товарам из 2 модуля в первый, между 107 и 108 строкой. Ну и соответственно заменить все между <div class='imag'>...</div>. За то, что будет работать не ручаюсь - проверить негде, да и жумлянская внутренняя архитектура для меня всегда была загадкой.

P.S. Дружеский совет - переходите на Opencart^)
 
Замена фала ajax.php приводит к тому что пропадает сама надпись "В корзине .... товаров" соответственно нет возможности развернуть блок чтобы посмотреть появились ли изображения.
Попробовал 2-ой вариант

1. Между 107 и 108 вставил блок подготовки данных
Получилось:
PHP:
   $data->billTotal = $lang->_('COM_VIRTUEMART_CART_TOTAL').' : <strong>'. $data->billTotal .'</strong>';
    if(!empty($data->products)){
    foreach($data->products as $key=>$value){
        $product = isset($tmp[$value["product_sku"]])?$tmp[$value["product_sku"]]:null;
        if(empty($product)){
            $product_name = strip_tags($value["product_name"]);
            $product_name = JFilterOutput::stringURLSafe($product_name);
            $product = isset($tmp2[$product_name])?$tmp2[$product_name]:null;
        }
        if(!empty($product)){
            $tmpArray = array();
 
            $data->products[$key]["virtuemart_product_id"] = $product->virtuemart_product_id;
            $data->products[$key]["product_name"] = $product->product_name;
            $data->products[$key]["product_in_stock"] = $product->product_in_stock;
            $data->products[$key]["virtuemart_media_id"] = $product->virtuemart_media_id;
            $data->products[$key]["categories"] = $product->categories;
            $data->products[$key]["virtuemart_category_id"] = $product->virtuemart_category_id;
            $data->products[$key]["link"] = $product->link;
            $data->products[$key]["image"] = "";
            $mediaModel = VmModel::getModel('Media');
            $tmpProduct = new stdClass;
            $tmpProduct->virtuemart_media_id = $data->products[$key]["virtuemart_media_id"];
            $mediaModel->attachImages($tmpProduct, "products", "image", 0);
            if(isset($tmpProduct->images) && !empty($tmpProduct->images)){
                $data->products[$key]["image"] = $tmpProduct->images[0]->file_url_thumb;
            }
            if(strpos( $data->products[$key]["image"], "http") === FALSE && strpos($data->products[$key]["image"], "https") === FALSE){
                $data->products[$key]["image"] = JURI::base().$data->products[$key]["image"];
            }
        }
    }
}
    ?>


2. заменил часть кода отвечающего за вывод картинки:
PHP:
<div class="imag">
<?php
foreach($prodcart as $key=>$v){
if($v->virtuemart_product_id == $product['product_vm_id']) {
$thumb = !empty($v->images[0]) ? $v->images[0]->displayMediaThumb('class="image"', false, 'class="modal"', true, true) : '';
echo $thumb;
}
}
?>
</div>
//заменил на
 
<div class="imag">
<?php
foreach ($data->products as $product){
$product["image"] = JString::str_ireplace( 'modules/mod_ice_virtuemart_cart/', '', $product["image"]);
?><div style="clear:both;"></div>
<a href="<?php echo $product["link"];?>"><img src="<?php echo $product["image"]; ?>" alt="<?php print htmlspecialchars($product['product_name']);?>"/></a>
</div>
Теперь вместо надписи "В корзине .... товаров" выводится ">"
Видимо ошибка в коде, но не могу понять где?
 
А попробуйте узнать, что у вас в массиве $data->products вообще находится. Если все как надо, ошибку вывода уже как минимум будет смысл искать.

Напишите где-нибудь ближе к концу файла <? var_dump($data->products); ?> Посмотрите, есть ли там действительно картинки - элемент массива с ключом "image".
 
Напишите где-нибудь ближе к концу файла <? var_dump($data->products); ?> Посмотрите, есть ли там действительно картинки - элемент массива с ключом "image".
Написал как и советовали ближе к концу файла <? var_dump($data->products); ?> - ничего не изменилось.
Как и где можно увидеть результаты?
Уж извините в PHP почти совсем не разбираюсь.
 
Назад
Сверху