thincmf 导航与当前页面内容怎么关联,二级页获取当前导航id,显示子导航

thincmf 二、三级页面侧面子导航怎么获取?导航链接最终打开的是url链接,链接中只带了文章分类信息,并没有导航信息,如何在二页面判断是点击哪个导航打开的??

如何高亮当前栏目,如何获取当前栏目的二级导航???

 

如果不用通用模版,每个栏目一个模版,那么可以这样:

<php>
$parent_nav_menu_id=6;
</php>
<subNavigation parent="$parent_nav_menu_id" root="ul" id="main-navigation" class="nav navbar-nav navbar-nav-custom">
    <subNavigationMenu root="li" class="menu-item">
        <a href="{$menu.href|default=''}" target="{$menu.target|default=''}">{$menu.name|default=''}</a>
    </subNavigationMenu>
    <subNavigationFolder root="li" class="dropdown dropdown-custom" dropdown="ul" dropdown-class="dropdown-menu">
        <a href="#" class="dropdown-toggle" data-toggle="dropdown">
            {$menu.name|default=''}<span class="caret"></span>
        </a>
    </subNavigationFolder>
</subNavigation>

 

如果不同栏目使用通用模版 list.html    article.html  page.html

nav表中 href 字段存储  list  {"action":"portal\/List\/index","param":{"id":1}}      page  {"action":"portal\/Page\/index","param":{"id":1}}

list和article里 可以根据当前catid 去nav表查询属于哪个导航,然后查找顶级导航

like ‘:10}’  && like ‘List’    或者组合成字符串 {"action":"portal\/List\/index","param":{"id":xx}} 然后再查询。

page里 没有catid,需要通过文章id去查询属于哪个导航

/*根据catid返回相关导航信息
    返回:array[rootid,rootname,currentid,currentname,subnav]
  */
  function getnav($where){
       
       if($where){ 
        $nav=Db::name('nav_menu')->where('href',$where)->find(); //有可能有多个? 
        $currentid=$nav["id"];
        $currentname=$nav["name"];
        $rootid=$nav["parent_id"]==0?$currentid:$nav["parent_id"];
        $rootname=$nav["parent_id"]==0?$currentname:getnavname($rootid);
        $subnav=Db::name('nav_menu')->where('parent_id',$rootid)->select();
        return ["currentid"=>$currentid,"currentname"=>$currentname,"rootid"=>$rootid,"rootname"=>$rootname,"subnav"=>$subnav];
       }else{
           return ["currentid"=>"","currentname"=>"","rootid"=>"","rootname"=>"","subnav"=>[]];
       }
       
  }

  function getlistnav($catid){
    return getnav($catid?'{"action":"portal\/List\/index","param":{"id":'.$catid.'}}':'');
  }

  function getpagenav($id){
      return getnav($id?'{"action":"portal\/Page\/index","param":{"id":'.$id.'}}':'');
  }

  function getnavroot($navid){

  }

  function getnavname($navid){ 
      $nav=Db::name('nav_menu')->where('id',$navid)->find();
      if($nav){return $nav["name"];}
      return "";
  }

直接通过subnav显示子导航不行 vo.href 不能正确获取。需要使用以下方法显示子导航。

<php>
        $nav=getlistnav($category["id"]); 
        $submenus = $navMenuModel->subNavMenusTreeArray($nav["rootid"]);
    </php>
   <volist name="$submenus" id="vo">
                  <li class="<if $nav["currentid"]==$vo.id>current</if>"><a href="{$vo.href}" class="" target="{$vo['target']}">{$vo.name}</a>
</volist> 

 

 还可以使用 $nav["rootid"] 来高亮导航菜单。

导航菜单显示时 <li data-id=导航id ,然后在获取到$nav["rootid"]后通过JavaScript 给相应导航addclass 。

或者 把  $nav=getlistnav($category["id"]); 放到头部显示导航之前 ,然后<if $nav["rootid"] ==$vo.id>class=.....

 

内容页面显示子导航,选中出现问题。点击主栏目显示包含子类的文章时,点击子类文章打开详情页面无法选中子导航,因为传递的cid参数是主栏目id

解决方法:列表页面链接 <a href="{:cmf_url('portal/Article/index',array('id'=>$vo['id'],'cid'=>$category['id']))}"> 换成  <a href="{:cmf_url('portal/Article/index',array('id'=>$vo['id'],'cid'=>$vo['category_id']))}">

以上方法文章选择一个分类时有效,如果文章选择了子类和父类无效。

所以需要修改文章显示逻辑。点击主栏目显示所有子栏目文章,改为组合子类id。后台添加时不再选择主栏目分类,主栏目下不再添加文章,所有文章全部添加到子类里。

若想显示所有子类内容,需要查找所有子类,组合成ids 英文逗号隔开

                    $ids=$category['id'];
                    $str="";
                    $subcats=\app\portal\service\ApiService::allSubCategories($category['id']);
                    if($subcats){
                      foreach($subcats as $k=>$v){
                         $str.=$v["id"].",";
                      }
                    }
                    $str=rtrim($str,',');
                    if($str) $ids=$str;

<portal:articles item="vo" where="$where" order="post.create_time DESC" page="$page"
relation="categories"
categoryIds="$ids"
returnVarName="articles_data">

 

posted @ 2023-07-04 16:45  djiz  阅读(98)  评论(0编辑  收藏  举报