在Prestashop

时间:2017-02-23 12:35:39

标签: php prestashop-1.6

我想将product.available_date添加到Prestashop 1.6中的购物车中。

我在shopping-cart-product-line-tpl中添加了以下行

{if isset($product.available_date) && $product.available_date > $smarty.now|date_format:'%Y-%m-%d'}
  <span id="availability_date_label">{l s='Availability date:'}</span>
  <span id="availability_date_value">
    {if Validate::isDate($product.available_date)}
    {dateFormat date=$product.available_date full=false}
    {/if}
  </span>

但我发现在Cart.php中没有设置available_date

我在cart.php中找到了以下功能

  

公共函数getProducts($ refresh = false,$ id_product = false,$ id_country = null)

我认为用于收集产品数据,它有一个sql-&gt;选择如下:

    // Build query
    $sql = new DbQuery();

    // Build SELECT
    $sql->select('cp.`id_product_attribute`, cp.`id_product`, cp.`quantity` AS cart_quantity, cp.id_shop, pl.`name`, p.`is_virtual`,
                    pl.`description_short`, pl.`available_now`, pl.`available_later`, **(added p.`available_date` here)**,product_shop.`id_category_default`, p.`id_supplier`,
                    p.`id_manufacturer`, product_shop.`on_sale`, product_shop.`ecotax`, product_shop.`additional_shipping_cost`,
                    product_shop.`available_for_order`, product_shop.`price`, product_shop.`active`, product_shop.`unity`, product_shop.`unit_price_ratio`,
                    stock.`quantity` AS quantity_available, p.`width`, p.`height`, p.`depth`, stock.`out_of_stock`, p.`weight`,
                    p.`date_add`, p.`date_upd`, IFNULL(stock.quantity, 0) as quantity, pl.`link_rewrite`, cl.`link_rewrite` AS category,
                    CONCAT(LPAD(cp.`id_product`, 10, 0), LPAD(IFNULL(cp.`id_product_attribute`, 0), 10, 0), IFNULL(cp.`id_address_delivery`, 0)) AS unique_id, cp.id_address_delivery,
                    product_shop.advanced_stock_management, ps.product_supplier_reference supplier_reference');

    // Build FROM
    $sql->from('cart_product', 'cp');

    // Build JOIN
    $sql->leftJoin('product', 'p', 'p.`id_product` = cp.`id_product`');
    $sql->innerJoin('product_shop', 'product_shop', '(product_shop.`id_shop` = cp.`id_shop` AND product_shop.`id_product` = p.`id_product`)');
    $sql->leftJoin('product_lang', 'pl', '
        p.`id_product` = pl.`id_product`
        AND pl.`id_lang` = '.(int)$this->id_lang.Shop::addSqlRestrictionOnLang('pl', 'cp.id_shop')
    );

    $sql->leftJoin('category_lang', 'cl', '
        product_shop.`id_category_default` = cl.`id_category`
        AND cl.`id_lang` = '.(int)$this->id_lang.Shop::addSqlRestrictionOnLang('cl', 'cp.id_shop')
    );

    $sql->leftJoin('product_supplier', 'ps', 'ps.`id_product` = cp.`id_product` AND ps.`id_product_attribute` = cp.`id_product_attribute` AND ps.`id_supplier` = p.`id_supplier`');

    // @todo test if everything is ok, then refactorise call of this method
    $sql->join(Product::sqlStock('cp', 'cp'));

    // Build WHERE clauses
    $sql->where('cp.`id_cart` = '.(int)$this->id);
    if ($id_product) {
        $sql->where('cp.`id_product` = '.(int)$id_product);
    }
    $sql->where('p.`id_product` IS NOT NULL');

    // Build ORDER BY
    $sql->orderBy('cp.`date_add`, cp.`id_product`, cp.`id_product_attribute` ASC');

    if (Customization::isFeatureActive()) {
        $sql->select('cu.`id_customization`, cu.`quantity` AS customization_quantity');
        $sql->leftJoin('customization', 'cu',
            'p.`id_product` = cu.`id_product` AND cp.`id_product_attribute` = cu.`id_product_attribute` AND cu.`id_cart` = '.(int)$this->id);
        $sql->groupBy('cp.`id_product_attribute`, cp.`id_product`, cp.`id_shop`');
    } else {
        $sql->select('NULL AS customization_quantity, NULL AS id_customization');
    }

    if (Combination::isFeatureActive()) {
        $sql->select('
            product_attribute_shop.`price` AS price_attribute, product_attribute_shop.`ecotax` AS ecotax_attr,
            IF (IFNULL(pa.`reference`, \'\') = \'\', p.`reference`, pa.`reference`) AS reference,
            (p.`weight`+ pa.`weight`) weight_attribute,
            IF (IFNULL(pa.`ean13`, \'\') = \'\', p.`ean13`, pa.`ean13`) AS ean13,
            IF (IFNULL(pa.`upc`, \'\') = \'\', p.`upc`, pa.`upc`) AS upc,
            IFNULL(product_attribute_shop.`minimal_quantity`, product_shop.`minimal_quantity`) as minimal_quantity,
            IF(product_attribute_shop.wholesale_price > 0,  product_attribute_shop.wholesale_price, product_shop.`wholesale_price`) wholesale_price
        ');

        $sql->leftJoin('product_attribute', 'pa', 'pa.`id_product_attribute` = cp.`id_product_attribute`');
        $sql->leftJoin('product_attribute_shop', 'product_attribute_shop', '(product_attribute_shop.`id_shop` = cp.`id_shop` AND product_attribute_shop.`id_product_attribute` = pa.`id_product_attribute`)');
    } else {
        $sql->select(
            'p.`reference` AS reference, p.`ean13`,
            p.`upc` AS upc, product_shop.`minimal_quantity` AS minimal_quantity, product_shop.`wholesale_price` wholesale_price'
        );
    }

    $sql->select('image_shop.`id_image` id_image, il.`legend`');
    $sql->leftJoin('image_shop', 'image_shop', 'image_shop.`id_product` = p.`id_product` AND image_shop.cover=1 AND image_shop.id_shop='.(int)$this->id_shop);
    $sql->leftJoin('image_lang', 'il', 'il.`id_image` = image_shop.`id_image` AND il.`id_lang` = '.(int)$this->id_lang);

    $result = Db::getInstance()->executeS($sql);

我尝试在查询中添加p.available_date并获取日期,但是如果产品有组合则不行。然后它在两种组合上添加了相同的日期。

任何人都知道如何让它适用于组合?

1 个答案:

答案 0 :(得分:0)

以上查询将通过将cart表与产品,类别和制造商表相关联来获取数据。上述查询中没有联接组合。但是您已经注意到系统正在从上面的查询中获取每个产品的 id_product_attribute ,如果组合功能在存储中处于活动状态,那么系统已经具有获取组合数据的条件,如下所示:

New-PSDrive -Name "X" -PSProvider FileSystem -Root "\\192.168.0.1\hde_path" -Persist

要获取组合可用日期,只需在选择查询中添加可用日期列,如下面的代码所示:

if (Combination::isFeatureActive()) {  
   $sql->select('
            product_attribute_shop.`price` AS price_attribute, product_attribute_shop.`ecotax` AS ecotax_attr,
            IF (IFNULL(pa.`reference`, \'\') = \'\', p.`reference`, pa.`reference`) AS reference,
            (p.`weight`+ pa.`weight`) weight_attribute,
            IF (IFNULL(pa.`ean13`, \'\') = \'\', p.`ean13`, pa.`ean13`) AS ean13,
            IF (IFNULL(pa.`isbn`, \'\') = \'\', p.`isbn`, pa.`isbn`) AS isbn,
            IF (IFNULL(pa.`upc`, \'\') = \'\', p.`upc`, pa.`upc`) AS upc,
            IFNULL(product_attribute_shop.`minimal_quantity`, product_shop.`minimal_quantity`) as minimal_quantity,
            IF(product_attribute_shop.wholesale_price > 0,  product_attribute_shop.wholesale_price, product_shop.`wholesale_price`) wholesale_price
        ');
        $sql->leftJoin('product_attribute', 'pa', 'pa.`id_product_attribute` = cp.`id_product_attribute`');
        $sql->leftJoin('product_attribute_shop', 'product_attribute_shop', '(product_attribute_shop.`id_shop` = cp.`id_shop` AND product_attribute_shop.`id_product_attribute` = pa.`id_product_attribute`)');  
}  else {
        $sql->select(
            'p.`reference` AS reference, p.`ean13`, p.`isbn`,
            p.`upc` AS upc, product_shop.`minimal_quantity` AS minimal_quantity, product_shop.`wholesale_price` wholesale_price'
        );
}