* @link http://www.netcommons.org NetCommons Project * @license http://www.netcommons.org/license.txt NetCommons License */ App::uses('AppHelper', 'View/Helper'); App::uses('Container', 'Containers.Model'); App::uses('Box', 'Boxes.Model'); App::uses('Current', 'NetCommons.Utility'); /** * LayoutHelper * */ class BoxesHelper extends AppHelper { /** * Other helpers used by FormHelper * * @var array */ public $helpers = array( 'Html', 'NetCommons.Button', 'NetCommons.NetCommonsForm', 'NetCommons.NetCommonsHtml', ); /** * Containers data * * @var array */ public $containers; /** * Default Constructor * * @param View $View The View this helper is being attached to. * @param array $settings Configuration settings for the helper. */ public function __construct(View $View, $settings = array()) { parent::__construct($View, $settings); $this->containers = Hash::get($settings, 'containers', array()); } /** * Get the box data for container * * @param string $containerType コンテナータイプ * Container::TYPE_HEADER or Container::TYPE_MAJOR or Container::TYPE_MAIN or * Container::TYPE_MINOR or Container::TYPE_FOOTER * @return array Box data */ public function getBox($containerType) { return Hash::get($this->containers, $containerType . '.Box', array()); } /** * プラグイン追加のHTMLを出力 * * @param array $box Boxデータ * @return string */ public function renderAddPlugin($box) { $containerType = $box['BoxesPageContainer']['container_type']; if ($this->hasAddPlugin($box)) { return $this->_View->element('Frames.add_plugin', array( 'boxId' => $box['Box']['id'], 'roomId' => $box['Box']['room_id'], 'containerType' => $containerType, )); } else { return ''; } } /** * プラグイン追加のHTMLを出力 * * @param array $box Boxデータ * @return string */ public function hasAddPlugin($box) { return Current::isSettingMode() && Current::permission('page_editable', $box['Box']['room_id']); } /** * ボックス内のFrameのHTMLを出力 * * @param int $containerType コンテナータイプ * @param array $boxes Boxデータ * @return string */ public function renderBoxes($containerType, $boxes) { $html = ''; if (! Current::isSettingMode()) { foreach ($boxes as $box) { $html .= $this->renderFrames($box); } } elseif ($containerType === Container::TYPE_HEADER || $containerType === Container::TYPE_FOOTER) { $html .= $this->_View->element( 'Boxes.render_boxes_header_footer', array('boxes' => $boxes, 'containerType' => $containerType) ); } elseif ($containerType === Container::TYPE_MAIN) { $html .= $this->_View->element( 'Boxes.render_boxes_main', array('boxes' => $boxes, 'containerType' => $containerType) ); } else { $html .= $this->_View->element( 'Boxes.render_boxes_major_minor', array('boxes' => $boxes, 'containerType' => $containerType) ); } return $html; } /** * ボックス内のFrameのHTMLを出力 * * @param array $box Boxデータ * @return string */ public function renderFrames($box) { $html = ''; if (! empty($box['Frame'])) { $containerType = $box['BoxesPageContainer']['container_type']; $html .= '
'; $html .= $this->_View->element('Frames.render_frames', array( 'box' => $box, 'containerType' => $containerType, )); $html .= '
'; } elseif ($this->hasBox($box)) { $html .= '
'; $html .= __d('boxes', 'Not found plugin.'); $html .= '
'; } return $html; } /** * ボックスエリアのタイトル表示 * * @param array $box Boxデータ * @return string */ public function boxTitle($box) { App::uses('Box', 'Boxes.Model'); $html = ''; $containerType = $box['BoxesPageContainer']['container_type']; if ($containerType === Container::TYPE_MAJOR) { $containerTitle = __d('boxes', '(left column)'); } elseif ($containerType === Container::TYPE_MINOR) { $containerTitle = __d('boxes', '(right column)'); } else { $containerTitle = ''; } if ($box['Box']['type'] === Box::TYPE_WITH_SITE) { $title = __d('boxes', 'Common area of the whole site%s', $containerTitle); } elseif ($box['Box']['type'] === Box::TYPE_WITH_SPACE) { $title = __d( 'boxes', 'Common area of the whole %s space%s', h($box['RoomsLanguage']['name']), $containerTitle ); } elseif ($box['Box']['type'] === Box::TYPE_WITH_ROOM) { $title = __d('boxes', 'Common area of the whole room%s', $containerTitle); } else { $title = __d('boxes', 'Area of this page only%s', $containerTitle); } if ($this->hasBoxSetting($box)) { $html .= $this->displayBoxSetting($box, $title); } else { $html .= $title; } return $html; } /** * 表示・非表示の変更HTMLを出力する * * @param array $box Boxデータ * @param string $title タイトル * @return string */ public function displayBoxSetting($box, $title) { $html = ''; $containerType = $box['BoxesPageContainer']['container_type']; if ($containerType === Container::TYPE_MAJOR || $containerType === Container::TYPE_MINOR) { $classOptions = array( 'pull-left box-display' ); } else { $classOptions = array( 'box-display' ); } $html .= $this->NetCommonsForm->create(null, array( 'id' => 'BoxForm' . $box['Box']['id'], 'url' => NetCommonsUrl::actionUrlAsArray(array( 'plugin' => 'boxes', 'controller' => 'boxes', 'action' => 'display', 'page_id' => Current::read('Page.id') //$box['Box']['id'], )), 'type' => 'put', 'class' => $classOptions, 'ng-controller' => 'BoxesController' )); $html .= $this->NetCommonsForm->hidden('BoxesPageContainer.id', array( 'value' => $box['BoxesPageContainer']['id'], )); $html .= $this->NetCommonsForm->hidden('BoxesPageContainer.box_id', array( 'value' => $box['BoxesPageContainer']['box_id'], )); $html .= $this->NetCommonsForm->hidden('BoxesPageContainer.page_container_id', array( 'value' => $box['BoxesPageContainer']['page_container_id'], )); $html .= $this->NetCommonsForm->hidden('BoxesPageContainer.page_id', array( 'value' => $box['BoxesPageContainer']['page_id'], )); $html .= $this->NetCommonsForm->hidden('BoxesPageContainer.container_type', array( 'value' => $box['BoxesPageContainer']['container_type'], )); $html .= $this->NetCommonsForm->hidden('Page.id', array( 'value' => Current::read('Page.id'), )); $html .= $this->NetCommonsForm->hidden('Page.room_id', array( 'value' => Current::read('Page.room_id'), )); $html .= $this->NetCommonsForm->hidden('Box.id', array( 'value' => $box['Box']['id'], )); $html .= $this->NetCommonsForm->hidden('Box.type', array( 'value' => $box['Box']['type'], )); if ($containerType === Container::TYPE_HEADER || $containerType === Container::TYPE_FOOTER) { $html .= $this->NetCommonsForm->radio( 'BoxesPageContainer.is_published', array('1' => $title), array( 'id' => 'BoxesPageContainerIsPublished' . $box['Box']['id'], 'value' => $box['BoxesPageContainer']['is_published'], 'ng-click' => 'select(' . $containerType . ', ' . $box['Box']['id'] . ')', 'ng-disabled' => 'sending', 'containerType' => $box['BoxesPageContainer']['container_type'] ) ); } else { if ($box['BoxesPageContainer']['is_published']) { $html .= $this->NetCommonsForm->hidden( 'BoxesPageContainer.is_published', array('value' => '0') ); $buttonIcon = 'glyphicon-eye-open'; $active = ' active'; $label = __d('boxes', 'Display'); } else { $html .= $this->NetCommonsForm->hidden( 'BoxesPageContainer.is_published', array('value' => '1') ); $buttonIcon = 'glyphicon-minus'; $active = ''; $label = __d('boxes', 'Non display'); } $html .= $this->Button->save( '', array( 'class' => 'btn btn-xs btn-default' . $active, ) ); } $html .= $this->NetCommonsForm->end(); if ($containerType === Container::TYPE_MAJOR || $containerType === Container::TYPE_MINOR) { $html .= $title; } return $html; } /** * 表示・非表示の変更の有無 * * @param array $box Boxデータ * @return bool */ public function hasBoxSetting($box) { if (isset($box['BoxesPageContainer']['container_type'])) { $containerType = $box['BoxesPageContainer']['container_type']; } else { $containerType = null; } if (! Current::isSettingMode()) { return false; } elseif ($containerType === Container::TYPE_MAJOR || $containerType === Container::TYPE_MINOR) { return Current::permission('page_editable', $box['Box']['room_id']); } else { return Current::permission('page_editable'); } } /** * ボックスの表示有無 * * @param array $box Boxデータ * @return bool */ public function hasBox($box) { if (! empty($box['Frame']) || $this->hasBoxSetting($box)) { return true; } else { return false; } } }