2012-01-04 3 views
1

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

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

ответ

-1

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

0
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); 
    } 

} 
1

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

Я использовал код ответил на @Ravi Кумар, и работал с присвоенной переменной $ изображений в файле шаблона, как этот

<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> 

ниже я пишу свою функцию написанную в 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

Я отредактировал выше ответ, специально смарт-код. Потому что это проблема с созданием проблемы при перезаписи URL. Чтобы получить код пути изображения: $ link-> getImageLink ($ name, $ ids, $ type = NULL) ' Наконец-то я получил путь к изображению' src = "{$ link-> getImageLink ($ product.link_rewrite, $ imageIds, 'large_default')} "' –

0

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

Первое: переопределять класс продукта, создать /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. Надеюсь, это поможет кому-то еще.