'Net' . DS . 'UserAgent' . DS . 'Mobile.php')); /** * PC/携帯共通 */ // 携帯チェック $this->agent = &Net_UserAgent_Mobile::factory(); if (!$this->agent->isNonMobile()) { Configure::write('mobileUserAgent', true); } class AppController extends Controller { var $user = array('User' => array( 'id' => 0, 'group_id' => 0, )); var $user_id = 0; var $isAdministrator = false; var $isAdmin = false; var $isMobile = false; var $site_configs = array(); var $components = array( 'AuthPlus', 'Acl', 'Cakeplus.HtmlEscape', 'Token', 'Crypt', 'DebugKit.Toolbar', 'Benchmark' ); var $helpers = array( 'Html', 'Form', 'Javascript', 'Text', 'Time', 'Cache', 'Settings', 'Media.Medium', 'Media.Upfile', 'Token' ); /* Characters抽出条件 */ var $conditions = array( 'Character.public_flag' => 'public', 'Character.deleted' => 0 ); var $fields = array( 'Character.id', 'Character.system_id', 'Character.user_id', 'Character.name', 'Character.main_picture', 'Character.sort_order', 'Character.status', 'Character.public_flag', 'Character.modified', ); var $contain = array(); var $recursive = -1; var $order = array( 'Character.modified' => 'DESC', ); var $paginate = array( 'Character' => array( 'limit' => 20, 'conditions' => array( 'Character.public_flag' => 'public', 'Character.deleted' => 0 ), 'recursive' => -1, 'order' => array( 'Character.modified' => 'DESC', ) ), ); /* ACL */ // 追加アクション用 crudMap var $actionMapPlus = array(); // POSTのTokenチェックをしないアクション var $disableTokenActions = array(); function __construct() { if (Configure::read('mobileUserAgent')) { Configure::write('Session.save', 'sessino_m_custom'); } parent::__construct(); } function beforeFilter() { $this->Benchmark->report($this->params['controller']. '/'. $this->action . ':' .' beforeFilterStart'); parent::beforeFilter(); $this->user['User']['name'] = __('Guest', true); // ブラウザキャッシュ破棄 $this->disableCache(); if (isset($this->params['prefix'])) { if ($this->params['prefix'] == Configure::read('Routing.admin')) { $this->isAdmin = true; $this->layout = 'admin_'.$this->layout; } elseif ($this->params['prefix'] == 'm') { $this->isMobile = true; } } $this->set('admin', $this->isAdmin); // サイト設定 $this->site_configs = CorePlus::set_db_settings(); $this->set('site_configs', $this->site_configs); if ($this->AuthPlus) { // ACL関連 $this->AuthPlus->actionPath = 'controllers/'; $this->AuthPlus->authorize = 'crud'; // 認証済みユーザ情報のセット $this->user_id = $this->AuthPlus->user('id'); $user = $this->getUser($this->user_id); if (!empty($user)) { $this->user = $user; } if (in_array($this->AuthPlus->user('group_id'), array(1,2,3))) { $this->isAdministrator = true; } // 対CRSF:Tokenチェック $this->Token->checkToken(); // 認証アクション設定 if (Configure::read('mobileUserAgent')) { $this->AuthPlus->loginAction = '/m/users/login'; $this->AuthPlus->loginRedirect = '/m/users/index'; $this->AuthPlus->logoutRedirect = '/m/users/index'; } else { $this->AuthPlus->loginAction = '/users/login'; $this->AuthPlus->loginRedirect = '/users/index'; $this->AuthPlus->logoutRedirect = '/users/index'; } if ($this->isAdmin) { $this->AuthPlus->loginRedirect = '/admin/users/index'; } } $this->set('user', $this->user); $this->set('isAdministrator', $this->isAdministrator); } function beforeRender() { $this->Benchmark->report($this->params['controller']. '/'. $this->action . ':' . ' beforeRenderStart'); parent::beforeRender(); } function afterFilter() { $this->Benchmark->report($this->params['controller']. '/'. $this->action . ':' . ' afterFilterStart'); parent::afterFilter(); } /* 共通関数 */ /* public_flag設定をview用にセット */ function set_public_flag4view() { $model_public_flags = $this->get_public_flag(); $this->set('public_flags', $model_public_flags); } function get_public_flag() { return $this->{$this->modelClass}->public_flag; } function check_public_flag($data, $key = null) { return CorePlus::check_public_flag($data, $key); } function check_public_flag2($data, $key = null) { return CorePlus::check_public_flag2($data, $key); } /* status設定をview用にセット */ function set_status4view() { $model_status = $this->get_status(); $this->set('status', $model_status); } function get_status() { if (isset($this->Character)) { return $this->Character->status; } elseif (isset($this->CharacterProfileArchive)) { return $this->CharacterProfileArchive->Character->status; } else { return array(); } } /* isOwner */ function isOwner($data, $user_id) { return CorePlus::isOwner($data, $user_id); } /* ユーザ情報取得 */ function getUser($id, $isAdmin=false, $isDelete=false) { if (!$id) { return array(); } if (!isset($this->User)) { $this->User = CorePlus::set_model('User'); } $conditions = array( 'User.id' => $id, ); if ($isAdmin === true) { $conditions['User.group_id'] = array( Configure::read('Group.admin'), Configure::read('Group.subadmin'), Configure::read('Group.watcher'), Configure::read('Group.member'), Configure::read('Group.locked'), Configure::read('Group.pre'), ); } else { $conditions['User.group_id'] = array( Configure::read('Group.admin'), Configure::read('Group.subadmin'), Configure::read('Group.watcher'), Configure::read('Group.member'), Configure::read('Group.locked'), ); } $fields = array( 'User.id', 'User.group_id', 'User.name', 'User.pcmail', 'User.mobile_mail', 'User.modified', ); if ($isAdmin === true) { $fields = array_merge($fields, array( 'User.username', 'User.useragent', 'User.host', 'User.created', )); } $contain = array( 'Attachment', ); if ($isAdmin === true || $isDelete === true) { $contain = array_merge($contain, array( 'Character', )); unset($this->User->hasMany['Character']['conditions']['Character.public_flag']); unset($this->User->hasMany['Character']['limit']); } if (empty($contain)) { $recursive = -1; } else { $recursive = Set::countDim($contain); } $user = $this->User->find('first', array( 'conditions' => $conditions, 'fields' => $fields, 'recursive' => $recursive, 'contain' => $contain, )); // アドレス復号化 if (isset($user['User']['pcmail']) && !empty($user['User']['pcmail'])) { $user['User']['pcmail'] = $this->Crypt->decrypt($user['User']['pcmail']); } return $user; } /* デモモードチェック */ function _check_demo() { if (Configure::read('Mode.Demo')) { if ($_SESSION['Auth']['User']['username'] == 'guest') { $this->Session->setFlash(__('NO AVAILABLE NOW.', true)); $this->redirect(array('action'=>'index')); } } } /* システム情報取得 */ function _restore_html_system($data) { if (isset($data['System']['name']) && !empty($data['System']['name'])) { $data['System']['name'] = $this->{$this->modelClass}->restore_html($data['System']['name'], false, false, false); } if (isset($data['System']['copyright']) && !empty($data['System']['copyright'])) { $data['System']['copyright'] = $this->{$this->modelClass}->restore_html($data['System']['copyright'], false, false, false); } if (isset($data['System']['url']) && !empty($data['System']['url'])) { $data['System']['url'] = $this->{$this->modelClass}->restore_html($data['System']['url'], false, false, false); } if (isset($data['System']['detail']) && !empty($data['System']['detail'])) { $data['System']['detail'] = $this->{$this->modelClass}->restore_html($data['System']['detail'], false, false, false); } if (isset($data['Profile']) && !empty($data['Profile'])) { $data = $this->_restore_html_profile($data); } return $data; } function _get_systems($public_flag = 'public') { $conditions = array(); if (!empty($public_flag)) { $conditions['System.public_flag'] = $public_flag; } if (!isset($this->System)) { $this->System = CorePlus::set_model('System'); } $systems = $this->System->find('list', array( 'conditions' => $conditions, 'recursive' => -1, )); if (!empty($systems)) { foreach ($systems as $k => $v) { $systems[$k] = $this->{$this->modelClass}->restore_html($v); } } return $systems; } /* キャラクター一覧取得 */ /* 条件セット */ function _set_conditions_characters4user_id($user_id = null, $conditions = array(), $fields = array(), $contain = array(), $order = array()) { if (!empty($user_id)) { $conditions = array_merge((array)$conditions, array( 'Character.user_id' => $user_id, ) ); } $conditions = array_merge($this->conditions, (array)$conditions); if ((isset($conditions['isAdmin']))|| (!empty($user_id) && ($user_id == $this->user_id))) { unset($conditions['Character.public_flag']); unset($conditions['isAdmin']); } $fields = array_merge($this->fields, (array)$fields); $contain = array_merge($this->contain, (array)$contain); if (empty($contain)) { $recursive = -1; } else { $recursive = Set::countDim($contain); } $order = array_merge($this->order, (array)$order); return array($conditions, $fields, $contain, $recursive, $order); } function _get_characters_list4user_id($user_id = null, $conditions = array(), $limit = 5, $fields = array(), $contain = array(), $order = array()) { list($conditions, $fields, $contain, $recursive, $order) = $this->_set_conditions_characters4user_id($user_id, $conditions, $fields, $contain, $order); if (!isset($this->Character)) { $this->Character = CorePlus::set_model('Character'); } return $this->Character->find('all', array( 'conditions' => $conditions, 'limit' => $limit, 'fields' => $fields, 'recursive' => $recursive, 'contain' => $contain, 'order' => $order, )); } function _get_characters_page4user_id($user_id = null, $conditions = array(), $limit = 20, $fields = array(), $contain = array(), $order = array(), $page = 1) { list($conditions, $fields, $contain, $recursive, $order) = $this->_set_conditions_characters4user_id($user_id, $conditions, $fields, $contain, $order); if (!isset($this->Character)) { $this->Character = CorePlus::set_model('Character'); } $this->paginate['Character'] = array( 'limit' => $limit, 'conditions' => $conditions, 'fields' => $fields, 'contain' => $contain, 'recursive' => $recursive, 'order' => $order, 'page' => $page, ); return $this->paginate('Character'); } /* キャラクター情報取得 */ function _get_character4character_id($character_id, $user_id = null, $public_flag = null, $is_deleted = 0) { if (!isset($this->Character)) { $this->Character = CorePlus::set_model('Character'); } $conditions = array( 'Character.id' => $character_id, 'Character.deleted' => $is_deleted, ); if ($user_id) { $conditions['Character.user_id'] = $user_id; } unset($this->Character->hasMany['CharacterPicture']['conditions']['CharacterPicture.public_flag']); if ($public_flag) { $conditions['Character.public_flag'] = $public_flag; $this->Character->hasMany['CharacterPicture']['conditions']['CharacterPicture.public_flag'] = $public_flag; } $character = $this->Character->find('first', array( 'conditions' => $conditions, 'contain' => array( 'CharacterPicture' => array( 'Attachment', ), ), 'recursive' => 2, )); if (empty($character)) { $this->Session->setFlash(__('Invalid Character.', true)); $this->redirect(array('controller' => 'characters', 'action'=>'index')); } return $character; } function check_character_picture_max($character_pictures_num) { if (!$max_num = intval($this->site_configs['Character.maxPictures']['value'])) { return true; } if ($max_num <= $character_pictures_num) { return false; } return true; } /* Profile系 htmlRestore */ function _restore_html_profile($data) { if (isset($data['Profile']['name']) && !empty($data['Profile']['name'])) { $data['Profile']['name'] = $this->{$this->modelClass}->restore_html($data['Profile']['name'], false, false, false); } if (isset($data['Profile'][0]['ProfileSelect'])) { foreach ($data['Profile'] as $k => $v) { $data['Profile'][$k] = $this->__restore_html_profile($v); } } elseif($data['Profile']['ProfileSelect']) { $data['Profile'] = $this->__restore_html_profile($data['Profile']); } return $data; } function __restore_html_profile($data) { if (isset($data['ProfileSelect']) && !empty($data['ProfileSelect'])) { $data = $this->_restore_html_profile_select($data); } if (isset($data['ProfileTable']) && !empty($data['ProfileTable'])) { $data = $this->_restore_html_profile_table($data); } if (isset($data['ProfileTableStatic']) && !empty($data['ProfileTableStatic'])) { $data = $this->_restore_html_profile_table_static($data); } return $data; } function _restore_html_profile_select($data) { foreach ($data['ProfileSelect'] as $k => $v) { if (isset($data['ProfileSelect'][$k]['value']) && !empty($data['ProfileSelect'][$k]['value'])) { $data['ProfileSelect'][$k]['value'] = $this->{$this->modelClass}->restore_html($v['value'], false, false, false); } } return $data; } function _restore_html_profile_table($data) { foreach ($data['ProfileTable'] as $k => $v) { if (isset($data['ProfileTable'][$k]['value']) && !empty($data['ProfileTable'][$k]['value'])) { $data['ProfileTable'][$k]['value'] = $this->{$this->modelClass}->restore_html($v['value'], false, false, false); } } return $data; } function _restore_html_profile_table_static($data) { foreach ($data['ProfileTableStatic'] as $k => $v) { if (isset($data['ProfileTableStatic'][$k]['title']) && !empty($data['ProfileTableStatic'][$k]['title'])) { $data['ProfileTableStatic'][$k]['title'] = $this->{$this->modelClass}->restore_html($v['title'], false, false, false); } } return $data; } } // AppControllerを携帯とPCで振り分け if (Configure::read('mobileUserAgent')) { class ModuleController extends MobileAppController { } } else { class ModuleController extends PcAppController { } } /** * 携帯用AppController */ class MobileAppController extends AppController { function beforeFilter() { parent::beforeFilter(); // 使用停止 if (!Configure::read('Mode.Mobile')) { exit("Mobile View is inavailable."); } // PC用URLアクセスはエラー if (!isset($this->params["prefix"])) { // BaseURLのみ遷移 if ($this->params["url"]["url"] == "/") { $this->redirect("/m/"); } $this->cakeError("errorPcView"); $this->_stop(); } // 入力データの文字コード変換 @array_walk_recursive($this->data, "convertEncodeSjis2Utf8"); } function beforeRender() { parent::beforeRender(); $this->layout = 'mobile_'.$this->layout; } function afterFilter() { parent::afterFilter(); // 全角文字の変換 $this->output = mb_convert_kana($this->output, "rak", Configure::read('App.encoding')); // 出力文字コードの変換 $this->output = mb_convert_encoding($this->output, "SJIS", Configure::read('App.encoding')); } } /** * PC用AppController */ class PcAppController extends AppController { function beforeFilter() { parent::beforeFilter(); // 携帯用アクションへのアクセスはPC用に変更 if (isset($this->params["prefix"]) && $this->params["prefix"] == "mobile") { $pc_url = substr_replace($this->params["url"]["url"], "", 0, 2+strlen($this->params["controller"])+1); if (!$pc_url) { $pc_url = substr_replace($this->params['action'], "", 0, strlen($this->params["prefix"])+1); } $this->redirect($pc_url); } } function beforeRender() { parent::beforeRender(); } } /* * データ処理用 */ /* * 文字コード変換 SJISWin->UTF-8 */ function convertEncodeSjis2Utf8(&$str, n$key) { $str = mb_convert_encoding($str, 'UTF-8', 'SJIS-Win'); }