• Yii常见导航无限分类的取出方法(带缓存)


    1.

    试图页面代码:

    <?php foreach((array)$this->_catalog as $key=>$row):?>
    <?php if($row['parent_id'] == 0):?>

    //导航一般只取出父id为0的。

    <dd>
    <h3><a href="<?php echo $this->createUrl('post/index',array(
    'catalog'=>$row['catalog_name_alias'])) ?>">
    <?php echo $row['catalog_name']?><i></i></a></h3>
    <ul>
    <?php foreach((array)Catalog::lite($row['id']) as $key=>$val):?>
    <li><a href="<?php echo $this->_navLink($val)?>"><?php echo $val['catalog_name']?></a></li>
    <?php endforeach?>
    </ul>
    </dd>
    <?php endif?>
    <?php endforeach?>

    2.基类控制器的init方法里面(注意:继续父类初始化也要特别说明parent::init)

    $this->_catalog = Catalog::get(0, XXcache::system('_catalog'));

    //从缓存里面取出id为0,

    3.XXcache.php:

    <?php

    class XXcache{

    public static function system( $id, $expirse = 600, $fields = '', $params = array() ) {
    $value = Yii::app()->cache->get( $id );
    if ( $value === false ) {
    return self::_refresh( $id, $expirse, $fields, $params );
    } else {
    return $value;
    }
    }

    public function _refresh( $id, $expirse, $fields, $params ) {
    try {
    switch ( $id ) {
    case '_link':
    $data = (array) self::_base( 'Link', $fields, array ( 'condition' => 'status_is=1' , 'order' => 'sort_order DESC,id DESC' ) );
    self::set( $id, $data, $expirse );
    break;
    case '_pca':
    $data = (array) self::_base( 'Pca', $fields, array ( 'condition' => "status_is='Y'" , 'order' => 'id ASC' ) );
    self::set( $id, $data, $expirse );
    break;
    case '_userGroup':
    $data = (array) self::_base( 'UserGroup', $fields );
    self::set( $id, $data, $expirse );
    break;
    case '_ad':
    $data = (array) self::_base( 'Ad', $fields, array ( 'condition' => 'status_is=1' , 'order' => 'sort_order DESC,id DESC' ) );
    self::set( $id, $data, $expirse );
    break;
    case '_config':
    $data = (array) self::_config( $params );

    self::set( $id, $data, $expirse );
    break;
    case '_catalog':
    $data = (array) self::_base( 'Catalog', $fields, array ( 'condition' => 'status_is=1' , 'order' => 'sort_order DESC,id DESC' ) );
    self::set( $id, $data, $expirse );
    break;
    default:
    throw new Exception( '数据不在接受范围' );
    break;
    }

    return $data;
    } catch ( Exception $error ) {
    exit( $error->getMessage() );
    }
    }

    protected function _base( $id = '', $fields = '', $condition = '' ) {
    $mod = ucfirst( $id );
    $model = new $mod();
    $dataGet = $model->findAll( $condition );
    foreach ( (array) $dataGet as $key => $row ) {
    foreach ( (array) self::_attributes( $fields, $model ) as $attr ) {
    $returnData[$key][$attr] = $row->$attr;
    }
    }
    return $returnData;
    }

    protected function _attributes( $fields, $model = '' ) {
    if ( empty( $fields ) || trim( $fields ) == '*' ) {
    return $model->attributeNames();
    } else {
    $fields = str_replace( ',', ',', $fields );
    return explode( ',', $fields );
    }
    }

    }

    4.catalog.php

    /**
    * 取分类
    */
    static public function get($parentid = 0, $array = array(), $level = 0, $add = 2, $repeat = '---') {

    $str_repeat = '';
    if ($level) {
    for($j = 0; $j < $level; $j ++) {
    $str_repeat .= $repeat;
    }
    }
    $newarray = array ();
    $temparray = array ();
    foreach ( ( array ) $array as $v ) {
    if ($v ['parent_id'] == $parentid) {
    $newarray [] = array ('id' => $v ['id'], 'catalog_name' => $v ['catalog_name'],
    'catalog_name_alias' => $v ['catalog_name_alias'],
    'parent_id' => $v ['parent_id'], 'level' => $level, 'sort_order' => $v ['sort_order'],
    'seo_keywords' => $v ['seo_keywords'], 'seo_description' => $v ['seo_description'],
    'attach_file' => $v ['attach_file'], 'attach_thumb' => $v ['attach_thumb'],
    'status_is' => $v ['status_is'], 'data_count' => $v ['data_count'] ,
    'display_type' => $v ['display_type'], 'menu_is' => $v ['menu_is'],
    'template_list' => $v ['template_list'],'acl_browser' => $v ['acl_browser'],
    'acl_operate' => $v ['acl_operate'],'template_page' => $v ['template_page'],
    'template_show' => $v ['template_show'],'create_time' => $v ['create_time'],
    'str_repeat' => $str_repeat, 'page_size'=>$v['page_size'] );

    $temparray = self::get ( $v ['id'], $array, ($level + $add) );
    if ($temparray) {
    $newarray = array_merge ( $newarray, $temparray );
    }
    }
    }
    return $newarray;
    }



    /**
    * 获取下级子类,普通模式
    *
    * @param $parentId
    * @param array $array
    * @return array
    */
    static public function lite ($parentId, array $array = array(), $params = array())
    {
    if(empty($parentId))
    return ;
    $eachArr = empty($array)? XXcache::system('_catalog', 86400): $array;
    foreach ((array)$eachArr as $row) {
    if ($row['parent_id'] == $parentId)
    $arr[] = $row;
    }
    return $arr;
    }

  • 相关阅读:
    tp3中子查询 逻辑条件是or
    数据量大的情况用布隆过滤器判断是否已存在
    pip 通过pqi切换源到国内镜像
    php先响应后处理
    selenium登录网银,密码控件输入
    mysql 查询a表在b表中不存在的记录
    下列java代码中的变量a、b、c分别在内存的______存储区存放。
    关于选中的磁盘具有MBR分区表。在EFI系统上,Windows只能安装到GPT磁盘。问题解决
    VBOX不能为虚拟电脑打开一个新任务解决方法
    解决虚拟机似乎正在使用的问题
  • 原文地址:https://www.cnblogs.com/fengzhiqiangcaisangzi/p/3360935.html
Copyright © 2020-2023  润新知