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

Тема в разделе "JavaScript", создана пользователем Freeman Liberty, 18 апр 2013.

Модераторы: ZiX
  1. Freeman Liberty

    Freeman Liberty

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

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

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

    Вложения:

  2. nethare

    nethare Постоялец

    Регистр.:
    27 окт 2012
    Сообщения:
    104
    Симпатии:
    30
    А сейчас на сайте рабочая корзина или нет?

    Попробовал, товары из корзины не удаляются в принципе, хотя крестик для удаления вроде есть.
     
  3. Freeman Liberty

    Freeman Liberty

    Регистр.:
    19 май 2009
    Сообщения:
    468
    Симпатии:
    171
    В каком браузере пробовал?
    Я работаю через хром - все добавляется и удаляется, только картинки к товару появляются после перезагрузки страницы.
     
  4. nethare

    nethare Постоялец

    Регистр.:
    27 окт 2012
    Сообщения:
    104
    Симпатии:
    30
    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"'truetrue) : '';
                        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^)
     
    Freeman Liberty нравится это.
  5. Freeman Liberty

    Freeman Liberty

    Регистр.:
    19 май 2009
    Сообщения:
    468
    Симпатии:
    171
    Замена фала 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"'truetrue) : '';
    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>
    Теперь вместо надписи "В корзине .... товаров" выводится ">"
    Видимо ошибка в коде, но не могу понять где?
     
  6. nethare

    nethare Постоялец

    Регистр.:
    27 окт 2012
    Сообщения:
    104
    Симпатии:
    30
    А попробуйте узнать, что у вас в массиве $data->products вообще находится. Если все как надо, ошибку вывода уже как минимум будет смысл искать.

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

    Freeman Liberty

    Регистр.:
    19 май 2009
    Сообщения:
    468
    Симпатии:
    171
    Написал как и советовали ближе к концу файла <? var_dump($data->products); ?> - ничего не изменилось.
    Как и где можно увидеть результаты?
    Уж извините в PHP почти совсем не разбираюсь.