php - Prestashop 如何获取查询中的所有 on_sale 产品?

标签 php mysql smarty prestashop

所以我有一个查询,找到所有“on_sale”= 1的产品,但问题是在 smarty href="{$product.link}" 中什么也不返回 这是 SQL 查询

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

查询找到了我需要的所有产品,但这些产品没有链接。

最佳答案

嘿,您可以通过将 Context 类对象传递给 smarty 模板,然后 $contextobj->link->getProductLink() 来重新生成链接;将所需的参数传递给函数,可能需要 ProductID、rewritingURL 等。

关于php - Prestashop 如何获取查询中的所有 on_sale 产品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36427875/

相关文章:

php - Paypal IPN 消息

PHP、MySQL 选择所有 if

css - 将 smarty 变量插入 sass

conditional-statements - smarty tags和css condition tags一样,请问如何解决?

php - mysql中如何比较时间

php - Doctrine 2.1 性能问题

mysql - 如何将删除结果保存到mysql中的变量中?

mysql - 使用 MySQL 连接三个表

javascript - Smarty 内部 javascript 条件...可能吗?

php - 在 Mysql 和 php 中不显示空数据的链接