<?php
// +----------------------------------------------------------------------
// | OneThink [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013 http://www.onethink.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: 麦当苗儿 <zuojiazi@vip.qq.com> <http://www.zjzit.cn>
// +----------------------------------------------------------------------
namespace Admin\Controller;

/**
 * 后台分类管理控制器
 * 
 * @author 麦当苗儿 <zuojiazi@vip.qq.com>
 */
class CategoryController extends AdminController {
	protected static $allow = array (
			'tree' 
	);
	
	/**
	 * 分类管理列表
	 * 
	 * @author 麦当苗儿 <zuojiazi@vip.qq.com>
	 */
	public function index() {
		$tree = D ( 'Category' )->getTree ( 0, 'id,name,title,sort,pid,allow_publish,status' );
		$this->assign ( 'tree', $tree );
		C ( '_SYS_GET_CATEGORY_TREE_', true ); // 标记系统获取分类树模板
		$this->meta_title = '分类管理';
		$this->display ();
	}
	
	/**
	 * 显示分类树，仅支持内部调
	 * 
	 * @param array $tree
	 *        	分类树
	 * @author 麦当苗儿 <zuojiazi@vip.qq.com>
	 */
	public function tree($tree = null) {
		C ( '_SYS_GET_CATEGORY_TREE_' ) || $this->_empty ();
		$this->assign ( 'tree', $tree );
		$this->display ( 'tree' );
	}
	
	/* 编辑分类 */
	public function edit($id = null, $pid = 0) {
		$Category = D ( 'Category' );
		
		if (IS_POST) { // 提交表单
			if (false !== $Category->update ()) {
				$this->success ( '编辑成功！', U ( 'index' ) );
			} else {
				$error = $Category->getError ();
				$this->error ( empty ( $error ) ? '未知错误！' : $error );
			}
		} else {
			$cate = '';
			if ($pid) {
				/* 获取上级分类信息 */
				$cate = $Category->info ( $pid, 'id,name,title,status' );
				if (! ($cate && 1 == $cate ['status'])) {
					$this->error ( '指定的上级分类不存在或被禁用！' );
				}
			}
			
			/* 获取分类信息 */
			$info = $id ? $Category->info ( $id ) : '';
			
			$this->assign ( 'info', $info );
			$this->assign ( 'category', $cate );
			$this->meta_title = '编辑分类';
			$this->display ();
		}
	}
	
	/* 新增分类 */
	public function add($pid = 0) {
		$Category = D ( 'Category' );
		
		if (IS_POST) { // 提交表单
			if (false !== $Category->update ()) {
				$this->success ( '新增成功！', U ( 'index' ) );
			} else {
				$error = $Category->getError ();
				$this->error ( empty ( $error ) ? '未知错误！' : $error );
			}
		} else {
			$cate = array ();
			if ($pid) {
				/* 获取上级分类信息 */
				$cate = $Category->info ( $pid, 'id,name,title,status' );
				if (! ($cate && 1 == $cate ['status'])) {
					$this->error ( '指定的上级分类不存在或被禁用！' );
				}
			}
			
			/* 获取分类信息 */
			$this->assign ( 'category', $cate );
			$this->meta_title = '新增分类';
			$this->display ( 'edit' );
		}
	}
	
	/**
	 * 删除一个分类
	 * 
	 * @author huajie <banhuajie@163.com>
	 */
	public function remove() {
		$cate_id = I ( 'id' );
		if (empty ( $cate_id )) {
			$this->error ( '参数错误!' );
		}
		
		// 判断该分类下有没有子分类，有则不允许删除
		$child = M ( 'Category' )->where ( array (
				'pid' => $cate_id 
		) )->field ( 'id' )->select ();
		if (! empty ( $child )) {
			$this->error ( '请先删除该分类下的子分类' );
		}
		
		// 判断该分类下有没有内容
		$document_list = M ( 'Document' )->where ( array (
				'category_id' => $cate_id 
		) )->field ( 'id' )->select ();
		if (! empty ( $document_list )) {
			$this->error ( '请先删除该分类下的文章（包含回收站）' );
		}
		
		// 删除该分类信息
		$res = M ( 'Category' )->delete ( $cate_id );
		if ($res !== false) {
			// 记录行为
			action_log ( 'update_category', 'category', $cate_id, UID );
			$this->success ( '删除分类成功！' );
		} else {
			$this->error ( '删除分类失败！' );
		}
	}
	
	/**
	 * 操作分类初始化
	 * 
	 * @param string $type        	
	 * @author huajie <banhuajie@163.com>
	 */
	public function operate($type = 'move') {
		// 检查操作参数
		if (strcmp ( $type, 'move' ) == 0) {
			$operate = '移动';
		} elseif (strcmp ( $type, 'merge' ) == 0) {
			$operate = '合并';
		} else {
			$this->error ( '参数错误！' );
		}
		$from = intval ( I ( 'get.from' ) );
		empty ( $from ) && $this->error ( '参数错误！' );
		
		// 获取分类
		$map = array (
				'status' => 1,
				'id' => array (
						'neq',
						$from 
				) 
		);
		$list = M ( 'Category' )->where ( $map )->field ( 'id,title' )->select ();
		
		$this->assign ( 'type', $type );
		$this->assign ( 'operate', $operate );
		$this->assign ( 'from', $from );
		$this->assign ( 'list', $list );
		$this->meta_title = $operate . '分类';
		$this->display ();
	}
	
	/**
	 * 移动分类
	 * 
	 * @author huajie <banhuajie@163.com>
	 */
	public function move() {
		$to = I ( 'post.to' );
		$from = I ( 'post.from' );
		$res = M ( 'Category' )->where ( array (
				'id' => $from 
		) )->setField ( 'pid', $to );
		if ($res !== false) {
			$this->success ( '分类移动成功！', U ( 'index' ) );
		} else {
			$this->error ( '分类移动失败！' );
		}
	}
	
	/**
	 * 合并分类
	 * 
	 * @author huajie <banhuajie@163.com>
	 */
	public function merge() {
		$to = I ( 'post.to' );
		$from = I ( 'post.from' );
		$Model = M ( 'Category' );
		
		// 检查分类绑定的模型
		$from_models = explode ( ',', $Model->getFieldById ( $from, 'model' ) );
		$to_models = explode ( ',', $Model->getFieldById ( $to, 'model' ) );
		foreach ( $from_models as $value ) {
			if (! in_array ( $value, $to_models )) {
				$this->error ( '请给目标分类绑定' . get_document_model ( $value, 'title' ) . '模型' );
			}
		}
		
		// 检查分类选择的文档类型
		$from_types = explode ( ',', $Model->getFieldById ( $from, 'type' ) );
		$to_types = explode ( ',', $Model->getFieldById ( $to, 'type' ) );
		foreach ( $from_types as $value ) {
			if (! in_array ( $value, $to_types )) {
				$types = C ( 'DOCUMENT_MODEL_TYPE' );
				$this->error ( '请给目标分类绑定文档类型：' . $types [$value] );
			}
		}
		
		// 合并文档
		$res = M ( 'Document' )->where ( array (
				'category_id' => $from 
		) )->setField ( 'category_id', $to );
		
		if ($res) {
			// 删除被合并的分类
			$Model->delete ( $from );
			$this->success ( '合并分类成功！', U ( 'index' ) );
		} else {
			$this->error ( '合并分类失败！' );
		}
	}
}
