upload/src/applications/bbs/controller/MasingleController.php
<?php

Wind::import('SRV:forum.srv.dataSource.PwFetchReplyByTidAndPids');
Wind::import('SRV:forum.srv.PwThreadManage');

/**
 * @author peihong <jhqblxt@gmail.com> Dec 2, 2011
 * @link
 * @copyright
 * @license
 */

class MasingleController extends PwBaseController {
	
	public $action;

	protected $manage;
	protected $doAction;
	protected $_doCancel = array();

	protected $_hasThread = false;
	protected $_jumpurl = '';

	public function beforeAction($handlerAdapter) {
		parent::beforeAction($handlerAdapter);
		if (!$this->loginUser->isExists()) {
			$this->showError('login.not');
		}
		$this->action = $handlerAdapter->getAction();
		$this->manage = $this->_getManage($this->action);
		if (($result = $this->manage->check()) !== true) {
			$this->showError($result->getError());
		}
	}

	public function manageAction() {
		if (!$this->doAction) {
			$reason = Wekit::C()->site->get('managereasons', '');
			$this->setOutput(explode("\n", $reason), 'manageReason');
			$this->setOutput($this->action, 'action');
			$this->setOutput(count($this->manage->data), 'count');
			$this->setTemplate('masingle_threads');
		} else {
			$sendnotice = $this->getInput('sendnotice', 'post');
			$this->manage->execute();
			if ($sendnotice) {
				$this->_sendMessage($this->action, $this->manage->getData());
			}
			if ($this->action == 'dodelete' && $this->_hasThread) {
				$this->_jumpurl = 'bbs/thread/run?fid=' . current($this->manage->getFids());
			}
			$this->showMessage('operate.success', $this->_jumpurl);
		}
	}

	protected function _getManage($action) {
		$pids = $this->getInput('pids', 'post');
		$tid = $this->getInput('tid', 'post');
		$pid = $this->getInput('pid', 'post');
		if ($pids && !is_array($pids)) {
			$pids = explode(',', $pids);
		} elseif (!$pids && $pid) {
			$pids = array($pid);
		}
		if (!$pids) {
			$this->showError('operate.select');
		}
		in_array('0', $pids) && $this->_hasThread = true;
		$manage = new PwThreadManage(new PwFetchReplyByTidAndPids($tid, $pids), $this->loginUser);
		
		if (strpos($action, 'do') === 0) {
			$getMethod = sprintf('_get%sManage', ucfirst(substr($action, 2)));
			$this->doAction = true;
		} else {
			$getMethod = sprintf('_get%sManage', ucfirst($action));
			$this->doAction = false;
		}
		if (method_exists($this, $getMethod)) {
			$do = $this->$getMethod($manage);
			$manage->appendDo($do);
		}
		return $manage;
	}

    protected function _getDeleteManage($manage) {
		Wind::import('SRV:forum.srv.manage.PwThreadManageDoDeleteReply');
		$do = new PwThreadManageDoDeleteReply($manage);
		if (!$this->doAction) {
			$this->setOutput('dodelete', 'doaction');
        } else {
			$deductCredit = $this->getInput('deductCredit', 'post');
			$reason = $this->getInput('reason', 'post');
			$do->setIsDeductCredit($deductCredit)
				->setReason($reason);
		}
		return $do;
	}

	/**
	 * 已阅操作
	 *
	 * @param obj $manage
	 * @return PwThreadManageDoInspect
	 */
	protected function _getInspectManage($manage) {
		Wind::import('SRV:forum.srv.manage.PwThreadManageDoInspect');
		$do = new PwThreadManageDoInspect($manage);
		if (!$this->doAction) {
			$this->showError('data.error');
		} else {
			$lou = $this->getInput('lou');
			$do->setLou($lou);
		}
		return $do;
	}

	/**
	 * 屏蔽操作
	 *
	 * @param obj $manage
	 * @return PwThreadManageDoInspect
	 */
	protected function _getShieldManage($manage) {
		Wind::import('SRV:forum.srv.manage.PwThreadManageDoShield');
		$do = new PwThreadManageDoShield($manage);
		if (!$this->doAction) {
			$this->setOutput('doshield', 'doaction');
			$this->setOutput($manage->data[0]['ifshield'], 'defaultShield');
		} else {
			list($reason,$ifShield) = $this->getInput(array('reason','ifShield'), 'post');
			$do->setReason($reason)->setIfShield($ifShield);
			!$ifShield && $this->_doCancel[] = 'doshield';
		}
		return $do;
	}

	/**
	 * 提醒操作
	 *
	 * @param obj $manage
	 * @return PwThreadManageDoInspect
	 */
	protected function _getRemindManage($manage) {
		Wind::import('SRV:forum.srv.manage.PwThreadManageDoRemind');
		$do = new PwThreadManageDoRemind($manage);
		if (!$this->doAction) {
			$this->setOutput('doremind', 'doaction');
			$this->setOutput($manage->data[0]['manage_remind'], 'defaultRemind');
		} else {
			list($reason,$ifRemind) = $this->getInput(array('reason','ifRemind'), 'post');
			$do->setReason($reason)->setIfRemind($ifRemind);
			!$ifRemind && $this->_doCancel[] = 'doremind';
		}
		return $do;
	}

	/**
	 * 帖内置顶操作
	 *
	 * @param obj $manage
	 * @return PwThreadManageDoInspect
	 */
	protected function _getToppedReplyManage($manage) {
		Wind::import('SRV:forum.srv.manage.PwThreadManageDoToppedReply');
		$do = new PwThreadManageDoToppedReply($manage);
		if (!$this->doAction) {
			$this->showError('data.error');
		} else {
			list($lou,$topped) = $this->getInput(array('lou','topped'));
			$do->setLou($lou)->setTopped($topped);
		}
		return $do;
	}
	
	/* (non-PHPdoc)
	 * @see WindController::resolvedActionMethod()
	 */
	public function resolvedActionMethod($handlerAdapter) {
		return $this->resolvedActionName('manage');
	}

	/**
	 * send messages
	 */
	protected function _sendMessage($action, $threads) {
		if (!is_array($threads) || !$threads || !$action) return false;
		$noticeService = Wekit::load('message.srv.PwNoticeService');
		$reason = $this->getInput('reason');
		foreach ($threads as $thread) {
			$params = array();
			$params['manageUsername'] = $this->manage->user->username;
			$params['manageUserid'] = $this->manage->user->uid;
			$params['manageThreadTitle'] = $thread['subject'];
			$params['manageThreadId'] = $thread['tid'];
			$params['manageTypeString'] = $this->_getManageActionName($action);
			$reason && $params['manageReason'] = $reason;
			$noticeService->sendNotice($thread['created_userid'], 'threadmanage', $thread['tid'], $params);
		}
		return true;
	}
	
	protected function _getManageActionName($action) {
		$resource = Wind::getComponent('i18n');
		$message = $resource->getMessage("BBS:manage.operate.name.$action");
		if (in_array($action, $this->_doCancel)) {
			$message = $resource->getMessage("BBS:manage.operate.action.cancel") . $message;
		}
		return $message;
	}	
}
