diff --git a/Test/Case/View/Helper/ButtonHelper/CancelAndSaveAndSaveTempTest.php b/Test/Case/View/Helper/ButtonHelper/CancelAndSaveAndSaveTempTest.php index 90417360..a37844bd 100644 --- a/Test/Case/View/Helper/ButtonHelper/CancelAndSaveAndSaveTempTest.php +++ b/Test/Case/View/Helper/ButtonHelper/CancelAndSaveAndSaveTempTest.php @@ -146,7 +146,7 @@ private function __assertButtons($result, $cancelUrl, $backUrl, $disapproval, $a //戻るのチェック if ($backUrl) { - $expected = '' . + $expected = '' . ' ' . __d('net_commons', 'BACK') . ''; $this->assertTextContains($expected, $result); diff --git a/View/Helper/ButtonHelper.php b/View/Helper/ButtonHelper.php index 3c4b8291..e6831bbd 100644 --- a/View/Helper/ButtonHelper.php +++ b/View/Helper/ButtonHelper.php @@ -270,13 +270,15 @@ public function cancelAndSaveAndSaveTemp($cancelUrl = null, $cancelOptions = [], $cancelOptions ); - //戻るボタン + //前へボタン if (isset($backUrl)) { $output .= $this->Html->link( ' ' . __d('net_commons', 'BACK'), $backUrl, array( - 'class' => 'btn btn-default' . $this->getButtonSize() . ' btn-workflow', 'escape' => false + 'class' => 'btn btn-default' . $this->getButtonSize() . ' btn-workflow', + 'escape' => false, + 'ng-class' => '{disabled: sending}' ) ); } diff --git a/View/Helper/WizardHelper.php b/View/Helper/WizardHelper.php index f91eab43..401cb12b 100644 --- a/View/Helper/WizardHelper.php +++ b/View/Helper/WizardHelper.php @@ -14,6 +14,57 @@ /** * ウィザードHelper * + * #### コントローラの定義(helpersのサンプル) + * https://github.com/NetCommons3/Rooms/blob/master/Controller/RoomsAppController.php#L73-L98 + * ``` + * public $helpers = array( + * 'NetCommons.Wizard' => array( + * 'navibar' => array( + * self::WIZARD_ROOMS => array( + * 'url' => array( + * 'controller' => 'rooms', + * 'action' => 'add', + * ), + * 'label' => array('rooms', 'General setting'), + * ), + * self::WIZARD_ROOMS_ROLES_USERS => array( + * 'url' => array( + * 'controller' => 'rooms_roles_users', + * 'action' => 'edit', + * ), + * 'label' => array('rooms', 'Edit the members to join'), + * ), + * self::WIZARD_PLUGINS_ROOMS => array( + * 'url' => array( + * 'controller' => 'plugins_rooms', + * 'action' => 'edit', + * ), + * 'label' => array('rooms', 'Select the plugins to join'), + * ), + * ), + * 'cancelUrl' => null + * ), + * ); + * ``` + * + * #### viewファイルのWizardバーサンプル + * https://github.com/NetCommons3/Rooms/blob/master/View/PluginsRooms/edit.ctp#L17 + * ``` + * echo $this->Wizard->navibar(RoomsAppController::WIZARD_PLUGINS_ROOMS); + * ``` + * + * ##### viewファイルのボタンサンプル + * (ワークフローなし)
+ * https://github.com/NetCommons3/Rooms/blob/master/View/PluginsRooms/edit.ctp#L17 + * ``` + * echo $this->Wizard->buttons(RoomsAppController::WIZARD_PLUGINS_ROOMS); + * ``` + * (ワークフローあり) + * ``` + * echo $this->Wizard->workflowButtons('Questionnaire.status'); + * ``` + * + * * @package NetCommons\NetCommons\View\Helper */ class WizardHelper extends AppHelper { @@ -26,6 +77,7 @@ class WizardHelper extends AppHelper { public $helpers = array( 'NetCommons.Button', 'NetCommons.NetCommonsHtml', + 'Workflow.Workflow', ); /** @@ -124,24 +176,88 @@ public function naviUrl($activeKey) { * ウィザードボタン * * @param string $activeKey アクティブのキー - * @param array $cancelOptions キャンセルボタンのオプション - * @param array $prevOptions 戻るボタンのオプション - * @param array $nextOptions 次へ、決定ボタンのオプション + * @param array $cancelOpt キャンセルボタンのオプション + * @param array $prevOpt 前へボタンのオプション + * @param array $nextOpt 次へ、決定ボタンのオプション * @return string HTML */ - public function buttons($activeKey, $cancelOptions = [], $prevOptions = [], $nextOptions = []) { + public function buttons($activeKey, $cancelOpt = [], $prevOpt = [], $nextOpt = []) { $output = ''; + //ウィザードの状態取得 + list($prev, $next) = $this->__wizardStep($activeKey); + //キャンセルボタン $cancelUrl = $this->NetCommonsHtml->url( - Hash::get($cancelOptions, 'url', $this->settings['cancelUrl']) + Hash::get($cancelOpt, 'url', $this->settings['cancelUrl']) ); - $cancelTitle = Hash::get($cancelOptions, 'title', __d('net_commons', 'Cancel')); - $output .= $this->Button->cancel($cancelTitle, $cancelUrl, $cancelOptions); + $cancelTitle = Hash::get($cancelOpt, 'title', __d('net_commons', 'Cancel')); + $output .= $this->Button->cancel($cancelTitle, $cancelUrl, $cancelOpt); + + //前へボタン + if ($prev) { + $prevUrl = $this->NetCommonsHtml->url(Hash::get($prevOpt, 'url', $prev['url'])); + $prevlTitle = Hash::get($prevOpt, 'title', __d('net_commons', 'BACK')); + $prevOpt['icon'] = Hash::get($prevOpt, 'icon', 'chevron-left'); + $output .= $this->Button->cancel($prevlTitle, $prevUrl, $prevOpt); + } + + //次へ・決定ボタン + if ($next) { + $nextTitle = Hash::get($nextOpt, 'title', __d('net_commons', 'NEXT')); + $nextOpt['icon'] = Hash::get($nextOpt, 'icon', 'chevron-right'); + } else { + $nextTitle = Hash::get($nextOpt, 'title', __d('net_commons', 'OK')); + } + $output .= $this->Button->save($nextTitle, $nextOpt); + + return $output; + } + +/** + * ウィザードボタン + * + * @param string $statusName ステータスのフィールド名("Modelname.fieldname") + * @param array $cancelUrl キャンセルURL + * @param array $prevUrl 前へURL + * @param array $panel panel-footerを表示するかどうか + * @return string HTML + * @SuppressWarnings(PHPMD.BooleanArgumentFlag) + */ + public function workflowButtons($statusName, $cancelUrl = null, $prevUrl = null, $panel = false) { + $output = ''; + + $keys = array_keys($this->settings['navibar']); + $activeKey = array_pop($keys); //ウィザードの状態取得 - $prev = null; + list($prev, ) = $this->__wizardStep($activeKey); + + //キャンセルURL + if (! $cancelUrl) { + $cancelUrl = $this->settings['cancelUrl']; + } + + //前へURL + if (! $prevUrl && $prev) { + $prevUrl = $this->NetCommonsHtml->url($prev['url']); + } + + $output .= $this->Workflow->buttons($statusName, $cancelUrl, $panel, $prevUrl); + + return $output; + } + +/** + * ウィザードの状態取得 + * + * @param string $activeKey アクティブのキー + * @return array $activeKeyがnullの場合、$nextは最後の + */ + private function __wizardStep($activeKey) { + //ウィザードの状態取得 $current = null; + $prev = null; $next = null; $step = null; foreach ($this->settings['navibar'] as $key => $navibar) { @@ -160,22 +276,7 @@ public function buttons($activeKey, $cancelOptions = [], $prevOptions = [], $nex $step = $navibar; } - if ($prev) { - $prevUrl = $this->NetCommonsHtml->url(Hash::get($prevOptions, 'url', $prev['url'])); - $prevlTitle = Hash::get($prevOptions, 'title', __d('net_commons', 'BACK')); - $prevOptions['icon'] = Hash::get($prevOptions, 'icon', 'chevron-left'); - $output .= $this->Button->cancel($prevlTitle, $prevUrl, $prevOptions); - } - - if ($next) { - $nextTitle = Hash::get($nextOptions, 'title', __d('net_commons', 'NEXT')); - $nextOptions['icon'] = Hash::get($nextOptions, 'icon', 'chevron-right'); - } else { - $nextTitle = Hash::get($nextOptions, 'title', __d('net_commons', 'OK')); - } - $output .= $this->Button->save($nextTitle, $nextOptions); - - return $output; + return array($prev, $next); } }