2013-06-17 3 views
1

Мы хотим сделать быстрый анализ на странице продукта, которая сравнивает текущий продукт, а затем двух ведущих продавцов в этой категории после этого. У меня есть все SQL, чтобы получить текущий продукт и два, которые являются топ-продавцами, но у меня проблемы с добавлением функций к этим. Это то, с чем я столкнулся.Характеристики продукта Prestashop PHP SQL

Это как раз пример. Этот SQL будет вытаскивать функции продукта в пределах категории.

SELECT ps_product.id_product, ps_feature_lang.name, ps_feature_value_lang.value FROM ps_product LEFT JOIN ps_feature_product ON ps_feature_product.id_product = ps_product.id_product LEFT JOIN ps_feature_lang ON ps_feature_lang.id_feature = ps_feature_product.id_feature LEFT JOIN ps_feature_value_lang ON ps_feature_value_lang.id_feature_value = ps_feature_product.id_feature_value WHERE ps_product.id_category_default = '6' AND ps_feature_lang.id_feature IS NOT NULL 

возвращает

id_product | name | value 
9   Height 5 
9   Width 5 
9   Depth 5 
9   Weight 5 
10   Height 10 

Я попытался группе id_product, но, конечно, покажет только из значений из списка функций для данного продукта. Я также попытался помещать их в массивы по продуктам, но не могу заставить их правильно выстраиваться на передний план.

Я не был уверен, что если PrestaShop уже встроенную функцию, чтобы вытащить характеристики продуктов

ответ

1

С MySQL вы можете попробовать использовать GROUP_CONCAT(), которые могли бы помочь в этом запросе. Однако мы написали быстрый фрагмент кода, чтобы дать вам обзор того, что вы можете сделать.

Этот код:

  • Извлекает два лучших продавцов категории текущего продукта
  • Получает список функций для 3-х продуктов (текущий продукт + 2 лучших продавцов)
  • Group эти и отображать их в HTML таблицу

Вот конечный результат:

Product comparison

Код:

<?php 

include(dirname(__FILE__).'/config/config.inc.php'); 
include(dirname(__FILE__).'/init.php'); 
ini_set('display_errors', 'On'); 

$id_product = 1; /* Current Product ID */ 
$id_category = 2; /* Current Category ID */ 
$id_lang = 1; /* Current Language ID */ 

/* Retrieve the two Best sellers for this category, excluding the current product */ 
$best_sellers = Db::getInstance()->ExecuteS(' 
SELECT ps.id_product, pl.name product_name 
FROM '._DB_PREFIX_.'product_sale ps 
LEFT JOIN '._DB_PREFIX_.'category_product cp ON (cp.id_product = ps.id_product) 
LEFT JOIN '._DB_PREFIX_.'product p ON (p.id_product = cp.id_product) 
LEFT JOIN '._DB_PREFIX_.'product_lang pl ON (pl.id_product = p.id_product) 
WHERE cp.id_category = '.(int)$id_category.' AND cp.id_product != '.(int)$id_product.' AND p.active = 1 AND pl.id_lang = '.(int)$id_lang.' 
ORDER BY ps.sale_nbr DESC 
LIMIT 2'); 

if (count($best_sellers)) 
{ 
    $products_to_compare = array(); 
    $products_names = array(); 
    foreach ($best_sellers as $best_seller) 
    { 
     $products_to_compare[] = (int)$best_seller['id_product']; 
     $products_names[(int)$best_seller['id_product']] = $best_seller['product_name']; 
    } 
    $products_to_compare[] = (int)$id_product; 
    $products_names[(int)$id_product] = 'Current product'; /* Replace by the current product name */ 

    $features = Db::getInstance()->ExecuteS(' 
    SELECT fp.id_product, fp.id_feature, fl.name feature_name, fvl.value feature_value 
    FROM '._DB_PREFIX_.'feature_product fp 
    LEFT JOIN '._DB_PREFIX_.'feature_lang fl ON (fl.id_feature = fp.id_feature) 
    LEFT JOIN '._DB_PREFIX_.'feature_value_lang fvl ON (fvl.id_feature_value = fp.id_feature_value) 
    WHERE fp.id_product IN ('.pSQL(implode(',', $products_to_compare)).')'); 

    $features_to_display = array(); 
    foreach ($features as $feature) 
    { 
     if (!isset($features_to_display[(int)$feature['id_feature']])) 
     { 
      $features_to_display[(int)$feature['id_feature']] = array(); 
      $features_to_display[(int)$feature['id_feature']]['name'] = $feature['feature_name']; 
     } 

     $features_to_display[(int)$feature['id_feature']][(int)$feature['id_product']] = $feature['feature_value']; 
    } 

    echo ' 
    <table cellpadding="5" cellspacing="0" border="1"> 
     <tr> 
      <td></td>'; 

    foreach ($products_to_compare as $product_to_compare) 
      echo '<td>'.($product_to_compare == $id_product ? '<b>' : '').Tools::safeOutput($products_names[(int)$product_to_compare]).($product_to_compare == $id_product ? '</b>' : '').'</td>'; 

    echo '</tr>'; 

    foreach ($features_to_display as $feature_to_display) 
    { 
     echo ' 
     <tr> 
      <td>'.Tools::safeOutput($feature_to_display['name']).'</td>'; 

     foreach ($products_to_compare as $product_to_compare) 
      echo '<td>'.($product_to_compare == $id_product ? '<b>' : '').Tools::safeOutput($feature_to_display[(int)$product_to_compare]).($product_to_compare == $id_product ? '</b>' : '').'</td>'; 

     echo ' 
     </tr>'; 
    } 

    echo ' 
    </table>'; 

} 
else 
    die('Sorry, no best sellers for this category'); 

Этот код может быть улучшен, чтобы сохранить память и передавать результаты в Smarty (вместо того, чтобы отображать их непосредственно в контроллере).

+0

Wow! Вы ответили на мой вопрос раз миллион! Спасибо! Я все еще изучаю все призвания Престашопа, которые они используют, и это очень помогло! –

+0

Я применил приведенный выше код для работы на моем сайте. Тем не менее, я постоянно получаю ошибку Undefined Offset: 12 и Undefined Offset: 10. Он говорит, что находится в сети 92 –

Смежные вопросы