/**
  * 承認選択フォーム出力
  * 承認設定がある場合に必要なメッセージを出力する。
  *
  * @return  void
  * @access  public
  */
 public function formAfterForm(CakeEvent $event)
 {
     //ブログ&固定ページ共通で、申し送り事項の表示処理を差し込む。
     //差し戻し、承認の時のみ、申し送り入力欄を表示する。
     $approval_comment_toggle = $this->_getHiddenCommentFormCode();
     //処理を実行するのは、ブログと固定ページ
     //---------------------------------
     // ブログ投稿フォーム
     //---------------------------------
     if ($event->data['id'] == 'BlogPostForm') {
         // BcFormHelperを利用する為、Viewを取得
         $View = $event->subject();
         //ブログのコンテンツIDを取得する。
         $blogContentId = $View->request->params['pass'][0];
         //承認レベル設定モデルを取得する。
         App::import('Model', 'Approval.ApprovalLevelSetting');
         $approvalLevelSetting = new ApprovalLevelSetting();
         //カテゴリの設定を優先する
         if (!empty($View->data['BlogPost']['blog_category_id'])) {
             $settingData = $approvalLevelSetting->find('first', array('conditions' => array('ApprovalLevelSetting.category_id' => $View->data['BlogPost']['blog_category_id'], 'ApprovalLevelSetting.type' => 'blog', 'ApprovalLevelSetting.publish' => 1)));
         }
         if (empty($settingData)) {
             $settingData = $approvalLevelSetting->find('first', array('conditions' => array('ApprovalLevelSetting.blog_content_id' => $blogContentId, 'ApprovalLevelSetting.type' => 'blog', 'ApprovalLevelSetting.publish' => 1)));
         }
         //セッション情報からログイン中のユーザー情報を取得する。
         App::uses('CakeSession', 'Model/Datasource');
         $Session = new CakeSession();
         $user = $Session->read('Auth.User');
         //設定情報を確認する。
         if (!empty($settingData)) {
             //新規作成の場合は、保留か承認申請かに内容を変更する。
             if ($View->request->params['action'] == 'admin_add') {
                 $options = array(0 => '保留', 3 => '承認を申請する');
                 //承認設定のある新規作成は誰でも書けるので、常に表示する。
                 $event->data['fields'][] = array('title' => '承認設定', 'input' => $View->BcForm->input('Approval.approval_flag', array('type' => 'select', 'options' => $options)));
                 //申送入力欄
                 $event->data['fields'][] = array('title' => '申し送り事項', 'input' => $View->BcForm->textarea('Approval.approval_comment') . $approval_comment_toggle);
                 //編集(edit)の場合
             } else {
                 //現在の承認済段階を確認する。
                 //承認情報・承認待ちモデルを取得する。
                 App::import('Model', 'Approval.ApprovalPost');
                 $approvalPost = new ApprovalPost();
                 //承認情報・承認待ちモデルからデータを探す
                 $approvalPostData = $approvalPost->find('first', array('conditions' => array('ApprovalPost.post_id' => $View->request->params['pass'][1])));
                 //データがある場合
                 if (!empty($approvalPostData)) {
                     //通過済みの承認ステージ
                     $pass_stage = $approvalPostData['ApprovalPost']['pass_stage'];
                     if (empty($pass_stage)) {
                         $pass_stage = 0;
                     }
                     //現在のステージを確認する(最終承認後はそれ以上ない)
                     if ($approvalPostData['ApprovalPost']['pass_stage'] == $settingData['ApprovalLevelSetting']['last_stage']) {
                         $nowStage = $approvalPostData['ApprovalPost']['pass_stage'];
                     } else {
                         $nowStage = $approvalPostData['ApprovalPost']['pass_stage'] + 1;
                     }
                     //現在の承認権限者タイプ
                     $nowApprovalType = $settingData['ApprovalLevelSetting']['level' . $nowStage . '_type'];
                     //編集モードの場合でも、next_approver_idが0の時は、却下で戻ってきたもの。
                     if ($pass_stage == 0) {
                         //権限者の確認
                         switch ($nowApprovalType) {
                             case 'user':
                                 if ($approvalPostData['ApprovalPost']['next_approver_id'] == $user['id']) {
                                     //承認権限があるかどうかを判定する。
                                     $now_stage = $pass_stage + 1;
                                     //ユーザー情報を確認する。
                                     $options = array(0 => '保留', 1 => '承認する', 2 => '差し戻す');
                                     $event->data['fields'][] = array('title' => '承認設定', 'input' => $View->BcForm->input('Approval.approval_flag', array('type' => 'select', 'options' => $options)));
                                     //申送入力欄(最終承認の時は無視する)
                                     $event->data['fields'][] = array('title' => '申し送り事項', 'input' => $View->BcForm->textarea('Approval.approval_comment') . $approval_comment_toggle);
                                 } else {
                                     //自分が権限者でない場合
                                     //却下で戻ってきたものの場合は、改めて申請できるので表示する。
                                     if ($approvalPostData['ApprovalPost']['next_approver_id'] == 0) {
                                         $options = array(0 => '保留', 3 => '承認を申請する');
                                         //最初の段階まで戻っていれば、誰もが申請できる。
                                         $event->data['fields'][] = array('title' => '承認設定', 'input' => $View->BcForm->input('Approval.approval_flag', array('type' => 'select', 'options' => $options)));
                                         //申送入力欄
                                         $event->data['fields'][] = array('title' => '申し送り事項', 'input' => $View->BcForm->textarea('Approval.approval_comment') . $approval_comment_toggle);
                                     }
                                 }
                                 break;
                             case 'group':
                                 if ($approvalPostData['ApprovalPost']['next_approver_id'] == $user['UserGroup']['id']) {
                                     //承認権限があるかどうかを判定する。
                                     $now_stage = $pass_stage + 1;
                                     //ユーザー情報を確認する。
                                     $options = array(0 => '保留', 1 => '承認する', 2 => '差し戻す');
                                     $event->data['fields'][] = array('title' => '承認設定', 'input' => $View->BcForm->input('Approval.approval_flag', array('type' => 'select', 'options' => $options)));
                                     //申送入力欄
                                     $event->data['fields'][] = array('title' => '申し送り事項', 'input' => $View->BcForm->textarea('Approval.approval_comment') . $approval_comment_toggle);
                                 } else {
                                     //自分が権限者でない場合
                                     //却下で戻ってきたものの場合は、改めて申請できるので表示する。
                                     if ($approvalPostData['ApprovalPost']['next_approver_id'] == 0) {
                                         $options = array(0 => '保留', 3 => '承認を申請する');
                                         //最初の段階まで戻っていれば、誰もが申請できる。
                                         $event->data['fields'][] = array('title' => '承認設定', 'input' => $View->BcForm->input('Approval.approval_flag', array('type' => 'select', 'options' => $options)));
                                         //申送入力欄
                                         $event->data['fields'][] = array('title' => '申し送り事項', 'input' => $View->BcForm->textarea('Approval.approval_comment') . $approval_comment_toggle);
                                     }
                                 }
                                 break;
                             default:
                                 break;
                         }
                         //却下または第1段階ではなく、承認待ちの状態の場合
                     } else {
                         $now_stage = $pass_stage + 1;
                         //権限者の確認
                         switch ($nowApprovalType) {
                             case 'user':
                                 //権限者の確認
                                 if ($approvalPostData['ApprovalPost']['next_approver_id'] == $user['id']) {
                                     //もしも最終段階まで来ていれば「承認する」はいらない。
                                     if ($approvalPostData['ApprovalPost']['pass_stage'] == $settingData['ApprovalLevelSetting']['last_stage']) {
                                         $options = array(0 => '承認状態を維持', 2 => '差し戻す');
                                     } else {
                                         $options = array(0 => '保留', 1 => '承認する', 2 => '差し戻す');
                                     }
                                     $event->data['fields'][] = array('title' => '承認設定', 'input' => $View->BcForm->input('Approval.approval_flag', array('type' => 'select', 'options' => $options)));
                                     //申送入力欄
                                     $event->data['fields'][] = array('title' => '申し送り事項', 'input' => $View->BcForm->textarea('Approval.approval_comment') . $approval_comment_toggle);
                                 }
                                 break;
                             case 'group':
                                 //権限者の確認
                                 if ($approvalPostData['ApprovalPost']['next_approver_id'] == $user['UserGroup']['id']) {
                                     //もしも最終段階まで来ていれば「承認する」はいらない。
                                     if ($approvalPostData['ApprovalPost']['pass_stage'] == $settingData['ApprovalLevelSetting']['last_stage']) {
                                         $options = array(0 => '承認状態を維持', 2 => '差し戻す');
                                     } else {
                                         $options = array(0 => '保留', 1 => '承認する', 2 => '差し戻す');
                                     }
                                     $event->data['fields'][] = array('title' => '承認設定', 'input' => $View->BcForm->input('Approval.approval_flag', array('type' => 'select', 'options' => $options)));
                                     //申送入力欄
                                     $event->data['fields'][] = array('title' => '申し送り事項', 'input' => $View->BcForm->textarea('Approval.approval_comment') . $approval_comment_toggle);
                                 }
                                 break;
                         }
                     }
                     //データがない場合は、新規作成後に承認機能を付与した場合。
                 } else {
                     $options = array(0 => '保留', 3 => '承認を申請する');
                     //データがないため新規作成と同じく、だれにでも表示する。
                     $event->data['fields'][] = array('title' => '承認設定', 'input' => $View->BcForm->input('Approval.approval_flag', array('type' => 'select', 'options' => $options)));
                     //申送入力欄
                     $event->data['fields'][] = array('title' => '申し送り事項', 'input' => $View->BcForm->textarea('Approval.approval_comment') . $approval_comment_toggle);
                 }
             }
         }
         //---------------------------------
         // 固定ページ投稿フォーム
         //---------------------------------
     } elseif ($event->data['id'] == 'PageForm') {
         // BcFormHelperを利用する為、Viewを取得
         $View = $event->subject();
         //承認レベル設定モデルを取得する。
         App::import('Model', 'Approval.ApprovalLevelSetting');
         $approvalLevelSetting = new ApprovalLevelSetting();
         //カテゴリの設定を優先する
         if (!empty($View->data['Page']['page_category_id'])) {
             $settingData = $approvalLevelSetting->find('first', array('conditions' => array('ApprovalLevelSetting.category_id' => $View->data['Page']['page_category_id'], 'ApprovalLevelSetting.type' => 'page', 'ApprovalLevelSetting.publish' => 1)));
         }
         if (empty($settingData)) {
             $settingData = $approvalLevelSetting->find('first', array('conditions' => array('ApprovalLevelSetting.category_id' => 0, 'ApprovalLevelSetting.type' => 'page', 'ApprovalLevelSetting.publish' => 1)));
         }
         //セッション情報からログイン中のユーザー情報を取得する。
         App::uses('CakeSession', 'Model/Datasource');
         $Session = new CakeSession();
         $user = $Session->read('Auth.User');
         //設定情報を確認する。
         if (!empty($settingData)) {
             //新規作成の場合は、保留か承認申請かに内容を変更する。
             if ($View->request->params['action'] == 'admin_add') {
                 $options = array(0 => '保留', 3 => '承認を申請する');
                 //承認設定のある新規作成は誰でも書けるので、常に表示する。
                 $event->data['fields'][] = array('title' => '承認設定', 'input' => $View->BcForm->input('Approval.approval_flag', array('type' => 'select', 'options' => $options)));
                 //申送入力欄
                 $event->data['fields'][] = array('title' => '申し送り事項', 'id' => 'test', 'input' => $View->BcForm->textarea('Approval.approval_comment') . $approval_comment_toggle);
                 //編集(edit)の場合
             } else {
                 //現在の承認済段階を確認する。
                 //承認情報・承認待ちモデルを取得する。
                 App::import('Model', 'Approval.ApprovalPage');
                 $approvalPage = new ApprovalPage();
                 //承認情報・承認待ちモデルからデータを探す
                 $approvalPageData = $approvalPage->find('first', array('conditions' => array('ApprovalPage.page_id' => $View->request->params['pass'][0])));
                 //データがある場合
                 if (!empty($approvalPageData)) {
                     //通過済みの承認ステージ
                     $pass_stage = $approvalPageData['ApprovalPage']['pass_stage'];
                     if (empty($pass_stage)) {
                         $pass_stage = 0;
                     }
                     //現在のステージを確認する(最終承認後はそれ以上ない)
                     if ($approvalPageData['ApprovalPage']['pass_stage'] == $settingData['ApprovalLevelSetting']['last_stage']) {
                         $nowStage = $approvalPageData['ApprovalPage']['pass_stage'];
                     } else {
                         $nowStage = $approvalPageData['ApprovalPage']['pass_stage'] + 1;
                     }
                     //現在の承認権限者タイプ
                     $nowApprovalType = $settingData['ApprovalLevelSetting']['level' . $nowStage . '_type'];
                     //編集モードの場合でも、next_approver_idが0の時は、却下で戻ってきたもの。
                     if ($pass_stage == 0) {
                         //権限者の確認
                         switch ($nowApprovalType) {
                             case 'user':
                                 if ($approvalPageData['ApprovalPage']['next_approver_id'] == $user['id']) {
                                     //承認権限があるかどうかを判定する。
                                     $now_stage = $pass_stage + 1;
                                     //ユーザー情報を確認する。
                                     $options = array(0 => '保留', 1 => '承認する', 2 => '差し戻す');
                                     $event->data['fields'][] = array('title' => '承認設定', 'input' => $View->BcForm->input('Approval.approval_flag', array('type' => 'select', 'options' => $options)));
                                     //申送入力欄
                                     $event->data['fields'][] = array('title' => '申し送り事項', 'input' => $View->BcForm->textarea('Approval.approval_comment') . $approval_comment_toggle);
                                 } else {
                                     //自分が権限者でない場合
                                     //却下で戻ってきたものの場合は、改めて申請できるので表示する。
                                     if ($approvalPageData['ApprovalPage']['next_approver_id'] == 0) {
                                         $options = array(0 => '保留', 3 => '承認を申請する');
                                         //最初の段階まで戻っていれば、誰もが申請できる。
                                         $event->data['fields'][] = array('title' => '承認設定', 'input' => $View->BcForm->input('Approval.approval_flag', array('type' => 'select', 'options' => $options)));
                                         //申送入力欄
                                         $event->data['fields'][] = array('title' => '申し送り事項', 'input' => $View->BcForm->textarea('Approval.approval_comment') . $approval_comment_toggle);
                                     }
                                 }
                                 break;
                             case 'group':
                                 if ($approvalPageData['ApprovalPage']['next_approver_id'] == $user['UserGroup']['id']) {
                                     //承認権限があるかどうかを判定する。
                                     $now_stage = $pass_stage + 1;
                                     //ユーザー情報を確認する。
                                     $options = array(0 => '保留', 1 => '承認する', 2 => '差し戻す');
                                     $event->data['fields'][] = array('title' => '承認設定', 'input' => $View->BcForm->input('Approval.approval_flag', array('type' => 'select', 'options' => $options)));
                                     //申送入力欄
                                     $event->data['fields'][] = array('title' => '申し送り事項', 'input' => $View->BcForm->textarea('Approval.approval_comment') . $approval_comment_toggle);
                                 } else {
                                     //自分が権限者でない場合
                                     //却下で戻ってきたものの場合は、改めて申請できるので表示する。
                                     if ($approvalPageData['ApprovalPage']['next_approver_id'] == 0) {
                                         $options = array(0 => '保留', 3 => '承認を申請する');
                                         //最初の段階まで戻っていれば、誰もが申請できる。
                                         $event->data['fields'][] = array('title' => '承認設定', 'input' => $View->BcForm->input('Approval.approval_flag', array('type' => 'select', 'options' => $options)));
                                         //申送入力欄
                                         $event->data['fields'][] = array('title' => '申し送り事項', 'input' => $View->BcForm->textarea('Approval.approval_comment') . $approval_comment_toggle);
                                     }
                                 }
                                 break;
                             default:
                                 break;
                         }
                         //却下または第1段階ではなく、承認待ちの状態の場合
                     } else {
                         $now_stage = $pass_stage + 1;
                         //権限者の確認
                         switch ($nowApprovalType) {
                             case 'user':
                                 //権限者の確認
                                 if ($approvalPageData['ApprovalPage']['next_approver_id'] == $user['id']) {
                                     //もしも最終段階まで来ていれば「承認する」はいらない。
                                     if ($approvalPageData['ApprovalPage']['pass_stage'] == $settingData['ApprovalLevelSetting']['last_stage']) {
                                         $options = array(0 => '承認状態を維持', 2 => '差し戻す');
                                     } else {
                                         $options = array(0 => '保留', 1 => '承認する', 2 => '差し戻す');
                                     }
                                     $event->data['fields'][] = array('title' => '承認設定', 'input' => $View->BcForm->input('Approval.approval_flag', array('type' => 'select', 'options' => $options)));
                                     //申送入力欄
                                     $event->data['fields'][] = array('title' => '申し送り事項', 'input' => $View->BcForm->textarea('Approval.approval_comment') . $approval_comment_toggle);
                                 }
                                 break;
                             case 'group':
                                 //権限者の確認
                                 if ($approvalPageData['ApprovalPage']['next_approver_id'] == $user['UserGroup']['id']) {
                                     //もしも最終段階まで来ていれば「承認する」はいらない。
                                     if ($approvalPageData['ApprovalPage']['pass_stage'] == $settingData['ApprovalLevelSetting']['last_stage']) {
                                         $options = array(0 => '承認状態を維持', 2 => '差し戻す');
                                     } else {
                                         $options = array(0 => '保留', 1 => '承認する', 2 => '差し戻す');
                                     }
                                     $event->data['fields'][] = array('title' => '承認設定', 'input' => $View->BcForm->input('Approval.approval_flag', array('type' => 'select', 'options' => $options)));
                                     //申送入力欄
                                     $event->data['fields'][] = array('title' => '申し送り事項', 'input' => $View->BcForm->textarea('Approval.approval_comment') . $approval_comment_toggle);
                                 }
                                 break;
                         }
                     }
                     //データがない場合は、新規作成後に承認機能を付与した場合。
                 } else {
                     $options = array(0 => '保留', 3 => '承認を申請する');
                     //データがないため新規作成と同じく、だれにでも表示する。
                     $event->data['fields'][] = array('title' => '承認設定', 'input' => $View->BcForm->input('Approval.approval_flag', array('type' => 'select', 'options' => $options)));
                     //申送入力欄
                     $event->data['fields'][] = array('title' => '申し送り事項', 'input' => $View->BcForm->textarea('Approval.approval_comment') . $approval_comment_toggle);
                 }
             }
         }
     }
     return true;
 }
 /**
  * ブログ投稿 beforeSave
  * 承認や差戻しの状態を確認し、データ操作を行う。
  *
  * [仕様]
  * 記事が属するカテゴリもしくはコンテンツ全体に承認設定があると処理に入る。
  * 記事の作成段階では「申請」を行う。申請があってはじめて承認段階に入る。
  * 「承認」は設定で決められた承認権限者が行う。ユーザーの場合とグループの場合がある。
  * 「承認」されるとpass_stageが1上がる。「差し戻し」を受けると1下がる。
  * 申請前も第1段階承認前もpass_stageは「0」。
  * 区別をつける必要がある時は「next_approver_id」を見る。申請前はまだ「0」になっている。
  *
  * カテゴリ毎に設定ができるため、途中でカテゴリが変更されたら、
  * 変更後のカテゴリの承認設定に従うため、一度リセット(申請前まで戻す)する必要がある。
  *
  * @return  void
  * @access  public
  */
 public function blogBlogPostBeforeSave(CakeEvent $event)
 {
     //---------------------------------
     // モデル・セッションの呼び出し
     //---------------------------------
     //承認待ちモデルを取得する。
     App::import('Model', 'Approval.ApprovalPost');
     $approvalPost = new ApprovalPost();
     //承認レベル設定モデルを取得する。
     App::import('Model', 'Approval.ApprovalLevelSetting');
     $approvalLevelSetting = new ApprovalLevelSetting();
     //セッション情報からログイン中のユーザー情報を取得する。
     App::uses('CakeSession', 'Model/Datasource');
     $Session = new CakeSession();
     $user = $Session->read('Auth.User');
     //呼び出し元のモデルを取得する
     $BlogPost = $event->subject();
     //---------------------------------
     // 設定情報の確認
     //---------------------------------
     //ブログの場合はカテゴリID(優先)、コンテンツIDの両方を確認する。
     $settingData = $approvalLevelSetting->find('first', array('conditions' => array('ApprovalLevelSetting.type' => 'blog', 'ApprovalLevelSetting.category_id' => $BlogPost->data['BlogPost']['blog_category_id'])));
     //カテゴリの設定がなければブログコンテンツ単位であるかどうかを確認する。
     if (empty($settingData)) {
         $settingData = $approvalLevelSetting->find('first', array('conditions' => array('ApprovalLevelSetting.type' => 'blog', 'ApprovalLevelSetting.category_id' => 0, 'ApprovalLevelSetting.blog_content_id' => $BlogPost->data['BlogPost']['blog_content_id'])));
     }
     //---------------------------------
     // 承認処理開始
     //---------------------------------
     //設定がされてない場合はスルーする
     if (empty($settingData)) {
         return true;
         //設定はあるが、利用しない:0の場合もスルーする
     } elseif ($settingData['ApprovalLevelSetting']['publish'] == 0) {
         return true;
         //設定があり、かつ利用する:1場合のみ処理に入る。
     } else {
         /* 除外処理(承認処理を行うにも関わらずフラグが届いていない。)*/
         if (empty($BlogPost->data['Approval'])) {
             return false;
         }
         //承認・保留・拒否に関わらず、カテゴリが変更になった場合、
         //新しいカテゴリの承認フローを1から通過する必要がある。
         //---------------------------------
         // カテゴリ変更の検知
         //---------------------------------
         $approvalData = $approvalPost->find('first', array('conditions' => array('ApprovalPost.post_id' => $BlogPost->data['BlogPost']['id'])));
         //新規作成の時などはデータがないので、ある場合のみ処理。
         if (!empty($approvalData)) {
             //カテゴリの変更を検知
             if ($approvalData['ApprovalPost']['blog_category_id'] != $BlogPost->data['BlogPost']['blog_category_id']) {
                 //変更後のカテゴリに承認設定があるかどうかを確認する。
                 $newCategorySetting = $approvalLevelSetting->find('first', array('conditions' => array('ApprovalLevelSetting.publish' => 1, 'ApprovalLevelSetting.type' => 'blog', 'ApprovalLevelSetting.category_id' => $BlogPost->data['BlogPost']['blog_category_id'])));
                 //カテゴリ個別の設定がない場合は、ブログ全体を確かめる。
                 if (empty($newCategorySetting)) {
                     $newCategorySetting = $approvalLevelSetting->find('first', array('conditions' => array('ApprovalLevelSetting.publish' => 1, 'ApprovalLevelSetting.type' => 'blog', 'ApprovalLevelSetting.blog_content_id' => $BlogPost->data['BlogPost']['blog_content_id'])));
                 }
                 //ブログ全体にも設定がない場合は、承認設定がないので現在の承認段階フローの記録を消して通過させる。
                 if (empty($newCategorySetting)) {
                     //削除実行
                     $this->ApprovalPost->delete($approvalData['ApprovalPost']['id']);
                     //通過させる。
                     return true;
                     //何かしらの承認設定があった場合
                 } else {
                     //新しい承認設定のもと、申請段階前まで戻す。
                     $approvalData['ApprovalPost']['blog_category_id'] = $BlogPost->data['BlogPost']['blog_category_id'];
                     $approvalData['ApprovalPost']['next_approver_id'] = 0;
                     $approvalData['ApprovalPost']['pass_stage'] = 0;
                     $BlogPost->data['BlogPost']['status'] = 0;
                     //データの更新
                     if ($this->ApprovalPost->save($approvalData)) {
                         return true;
                     } else {
                         return false;
                     }
                 }
             }
         }
         /* 承認フラグを確認する。*/
         // 0:保留
         // 1:承認または承認申請(次の段階へ)
         // 2:拒否(1つ戻す)
         //------------------------------
         // 0:保留の時
         //------------------------------
         if ($BlogPost->data['Approval']['approval_flag'] == 0) {
             if (!empty($BlogPost->data['BlogPost']['id'])) {
                 //承認情報データの取得
                 $approvalData = $approvalPost->find('first', array('conditions' => array('ApprovalPost.post_id' => $BlogPost->data['BlogPost']['id'])));
                 //もしも最終段階まで来ていなければ強制非公開
                 if ($settingData['ApprovalLevelSetting']['last_stage'] != $approvalData['ApprovalPost']['pass_stage']) {
                     $BlogPost->data['BlogPost']['status'] = 0;
                 }
                 //新規作成の時
             } else {
                 $BlogPost->data['BlogPost']['status'] = 0;
             }
             return true;
             //スルーする。
             //------------------------------
             // 1:承認の時(承認申請後の場合)
             //------------------------------
         } elseif ($BlogPost->data['Approval']['approval_flag'] == 1) {
             //すでに承認申請後なので、この段階では必ず既存データがある。
             if (!empty($BlogPost->data['BlogPost']['id'])) {
                 //承認情報データの取得
                 $approvalData = $approvalPost->find('first', array('conditions' => array('ApprovalPost.post_id' => $BlogPost->data['BlogPost']['id'])));
                 /* 現状の確認を行う */
                 //現在の承認済段階を確認する。
                 if (!empty($approvalData['ApprovalPost']['pass_stage'])) {
                     $pass_stage = $approvalData['ApprovalPost']['pass_stage'];
                 }
                 if (empty($pass_stage)) {
                     //null
                     $pass_stage = 0;
                 }
                 //現在の承認ステージ(通過ステージに1足したもの)
                 $now_stage = $pass_stage + 1;
                 //最終的に必要な承認ステージ数
                 $last_stage = $settingData['ApprovalLevelSetting']['last_stage'];
                 //現在のステージの権限者ID(ユーザーもしくはグループのIDが入っている)
                 $approverId = $settingData['ApprovalLevelSetting']['level' . $now_stage . '_approver_id'];
                 //ログイン中のユーザーのIDとグループID
                 $loginUserId = $user['id'];
                 $loginUserGroupId = $user['UserGroup']['id'];
                 /* 取得した情報から承認権限の確認を行う */
                 //権限者タイプ(type:user or group)の確認と権限チェック
                 switch ($settingData['ApprovalLevelSetting']['level' . $now_stage . '_type']) {
                     //承認権限者がユーザー単位で設定されている場合
                     case 'user':
                         /* 権限なし */
                         //現在のユーザーが権限者ではない場合
                         if ($approverId != $loginUserId) {
                             //強制的に非公開設定
                             $BlogPost->data['BlogPost']['status'] = 0;
                             /* 権限あり */
                             //承認権限を持っている場合
                         } elseif ($approverId == $loginUserId) {
                             /* データの整理を行う */
                             //現在の承認ステージ
                             $now = $pass_stage + 1;
                             //次の承認ステージ
                             $next_stage = $now + 1;
                             //ブログ投稿記事の情報を取得する。
                             $post['ApprovalPost'] = $BlogPost->data['BlogPost'];
                             $post['ApprovalPost']['post_id'] = $BlogPost->data['BlogPost']['id'];
                             $post['ApprovalPost']['id'] = $approvalData['ApprovalPost']['id'];
                             $post['ApprovalPost']['pass_stage'] = $now;
                             //もしもこれが最終権限でなければ、次のステージ権限者を保存しておく。
                             if ($settingData['ApprovalLevelSetting']['last_stage'] != $now) {
                                 $post['ApprovalPost']['next_approver_id'] = $settingData['ApprovalLevelSetting']['level' . $next_stage . '_approver_id'];
                             }
                             /* 承認の記録を保存する */
                             //承認情報DBへ保存する。
                             if ($approvalPost->save($post)) {
                                 //最終承認まで行っていない場合は、強制非公開にする。
                                 if ($post['ApprovalPost']['pass_stage'] < $last_stage) {
                                     $BlogPost->data['BlogPost']['status'] = 0;
                                     $this->_sendApprovalMail($settingData, $approvalData, $BlogPost->data, 1);
                                 }
                                 return true;
                             }
                         }
                         break;
                         //承認権限者がグループ単位で設定されている場合
                     //承認権限者がグループ単位で設定されている場合
                     case 'group':
                         /* 権限なし */
                         //承認権限がない場合、常に非公開
                         if ($approverId != $loginUserGroupId) {
                             $BlogPost->data['BlogPost']['status'] = 0;
                             /* 権限あり */
                             //承認権限を持っている場合
                         } else {
                             /* データの整理を行う */
                             //現在の承認ステージ
                             $now = $pass_stage + 1;
                             //次の承認ステージ
                             $next_stage = $now + 1;
                             //ブログ投稿記事の情報を取得する。
                             $post['ApprovalPost'] = $BlogPost->data['BlogPost'];
                             $post['ApprovalPost']['post_id'] = $BlogPost->data['BlogPost']['id'];
                             $post['ApprovalPost']['id'] = $approvalData['ApprovalPost']['id'];
                             $post['ApprovalPost']['pass_stage'] = $now;
                             //もしもこれが最終権限でなければ、次のステージ権限者を保存しておく。
                             if ($settingData['ApprovalLevelSetting']['last_stage'] != $now) {
                                 $post['ApprovalPost']['next_approver_id'] = $settingData['ApprovalLevelSetting']['level' . $next_stage . '_approver_id'];
                             }
                             /* 承認の記録を保存する */
                             //承認情報DBへ保存する。
                             if ($approvalPost->save($post)) {
                                 //pass_stageがlast_stageより大きくなければ(最終承認まで行っていない)、非公開は続行。
                                 if ($post['ApprovalPost']['pass_stage'] < $last_stage) {
                                     $BlogPost->data['BlogPost']['status'] = 0;
                                     $this->_sendApprovalMail($settingData, $approvalData, $BlogPost->data, 1);
                                 }
                                 return true;
                             }
                         }
                         break;
                     default:
                         break;
                 }
             }
             //------------------------------
             // 2:却下の時
             //------------------------------
         } elseif ($BlogPost->data['Approval']['approval_flag'] == 2) {
             /* 現在の状況を取得 */
             $approvalData = $approvalPost->find('first', array('conditions' => array('ApprovalPost.post_id' => $BlogPost->data['BlogPost']['id'])));
             /* 承認却下の処理実行 */
             //すでに承認を1段階以上受けている場合
             if ($approvalData['ApprovalPost']['pass_stage'] != 0) {
                 //次の権限者を1段階前に戻す
                 $prevStage = $approvalData['ApprovalPost']['pass_stage'] - 1;
                 //0まで戻った場合(申請段階まで戻った場合)
                 if ($prevStage == 0) {
                     $approvalData['ApprovalPost']['next_approver_id'] = 0;
                 } else {
                     $approvalData['ApprovalPost']['next_approver_id'] = $settingData['ApprovalLevelSetting']['level' . $prevStage . '_approver_id'];
                 }
                 //通過ステージを1段階戻す。もしも最終段階まで承認が終わっていれば2つ戻す
                 if ($approvalData['ApprovalPost']['pass_stage'] == $settingData['ApprovalLevelSetting']['last_stage']) {
                     $approvalData['ApprovalPost']['pass_stage'] = $approvalData['ApprovalPost']['pass_stage'] - 2;
                     if ($approvalData['ApprovalPost']['pass_stage'] < 0) {
                         $approvalData['ApprovalPost']['pass_stage'] = 0;
                     }
                 } else {
                     $approvalData['ApprovalPost']['pass_stage'] = $approvalData['ApprovalPost']['pass_stage'] - 1;
                 }
                 //第1段階で却下された場合、次の権限者は0にする。
             } else {
                 $approvalData['ApprovalPost']['next_approver_id'] = 0;
             }
             //var_dump($approvalData);exit;
             /* 却下の記録を保存する */
             //承認情報DBを更新する
             if ($approvalPost->save($approvalData)) {
                 //常に非公開状態(承認が下るまでは非公開にする)
                 $BlogPost->data['BlogPost']['status'] = 0;
                 $this->_sendApprovalMail($settingData, $approvalData, $BlogPost->data, 2);
                 return true;
             }
             //------------------------------
             // 申請(新規登録or最初まで却下されてきた場合)
             //------------------------------
         } elseif ($BlogPost->data['Approval']['approval_flag'] == 3) {
             //現在の承認情報データの取得
             //(一度却下されたあとの場合はデータが存在する。)
             if (!empty($BlogPost->data['BlogPost']['id'])) {
                 $approvalData = $approvalPost->find('first', array('conditions' => array('ApprovalPost.post_id' => $BlogPost->data['BlogPost']['id'])));
             }
             //すでに承認情報データがある(却下されて最初の段階まで戻った場合)
             if (!empty($approvalData)) {
                 //承認情報DBへデータを挿入する。
                 $post['ApprovalPost'] = $BlogPost->data['BlogPost'];
                 //IDだけは一旦捨てる。
                 $post['ApprovalPost']['id'] = $approvalData['ApprovalPost']['id'];
                 //申請段階のため通過ステージは0にする
                 $post['ApprovalPost']['pass_stage'] = 0;
                 //申請段階のため次のステージは必ず1
                 $post['ApprovalPost']['next_approver_id'] = $settingData['ApprovalLevelSetting']['level1_approver_id'];
                 //承認申請を行う段階で選択されたカテゴリを取得する。
                 if (!empty($BlogPost->data['BlogPost']['blog_category_id'])) {
                     $post['ApprovalPost']['next_approver_id'] = $BlogPost->data['BlogPost']['blog_category_id'];
                 }
                 /* 申請の記録を保存する */
                 if ($approvalPost->save($post)) {
                     //常に非公開状態(承認が下るまでは非公開にする)
                     $BlogPost->data['BlogPost']['status'] = 0;
                     $this->_sendApprovalMail($settingData, $approvalData, $BlogPost->data, 3);
                     return true;
                 }
                 //承認情報データがない場合
             } else {
                 //承認情報DBへデータを挿入する。
                 $post['ApprovalPost'] = $BlogPost->data['BlogPost'];
                 //idがある場合(一度保留を経て申請)。
                 if (!empty($BlogPost->data['BlogPost']['id'])) {
                     $post['ApprovalPost']['post_id'] = $BlogPost->data['BlogPost']['id'];
                     //idがない場合(新規作成)
                 } else {
                     //ブログの最終IDを取得する。getLastInsertID();が効かない・・・
                     App::import('Model', 'Blog.BlogPost');
                     $blogModel = new BlogPost();
                     $blogLastData = $blogModel->find('first', array('order' => array('BlogPost.id DESC')));
                     $post['ApprovalPost']['post_id'] = (int) $blogLastData['BlogPost']['id'] + 1;
                 }
                 $post['ApprovalPost']['id'] = '';
                 unset($post['ApprovalPost']['id']);
                 //申請段階のため通過ステージは0にする
                 $post['ApprovalPost']['pass_stage'] = 0;
                 //申請段階のため次のステージは必ず1
                 $post['ApprovalPost']['next_approver_id'] = $settingData['ApprovalLevelSetting']['level1_approver_id'];
                 /* 申請の記録を保存する */
                 if ($approvalPost->save($post)) {
                     //常に非公開状態(承認が下るまでは非公開にする)
                     $BlogPost->data['BlogPost']['status'] = 0;
                     $this->_sendApprovalMail($settingData, null, $BlogPost->data, 3);
                     return true;
                 }
             }
             //------------------------------
             // それ以外
             //------------------------------
         } else {
             return false;
         }
     }
 }