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">