zoukankan      html  css  js  c++  java
  • zencart 目录产品显示控制

    想要点击一级目录显示所有的相应的二级目录的产品,修改 \includes\modules\pages\index 中的 main_template_vars.php

    将 $tpl_page_body = 'tpl_index_categories.php'; 
    修改为:$tpl_page_body = 'tpl_index_product_list.php';
    但是不会分页。。。(测试环境 zen-cart-v139h-utf8)

    -----------------华丽的--------------------------------------
    以下是转载的详细说明,原文地址:http://ifeeline.com/archives/106

    在zen-cart中,目录跟产品的关系是多对多的关系,意思就是说一个目录可以有多个产品,一个产品也可以归属多个目录,看一下数据结构:


    数据结构

    从这个数据结构中我们还看到,parent_id自引用categories_id实现目录的级联,很显然,这是最合理的实现方式。在zen-cart的默认实现中,如果一个目录包含了子目录,当选择这个目录时就会把它里面的子目录显示出来,这是合理的方式,但是有时候我们并不想显示子目录而是想显示这个目录以及所有子目录里面的所有产品,如果仅仅是不希望显示子目录,那么只要一级目录里面不放入子目录而只放入产品就可以解决这个问题,如果提供这个解决方案给你,你或者不会满意,你可能希望建立一个目录结构,为了细分,目录还会嵌套目录,但是显示产品的时候是把选中的这个目录里面的所有产品(包含子目录的)显示出来。要实现这个,非要动手术不行了……..

    我们知道,zen-cart里面,显示首页、显示子目录和显示目录里面的产品都是在同一个页面完成的,根据zen-cart的模板机制,它一定是通过加载不同的模板实现的,或者说通过不同的请求参数,加载不同的视图,zen-cart要实现这种功能,一定是通过main_template_vars.php这个控制文件实现的,这个文件可能不在当前页面的对应的文件夹中(有一个公用的),因为只有要实现不同参数加载不同视图时,才需要一个定制的main_template_vars.php文件。

    接下来,首先看看includes/modules/pages/index目录里面的header_php.php文件(因为它先于main_template_vars.php被加载),看一下它先干什么:(源码就不贴了)

    这个文件中先标志$category_depth = ‘top’,然后根据$current_category_id判断目录深度,如果它有包含产品,标记为$category_depth = ‘products’,注意:如果包含产品又包含目录,它只认为这个目录是只包含产品。如果没有包含任何产品就判断是否有子目录,如果有子目录就标记为$category_depth = ‘nested’,否则就是空目录了,那么还是标记为$category_depth = ‘products’,这是一段关键代码,先铺垫一下。

    接下来,打开main_template_vars.php文件看看,会发现它根据$category_depth参数加载视图,如果$category_depth == ‘nested’就$tpl_page_body = ‘tpl_index_categories.php’(显示子目录),如果$category_depth == ‘products’就$tpl_page_body = ‘tpl_index_product_list.php’(显示产品),否则就$category_depth = ‘products’(显示首页),这样的话,手术动起来思路就明确了,把$category_depth == ‘nested’的情况也让它$tpl_page_body = ‘tpl_index_product_list.php’就可以了,但是又有新问题产生,$category_depth == ‘nested’时事实它里面没有包含产品,现在要获得的是把它里面包含的所有子目录的全部产品,所以,必须修改数据库查询,我们看到如下代码:

    // set the product filters according to selected product type
    $typefilter = ‘default’;
    if (isset($_GET['typefilter'])) $typefilter = $_GET['typefilter'];
    require(DIR_WS_INCLUDES . zen_get_index_filters_directory($typefilter . ‘_filter.php’));

    所以现在打开default_filter.php,定位到 elseif($category_depth == ‘nested’){ 这种情况原本是检索当前目录下的所有子目录的,这里要改成获取当前目录里面的所有子目录的全部产品,我是这样搞的:zen_get_subcategories($arr,$current_category_id)把当前目录的子目录获取出来,装入$arr数组,然后用$category_query_str=’(‘.implode(‘,’,array_unique($arr)).’)'构建查询串,最后限制查询的目录在这个范围内( categories_id in “.$category_query_str.” )。这样子就算完工了,还好,手术不算庞大。

  • 相关阅读:
    LightOJ1074(spfa+dfs标记负环及负环能够到达的点)
    (模板)AC自动机模板
    poj3660(floyd最短路)
    (模板)hdoj2544(最短路--bellman-ford算法&&spfa算法)
    hdoj4099(字典树+高精度)
    poj1056(字符串判断是否存在一个字符串是另一个字符串的前缀)
    hdoj1247(字典树)
    poj3630||hdoj1671(字典树)
    (模板)hdoj1251(字典树模板题)
    poj3348(求凸包面积)
  • 原文地址:https://www.cnblogs.com/xiangniu/p/2442579.html
Copyright © 2011-2022 走看看