Как получить все изображения товара на странице категории - Prestashop - PullRequest
1 голос
/ 04 января 2012

Я использую Prestashop. У меня возникают проблемы при загрузке всех изображений для продукта на странице категории. Например: -

У меня есть продукт с именем "abc". Есть 3 изображения для этого продукта. один - изображение обложки и два других изображения. Я хочу отобразить все три изображения на странице категории, в настоящее время отображается только изображение обложки.

Ответы [ 4 ]

1 голос
/ 28 октября 2013

Пока я решал проблему в одном из проектов моего клиента.Я также хочу показать все изображения на странице со списком продуктов.

Я использовал код, на который ответил @Ravi Kumar, и работал с назначенной переменной $ images в файле шаблона, например

<ul id="thumbs_list_frame">
    {if isset($images[$product.id_product])}
        {foreach from=$images[$product.id_product] item=image name=thumbnails}
        {assign var=imageIds value="`$product.id_product`-`$image.id_image`"}
        <li id="thumbnail_{$image.id_image}">

                <img  id="thumb_{$image.id_image}" src="{$link->getImageLink($product.link_rewrite, $imageIds, 'large_default')}" alt="{$image.legend|htmlspecialchars}"  alt="" title="{$product->name|escape:'htmlall':'UTF-8'}" width="{$largeSize.width}" height="{$largeSize.height}"  />

        </li>
        {/foreach}
    {/if}
</ul>

ниже Iпишу свою функцию, написанную в файле categoryController.php

/**
 * Assign list of products template vars
 */
public function assignProductList()
{
    $hookExecuted = false;
    Hook::exec('actionProductListOverride', array(
        'nbProducts' => &$this->nbProducts,
        'catProducts' => &$this->cat_products,
        'hookExecuted' => &$hookExecuted,
    ));


    // The hook was not executed, standard working
    if (!$hookExecuted)
    {
        $this->context->smarty->assign('categoryNameComplement', '');
        $this->nbProducts = $this->category->getProducts(null, null, null, $this->orderBy, $this->orderWay, true);
        $this->pagination((int)$this->nbProducts); // Pagination must be call after "getProducts"
        $this->cat_products = $this->category->getProducts($this->context->language->id, (int)$this->p, (int)$this->n, $this->orderBy, $this->orderWay);
    }
    // Hook executed, use the override
    else
        // Pagination must be call after "getProducts"
        $this->pagination($this->nbProducts);

    $productImages = array();                
    $newImages = array(); 

    foreach ($this->cat_products as &$product)
    {
        if ($product['id_product_attribute'] && isset($product['product_attribute_minimal_quantity']))
            $product['minimal_quantity'] = $product['product_attribute_minimal_quantity'];

        $new_product = new ProductCore($product['id_product']);
        $images = $new_product->getImages((int)self::$cookie->id_lang);

        foreach ($images AS $k => $image)
        {
            $productImages[(int)$image['id_image']] = $image;
        }

        $newImages[$product['id_product']] = $productImages;

        $productImages = null;
        $new_product = null;
    }
    if (count($newImages))
                self::$smarty->assign('images', $newImages);  

    $this->context->smarty->assign('nb_products', $this->nbProducts);
}
0 голосов
/ 17 июня 2016

Ладно, похоже, это очень распространенная проблема: будучи новичком в prestashop и имея дело с той же проблемой, я обнаружил множество похожих запросов в режиме онлайн и никаких рабочих решений, так что вот как я получил его:

Первый: переопределить класс Product, создать / override / classes / Product.php

class Product extends ProductCore {
    /**
     * @param string $id_product  ID of the product to fetch
     * @param bool $exclude_cover  Whether to remove or not the cover from the returned list
     * @return array List of the product images
     * @throws PrestaShopDatabaseException
     */
    public static function getProductImagesID($id_product, $exclude_cover = false) {
        $id_image = Db::getInstance()->executeS('SELECT `id_image` FROM `' . _DB_PREFIX_ . 'image` WHERE `id_product` = ' . (int)($id_product) . ($exclude_cover ? ' AND `cover` IS NULL' : '') . ' ORDER BY position ASC');
        return $id_image;
    }
}

Второй: использовать его какВы хотите в любых .tpl файлах

...
{assign var='productImgs' value=Product::getProductImagesID($product.id_product,true)}
{* now you have an array of product images called $productImgs *}
{* eg. show the first image of the product that is not saved as cover *}
<img class="..." src="{$link->getImageLink($product.link_rewrite, $productImgs[0]['id_image'], 'home_default')|escape:'html':'UTF-8'}" alt="..."/>

Готово!

Бонус: доступ к базе данных из файла контроллера должен иметь смысл, но переопределение класса должно сэкономить вам при обновлении платформы.

Не забудьте удалить файл кэша / cache / class_index.php и отключить / включить все системы кэширования prestashop.Надеюсь, что это может помочь кому-то еще.

0 голосов
/ 18 июля 2012
class CategoryController extends CategoryControllerCore
{
    function __construct()  {
        parent::__construct();
    }

    public function process()
    {
        parent::process();

        $productImages = array();                
        $newImages = array();                
        foreach($this->cat_products as $product)  
        {
            $new_product = new ProductCore($product['id_product']);
            $images = $new_product->getImages((int)self::$cookie->id_lang);

            foreach ($images AS $k => $image)
            {
                $productImages[(int)$image['id_image']] = $image;
            }

            $newImages[$product['id_product']] = $productImages;
            $productImages = null;
            $new_product = null;

        }
        if (count($newImages))
            self::$smarty->assign('images', $newImages);   
    }

}
0 голосов
/ 21 января 2012

Используйте классы. В папке prestashop есть папка с именем override. Создайте файл php и попробуйте сделать это, используя переопределение класса.

...