DedeCMS 输出 N 级导航菜单

简爱代码>DedeCMS2015-5-20 21:5563972

自己在工作中用到的,就是自己按照 DedeCMS 的标签写法谢了一个 方便调用

毕竟DedeCMS 在 模板里面写 PHP代码不太方便

此标签输出的标准的<ul><li>多级导航菜单,只不过不含最外围的<ul> 标签 方便自定义

当前 样式 为 .cur调用方法为<ul>{dede:asilu menuid=0 home='首页'/}</ul> 这就是输出 N 级导航菜单


当然你也可以指定 菜单样式

默认的<li>样式为 <li~cur~><a href="~typelink~">~typename~</a></li>

如果你想为每个分类定义 图标的话也可以实现

调用标签自定义自己的<li>样式{dede:asilu menuid=0 home='首页' li='<li~cur~><img src="/icon/~id~.png"/><a href="~typelink~">~typename~</a></li>'/}

然后再网站根目录 下 icon 文件夹 存放名字为 分类 ID png 格式分类图标即可

其中可用的替换参数 有

~cur~ 当前样式 如果为当前 就输出 class="cur" 否则 为空

~id~ 当前分类 ID

~reid~ 当前分类的 父 ID

~topid~ 顶级 ID

~typelink~当前链接名称

~typename~链接地址


复制下面代码保存至DedeCMS安装目录/include/taglib/asilu.lib.php 下即可

附件代码内容

<?php   if(!defined('DEDEINC')) exit('Request Error!');
/**
 * 简爱 的自用标签  删除多级导航菜单及 幻灯片获取
 *
 * @version        $Id: channelartlist.lib.php 1 9:29 2015年5月19日Z 简爱 $
 * @package        DedeCMS.Taglib
 * @copyright      Copyright (c) 2015 - 2020, DesDev, Inc.
 * @license        http://asilu.com
 * @link           http://asilu.com
 */

function lib_asilu(&$ctag,&$refObj){
	global $dsql, $cfg_templets_skin, $cfg_cmsurl, $cfg_cmspath;
	if(isset($ctag->CAttribute->Items[imgs])){
		extract($ctag->CAttribute->Items);
		$images = getImages($imgs);
		if(empty($images) || !is_array($images)) return '';
		$li = $li ? $li : '<li><img src="~img~"/></li>';
		$l = '';
		foreach($images as $img){
			$l .= strtr($li, array('~img~' => $img));'';
		}
		return $l;
	}

	if(isset($ctag->CAttribute->Items[menuid])){
		//处理标记属性、innertext
		// $attlist = 'menuid|0,row|20,cacheid|';
		// FillAttsDefault($ctag->CAttribute->Items,$attlist);
		extract($ctag->CAttribute->Items, EXTR_SKIP);
		$innertext = trim($ctag->GetInnerText());
		$artlist = '';
		//读取固定的缓存块
		$cacheid = trim($cacheid);
		if($cacheid !='') {
			$artlist = GetCacheBlock($cacheid);
			if($artlist!='') return $artlist;
		}

		$curid = ( !empty($refObj->TypeLink->TypeInfos['id']) ?  $refObj->TypeLink->TypeInfos['id'] : 0 );
		if($innertext=='') $innertext = GetSysTemplets('part_channelartlist.htm');
		$totalnum = $row;
		if(empty($totalnum)) $totalnum = 20;
		$totalnum = 500;
		$tpsql = " ishidden<>1 ";
		$dsql->SetQuery("SELECT id,typename,typedir,isdefault,ispart,defaultname,namerule2,moresite,siteurl,reid,topid,sitepath
												FROM `#@__arctype` WHERE $tpsql ORDER BY sortrank ASC LIMIT $totalnum");
		//获得类别ID总数的信息
		$typeids = array();
		$dsql->Execute();
		while($row = $dsql->GetArray()) {
			$typeids[] = $row;
		}

		if($menuid==0 || $menuid=='top') {
			$menuid = array(0);
		} elseif(!preg_match('#,#', $menuid)) {
			$menuid = preg_split('/[\s]*,[\s]* /', $menuid, 0, PREG_SPLIT_NO_EMPTY);
		} else {
			$menuid = array($menuid);
		}
		$li = $li ? $li : '<li~cur~><a href="~typelink~">~typename~</a></li>';
		if($home)
			$ul = strtr($li, array(
				"~cur~" => (0 == $curid ? ' class="cur"' : ''),
				"~id~" => 0,
				"~typelink~" => "/$cfg_cmspath/",
				"~typename~" => $home,
			)) ."\r\n";
		else
			$ul = '';
		foreach($menuid as $id){
			$ul .= jaTree($typeids, $li, $id, $curid) ."\r\n";
		}
		return $ul;
	}
	return '';
}



// 获取指定文件夹 图片
function getImages($dir){
	static $path;
	if(!$path) $path = realpath(dirname(__FILE__) ."/../../") . '/';
	$dir = $path . trim($dir, "\\/");
	if(!is_dir($dir)) return '';
	$file = "$dir/ja_images.php";
	if(file_exists($file))
		return require_once $file;
	$images = glob("$dir/*.{jpg,jpeg,gif,png}", GLOB_BRACE);
	if(is_array($images)){
		foreach ($images as &$v){ $v = basename($v); }
		sort($images);
	}
	$date = gmdate('Y/m/d H:i:s', time() + 3600 * 8);
	file_put_contents($file, "<?php\r\n# $date 动态生成 可删除\r\n\r\nreturn\r\n". var_export($images, true) .';');
	return $images;
}


// 不含最外围的 <ul> 的 N 级菜单输出
function jaTree($list, $li_tpl = '<li~cur~><a href="~typelink~">~typename~</a></li>', $reid=0, $curid=0, $sp='  '){
	// static $ul = '';
	$li_tpl = str_replace('</li>', '', $li_tpl);
	$ul = '';
	foreach($list as $v){
		if($v['reid'] == $reid){
			$cur = $v['id'] == $curid ? ' class="cur"' : '';
			$ul .= $sp . strtr($li_tpl, array(
				// "~rel~" => $v['rel'],
				"~cur~" => $cur,
				"~id~" => $v['id'],
				"~reid~" => $v['reid'],
				"~topid~" => $v['topid'],
				"~typelink~" => GetOneTypeUrlA($v),
				"~typename~" => $v['typename'],
			));
			$li = jaTree($list, $li_tpl, $v['id'], $curid, $sp . $sp . $sp);
			$ul .= !empty($li) ? "\r\n$sp$sp<ul>\r\n$li$sp$sp</ul>\r\n$sp" : '';
			$ul .= "</li>\r\n";
		}
	}
	return $ul;
}


本文出自简爱博客,转载时请注明出处及相应链接。

本文章所含附件 (1):

评论

  1. 牛逼2015-07-22 13:41回复

    试试看 好不好用[可怜/]

  2. 简爱2015-06-04 21:57回复

    的风格的风格风
    fdgdfgdfgfdfggfg
    的方法的鬼地方