周五有空把Handsome主题更新了,发现作者采纳了博主的意见加入了隐藏特定页面的功能。

handsome主题默认在导航栏页面栏目输出所有页面,但是有些页面我不想让他显示在页面分类下(比如时光机),所以通过自定义字段控制是否输出。修改handsome/component/aside.php找到【🔠代码】在<?php while($pages->next()): ?>下面一行加入【🔠代码】然后给不想输出的页面加一个自定义字段navbar并把字段值改为hide即可

不过博主感觉功能还是太弱,所以这周末做了一点微小的工作,让Handsome主题兼容TeMenu插件。

TeMenu插件

TeMenu是Typecho下唯一一款菜单管理插件,体验和Windows下相差不太远。

导航菜单支持添加分类链接、独立页面链接以及自定义链接

导航菜单链接支持自定义链接图标及打开方式

导航菜单支持多级菜单(样式需自行设置)

可添加多个导航菜单以应对不同需求

下载地址

收费插件,请到官网购买下载。
http://lixianhua.com/temenu_plugin_for_typecho.html

兼容方法

1、到usr/themes/handsome/libs目录下新增Menu.php
Menu.php的内容如下所示

  • <?php
  • if (!defined('__TYPECHO_ROOT_DIR__')) exit;
  • /**
  • * Menu.php
  • * Author : Ryan
  • * Date : 2018/07/21
  • * Version : 1.0.0
  • * Description: 使用PHP方法输出菜单
  • */
  • class Menu {
  • /**
  • * 菜单初始化
  • * @param string $slug
  • * @return void
  • */
  • public function parse($slug) {
  • $html = '';
  • $all = Typecho_Plugin::export();
  • if (array_key_exists('TeMenu', $all['activated'])) {
  • $navigation = json_decode(Typecho_Widget::widget('Widget_Options')->plugin('TeMenu')->navigation, true);
  • if(!array_key_exists($slug, $navigation)){
  • $html = '<li><a href="' . str_replace('login.php','',Typecho_Widget::widget('Widget_Options')->loginUrl) .'extending.php?panel=TeMenu%2Fpanel.php"><i class="fontello fontello-menu"></i><span>请到后台新增菜单</span></a></li>';
  • } else {
  • $menu = $navigation[$slug]['menu'];
  • $html = self::parseMenu($menu);
  • }
  • } else {
  • $html = '';
  • $html.= self::title('导航');
  • $hideHomeItem = false;
  • if(!empty(Typecho_Widget::widget('Widget_Options')->asideItems)){
  • $json = '['.Typecho_Widget::widget('Widget_Options')->asideItems.']';
  • $asideItems = json_decode($json);
  • $asideItemsOutput = "";
  • foreach ($asideItems as $asideItem){
  • $itemName = $asideItem->name;
  • @$itemStatus = $asideItem->status;
  • @$itemLink = $asideItem->link;
  • @$itemClass = $asideItem->class;
  • @$itemTarget = $asideItem->target;
  • if ($itemName === 'home' && strtoupper($itemStatus) === 'HIDE'){
  • $hideHomeItem = true;
  • continue;//本次循环结束,不再执行下面内容
  • }
  • if (@$itemTarget){
  • $linkStatus = 'target="'.$itemTarget.'"';
  • }else{
  • $linkStatus = 'target="_blank"';
  • }
  • $asideItemsOutput .= '<li> <a '.$linkStatus.' href="'.$itemLink.'" class ="auto"><i class="'.$itemClass.' icon text-md"></i><span>'._mt($itemName).'</span></a></li>';
  • }
  • }
  • if (!$hideHomeItem) { //首页
  • $html .= '<!--主页--><li><a href="' . Typecho_Widget::widget('Widget_Options')->rootUrl . '/" class="auto"><i class="iconfont icon-zhuye icon text-md"></i><span>' . _mt("首页") . '</span></a></li><!-- /主页 -->';
  • }
  • $html .= @$asideItemsOutput;
  • if (@!in_array('component',Typecho_Widget::widget('Widget_Options')->asideSetting)) {
  • $html .= self::line(); //分割线
  • $html .= self::title("组成");
  • $html .= self::categories(); //分类
  • $html .= self::pages();
  • $html .= self::friends();
  • }
  • }
  • echo $html;
  • }
  • /**
  • * 生成菜单 HTML
  • * @param string $menu
  • * @return string
  • */
  • public function parseMenu($menu, $depth = 1) {
  • $html = '';
  • $archive = Typecho_Widget::widget('Widget_Archive');
  • foreach($menu as $k=>$v){
  • if ($v['type']=='category'){
  • $category = Typecho_Widget::widget('Widget_Metas_Category_List')->getCategory($v['id']);
  • $v['url'] = $category['permalink'];
  • $v['slug'] = $category['slug'];
  • $v['current'] = $archive->is('category',$category['slug']);
  • } elseif ($v['type']=='page'){
  • $page = Typecho_Widget::widget('Menu_Page_List')->getPage($v['id']);
  • $v['url'] = $page['permalink'];
  • $v['slug'] = $page['slug'];
  • $v['current'] = $archive->is('page',$page['slug']);
  • } else {
  • $url = $archive->request->getRequestUrl();
  • $v['url'] = $v['id'];
  • $v['current'] = $url === $v['url'];
  • }
  • $v['target'] = isset($v['target']) && $v['target'] ? 'target="_blank"' : '';
  • $v['class'] = "";
  • switch($v['icon']) {
  • case "title":
  • $html .= self::title($v['name']);
  • break;
  • case "friends":
  • $html .= self::friends($v['name']);
  • break;
  • case "pages":
  • $html .= self::pages($v['name']);
  • break;
  • case "categories":
  • $html .= self::categories($v['name']);
  • break;
  • case "line":
  • $html .= self::line();
  • break;
  • default:
  • if ($depth == 1) { //一级菜单处理
  • $v['icon'] = (isset($v['icon']) && $v['icon'] != '') ? '<i class="'.$v['icon'].' icon text-md"></i>' : '<i class="glyphicon glyphicon-file icon text-md"></i>'; //字体图标
  • $v['caret'] = ((isset($v['children'])) ? '<span class="pull-right text-muted"><i class="fontello icon-fw fontello-angle-right text"></i><i class="fontello icon-fw fontello-angle-down text-active"></i></span>' : ''); //大于号
  • } else {
  • $v['icon'] = '';
  • }
  • $html .= '<li class="'. $v['class'] .'">';
  • $html .= str_replace(array('{url}','{name}','{class}','{icon}','{target}', '{caret}'),
  • array($v['url'],$v['name'],"auto",$v['icon'],$v['target'],$v['caret']),'<a class="{class}" href="{url}" {target}>{caret}{icon}<span>{name}</span></a>');
  • if(isset($v['children'])){
  • $html .= '<ul class="nav nav-sub dk">';
  • $html .= self::parseMenu($v['children'], $depth+1);
  • $html .= '</ul>';
  • }
  • break;
  • }
  • $html .= '</li>';
  • }
  • return $html;
  • }
  • public function title($title = "菜单") {
  • return '<li class="hidden-folded padder m-t m-b-sm text-muted text-xs"><span>' . _mt($title) .'</span></li>';
  • }
  • public function line() {
  • return '<li class="line dk"></li>';
  • }
  • public function pages($title = "页面") {
  • $html = '';
  • $html .= '<li><a class="auto"><span class="pull-right text-muted"><i class="fontello icon-fw fontello-angle-right text"></i><i class="fontello icon-fw fontello-angle-down text-active"></i></span><i class="glyphicon glyphicon-file"></i><span>' . _mt($title) . '</span></a><ul class="nav nav-sub dk"><li class="nav-sub-header"><a data-no-instant><span>' . _mt($title) . '</span></a></li>';
  • Typecho_Widget::widget('Widget_Contents_Page_List')->to($pages);
  • while($pages->next()) {
  • if ($pages->fields->navbar == "hide") continue; //隐藏指定页面
  • $html .= '<li><a href="' . $pages->permalink . '"><span>' . $pages->title . '</span></a></li>';
  • }
  • $html .= '</ul></li>';
  • return $html;
  • }
  • public function categories($title = '分类') {
  • $html = '';
  • $html .= '<!--分类category--><li><a class="auto"><span class="pull-right text-muted"><i class="fontello icon-fw fontello-angle-right text"></i><i class="fontello icon-fw fontello-angle-down text-active"></i></span><i class="glyphicon glyphicon-th"></i><span>' . _mt($title) . '</span></a><ul class="nav nav-sub dk"><li class="nav-sub-header"><a data-no-instant><span>' . _mt($title) . '</span></a></li>';
  • //循环输出分类
  • Typecho_Widget::widget('Widget_Metas_Category_List')->to($categories);
  • while($categories->next()){
  • if ($categories->levels === 0){//父亲分类
  • $children = $categories->getAllChildren($categories->mid);//获取当前父分类所有子分类
  • //print_r($children);
  • //var_dump(empty($children));
  • if (!empty($children)){//子分类不为空
  • $html .= '<li><a class="auto"><span class="pull-right text-muted">
  • <i class="fontello icon-fw fontello-angle-right text"></i>
  • <i class="fontello icon-fw fontello-angle-down text-active"></i>
  • </span><span>'.$categories->name.'</span></a>';
  • //循环输出子分类
  • $childCategoryHtml = '<ul class="nav nav-sub dk child-nav">';
  • $childCategoryHtml .= '<li><a href="'.$categories->permalink.'"><b class="badge pull-right">'.$categories->count.'</b><span>'.$categories->name.'</span></a></li>';
  • foreach ($children as $mid){
  • $child = $categories->getCategory($mid);
  • $childCategoryHtml .= '<li><a href="'.$child['permalink'].'"><b class="badge pull-right">'.$child['count'].'</b><span>'.$child['name'].'</span></a></li>';
  • }
  • $childCategoryHtml .= '</ul>';
  • $html .= $childCategoryHtml;
  • $html .= "</li>";
  • }else{//没有子分类
  • $html .= '<li><a href="'.$categories->permalink.'"><b class="badge pull-right">'.$categories->count.'</b><span>'.$categories->name.'</span></a></li>';
  • }
  • }
  • }
  • $html .= '</ul></li>';
  • return $html;
  • }
  • public function friends($title = "友链") {
  • return '<li><a class="auto"><span class="pull-right text-muted"><i class="fontello icon-fw fontello-angle-right text"></i><i class="fontello icon-fw fontello-angle-down text-active"></i></span><i class="iconfont icon-links"></i><span>' . _mt($title) . '</span></a><ul class="nav nav-sub dk"><li class="nav-sub-header"><a data-no-instant><span>' . _mt($title) . '</span></a></li>' . Links_Plugin::output_str("<li><a href=\"{url}\" target=\"_blank\" title=\"{title}\"><span>{name}</span></a></li>", 0, "ten") . '</ul></li>';
  • }
  • }
  • class Menu_Page_List extends Widget_Abstract_Contents
  • {
  • /**
  • * 所有页面哈希表
  • *
  • * @var array
  • * @access private
  • */
  • private $_map = array();
  • /**
  • * 执行函数
  • *
  • * @access public
  • * @return void
  • */
  • public function execute()
  • {
  • $select = $this->select()->where('table.contents.type = ?', 'page')
  • ->where('table.contents.created < ?', $this->options->gmtTime)
  • ->order('table.contents.order', Typecho_Db::SORT_ASC);
  • //去掉自定义首页
  • $frontPage = explode(':', $this->options->frontPage);
  • if (2 == count($frontPage) && 'page' == $frontPage[0]) {
  • $select->where('table.contents.cid <> ?', $frontPage[1]);
  • }
  • $rs = $this->db->fetchAll($select, array($this, 'push'));
  • foreach($rs as $v){
  • $this->_map[$v['cid']] = $v;
  • }
  • }
  • /**
  • * 获取单个页面
  • *
  • * @param integer $cid
  • * @access public
  • * @return mixed
  • */
  • public function getPage($cid)
  • {
  • return isset($this->_map[$cid]) ? $this->_map[$cid] : NULL;
  • }
  • }
复制

2.然后修改functions.php引入菜单组件

  • require_once("libs/Content.php");
  • require_once("libs/Menu.php"); //新增这一行
复制

3.修改usr/themes/handsome/component/aside.php
把导航代码(两个中间的代码)替换为

  • <nav ui-nav class="navi clearfix">
  • <ul class="nav">
  • <?php Menu::parse('aside'); ?>
  • </ul>
  • </nav>
复制

4.到这里,你的左侧导航菜单已经由TeMenu插件接管了。

Tips

1.如果没有TeMenu插件被禁用,菜单和以前一样没有任何变化
2.没有设置菜单左侧导航栏会提示你到后台新增菜单,点击就能进入菜单管理页面
3.菜单标志为aside
![please_setup_menu.png][(https://blog.iplayloli.com/usr/uploads/2018/07/548333237.png)
3.特殊菜单(只能是一级菜单),没有处理非一级的,(你可以试试放到二级)

全站友链:把图标设置样式 friends,标题写你想显示的
分类:把图标设置样式 categories,标题写你想显示的
导航、组成:把图标设置样式 title,标题写你想显示的
页面:把图标设置样式 pages,标题写你想显示的
分割线:把图标设置样式 line

[hplayer media="tencent" id="00021LgB2RC7tR" type="song" size="large" auto="false" /]