2016-04-05 11 views
0

so bin ich eine Abfrage, die alle Produkte findet, die „on_sale“ = 1, aber das Problem ist, dass hier in Smarty href="{$product.link}" Rückkehr nichts die SQL-Abfrage ist IPrestashop Wie bekomme ich alle Produkte on_sale in Abfrage?

public static function getOnSaleProducts($id_lang, $page_number = 0, $nb_products = 10, 
             $count = false, $order_by = null, $order_way = null, Context $context = null) 
{ 
    if (!$context) 
     $context = Context::getContext(); 
    $front = true; 
    if (!in_array($context->controller->controller_type, array('front', 'modulefront'))) 
     $front = false; 
    if ($page_number < 0) $page_number = 0; 
    if ($nb_products < 1) $nb_products = 10; 
    if (empty($order_by) || $order_by == 'position') $order_by = 'date_add'; 
    if (empty($order_way)) $order_way = 'DESC'; 
    if ($order_by == 'id_product' || $order_by == 'price' || $order_by == 'date_add' || $order_by == 'date_upd') 
     $order_by_prefix = 'p'; 
    else if ($order_by == 'name') 
     $order_by_prefix = 'pl'; 
    if (!Validate::isOrderBy($order_by) || !Validate::isOrderWay($order_way)) 
     die(Tools::displayError()); 
    $groups = FrontController::getCurrentCustomerGroups(); 
    $sql_groups = (count($groups) ? 'IN ('.implode(',', $groups).')' : '= 1'); 
    if (strpos($order_by, '.') > 0) 
    { 
     $order_by = explode('.', $order_by); 
     $order_by_prefix = $order_by[0]; 
     $order_by = $order_by[1]; 
    } 
    if ($count) 
    { 
     $sql = 'SELECT COUNT(p.`id_product`) AS nb 
       FROM `'._DB_PREFIX_.'product` p 
       '.Shop::addSqlAssociation('product', 'p').' 
       WHERE product_shop.`active` = 1 
       AND DATEDIFF(
        product_shop.`date_add`, 
        DATE_SUB(
         NOW(), 
         INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY 
        ) 
       ) > 0 
       '.($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : '').' 
       AND p.`id_product` IN (
        SELECT cp.`id_product` 
        FROM `'._DB_PREFIX_.'category_group` cg 
        LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`) 
        WHERE cg.`id_group` '.$sql_groups.' 
       )'; 
     return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql); 
    } 
    $sql = new DbQuery(); 
    $sql->select(
     'p.*, product_shop.*, stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity, pl.`description`, pl.`description_short`, pl.`link_rewrite`, pl.`meta_description`, 
     pl.`meta_keywords`, pl.`meta_title`, pl.`name`, image_shop.`id_image`, il.`legend`, m.`name` AS manufacturer_name' 
    ); 
    $sql->from('product', 'p'); 
    $sql->join(Shop::addSqlAssociation('product', 'p')); 
    $sql->leftJoin('product_lang', 'pl', ' 
     p.`id_product` = pl.`id_product` 
     AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl') 
    ); 
    $sql->leftJoin('image', 'i', 'i.`id_product` = p.`id_product`'); 
    $sql->join(Shop::addSqlAssociation('image', 'i', false, 'image_shop.cover=1')); 
    $sql->leftJoin('image_lang', 'il', 'i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang); 
    $sql->leftJoin('manufacturer', 'm', 'm.`id_manufacturer` = p.`id_manufacturer`'); 
    $sql->where('product_shop.`active` = 1'); 
    $sql->where('(image_shop.id_image IS NOT NULL OR i.id_image IS NULL) OR (image_shop.id_image IS NULL AND i.cover=1)'); 
    if ($front) 
     $sql->where('product_shop.`visibility` IN ("both", "catalog")'); 
    $sql->where(' 
     DATEDIFF(
      product_shop.`date_add`, 
      DATE_SUB(
       NOW(), 
       INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY 
      ) 
     ) > 0' 
    ); 
    $sql->where('p.`id_product` IN (
     SELECT cp.`id_product` 
     FROM `'._DB_PREFIX_.'category_group` cg 
     LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`) 
     WHERE cg.`id_group` '.$sql_groups.')' 
    ); 
    $sql->orderBy((isset($order_by_prefix) ? pSQL($order_by_prefix).'.' : '').'`'.pSQL($order_by).'` '.pSQL($order_way)); 
    if (Combination::isFeatureActive()) 
    { 
     $sql->select('pa.id_product_attribute'); 
     $sql->leftOuterJoin('product_attribute', 'pa', 'p.`id_product` = pa.`id_product`'); 
     $sql->join(Shop::addSqlAssociation('product_attribute', 'pa', false, 'product_attribute_shop.default_on = 1')); 
     $sql->where('(pa.id_product_attribute IS NULL OR product_attribute_shop.id_shop='.(int)$context->shop->id.')'); 
    } 
    $sql->join(Product::sqlStock('p', Combination::isFeatureActive() ? 'product_attribute_shop' : 0)); 
    $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql); 
    if ($order_by == 'price') 
     Tools::orderbyPrice($result, $order_way); 
    if (!$result) 
     return false; 
    $products_ids = array(); 
    foreach ($result as $row) 
     $products_ids[] = $row['id_product']; 
    // Thus you can avoid one query per product, because there will be only one query for all the products of the cart 
    Product::cacheFrontFeatures($products_ids, $id_lang); 
    return Product::getProductsProperties((int)$id_lang, $result); 
} 

die Abfrage findet alle das Produkt brauchen aber die Produkte haben keine Links.

+4

Seitliche Anmerkung auf Codequalität: Sie möchten möglicherweise "sauberen Code" durch Robert Martin studieren. Sie wissen, die Tatsache, dass Sie sich entscheiden, in PHP zu programmieren, bedeutet nicht, dass Sie unbedingt komplizierten, schwer lesbaren, schwerer zu wartenden Code schreiben müssen ... – GhostCat

+1

Woher soll der product.link zu einigen stammen? Sie generieren es nirgendwo in diesem Code, haben Sie vergessen, Context :: getContext() -> link-> getProductLink (...) aufzurufen? Außerdem solltest du wirklich darüber nachdenken, was @ Jägermeister gesagt hat, denn Gott bewahre, dass es in diesem Code einen Fehler gibt, ich werde Zivilisationen fallen und steigen sehen, bevor du es debuggen kannst. – Eihwaz

Antwort

0

Hey, Sie können die Verbindung neu generieren, indem Sie das Context-Klassenobjekt an die Smarty-Vorlage übergeben und dann $ contexttobj-> link-> getProductLink(); passierte den requied Parameter zur Funktion kann es productID nehmen, rewrittenURL usw.