* @license http://www.opensource.org/licenses/mit-license.php The MIT License
* @link http://trpgtools-onweb.sourceforge.jp/
*/
class CharactersController extends AppController {
var $name = 'Characters';
var $helpers = array(
'Select',
'Profiledisp',
);
/* テーマ */
var $view = 'View';
var $theme = null;
var $isNpc = false;
var $disableTokenActions = array();
var $post_data = array();
// 検索対象項目
var $search_cols = array(
);
/* メソッド */
function beforeFilter() {
parent::beforeFilter();
// Cache
$this->cacheAction = array(
'index' => Configure::read('Cache.expireShort'),
);
// 認証なしアクセス可
$this->AuthPlus->allow('view');
$this->AuthPlus->allow('index');
$this->AuthPlus->allow('search');
// 設定
$this->set_public_flag4view();
$this->set_status4view();
}
function beforeRender()
{
parent::beforeRender();
}
/* アクションメソッド */
function index($id = null) {
if (!empty($id) && $id == $this->user_id) {
$this->redirect(array_merge(array('action'=>'mycharacter'), $this->params['named']));
}
$this->set('isOwner', false);
$this->_index($id);
}
function search($id = null) {
if (!empty($id) && $id == $this->user_id) {
$this->redirect(array_merge(array('action'=>'mysearch'), $this->params['named']));
}
$this->set('isOwner', false);
$this->_search($id);
}
function mysearch(){
$this->set('isOwner', true);
$this->_search($this->user_id);
}
function mycharacter(){
// お知らせ
$news = array();
if (empty($this->site_configs['Site.myHome']['value'])) {
$news = $this->get_news();
}
$this->set('news', $news);
$this->set('isOwner', true);
$this->_index($this->user_id);
}
function view($id = null) {
if (!$id) {
$this->Session->setFlash(__('Invalid Character.', true));
$this->redirect(array('action'=>'index'));
}
$character = $this->_view($id, array(), false);
// Systemチェック
if (!$this->check_public_flag($character['System'])) {
unset($character['System']['Profile']);
}
$this->set('maxPictures', $this->check_character_picture_max(count($character['CharacterPicture'])));
$isOwner = false;
if ($this->isOwner($character['Character'], $this->user_id)) {
$isOwner = true;
}
$this->set('isOwner', $isOwner);
// キャラ画像のpublic_flagチェック
if ($isOwner !== true && !empty($character['CharacterPicture'])) {
foreach($character['CharacterPicture'] as $k => $v) {
if (!$this->check_public_flag2($v)) {
unset($character['CharacterPicture'][$k]);
}
}
}
$this->set('character', $this->HtmlEscape->nl2br_escaped($character));
}
function add() {
$systems = $this->_get_systems('public');
// SingleSystem
if (isset($this->site_configs['System.singleSystem']['value']) && $this->site_configs['System.singleSystem']['value']) {
$this->params['named']['system_id'] = key($systems);
}
if (isset($this->params['named']['system_id']) && !empty($this->params['named']['system_id'])) {
$system = $this->Character->System->find('first', array(
'conditions' => array(
'System.id' => $this->params['named']['system_id'],
),
'recursive' => -1,
'fields' => array(
'System.id',
'System.name',
'System.public_flag',
'System.set_npc',
)
));
if (empty($system) || !$this->check_public_flag2($system['System'])) {
$this->Session->setFlash(__('Invalid ID.', true));
$this->redirect(array('action'=>'index'));
}
}
/* if (isset($system['System']) && !empty($system['System']) && $system['System']['set_npc']) {
$this->isNpc = true;
}*/
if (!empty($this->data)) {
$this->data['Character']['user_id'] = $this->user_id;
if (isset($this->site_configs['System.singleSystem']['value']) && $this->site_configs['System.singleSystem']['value']) {
$this->data['Character']['system_id'] = key($systems);
}
$this->Character->create();
if ($this->Character->save($this->data, array('fieldList' => $this->Character->fields['add']))) {
$this->Session->setFlash(sprintf(__('%s has been saved.', true), $this->data['Character']['name']));
$this->redirect(array('controller' => 'characters', 'action'=>'view', $this->Character->id));
} else {
$this->Session->setFlash(__('The data could not be saved. Please, try again.', true));
}
}
$this->set('systems', $systems);
$this->set('isOwner', false);
$this->set('title_for_layout', " ". __('Add Character', true));
}
function edit($id = null) {
if (!$id && empty($this->data)) {
$this->Session->setFlash(__('Invalid ID.', true));
$this->redirect(array('action'=>'index'));
}
// Characterデータ取得
unset($this->Character->System->hasMany['Profile']['fields']);
$this->Character->System->Profile->hasMany['CharactersHasProfile']['fields'] = '';
unset($this->Character->hasMany['CharacterProfileArchive']);
$character = $this->_get_character($id, array(), false);
if (!$this->isOwner($character['Character'], $this->user_id)) {
$this->Session->setFlash(__('No Permission', true));
$this->redirect(array('action'=>'index'));
}
// Systemチェック
if (!$this->check_public_flag($character['System'])) {
$this->redirect(array('action'=>'change_system', $id));
}
/* if ($character['System']['set_npc']) {
$this->isNpc = true;
}*/
if (empty($this->data)) {
$character['System']['Profile'] = $this->_set_profile_table2characters_has_profiles($character['System']['Profile']);
}
if (!empty($this->data)) {
$this->post_data = $this->data;
$this->data['clearCache'] = array(
'character_id' => $id,
'user_id' => $this->user_id,
'system_id' => $character['System']['id'],
);
// 新hasProfile処理
if (isset($this->data['CharactersHasProfile'])) {
$this->data['CharactersHasProfile'] = $this->_set_new_characters_has_profile($this->data['CharactersHasProfile']);
}
/* validate */
$this->_set_validate4characters_has_profile($character['System']['id']);
if ($this->Character->saveAll($this->data, array('validate' => 'only'))) {
// requiredのチェック
$requiredCheck = $this->_checkRequiredProfile($character['System']['Profile']);
if ($requiredCheck) {
// 現在のhas_profiles削除
$this->Character->CharactersHasProfile->deleteAll(array(
'CharactersHasProfile.character_id' => $id
));
/* データ保存 */
$this->data['Character']['id'] = $id;
$this->Character->create();
if ($this->Character->saveAll($this->data, array(
'validate' => false,
'fieldList' => array_merge(
$this->Character->fields['edit'],
$this->Character->CharactersHasProfile->fields['add']
)
))) {
// Archives保存
if (isset($this->data['Character']['archive']) && $this->data['Character']['archive'] == 1) {
$this->Character->saveCharacterProfile($this->Character->id, $this->data);
}
$this->Session->setFlash(sprintf(__('%s has been saved.', true), $this->data['Character']['name']));
$this->redirect(array('action'=>'view', $id));
}
}
} else {
$validate_error = current(current(current($this->Character->validationErrors)));
$this->Session->setFlash($validate_error);
}
$this->data = array_merge($character, $this->post_data);
$this->data['Character'] = $this->post_data['Character'];
$this->data['Character']['main_picture'] = $character['Character']['main_picture'];
$this->data['Character']['system_id'] = $character['Character']['system_id'];
$this->data['Character']['id'] = $id;
foreach ($this->data['System']['Profile'] as $k1 => $profile) {
if ($profile['profile_type'] == 'table') {
$colum_num = count($profile['CharactersHasProfile']);
} elseif ($profile['profile_type'] == 's-table') {
$colum_num = count($profile['CharactersHasProfile']);
} elseif ($profile['profile_type'] == 'checkbox') {
$colum_num = count($profile['ProfileSelect']);
} elseif ($profile['profile_type'] == 'm-input') {
$colum_num = count($profile['CharactersHasProfile']);
} else {
$colum_num = 1;
}
if ($colum_num == 0) {
if ($profile['profile_type'] == 's-table') {
$colum_num = count($profile['ProfileTable']) * count($profile['ProfileTable'][0]['ProfileTableStatic']);
} elseif ($profile['profile_type'] == 'table') {
$colum_num = count($profile['ProfileTable']) * 4;
} elseif ($profile['profile_type'] == 'checkbox') {
$colum_num = count($profile['ProfileSelect']);
} elseif ($profile['profile_type'] == 'm-input') {
$colum_num = 5;
} else {
$colum_num = 1;
}
}
for ($i=0; $i<$colum_num; $i++) {
if (!isset($profile['CharactersHasProfile'][$i])) {
$profile['CharactersHasProfile'][$i] = array('character_id' => $character['Character']['id']);
}
$postdata = array_shift($this->post_data['CharactersHasProfile']);
if (is_array($postdata['value'])) {
$postdata['value'] = $postdata['value'][0];
}
if (isset($postdata[$i])) {
$this->data['System']['Profile'][$k1]['CharactersHasProfile'][$i] = array_merge($profile['CharactersHasProfile'][$i], $postdata[$i]);
} else {
$this->data['System']['Profile'][$k1]['CharactersHasProfile'][$i] = array_merge($profile['CharactersHasProfile'][$i], (array)$postdata);
}
}
}
}
elseif (empty($this->data)) {
$this->data = $character;
$this->data['Character'] = $this->_restore_html_character($this->data['Character'], true);
}
$this->data['System']['Profile'] = $this->_restore_html_characters_has_profiles($this->data['System']['Profile'], true);
$this->set('isOwner', true);
$this->set('title_for_layout', " ". sprintf(__('Edit %s', true), $character['Character']['name']));
}
function add_milti_profiles($id = null) {
if (!$id || !CorePlus::is_valid($this->params['named'], 'profile_id')) {
$this->Session->setFlash(__('Invalid ID.', true));
$this->redirect(array('action'=>'index'));
}
// Characterデータ取得
$this->Character->System->hasMany['Profile']['fields'] = '';
$this->Character->System->Profile->hasMany['CharactersHasProfile']['fields'] = '';
unset($this->Character->hasMany['CharacterProfileArchive']);
$character = $this->_get_character($id);
if (!$this->isOwner($character['Character'], $this->user_id)) {
$this->Session->setFlash(__('No Permission', true));
$this->redirect(array('action'=>'index'));
}
// Systemチェック
if (!$this->check_public_flag($character['System'])) {
$this->redirect(array('action'=>'change_system', $id));
}
// Profilesデータ取得
if (empty($character['System']['Profile'])) {
$this->Session->setFlash(__('Invalid Profile.', true));
$this->redirect(array('action'=>'view', $id));
}
$profile_id = $this->params['named']['profile_id'];
$target = array();
foreach ($character['System']['Profile'] as $profile) {
if ($profile['id'] == $profile_id) {
$target = $profile;
break;
}
}
if (!$target) {
$this->Session->setFlash(__('No Profile.', true));
$this->redirect(array('action'=>'view', $id));
}
$character['System']['Profile'] = array();
$character['System']['Profile'][0] = $target;
$character['System']['Profile'] = $this->_set_profile_table2characters_has_profiles($character['System']['Profile']);
if (!empty($this->data)) {
$this->data['clearCache'] = array(
'character_id' => $id,
'user_id' => $this->user_id,
'system_id' => $character['System']['id'],
);
$this->post_data = $this->data;
$this->data = array();
if (isset($this->post_data['Character'])) {
$this->data['Character'] = array_merge($character['Character'], $this->post_data['Character']);
} else {
$this->data['Character'] = $character['Character'];
}
$this->data['Character'] = $this->_restore_html_character($this->data['Character']);
$this->data['Character']['__Token'] = $this->post_data['Character']['__Token'];
$this->data['Character']['modified'] = null;
// 新hasProfile処理
$this->data['CharactersHasProfile'] = $this->_set_new_characters_has_profile($this->post_data['CharactersHasProfile'], $profile_id, $character['System']['Profile']);
/* validate */
$this->_set_validate4characters_has_profile($character['System']['id']);
if ($this->Character->saveAll($this->data, array('validate' => 'only'))) {
// requiredのチェック
$requiredCheck = $this->_checkRequiredProfile($character['System']['Profile']);
if ($requiredCheck) {
// 現在のhas_profiles削除
$this->Character->CharactersHasProfile->deleteAll(array(
'CharactersHasProfile.profile_id' => $target['id'],
'CharactersHasProfile.character_id' => $id
));
/* データ保存 */
$this->Character->create();
if ($this->Character->saveAll($this->data, array(
'validate' => false,
'fieldList' => array_merge(
$this->Character->CharactersHasProfile->fields['add']
)
))) {
// Archives保存
if (isset($this->data['Character']['archive']) && $this->data['Character']['archive'] == 1) {
$this->Character->saveCharacterProfile($this->Character->id, $this->data);
}
$this->Session->setFlash(sprintf(__('%s has been saved.', true), $this->data['Character']['name']));
$this->redirect(array('action'=>'view', $id));
} else {
$this->data = array_merge($character, $this->data);
}
} else {
}
} else {
$validate_error = current(current(current($this->Character->validationErrors)));
$this->Session->setFlash($validate_error);
}
$this->data = array_merge($character, $this->data);
$this->data['Character']['id'] = $id;
unset($this->data['Character']['__Token']);
}
if (empty($this->data)) {
$this->data = $character;
}
$this->data['System']['Profile'] = $this->_restore_html_characters_has_profiles($this->data['System']['Profile']);
$this->set('isOwner', true);
if (isset($this->params['named']['num'])) {
$form_nums = $this->params['named']['num'];
} else {
$form_nums = 3;
}
$this->set('form_nums', $form_nums);
$this->set('title_for_layout', " ". sprintf(__('Edit %s', true), $character['Character']['name']));
}
function change_system($id = null) {
if (!$id) {
$this->Session->setFlash(__('Invalid ID.', true));
$this->redirect(array('action'=>'index'));
}
// Characterデータ取得
$this->Character->System->hasMany['Profile']['fields'] = '';
$this->Character->System->Profile->hasMany['CharactersHasProfile']['fields'] = '';
$character = $this->_get_character($id);
if (!$this->isOwner($character['Character'], $this->user_id)) {
$this->Session->setFlash(__('No Permission', true));
$this->redirect(array('action'=>'index'));
}
// Systemチェック
// Systemあり
if (isset($character['System']) && !empty($character['System'])) {
// 「その他」設定
if ($this->isOtherSystem($character['System']['id'])) {
$this->set('isChange', true);
// 公開状態は変更不可
} elseif ($this->check_public_flag($character['System'])) {
$this->redirect(array('action'=>'edit', $id));
// System非公開
} else {
$this->set('isChange', true);
}
}
if (!empty($this->data)) {
$this->data['clearCache'] = array(
'character_id' => $id,
'user_id' => $this->user_id,
'system_id' => $character['System']['id'],
);
$this->data['Character']['id'] = $id;
// validateはsystem_idのみ
$this->Cahracter['validate'] = array(
'system_id' => array(
'validSystemId' => array(
'rule' => array('validSystemId', true),
'allowEmpty' => false,
)
),
);
if ($this->Character->save(
$this->data,
array(
'validate' => true,
'fieldList' => array('system_id'),
)
)) {
$this->Session->setFlash(__('The new system has been saved', true));
$this->redirect(array('action'=>'view', $id));
} else {
$this->Session->setFlash(__('The data could not be saved. Please, try again.', true));
}
}
$this->set('isOwner', true);
$this->set('character', $character);
$systems = $this->_get_systems('public');
$this->set('systems', $systems);
$this->set('title_for_layout', " ". sprintf(__('%s Change System', true), $character['Character']['name']));
}
function set_status($id = null) {
if (!$id || !isset($this->params['named']['mode'])) {
$this->Session->setFlash(__('Invalid ID.', true));
$this->redirect(array('controller' => 'characters', 'action'=>'index'));
}
$character = $this->_get_character4character_id($id, $this->user_id, 'public');
if ($this->params['named']['mode'] != 'main_picture' && $this->params['named']['mode'] != 'full_length') {
$this->Session->setFlash(__('Invalid URL.', true));
$this->redirect(array('controller' => 'character_pictures', 'action'=>'index', $id));
}
// 新picture設定
$new_character_picture = null;
if (isset($this->params['named']['new_picture_id']) && $this->params['named']['new_picture_id'] != 'null') {
if ($character['CharacterPicture']) {
foreach($character['CharacterPicture'] as $k => $v) {
if ($v['id'] == $this->params['named']['new_picture_id']) {
$new_character_picture = CorePlus::get_value($v, 'Attachment.0.basename');
break;
}
}
}
if (!$new_character_picture) {
$this->Session->setFlash(__('Invalid data.', true));
$this->redirect(array('controller' => 'character_pictures', 'action'=>'listview', $id));
}
}
$this->data['clearCache'] = array(
'character_id' => $id,
'user_id' => $this->user_id,
'system_id' => $character['Character']['system_id'],
);
// 設定変更
$this->Character->id = $id;
$this->data['Character'][$this->params['named']['mode']] = $new_character_picture;
$this->Character->save(
$this->data,
array(
'fieldList' => array(
$this->params['named']['mode']
),
)
);
$this->Character->deleteCache4CharacterPicture($id);
$this->Session->setFlash(__('CharacterPicture Configuration has been saved.', true));
$this->redirect(array('controller' => 'character_pictures', 'action' => 'listview', $id));
}
function delete($id = null) {
if (!$id) {
$this->Session->setFlash(__('Invalid id for Character', true));
$this->redirect(array('action'=>'index'));
}
if ($this->_delete($id)) {
$this->redirect(array('controller' => 'users', 'action'=>'index'));
}
$this->set('title_for_layout', " - ". __('Delete Character', true));
}
function admin_index($id = null) {
$this->_index($id, array('isAdmin' => true));
}
function admin_search($id = null) {
$this->search_cols['Character']['public_flag'] = array(
'name' => __('Public Flag', true),
'type' => 'select',
'options' => CorePlus::set_publicflag($this->model_public_flags, array('all')),
'default' => 'public',
);
$this->_search($id, array('isAdmin' => true));
}
function admin_view($id = null) {
if (!$id) {
$this->Session->setFlash(__('Invalid Character.', true));
$this->redirect(array('action' => 'admin_index'));
}
$character = $this->_view($id, array(), true);
$this->set('character', $this->HtmlEscape->nl2br_escaped($character));
}
function admin_edit($id = null) {
if (!$id && empty($this->data)) {
$this->Session->setFlash(__('Invalid ID.', true));
$this->redirect(array('action'=>'index'));
}
// Characterデータ取得
$this->Character->System->hasMany['Profile']['fields'] = '';
$this->Character->System->Profile->hasMany['CharactersHasProfile']['fields'] = '';
unset($this->Character->hasMany['CharacterProfileArchive']);
$character = $this->_get_character($id, array(), true);
if (!$character) {
$this->Session->setFlash(__('No Character', true));
$this->redirect(array('action'=>'index'));
}
if (empty($this->data)) {
$character['System']['Profile'] = $this->_set_profile_table2characters_has_profiles($character['System']['Profile']);
}
if (!empty($this->data)) {
$this->data['clearCache'] = array(
'character_id' => $id,
'user_id' => $this->user_id,
'system_id' => $character['System']['id'],
);
if (isset($this->data['Character']['mode']) && $this->data['Character']['mode'] == 'set_private') {
$this->data['Character']['public_flag'] = 'private';
} elseif (isset($this->data['Character']['mode']) && $this->data['Character']['mode'] == 'set_public') {
$this->data['Character']['public_flag'] = 'public';
} elseif (isset($this->data['Character']['mode']) && $this->data['Character']['mode'] == 'delete_confirm') {
$this->redirect(array('controller' => 'characters', 'action'=>'admin_delete', $id));
} else {
$this->Session->setFlash(sprintf(__('Invalid data.', true), $this->data['Character']['name']));
$this->redirect(array('action'=>'view', $id));
}
$this->data['Character']['id'] = $id;
$this->Character->create();
if ($this->Character->save($this->data, array(
'validate' => true,
'fieldList' => array(
'public_flag',
),
))) {
$this->Session->setFlash(sprintf(__('%s has been saved.', true), $character['Character']['name']));
$this->redirect(array('action'=>'view', $id));
}
$this->data = array_merge($character, $this->data);
$this->data['Character']['id'] = $id;
}
if (empty($this->data)) {
$this->data = $character;
$this->data['Character'] = $this->_restore_html_character($this->data['Character'], true);
$this->data['System']['Profile'] = $this->_restore_html_characters_has_profiles($this->data['System']['Profile'], true);
}
$this->set('title_for_layout', " ". sprintf(__('Edit %s', true), $character['Character']['name']));
}
function admin_delete($id = null) {
if (!$id) {
$this->Session->setFlash(__('Invalid id for Character', true));
$this->redirect(array('action'=>'index'));
}
if ($this->_delete($id, array(), true)) {
$this->redirect(array('action'=>'index'));
}
$this->set('title_for_layout', " - ". __('Delete Character', true));
}
/* 共通化アクションメソッド */
function _index($id, $conditions = array(), $limit = 20, $fields = array(), $contain = array(), $order = array(), $page = 1) {
if (isset($conditions['isAdmin']) && $conditions['isAdmin'] === true) {
$isAdmin = true;
unset($this->Character->belongsTo['System']['conditions']['System.public_flag']);
} else {
$isAdmin = false;
}
$title = __('List of All Characters', true);
// System指定分岐
if (isset($this->params['named']['system']) && intval($this->params['named']['system'])) {
//情報取得
$this_system = $this->_getThisSystem($this->params['named']['system'], $isAdmin);
$conditions['Character.system_id'] = $this->params['named']['system'];
// Profileの一覧表示
$profiles = $this->Character->System->Profile->find('all', array(
'fields' => array(
'Profile.id',
'Profile.name',
'Profile.key_name',
'Profile.profile_type',
'Profile.sort_order',
),
'conditions' => array(
'Profile.system_id' => $this->params['named']['system'],
'Profile.show_list' => true,
),
'recursive' => -1,
));
$prof = array();
foreach ($profiles as $k => $v) {
if (isset($v['Profile']['sort_order']) && !empty($v['Profile']['sort_order'])) {
$sort_order_profile[$v['Profile']['id']] = $v['Profile']['sort_order'];
} else {
$sort_order_profile[$v['Profile']['id']] = 0;
}
$prof[$v['Profile']['id']] = array(
'id' => $v['Profile']['id'],
'name' => $v['Profile']['name'],
'key_name' => $v['Profile']['key_name'],
'profile_type' => $v['Profile']['profile_type'],
);
}
if (!empty($sort_order_profile)) {
$prof = $this->sort4sort_order($prof, $sort_order_profile);
}
foreach ($prof as $k => $v) {
$this->showlist_cols['Profile'][] = $v['id'];
}
$this_system['Profile'] = $prof;
$this_system = $this->_restore_html_system($this_system);
/* if ($this_system['System']['set_npc']) {
$this->isNpc = true;
}*/
$title = $this_system['System']['name']. " ". $title;
$this->set('this_system', $this_system);
} else {
$contain = array_merge(array('System'), (array)$contain);
// $this->isNpc = true;
}
$user = array();
if (!empty($id)) {
$user = $this->Character->User->find('first', array(
'conditions' => array('User.id' => $id),
'recursive' => -1,
'fields' => array(
'User.id',
'User.name',
),
));
if (empty($user)) {
$this->Session->setFlash(__('Invalid Id.', true));
$this->redirect(array('action'=>'index'));
}
$conditions['Character.user_id'] = $id;
if ($id == $this->user_id) {
unset($this->paginate['conditions']['Character.public_flag']);
}
$title = $user['User']['name']. " ". $title;
} else {
$contain = array_merge($contain, array('User'));
}
$this->set('userSet', $user);
// Status分岐
if (!isset($this->params['named']['status'])) {
$status = 'active';
} else {
$status = $this->params['named']['status'];
}
switch ($status) {
case 'active':
case 'inactive':
// case 'npc':
$conditions['Character.status'] = $status;
break;
default:
$status = 'all';
unset($conditions['Character.status']);
break;
}
$this->set('selected_status', $status);
$characters = $this->HtmlEscape->nl_unescape($this->_get_characters_page4user_id($id, $conditions, $limit, $fields, $contain, $order, $page));
$this->set('characters', $characters);
$this->set('title_for_layout', " - ". $title);
}
function _search($id, $conditions = array(), $limit = 20) {
if (isset($conditions['isAdmin']) && $conditions['isAdmin'] === true) {
$isAdmin = true;
} else {
$isAdmin = false;
}
if (!isset($this->search_cols['Character'])) {
$this->search_cols['Character'] = array();
}
$system_conditions['System.public_flag'] = 'public';
if (isset($this->data['Character']['keyword']['system_id'])) {
if (!empty($this->data['Character']['keyword']['system_id'])) {
$this->passedArgs['system'] = $this->data['Character']['keyword']['system_id']['value'];
$system_id = $this->passedArgs['system'];
}
} elseif (isset($this->passedArgs['system'])) {
$system_id = $this->passedArgs['system'];
} else {
$system_id = 0;
}
$systems = $this->_get_systems('public');
$systems = array_merge(array(
'0' => __('All', true),
), $systems);
$this->search_cols['Character'] = array_merge($this->search_cols['Character'], array(
'system_id' => array(
'name' => __('System', true),
'type' => 'select',
'options' => $systems,
'default' => $system_id,
),
));
if (isset($this->passedArgs['status'])) {
$status = $this->passedArgs['status'];
} else {
$status = 'active';
}
$this->search_cols['Character'] = array_merge($this->search_cols['Character'], array(
'status' => array(
'name' => __('Status', true),
'type' => 'select',
'options' => CorePlus::set_status($this->model_status2),
'default' => $status,
),
));
$this->search_cols['Character'] = array_merge($this->search_cols['Character'], array(
'name' => array(
'name' => __('Charater Name', true),
'type' => 'text',
),
));
if ($this->site_configs['Character.NotesSearch']['value']) {
$this->search_cols['Character'] = array_merge($this->search_cols['Character'], array(
'notes' => array(
'name' => __('Notes', true),
'type' => 'text',
)
));
}
// Profileの検索対象
if (!empty($system_id)) {
$this_system = $this->_getThisSystem($system_id, $isAdmin);
$profiles = $this->Character->System->Profile->find('all', array(
'fields' => array(
'Profile.id',
'Profile.name',
'Profile.key_name',
'Profile.profile_type',
'Profile.sort_order',
),
'conditions' => array(
'Profile.system_id' => $system_id,
'Profile.search' => true,
),
'recursive' => -1,
));
$prof = array();
foreach ($profiles as $k => $v) {
if (isset($v['Profile']['sort_order']) && !empty($v['Profile']['sort_order'])) {
$sort_order_profile[$v['Profile']['id']] = $v['Profile']['sort_order'];
} else {
$sort_order_profile[$v['Profile']['id']] = 0;
}
$prof[$v['Profile']['id']] = array(
'id' => $v['Profile']['id'],
'name' => $v['Profile']['name'],
// 'key_name' => $v['Profile']['key_name'],
// 'profile_type' => $v['Profile']['profile_type'],
);
}
if (!empty($sort_order_profile)) {
$prof = $this->sort4sort_order($prof, $sort_order_profile);
}
foreach ($prof as $k => $v) {
$this->search_cols['CharactersHasProfile'][$v['id']] = array(
'name' => $v['name'],
'type' => 'text',
);
}
}
if (!empty($id) && ($this->user['User']['id'] == $id)) {
$isAdmin = true;
}
$this->set('search_cols', $this->search_cols);
if ($this->site_configs['Character.ListSearchNotes']['value'] || $this->site_configs['Character.NotesSearch']['value']) {
$this->fields = array_merge($this->fields, array('Character.notes'));
}
// $this->set('fields', $this->fields);
// 検索条件設定
$type = 'OR';
$page = 1;
if (!empty($this->data)) {
if (isset($this->data['Character']['page']) && $this->data['Character']['page'] > 0) {
$page = $this->data['Character']['page'];
unset($this->data['Character']['page']);
}
$prev_type = 'AND';
$prev_type_set = false;
$new_condition = null;
foreach ($this->data as $model => $search_conditions) {
$keywords = array();
if (isset($search_conditions['keyword']) && !empty($search_conditions['keyword'])) {
foreach ($search_conditions['keyword'] as $field => $search_options) {
switch($model) {
case 'Character':
if ($field == 'public_flag') {
if (isset($conditions['isAdmin']) && !empty($conditions['isAdmin']) && $search_options['value'] == 'all') {
unset($this->paginate['conditions']['Character.public_flag']);
} else {
$conditions['Character.public_flag'] = $search_options['value'];
$conditions['public_force'] = true;
}
} elseif ($field == 'system_id') {
if (empty($search_options['value'])) {
if (isset($this->params['named']['system'])) {
unset($this->params['named']['system']);
}
} else {
$this->params['named']['system'] = $search_options['value'];
}
} elseif ($field == 'status') {
if ($search_options['value'] == 'all') {
$this->params['named']['status'] = 'all';
} else {
$this->params['named']['status'] = $search_options['value'];
}
} else {
if (isset($search_options['value']) && !empty($search_options['value'])) {
if (!empty($prev_type_set)) {
$new_condition .= ' '. strtoupper($prev_type). ' ';
$prev_type_set = false;
}
if (isset($search_options['type']) && in_array(strtolower($search_options['type']), array('and', 'or'))) {
$prev_type = strtoupper($search_options['type']);
$prev_type_set = true;
}
$new_condition .= $this->_create_search_sql($search_options['value'], $field, $model);
}
}
break;
case 'CharactersHasProfile':
if (isset($search_options['value']) && !empty($search_options['value'])) {
$conditions['profile_search'] = true;
if (!empty($prev_type_set)) {
$new_condition .= ' '. strtoupper($prev_type). ' ';
$prev_type_set = false;
}
if (isset($search_options['type']) && in_array(strtolower($search_options['type']), array('and', 'or'))) {
$prev_type = strtoupper($search_options['type']);
$prev_type_set = true;
}
$new_condition .= $this->_create_search_sql($search_options['value'], 'value', $model, $field);
}
break;
default:
$this->Session->setFlash(__('Invalid Data.', true));
$this->redirect(array('action'=>'index'));
break;
}
}
}
}
if (empty($isAdmin)) {
if (!empty($new_condition)) {
$new_condition = '('. $new_condition. ')';
$new_condition .= ' AND';
}
if (isset($conditions['profile_search'])) {
$new_condition .= ' CharactersHasProfile.public_flag = \'public\'';
}
}
if (!empty($new_condition)) {
$conditions['AND'][] = '('. $new_condition. ')';
}
}
$this->_index($id, $conditions, $limit, array(), array(), array(), $page);
}
function _view($id, $conditions = array(), $isAdmin = false) {
$this->helpers[] = 'CharacterSheet';
// キャラデータ取得
$orig_character = $this->_get_character($id, $conditions, $isAdmin);
$character = $this->Character->set_profiles2view($orig_character);
Configure::write('isOwner', false);
if ($isAdmin || CorePlus::isOwner($character['Character'], $this->user_id)) {
Configure::write('isOwner', true);
}
// Systemチェック
$this->set('systemValid', 'public');
if (!$character['System']) {
$this->set('systemValid', false);
}
if (!$this->check_public_flag($character['System'])) {
$this->set('systemValid', 'unpublic');
}
/* if ($character['System']['set_npc']) {
$this->isNpc = true;
}*/
$character = $this->_restore_html_system($character);
$character['System']['Profile'] = $this->_restore_html_characters_has_profiles($character['System']['Profile'], false);
$this->set('title_for_layout', " - ". $character['Character']['name']);
// キャラクターシート設定
if (isset($this->params['named']['mode']) && !empty($this->params['named']['mode'])) {
$mode = $this->params['named']['mode'];
// スキン公開チェック
$public_flg = false;
$skin = array();
if (!$isAdmin) {
// 公開済み
foreach ($character['System']['CharacterSheet'] as $v) {
if ($v['key_name'] == $mode) {
$public_flg = true;
$skin = $v;
break;
}
}
// 自身のキャラシのみ
if (!$public_flg) {
$this->CharacterSheet = CorePlus::set_model('CharacterSheet');
$characterSheet = $this->CharacterSheet->find('first', array(
'conditions' => array('CharacterSheet.key_name' => $mode),
'recursive' => -1,
));
if ($this->_checkCharaSheeOwner($characterSheet)) {
$skin = $characterSheet['CharacterSheet'];
$public_flg = true;
}
}
} else {
$public_flg = true;
}
if ($public_flg) {
$this->view = 'Theme';
$this->theme = $mode;
$this->set('skin', $skin);
}
}
return $character;
}
function _delete($id = null, $conditions = array(), $isAdmin = false) {
if (!$id) {
$this->Session->setFlash(__('Invalid id for Character', true));
$this->redirect(array('action'=>'index'));
}
$character = $this->_view($id, $conditions, $isAdmin);
if (empty($character)) {
$this->Session->setFlash(__('No Character', true));
$this->redirect(array('action'=>'index'));
}
$this->set('character', $character);
if (!$isAdmin && !$this->isOwner($character['Character'], $this->user_id)) {
$this->Session->setFlash(__('No Permission', true));
$this->redirect(array('action'=>'index'));
}
$this->set('isOwner', true);
if (!empty($this->data)) {
$this->data['clearCache'] = array(
'character_id' => $id,
'user_id' => $this->user_id,
'system_id' => $character['System']['id'],
);
if ($this->data['Character']['confirm'] == 'yes') {
// Character
$this->data['Character']['id'] = $id;
$this->data['Character']['main_picture'] = null;
$this->data['Character']['full_length'] = null;
$this->data['Character']['deleted'] = true;
$this->data['Character']['deleted_date'] = date('Y-m-d H:i:s');
$this->Character->create();
if ($this->Character->save(
$this->data,
array(
'validate' => false,
'fieldList' => array(
'main_picture',
'full_length',
'deleted',
'deleted_date'
),
)
)) {
// CharactersHasProfiles
$this->Character->CharactersHasProfile->updateAll(
array(
'CharactersHasProfile.public_flag' => "'private'",
),
array(
'CharactersHasProfile.character_id' => $id
)
);
// CharacterProfileArchives
$date = date('Y-m-d H:i:s');
$this->Character->CharacterProfileArchive->updateAll(
array(
'CharacterProfileArchive.deleted' => true,
'CharacterProfileArchive.deleted_date' => "'$date'",
),
array(
'CharacterProfileArchive.character_id' => $id
)
);
// Attachments
if (isset($character['CharacterPicture']) && !empty($character['CharacterPicture'])) {
foreach ($character['CharacterPicture'] as $picture) {
$this->Character->CharacterPicture->delete($picture['id']);
}
}
$this->Session->setFlash(__('Character deleted', true));
return true;
} else {
$this->Session->setFlash(__('The Character could not be deleted.', true));
}
}
}
return false;
}
/* 共通関数 */
function _get_character($id, $conditions = array(), $isAdmin = false)
{
$character = $this->Character->get_character($id, $conditions, $isAdmin);
if (empty($character)) {
$this->Session->setFlash(__('No Character', true));
$this->redirect(array('action'=>'index'));
}
if ($isAdmin === false && !$this->check_public_flag($character['Character'])) {
$this->Session->setFlash(__('No Permission', true));
$this->redirect(array('action'=>'index'));
}
if (isset($character['System']['Profile'])) {
$character['System'] = $this->_restore_html_profile($character['System']);
}
return $character;
}
// ProfileTableをCharacterHasProfilesのTableの形式にセット
function _set_profile_table2characters_has_profiles($profile)
{
if (!empty($profile[0]['CharactersHasProfile'])) {
return $profile;
}
foreach($profile as $k => $v) {
if (empty($v['ProfileTable'])) {
continue;
}
$tmp = array();
$rows = count($v['CharactersHasProfile']);
for($i=0; $i<$rows; $i++) {
foreach($v['ProfileTable'] as $k2 => $v2) {
if (isset($v2['CharactersHasProfile'][$i])) {
$tmp[] = $v2['CharactersHasProfile'][$i];
} elseif (isset($v['CharactersHasProfile'][$i])) {
$tmp[] = $v['CharactersHasProfile'][$i];
break;
} else {
$tmp[] = null;
}
}
}
$profile[$k]['CharactersHasProfile'] = $tmp;
if (isset($profile[$k]['ProfileTable'][0]['ProfileTableStatic']) && !empty($profile[$k]['ProfileTable'][0]['ProfileTableStatic'])) {
$profile[$k]['ProfileTable'][0]['ProfileTableStatic'] = $this->_restore_html_profile_table_static($profile[$k]['ProfileTable'][0]['ProfileTableStatic']);
}
}
return $profile;
}
// CharactersHasProfileの追加valiadte設定
function _set_validate4characters_has_profile($system_id)
{
$this->Character->CharactersHasProfile->validate['profile_id']['validProfileId'] = array(
'rule' => array('validProfileId', $system_id),
);
$this->Character->CharactersHasProfile->validate['profile_select_id']['validProfileSelectId'] = array(
'rule' => array('validProfileSelectId', $system_id),
'allowEmpty' => true,
);
$this->Character->CharactersHasProfile->validate['profile_table_id']['validProfiletableId'] = array(
'rule' => array('validProfiletableId', $system_id),
'allowEmpty' => true,
);
}
/* restore_html */
function _restore_html_character($data, $nl2br = false) {
$data['name'] = $this->{$this->modelClass}->restore_html($data['name'], false, false, false);
$data['notes'] = $this->{$this->modelClass}->restore_html($data['notes'], false, false, false);
$data['secret_notes'] = $this->{$this->modelClass}->restore_html($data['secret_notes'], false, false, false);
if ($nl2br) {
$data['notes'] = str_replace('
', "\n", $data['notes']);
$data['secret_notes'] = str_replace('
', "\n", $data['secret_notes']);
}
return $data;
}
function _restore_html_characters_has_profiles($profile, $nl2br = false) {
if (empty($profile)) {
return null;
}
foreach($profile as $k => $v) {
if (empty($v['CharactersHasProfile'])) {
continue;
}
$profile[$k]['CharactersHasProfile'] = $this->__restore_html_characters_has_profiles($v['CharactersHasProfile'], $nl2br, $v['profile_type']);
}
return $profile;
}
function __restore_html_characters_has_profiles($data, $nl2br = false, $profile_type = null) {
if (empty($data)) {
return null;
}
foreach ($data as $k => $v) {
if (isset($v['value'])) {
$data[$k]['value'] = $this->{$this->modelClass}->restore_html($v['value'], false, false, false);
if ($nl2br && $profile_type == 'textarea') {
$data[$k]['value'] = str_replace('
', "\n", $data[$k]['value']);
}
}
}
return $data;
}
function _checkRequiredProfile($profile)
{
if (empty($profile) || !isset($this->data['CharactersHasProfile'])) {
return true;
}
$requireCheck = array();
foreach($this->data['CharactersHasProfile'] as $k => $v) {
if (!isset($requireCheck[$v['profile_id']])) {
$requireCheck[$v['profile_id']] = null;
}
if (isset($requireCheck[$v['profile_id']]['value']) && !empty($requireCheck[$v['profile_id']]['value'])) {
continue;
}
if (empty($v['value'])) {
continue;
}
if (isset($v['profile_table_static_id']) && !empty($v['profile_table_static_id'])) {
if (!isset($requireCheck[$v['profile_id']]['profile_table_id']) || empty($requireCheck[$v['profile_id']]['profile_table_id'])) {
$requireCheck[$v['profile_id']]['profile_table_id'] = $v['profile_table_id'];
}
if ($requireCheck[$v['profile_id']]['profile_table_id'] == $v['profile_table_id']) {
continue;
}
}
$requireCheck[$v['profile_id']]['value'] = $v['value'];
}
$errors = array();
foreach ($profile as $k => $v) {
if ($v['required']) {
if (!isset($requireCheck[$v['id']]) || empty($requireCheck[$v['id']]['value'])) {
$errors[] = $v['name'];
}
}
}
if ($errors) {
$this->Session->setFlash(sprintf(__('%s is required.', true), implode(',', $errors)));
return false;
} else {
return true;
}
}
function _create_search_sql($keywords, $field, $model, $profile_id = null)
{
$type = 'OR';
$result = null;
if (empty($keywords) || !is_string($keywords) || empty($field)) {
return array();
}
if (!isset($this->search_cols[$model]) ||
((empty($profile_id) && !array_key_exists($field, $this->search_cols[$model]))
|| (!empty($profile_id) && !array_key_exists($profile_id, $this->search_cols[$model])))) {
return null;
}
$keywords = rawurldecode($keywords);
$searchwords = explode(",", $keywords);
foreach ($searchwords as $k2 => $searchword) {
if (empty($searchword)) {
continue;
}
if (!empty($result)) {
$result .= ' '. strtoupper($type). ' ';
} else {
$result .= '(';
}
$result .= '('. $model.'.'.$field. ' LIKE '. '\'%'. $searchword. '%\'';
if (!empty($profile_id)) {
$result .= ' AND CharactersHasProfile.profile_id = '. $profile_id;
}
$result .= ')';
}
$result .= ')';
return $result;
}
}