PageRenderTime 255ms CodeModel.GetById 61ms app.highlight 122ms RepoModel.GetById 59ms app.codeStats 0ms

/baser/views/helpers/bc_baser.php

https://github.com/hashing/basercms
PHP | 1597 lines | 758 code | 191 blank | 648 comment | 185 complexity | 3405f8f4c1f20cb38189685a780f9d42 MD5 | raw file
   1<?php
   2/* SVN FILE: $Id$ */
   3/**
   4 * Baserヘルパー
   5 *
   6 * PHP versions 5
   7 *
   8 * baserCMS :  Based Website Development Project <http://basercms.net>
   9 * Copyright 2008 - 2012, baserCMS Users Community <http://sites.google.com/site/baserusers/>
  10 *
  11 * @copyright		Copyright 2008 - 2012, baserCMS Users Community
  12 * @link			http://basercms.net baserCMS Project
  13 * @package			cake
  14 * @subpackage		baser.app.view.helpers
  15 * @since			baserCMS v 0.1.0
  16 * @version			$Revision$
  17 * @modifiedby		$LastChangedBy$
  18 * @lastmodified	$Date$
  19 * @license			http://basercms.net/license/index.html
  20 */
  21/**
  22 * Include files
  23 */
  24/**
  25 * Baserヘルパー
  26 *
  27 * @package cake
  28 * @subpackage baser.app.views.helpers
  29 */
  30class BcBaserHelper extends AppHelper {
  31/**
  32 * View
  33 * 
  34 * @var View
  35 * @access protected
  36 */
  37	var $_view = null;
  38/**
  39 * サイト基本設定
  40 * 
  41 * @var array
  42 * @access public
  43 */
  44	var $siteConfig = array();
  45/**
  46 * ヘルパー
  47 * 
  48 * @var array
  49 * @access public
  50 */
  51	var $helpers = array(BC_HTML_HELPER, 'Javascript', 'Session', BC_XML_HELPER, BC_ARRAY_HELPER);
  52/**
  53 * コンテンツ
  54 * 
  55 * @var string
  56 * @access protected
  57 */
  58	var $_content = null;
  59/**
  60 * カテゴリタイトル設定
  61 * 
  62 * @var mixed
  63 * @access protected
  64 */
  65	var $_categoryTitleOn = true;
  66/**
  67 * カテゴリタイトル
  68 * 
  69 * @var mixed boolean Or string
  70 * @access protected
  71 */
  72	var $_categoryTitle = true;
  73/**
  74 * ページモデル
  75 * 
  76 * @var Page
  77 * @access public
  78 */
  79	var $Page = null;
  80/**
  81 * アクセス制限設定モデル
  82 * 
  83 * @var Permission
  84 * @access public
  85 */
  86	var $Permission = null;
  87/**
  88 * Plugin Basers
  89 * 
  90 * @var array
  91 * @access public
  92 */
  93	var $pluginBasers = array();
  94/**
  95 * コンストラクタ
  96 *
  97 * @return void
  98 * @access public
  99 */
 100	function __construct() {
 101
 102		$this->_view =& ClassRegistry::getObject('view');
 103
 104		if(BC_INSTALLED && !Configure::read('BcRequest.isUpdater') && !Configure::read('BcRequest.isMaintenance')){
 105
 106			if (ClassRegistry::isKeySet('Permission')) {
 107				$this->Permission = ClassRegistry::getObject('Permission');
 108			}else {
 109				$this->Permission = ClassRegistry::init('Permission');
 110			}
 111
 112			if (ClassRegistry::isKeySet('Page')) {
 113				$this->Page = ClassRegistry::getObject('Page');
 114			}else {
 115				$this->Page = ClassRegistry::init('Page');
 116			}
 117
 118			if (ClassRegistry::isKeySet('PageCategory')) {
 119				$this->PageCategory = ClassRegistry::getObject('PageCategory');
 120			}else {
 121				$this->PageCategory = ClassRegistry::init('PageCategory');
 122			}
 123		}
 124		
 125		if(BC_INSTALLED) {
 126			if(isset($this->_view->viewVars['siteConfig'])) {
 127				$this->siteConfig = $this->_view->viewVars['siteConfig'];
 128			}
 129		}
 130		
 131		if(BC_INSTALLED && !Configure::read('BcRequest.isUpdater') && !Configure::read('BcRequest.isMaintenance')){
 132			// プラグインのBaserヘルパを初期化
 133			$this->_initPluginBasers();
 134
 135		}
 136		
 137
 138	}
 139/**
 140 * afterRender
 141 * 
 142 * @return void
 143 * @access public
 144 */
 145	function afterRender() {
 146		
 147		parent::afterRender();
 148		// コンテンツをフックする
 149		$this->_content = ob_get_contents();
 150		
 151	}
 152/**
 153 * メニューを取得する
 154 * 
 155 * @param string $menuType
 156 * @return array $globalMenus
 157 * @access public
 158 */
 159	function getMenus () {
 160
 161		if (ClassRegistry::init('GlobalMenu')) {
 162			if(!file_exists(CONFIGS.'database.php')) {
 163				return '';
 164			}
 165			$dbConfig = new DATABASE_CONFIG();
 166			if(!$dbConfig->baser) {
 167				return '';
 168			}
 169			$GlobalMenu = ClassRegistry::getObject('GlobalMenu');
 170			// エラーの際も呼び出される事があるので、テーブルが実際に存在するかチェックする
 171			$db =& ConnectionManager::getDataSource('baser');
 172			if ($db->isInterfaceSupported('listSources')) {
 173				$sources = $db->listSources();
 174				if (!is_array($sources) || in_array(strtolower($db->config['prefix'] . 'global_menus'), array_map('strtolower', $sources))) {
 175					if (empty($this->params['prefix'])) {
 176						$prefix = 'publish';
 177					} else {
 178						$prefix = $this->params['prefix'];
 179					}
 180					return $GlobalMenu->find('all', array('order' => 'sort'));
 181				}
 182			}
 183		}
 184		return '';
 185		
 186	}
 187/**
 188 * タイトルをセットする
 189 * 
 190 * @param string $title
 191 * @access public
 192 */
 193	function setTitle($title,$categoryTitleOn = null) {
 194		
 195		if(!is_null($categoryTitleOn)) {
 196			$this->_categoryTitleOn = $categoryTitleOn;
 197		}
 198		$this->_view->set('title',$title);
 199		
 200	}
 201/**
 202 * キーワードをセットする
 203 * 
 204 * @param string $title
 205 * @access public
 206 */
 207	function setKeywords($keywords) {
 208		
 209		$this->_view->set('keywords',$keywords);
 210		
 211	}
 212/**
 213 * 説明文をセットする
 214 * 
 215 * @param string $title
 216 * @access public
 217 */
 218	function setDescription($description) {
 219		
 220		$this->_view->set('description',$description);
 221		
 222	}
 223/**
 224 * レイアウト用の変数をセットする
 225 * $view->set のラッパー
 226 * 
 227 * @param string $title
 228 * @param mixed $value
 229 * @return void
 230 * @access public
 231 */
 232	function set($key,$value) {
 233		
 234		$this->_view->set($key,$value);
 235		
 236	}
 237/**
 238 * タイトルへのカテゴリタイトル表示を設定
 239 * コンテンツごとの個別設定
 240 * 
 241 * @param mixed $on boolean / 文字列(カテゴリ名として出力した文字を指定する)
 242 * @return void
 243 * @access public
 244 */
 245	function setCategoryTitle($on = true) {
 246		
 247		$this->_categoryTitle = $on;
 248		
 249	}
 250/**
 251 * キーワードを取得する
 252 * 
 253 * @return string $keyword
 254 * @return string
 255 * @access public
 256 */
 257	function getKeywords() {
 258		
 259		$keywords = '';
 260		if(!empty($this->_view->viewVars['keywords'])) {
 261			$keywords = $this->_view->viewVars['keywords'];
 262		}elseif(!empty($this->siteConfig['keyword'])) {
 263			$keywords = $this->siteConfig['keyword'];
 264		}
 265		return $keywords;
 266		
 267	}
 268/**
 269 * 説明文を取得する
 270 * 
 271 * @return string $description
 272 * @return string
 273 * @access public
 274 */
 275	function getDescription() {
 276		
 277		$description = '';
 278		if(!empty($this->_view->viewVars['description'])) {
 279			$description = $this->_view->viewVars['description'];
 280		}elseif(!empty($this->siteConfig['description'])) {
 281			$description = $this->siteConfig['description'];
 282		}
 283		return $description;
 284		
 285	}
 286/**
 287 * タイトルを取得する
 288 * ページタイトルと直属のカテゴリ名が同じ場合は、ページ名を省略する
 289 * 
 290 * @param string $separator
 291 * @param string $categoryTitleOn
 292 * @return string $description
 293 * @access public
 294 */
 295	function getTitle($separator='|',$categoryTitleOn = null) {
 296
 297		$title = '';
 298		$crumbs = $this->getCrumbs($categoryTitleOn);
 299		if($crumbs){
 300			$crumbs = array_reverse($crumbs);
 301			foreach ($crumbs as $key => $crumb) {
 302				if($this->BcArray->first($crumbs, $key) && isset($crumbs[$key+1])) {
 303					if($crumbs[$key+1]['name'] == $crumb['name']) {
 304						continue;
 305					}
 306				}
 307				if($title){
 308					$title .= $separator;
 309				}
 310				$title .= $crumb['name'];
 311			}
 312		}
 313
 314		// サイトタイトルを追加
 315		if ($title && !empty($this->siteConfig['name'])) {
 316			$title .= $separator;
 317		}
 318		if (!empty($this->siteConfig['name'])) {
 319			$title .= $this->siteConfig['name'];
 320		}
 321
 322		return $title;
 323
 324	}
 325/**
 326 * パンくず用の配列を取得する
 327 * 基本的には、コントローラーの crumbs プロパティで設定した値を取得する仕様だが
 328 * 事前に setCategoryTitle メソッドで出力内容をカスタマイズする事ができる
 329 * 
 330 * @param mixid $categoryTitleOn
 331 * @return array
 332 * @access public
 333 * @todo 処理内容がわかりにくいので変数名のリファクタリング要
 334 */
 335	function getCrumbs($categoryTitleOn = null){
 336
 337		// ページカテゴリを追加
 338		if(!is_null($categoryTitleOn)) {
 339			$this->_categoryTitleOn = $categoryTitleOn;
 340		}
 341
 342		$crumbs = array();
 343		if($this->_categoryTitleOn && $this->_categoryTitle) {
 344			if($this->_categoryTitle === true) {
 345				if($this->_view->viewVars['crumbs']){
 346					$crumbs = $this->_view->viewVars['crumbs'];
 347				}
 348			}else {
 349				if(is_array($this->_categoryTitle)){
 350					$crumbs = $this->_categoryTitle;
 351				}else{
 352					$crumbs = array($this->_categoryTitle=>'');
 353				}
 354			}
 355		}
 356		
 357		$contentsTitle = $this->getContentsTitle();
 358		if($contentsTitle) {
 359			$crumbs[] = array('name' => $contentsTitle, 'url' => '');
 360		}
 361		
 362		return $crumbs;
 363
 364	}
 365/**
 366 * コンテンツタイトルを取得する
 367 * @return string $description
 368 * @access public
 369 */
 370	function getContentsTitle() {
 371
 372		$contentsTitle = '';
 373		// トップページの場合は、タイトルをサイト名だけにする
 374		if (!empty($this->_view->viewVars['contentsTitle'])) {
 375			$contentsTitle = $this->_view->viewVars['contentsTitle'];
 376		}elseif($this->_view->pageTitle) {
 377			$contentsTitle = $this->_view->pageTitle;
 378		}
 379		if ($this->_view->name != 'CakeError' && !empty($contentsTitle)) {
 380			return $contentsTitle;
 381		}
 382
 383	}
 384/**
 385 * コンテンツタイトルを出力する
 386 * 
 387 * @return void
 388 * @access public
 389 */
 390	function contentsTitle() {
 391		
 392		echo $this->getContentsTitle();
 393		
 394	}
 395/**
 396 * タイトルを出力する
 397 * 
 398 * @param string $separator
 399 * @param string $categoryTitleOn
 400 * @return void
 401 * @access public
 402 */
 403	function title($separator='|',$categoryTitleOn = null) {
 404		
 405		echo '<title>'.strip_tags($this->getTitle($separator,$categoryTitleOn)).'</title>';
 406		
 407	}
 408/**
 409 * メタキーワードタグを出力する
 410 * 
 411 * @return void
 412 * @access public
 413 */
 414	function metaKeywords() {
 415		
 416		echo $this->BcHtml->meta('keywords',$this->getkeywords());
 417		
 418	}
 419/**
 420 * メタディスクリプションを出力する
 421 * 
 422 * @return void
 423 * @access public
 424 */
 425	function metaDescription() {
 426		
 427		echo $this->BcHtml->meta('description', strip_tags($this->getDescription()));
 428		
 429	}
 430/**
 431 * RSSリンクタグを出力する
 432 * 
 433 * @param string $title
 434 * @param string $link
 435 * @return void
 436 * @access public
 437 */
 438	function rss($title, $link) {
 439		
 440		echo $this->BcHtml->meta($title, $link, array('type' => 'rss'));
 441		
 442	}
 443/**
 444 * トップページかどうか判断する
 445 * 
 446 * @return boolean
 447 * @access public
 448 * @deprecated isHomeに統合する
 449 */
 450	function isTop() {
 451		
 452		return $this->isHome();
 453		
 454	}
 455/**
 456 * トップページかどうか判断する
 457 * 
 458 * @return boolean
 459 * @access public
 460 */
 461	function isHome() {
 462		
 463		return ($this->params['url']['url'] == '/' ||
 464						$this->params['url']['url'] == 'index' ||
 465						$this->params['url']['url'] == Configure::read('BcRequest.agentAlias').'/' ||
 466						$this->params['url']['url'] == Configure::read('BcRequest.agentAlias').'/index');
 467		
 468	}
 469/**
 470 * webrootを出力する為だけのラッパー
 471 * 
 472 * @return void
 473 * @access public
 474 */
 475	function root() {
 476		
 477		echo $this->getRoot();
 478		
 479	}
 480/**
 481 * webrootを取得する為だけのラッパー
 482 * 
 483 * @return string
 484 * @access public
 485 */
 486	function getRoot() {
 487		
 488		return $this->base.'/';
 489		
 490	}
 491/**
 492 * ベースを考慮したURLを出力
 493 * 
 494 * @param string $url
 495 * @param boolean $full
 496 * @return void
 497 * @access public
 498 */
 499	function url($url,$full = false) {
 500		
 501		echo $this->getUrl($url,$full);
 502		
 503	}
 504/**
 505 * ベースを考慮したURLを取得
 506 * 
 507 * @param string $url
 508 * @param boolean $full
 509 */
 510	function getUrl($url,$full = false) {
 511		
 512		return parent::url($url,$full);
 513		
 514	}
 515/**
 516 * エレメントを取得する
 517 * View::elementを取得するだけのラッパー
 518 * 
 519 * @param string $name
 520 * @param array $params
 521 * @param boolean $loadHelpers
 522 * @param boolean $subDir
 523 * @return string
 524 * @access public
 525 */
 526	function getElement($name, $params = array(), $loadHelpers = false, $subDir = true) {
 527
 528		if(!empty($this->_view->subDir) && $subDir) {
 529			$name = $this->_view->subDir.DS.$name;
 530			$params['subDir'] = true;
 531		} else {
 532			$params['subDir'] = false;
 533		}
 534		return $this->_view->element($name, $params, $loadHelpers);
 535
 536	}
 537/**
 538 * エレメントを出力する
 539 * View::elementを出力するだけのラッパー
 540 * 
 541 * @param string $name
 542 * @param array $params
 543 * @param boolean $loadHelpers
 544 * @return void
 545 * @access public
 546 */
 547	function element($name, $params = array(), $loadHelpers = false, $subDir = true) {
 548		
 549		echo $this->getElement($name, $params, $loadHelpers, $subDir);
 550		
 551	}
 552/**
 553 * ヘッダーを出力する
 554 * 
 555 * @param array $params
 556 * @param mixed $loadHelpers
 557 * @param boolean $subDir
 558 */
 559	function header($params = array(), $loadHelpers = false, $subDir = true) {
 560		
 561		$out = $this->getElement('header', $params, $loadHelpers, $subDir);
 562		echo $this->executeHook('baserHeader', $out);
 563		
 564	}
 565/**
 566 * フッターを出力する
 567 *
 568 * @param array $params
 569 * @param mixed $loadHelpers
 570 * @param boolean $subDir
 571 * @return void
 572 * @access public
 573 */
 574	function footer($params = array(), $loadHelpers = false, $subDir = true) {
 575		
 576		$out = $this->getElement('footer', $params, $loadHelpers, $subDir);
 577		echo $this->executeHook('baserFooter', $out);
 578		
 579	}
 580/**
 581 * ページネーションを出力する
 582 * [非推奨] 
 583 * @param string $name
 584 * @param array $params
 585 * @param boolean $loadHelpers
 586 * @return void
 587 * @access public
 588 * @deprecated
 589 */
 590	function pagination($name = 'default', $params = array(), $loadHelpers = false, $subDir = true) {
 591		
 592		if(!$name) {
 593			$name = 'default';
 594		}
 595		$file = 'paginations'.DS.$name;
 596		echo $this->getElement($file,$params,$loadHelpers, $subDir);
 597		
 598	}
 599/**
 600 * コンテンツを出力する
 601 * $content_for_layout を出力するだけのラッパー
 602 * 
 603 * @return void
 604 * @access public
 605 */
 606	function content() {
 607		
 608		echo $this->_content;
 609		
 610	}
 611/**
 612 * セッションメッセージをフラッシュするだけのラッパー
 613 * 
 614 * @param array $key
 615 * @return void
 616 * @access public
 617 */
 618	function flash($key='flash') {
 619		
 620		if ($this->Session->check('Message.'.$key)) {
 621			$this->Session->flash($key);
 622		}
 623		
 624	}
 625/**
 626 * スクリプトを出力する
 627 * $scripts_for_layout を出力する
 628 * 
 629 * @return void
 630 * @access public
 631 */
 632	function scripts() {
 633		
 634		if(empty($this->params['admin']) && !empty($this->_view->viewVars['user']) && !Configure::read('BcRequest.agent')) {
 635			$publishTheme = $this->BcHtml->themeWeb;
 636			$this->BcHtml->themeWeb = 'themed/'.$this->siteConfig['admin_theme'].'/';
 637			$this->css('admin/toolbar', array('inline' => false));
 638			$this->BcHtml->themeWeb = $publishTheme;
 639		}
 640		echo join("\n\t", $this->_view->__scripts);
 641		
 642	}
 643/**
 644 * ツールバーやCakeのデバッグ出力を表示
 645 * 
 646 * @return void
 647 * @access public
 648 */
 649	function func() {
 650		if(empty($this->params['admin']) && !empty($this->_view->viewVars['user']) && !Configure::read('BcRequest.agent')) {
 651			$publishTheme = $this->_view->theme;
 652			$this->_view->theme = $this->siteConfig['admin_theme'];
 653			$this->element('admin/toolbar');
 654			$this->_view->theme = $publishTheme;
 655		}
 656		if (isset($this->_view->viewVars['cakeDebug']) && Configure::read() > 2) {
 657			$params = array('controller' => $this->_view->viewVars['cakeDebug']);
 658			echo View::element('dump', $params, false);
 659		}
 660		
 661	}
 662/**
 663 * サブメニューをセットする
 664 * 
 665 * @param array $submenus
 666 * @return void
 667 * @access public
 668 */
 669	function setSubMenus($submenus) {
 670		
 671		$this->_view->set('subMenuElements',$submenus);
 672		
 673	}
 674/**
 675 * XMLヘッダを出力する
 676 * 
 677 * @param array $attrib
 678 * @return void
 679 * @access public 
 680 */
 681	function xmlHeader($attrib = array()) {
 682		
 683		if(empty($attrib['encoding']) && Configure::read('BcRequest.agent') == 'mobile'){
 684			$attrib['encoding'] = 'Shift-JIS';
 685		}
 686		echo $this->BcXml->header($attrib)."\n";
 687		
 688	}
 689/**
 690 * アイコンタグを出力するだけのラッパー
 691 * 
 692 * @return void
 693 * @access public
 694 */
 695	function icon() {
 696		
 697		echo  $this->BcHtml->meta('icon');
 698		
 699	}
 700/**
 701 * DOC TYPE を出力するだけのラッパー
 702 * 
 703 * @param type $type
 704 * @return void
 705 * @access public
 706 */
 707	function docType($type = 'xhtml-trans') {
 708		
 709		echo $this->BcHtml->docType($type)."\n";
 710		
 711	}
 712/**
 713 * 
 714 * CSSタグを出力するだけのラッパー
 715 * 
 716 * @param string $path
 717 * @param string $rel
 718 * @param array $htmlAttributes
 719 * @param boolean $inline
 720 * @return void
 721 * @access public 
 722 */
 723	function css($path, $htmlAttributes = array(), $inline = true) {
 724		
 725		// Cake1.2系との互換対応
 726		if (isset($htmlAttributes['inline']) && $inline == true) {
 727			$inline = $htmlAttributes['inline'];
 728		}
 729		$rel = null;
 730		if(!empty($htmlAttributes['rel'])) {
 731			$rel = $htmlAttributes['rel'];
 732		}
 733		$ret = $this->BcHtml->css($path, $rel, $htmlAttributes, $inline);
 734		if($inline) {
 735			echo $ret;
 736		}
 737		
 738	}
 739/**
 740 * Javascriptのlinkタグを出力するだけのラッパー
 741 * 
 742 * @param boolean $url
 743 * @param boolean $inline 
 744 * @return void
 745 * @access public
 746 */
 747	function js($url, $inline = true) {
 748		
 749		$ret = $this->Javascript->link($url, $inline);
 750		if($inline) {
 751			echo $ret;
 752		}
 753		
 754	}
 755/**
 756 * imageタグを出力するだけのラッパー
 757 * 
 758 * @param array $path
 759 * @param array $options 
 760 * @return void
 761 * @access pub
 762 */
 763	function img($path, $options = array()) {
 764		
 765		echo $this->getImg($path, $options);
 766		
 767	}
 768/**
 769 * imageタグを取得するだけのラッパー
 770 * 
 771 * @param array $path
 772 * @param array $options
 773 * @return array
 774 * @access public
 775 */
 776	function getImg($path, $options = array()) {
 777		
 778		return $this->BcHtml->image($path, $options);
 779		
 780	}
 781/**
 782 * aタグを表示するだけのラッパー関数
 783 * 
 784 * @param string $title
 785 * @param string $url
 786 * @param array $htmlAttributes
 787 * @param boolean $confirmMessage
 788 * @param boolean $escapeTitle 
 789 * @return void
 790 * @access public
 791 */
 792	function link($title, $url = null, $htmlAttributes = array(), $confirmMessage = false, $escapeTitle = false) {
 793		
 794		echo $this->getLink($title, $url, $htmlAttributes, $confirmMessage, $escapeTitle);
 795		
 796	}
 797/**
 798 *
 799 */
 800/**
 801 * aタグを取得するだけのラッパー
 802 * 
 803 * @param string $title
 804 * @param string $url
 805 * @param array $htmlAttributes
 806 * @param boolean $confirmMessage
 807 * @param boolean $escapeTitle
 808 * @return string
 809 * @access public
 810 */
 811	function getLink($title, $url = null, $htmlAttributes = array(), $confirmMessage = false, $escapeTitle = false) {
 812		
 813		$htmlAttributes = $this->executeHook('beforeBaserGetLink', $title, $url, $htmlAttributes, $confirmMessage, $escapeTitle);
 814
 815		if(!empty($htmlAttributes['prefix'])) {
 816			if(!empty($this->params['prefix'])) {
 817				$url[$this->params['prefix']] = true;
 818			}
 819			unset($htmlAttributes['prefix']);
 820		}
 821		if(isset($htmlAttributes['forceTitle'])) {
 822			$forceTitle = $htmlAttributes['forceTitle'];
 823			unset($htmlAttributes['forceTitle']);
 824		}else {
 825			$forceTitle = false;
 826		}
 827
 828		if(isset($htmlAttributes['ssl'])) {
 829			$ssl = true;
 830			unset($htmlAttributes['ssl']);
 831		}else {
 832			$ssl = false;
 833		}
 834		
 835		// 管理システムメニュー対策
 836		// プレフィックスが変更された場合も正常動作させる為
 837		// TODO メニューが廃止になったら削除
 838		if(!is_array($url)) {
 839			$url = preg_replace('/^\/admin\//', '/'.Configure::read('Routing.admin').'/', $url);
 840		}
 841		
 842		$url = $this->getUrl($url);
 843		$_url = preg_replace('/^'.preg_quote($this->base, '/').'\//', '/', $url);
 844		$enabled = true;
 845
 846		// 認証チェック
 847		if(isset($this->Permission) && !empty($this->_view->viewVars['user']['user_group_id'])) {
 848			$userGroupId = $this->_view->viewVars['user']['user_group_id'];
 849			if(!$this->Permission->check($_url,$userGroupId)) {
 850				$enabled = false;
 851			}
 852		}
 853
 854		// ページ公開チェック
 855		if(isset($this->Page) && empty($this->params['admin'])) {
 856			$adminPrefix = Configure::read('Routing.admin');
 857			if(isset($this->Page) && !preg_match('/^\/'.$adminPrefix.'/', $_url)) {
 858				if($this->Page->isPageUrl($_url) && !$this->Page->checkPublish($_url)) {
 859					$enabled = false;
 860				}
 861			}
 862		}
 863
 864		if(!$enabled) {
 865			if($forceTitle) {
 866				return "<span>$title</span>";
 867			}else {
 868				return '';
 869			}
 870		}
 871
 872		// 現在SSLのURLの場合、フルパスで取得
 873		if($this->isSSL() || $ssl) {
 874			$_url = preg_replace("/^\//", "", $_url);
 875			if(preg_match('/^admin\//', $_url)) {
 876				$admin = true;
 877			} else {
 878				$admin = false;
 879			}
 880			if(Configure::read('App.baseUrl')) {
 881				$_url = 'index.php/'.$_url;
 882			}
 883			if(!$ssl && !$admin) {
 884				$url = Configure::read('BcEnv.siteUrl').$_url;
 885			} else {
 886				$url = Configure::read('BcEnv.sslUrl').$_url;
 887			}
 888		} else {
 889			$url = $_url;
 890		}
 891
 892		// Cake1.2系との互換対応
 893		if (isset($htmlAttributes['escape']) && $escapeTitle == true) {
 894			$escapeTitle = $htmlAttributes['escape'];
 895		}
 896		if(!$htmlAttributes) {
 897			$htmlAttributes = array();
 898		}
 899		$htmlAttributes = array_merge($htmlAttributes, array('escape' => $escapeTitle));
 900		
 901		$out = $this->BcHtml->link($title, $url, $htmlAttributes, $confirmMessage);
 902
 903		return $this->executeHook('afterBaserGetLink', $url, $out);
 904		
 905	}
 906/**
 907 * 現在がSSL通信か確認する
 908 *
 909 * @return boolean
 910 * @access public
 911 */
 912	function isSSL() {
 913		
 914		if(!empty($this->_view->viewVars['isSSL'])){
 915			return true;
 916		} else {
 917			return false;
 918		}
 919		
 920	}
 921/**
 922 * charsetを出力するだけのラッパー
 923 * 
 924 * @param string $charset
 925 * @return void
 926 * @access public
 927 */
 928	function charset($charset = null) {
 929		
 930		if(!$charset && Configure::read('BcRequest.agent') == 'mobile'){
 931			$charset = 'Shift-JIS';
 932		}
 933		echo $this->BcHtml->charset($charset);
 934		
 935	}
 936/**
 937 * コピーライト用の年を出力する
 938 * 
 939 * @param string 開始年
 940 * @return void
 941 * @access public
 942 */
 943	function copyYear($begin) {
 944		
 945		$year = date('Y');
 946		if($begin == $year) {
 947			echo $year;
 948		}else {
 949			echo $begin.' - '.$year;
 950		}
 951		
 952	}
 953/**
 954 * ページ編集へのリンクを出力する
 955 * 
 956 * @param string $id
 957 * @return void
 958 * @access public
 959 */
 960	function setPageEditLink($id) {
 961		
 962		if(empty($this->params['admin']) && !empty($this->_view->viewVars['user']) && !Configure::read('BcRequest.agent')) {
 963			$this->_view->viewVars['editLink'] = array('admin' => true, 'controller' => 'pages', 'action' => 'edit', $id);
 964		}
 965		
 966	}
 967/**
 968 * 編集リンクを出力する
 969 * 
 970 * @return void
 971 * @access public
 972 */
 973	function editLink() {
 974		
 975		if(!empty($this->_view->viewVars['editLink'])) {
 976			$this->link('編集する', $this->_view->viewVars['editLink'], array('class' => 'tool-menu'));
 977		}
 978		
 979	}
 980/**
 981 * 編集リンクが存在するかチェックする
 982 * 
 983 * @return boolean
 984 * @access public
 985 */
 986	function existsEditLink() {
 987		
 988		return (!empty($this->_view->viewVars['editLink']));
 989		
 990	}
 991/**
 992 * 公開ページへのリンクを出力する
 993 * 
 994 * @return void
 995 * @access public
 996 */
 997	function publishLink() {
 998		
 999		if(!empty($this->_view->viewVars['publishLink'])) {
1000			$this->link('公開ページ', $this->_view->viewVars['publishLink'], array('class' => 'tool-menu'));
1001		}
1002		
1003	}
1004/**
1005 * 公開ページへのリンクが存在するかチェックする
1006 * 
1007 * @return boolean
1008 * @access public
1009 */
1010	function existsPublishLink() {
1011		
1012		return (!empty($this->_view->viewVars['publishLink']));
1013		
1014	}
1015/**
1016 * アップデート処理が必要かチェックする
1017 * TODO 別のヘルパに移動する
1018 * @return boolean
1019 * @access public
1020 */
1021	function checkUpdate() {
1022		
1023		$baserVerpoint = verpoint($this->_view->viewVars['baserVersion']);
1024		if(isset($this->siteConfig['version'])) {
1025			$siteVerpoint = verpoint($this->siteConfig['version']);
1026		}else {
1027			$siteVerpoint = 0;
1028		}
1029		
1030		if(!$baserVerpoint === false || $siteVerpoint === false) {
1031			return false;
1032		} else {
1033			return ($baserVerpoint > $siteVerpoint);
1034		}
1035		
1036	}
1037/**
1038 * アップデート用のメッセージを出力する
1039 * TODO 別のヘルパーに移動する
1040 * @return void
1041 * @access public
1042 */
1043	function updateMessage() {
1044		$adminPrefix = Configure::read('Routing.admin');
1045		if($this->checkUpdate() && $this->params['controller'] != 'updaters') {
1046			$updateLink = $this->BcHtml->link('ここ',"/{$adminPrefix}/updaters");
1047			echo '<div id="UpdateMessage">WEBサイトのアップデートが完了していません。'.$updateLink.' からアップデートを完了させてください。</div>';
1048		}
1049		
1050	}
1051/**
1052 * コンテンツ名を出力する
1053 * 
1054 * @param boolean $detail 
1055 * @return void
1056 * @access public
1057 */
1058	function contentsName($detail = false, $options = array()) {
1059
1060		echo $this->getContentsName($detail);
1061		
1062	}
1063/**
1064 * コンテンツ名を取得する
1065 * ・キャメルケースで取得
1066 * ・URLのコントローラー名までを取得
1067 * ・ページの場合は、カテゴリ名(カテゴリがない場合は Default)
1068 * ・トップページは、Home
1069 * 
1070 * @param boolean $detail
1071 * @return string
1072 * @access public
1073 */
1074	function getContentsName($detail = false, $options = array()) {
1075
1076		$options = array_merge(array(
1077			'home'		=> 'Home',
1078			'default'	=> 'Default',
1079			'error'		=> 'Error',
1080			'underscore'=> false),
1081		$options);
1082		
1083		extract($options);
1084		
1085		$prefix = '';
1086		$plugin = '';
1087		$controller = '';
1088		$action = '';
1089		$pass = '';
1090		$url0 = '';
1091		$url1 = '';
1092		$url2 = '';
1093		$aryUrl = array();
1094		
1095		if(!empty($this->params['prefix']) && Configure::read('BcRequest.agentPrefix') != $this->params['prefix']) {
1096			$prefix = h($this->params['prefix']);
1097		}
1098		if(!empty($this->params['plugin'])) {
1099			$plugin = h($this->params['plugin']);
1100		}
1101		$controller = h($this->params['controller']);
1102		if($prefix) {
1103			$action = str_replace($prefix.'_', '', h($this->params['action']));
1104		}else {
1105			$action = h($this->params['action']);
1106		}
1107		if(!empty($this->params['pass'])) {
1108			foreach($this->params['pass'] as $key => $value) {
1109				$pass[$key] = h($value);
1110			}
1111		}
1112
1113		$url = split('/', h($this->params['url']['url']));
1114		
1115		if(Configure::read('BcRequest.agent')) {
1116			array_shift($url);
1117		}
1118
1119		if(isset($url[0])) {
1120			$url0 = $url[0];
1121		}
1122		if(isset($url[1])) {
1123			$url1 = $url[1];
1124		}
1125		if(isset($url[2])) {
1126			$url2 = $url[2];
1127		}
1128
1129		// 固定ページの場合
1130		if($controller=='pages' && $action=='display') {
1131			
1132			if(strpos($pass[0], 'pages/') !== false) {
1133				$pageUrl = str_replace('pages/','', $pass[0]);
1134			} else {
1135				$pageUrl = h($this->params['url']['url']);
1136			}
1137			if(preg_match('/\/$/', $pageUrl)) {
1138				$pageUrl .= 'index';
1139			}
1140			$pageUrl = preg_replace('/\.html$/', '', $pageUrl);
1141			$pageUrl = preg_replace('/^\//', '', $pageUrl);
1142			$aryUrl = split('/',$pageUrl);
1143			
1144		} else {
1145
1146			// プラグインルーティングの場合
1147			if((($url1==''&&$action=='index')||($url1==$action)) && $url2!=$action && $plugin) {
1148				$plugin = '';
1149				$controller = $url0;
1150			}
1151			
1152			if($plugin) {
1153				$controller = $plugin.'_'.$controller;
1154			}
1155			if($prefix)	{
1156				$controller = $prefix.'_'.$controller;
1157			}
1158			if($controller) {
1159				$aryUrl[] = $controller;
1160			}
1161			if($action) {
1162				$aryUrl[] = $action;
1163			}
1164			if($pass) {
1165				$aryUrl = $aryUrl + $pass;
1166			}
1167
1168		}
1169
1170		if ($this->_view->name == 'CakeError') {
1171			
1172			$contentsName = $error;
1173			
1174		} elseif(count($aryUrl) >= 2) {
1175			
1176			if(!$detail) {
1177				$contentsName = $aryUrl[0];
1178			} else {
1179				$contentsName = implode('_', $aryUrl);
1180			}
1181			
1182		} elseif(count($aryUrl) == 1 && $aryUrl[0] == 'index') {
1183			
1184			$contentsName = $home;
1185			
1186		} else {
1187			if(!$detail) {	
1188				$contentsName = $default;
1189			} else {
1190				$contentsName = $aryUrl[0];
1191			}
1192		}
1193		
1194		if($underscore) {
1195			$contentsName = Inflector::underscore($contentsName);
1196		} else {
1197			$contentsName = Inflector::camelize($contentsName);
1198		}
1199			
1200		return $contentsName;
1201
1202	}
1203/**
1204 * パンくずリストを出力する
1205 * アクセス制限がかかっているリンクはテキストのみ表示する
1206 *
1207 * @param string $separator Text to separate crumbs.
1208 * @param string $startText This will be the first crumb, if false it defaults to first crumb in array
1209 * @return string
1210 * @access public
1211 */
1212	function crumbs($separator = '&raquo;', $startText = false) {
1213		
1214		if (!empty($this->BcHtml->_crumbs)) {
1215			$out = array();
1216			if ($startText) {
1217				$out[] = $this->getLink($startText, '/');
1218			}
1219
1220			foreach ($this->BcHtml->_crumbs as $crumb) {
1221				if (!empty($crumb[1])) {
1222					$out[] = $this->getLink($crumb[0], $crumb[1], $crumb[2]);
1223				} else {
1224					$out[] = $crumb[0];
1225				}
1226			}
1227			echo $this->output(implode($separator, $out));
1228		}
1229		
1230	}
1231/**
1232 * パンくずリストに要素を追加する
1233 * アクセス制限がかかっているリンクの場合でもタイトルを表示できるオプションを付加
1234 * $options に forceTitle を指定する事で表示しない設定も可能
1235 *
1236 * @param string $name Text for link
1237 * @param string $link URL for link (if empty it won't be a link)
1238 * @param mixed $options Link attributes e.g. array('id'=>'selected')
1239 * @return void
1240 * @access public 
1241 */
1242	function addCrumb($name, $link = null, $options = null) {
1243		
1244		$_options = array('forceTitle'=>true);
1245		if($options) {
1246			$options = am($_options,$options);
1247		} else {
1248			$options = $_options;
1249		}
1250		$this->BcHtml->_crumbs[] = array($name, $link, $options);
1251		
1252	}
1253/**
1254 * ページリストを取得する
1255 * 
1256 * @param string $categoryId
1257 * @return mixed boolean / array
1258 * @access public
1259 */
1260	function getPageList($categoryId=null) {
1261		
1262		if ($this->Page) {
1263			$conditions = array('Page.status'=>1);
1264			if($categoryId) {
1265				$conditions['Page.page_category_id'] = $categoryId;
1266			}
1267			$this->Page->unbindModel(array('belongsTo'=>array('PageCategory')));
1268			$pages = $this->Page->find('all',array('conditions'=>$conditions,
1269					'fields'=>array('title','url'),
1270					'order'=>'Page.sort'));
1271			return Set::extract('/Page/.',$pages);
1272		}else {
1273			return false;
1274		}
1275		
1276	}
1277/**
1278 *
1279 */
1280/**
1281 * ブラウザにキャッシュさせる為のヘッダーを出力する
1282 * 
1283 * @param type $expire
1284 * @param array $type 
1285 * @return void
1286 * @access public
1287 */
1288	function cacheHeader($expire = DAY, $type='html') {
1289
1290		$contentType = array(
1291			'html' => 'text/html',
1292			'js' => 'text/javascript', 'css' => 'text/css',
1293			'gif' => 'image/gif', 'jpg' => 'image/jpeg', 'png' => 'image/png'
1294		);
1295		$fileModified = filemtime(WWW_ROOT.'index.php');
1296
1297		if(!$expire) {
1298			$expire = strtotime(DAY);
1299		} elseif(!is_numeric($expire)){
1300			$expire = strtotime($expire);
1301		}
1302		header("Date: " . date("D, j M Y G:i:s ", $fileModified) . 'GMT');
1303		header("Last-Modified: " . gmdate( "D, d M Y H:i:s", $fileModified) . " GMT");
1304		header('Content-type: ' . $contentType[$type]);
1305		header("Expires: " . gmdate("D, j M Y H:i:s", time() + $expire) . " GMT");
1306		header('Cache-Control: max-age=' . $expire);
1307		// Firefoxの場合は不要↓
1308		//header("Cache-Control: cache");
1309		header("Pragma: cache");
1310
1311	}
1312/**
1313 * httpから始まるURLを取得する
1314 * 
1315 * @param string $url
1316 * @return string
1317 * @access public
1318 */
1319	function getUri($url){
1320		if(preg_match('/^http/is', $url)) {
1321			return $url;
1322		}else {
1323			if(empty($_SERVER['HTTPS'])) {
1324				$protocol = 'http';
1325			}else {
1326				$protocol = 'https';
1327			}
1328			return $protocol . '://'.$_SERVER['HTTP_HOST'].$this->getUrl($url);
1329		}
1330	}
1331/**
1332 * プラグインのBaserヘルパを初期化する
1333 * BaserHelperに定義されていないメソッドをプラグイン内のヘルパに定義する事で
1334 * BaserHelperから呼び出せるようになる仕組みを提供する。
1335 * コアからプラグインのヘルパメソッドをBaserHelper経由で直接呼び出せる為、
1336 * コア側のコントローラーでいちいちヘルパの定義をしなくてよくなり、
1337 * プラグインを導入しただけでテンプレート上でプラグインのメソッドが呼び出せるようになる。
1338 * 例えばページ機能のWISIWIG内でプラグインのメソッドを書き込む事ができる。
1339 *
1340 * プラグインのBaserヘルパの命名規則:{プラグイン名}BaserHelper
1341 * (呼びだし方)$bcBaser->feed(1);
1342 *
1343 * @return void
1344 * @access public
1345 */
1346	function _initPluginBasers(){
1347
1348		$view = $this->_view;
1349		$plugins = Configure::read('BcStatus.enablePlugins');
1350
1351		if(!$plugins) {
1352			return;
1353		}
1354
1355		$pluginBasers = array();
1356		foreach($plugins as $plugin) {
1357			$pluginName = Inflector::camelize($plugin);
1358			if(App::import('Helper',$pluginName.'.'.$pluginName.'Baser')) {
1359				$pluginBasers[] = $pluginName.'BaserHelper';
1360			}
1361		}
1362		$vars = array(
1363				'base', 'webroot', 'here', 'params', 'action', 'data', 'themeWeb', 'plugin'
1364		);
1365		$c = count($vars);
1366		foreach($pluginBasers as $key => $pluginBaser) {
1367			$this->pluginBasers[$key] =& new $pluginBaser();
1368			for ($j = 0; $j < $c; $j++) {
1369				if(isset($view->{$vars[$j]})) {
1370					$this->pluginBasers[$key]->{$vars[$j]} = $view->{$vars[$j]};
1371				}
1372			}
1373		}
1374
1375	}
1376/**
1377 * プラグインBaserヘルパ用マジックメソッド
1378 * Baserヘルパに存在しないメソッドが呼ばれた際プラグインのBaserヘルパを呼び出す
1379 *
1380 * @param string $method
1381 * @param array $params
1382 * @return ixed
1383 * @access protected
1384 */
1385	function call__($method, $params) {
1386		
1387		foreach($this->pluginBasers as $pluginBaser){
1388			if(method_exists($pluginBaser,$method)){
1389				return call_user_func_array(array(&$pluginBaser, $method), $params);
1390			}
1391		}
1392		
1393	}
1394/**
1395 * 文字列を検索しマークとしてタグをつける
1396 *
1397 * @param string $search 検索文字列
1398 * @param string $text 検索対象文字列
1399 * @param string $name マーク用タグ
1400 * @param array $attributes タグの属性
1401 * @param boolean $escape エスケープ有無
1402 * @return string $text 変換後文字列
1403 * @access public
1404 */
1405	function mark($search, $text, $name = 'strong', $attributes = array(), $escape = false) {
1406
1407		if(!is_array($search)) {
1408			$search = array($search);
1409		}
1410		foreach($search as $value) {
1411			$text = str_replace($value, $this->BcHtml->tag($name, $value, $attributes, $escape), $text);
1412		}
1413		return $text;
1414		
1415	}
1416/**
1417 * サイトマップを出力する
1418 * 
1419 * @param mixid $pageCategoryId / '' / 0
1420 * @param string $recursive
1421 * @return void
1422 * @access public
1423 */
1424	function sitemap($pageCategoryId = null, $recursive = null) {
1425
1426		$pageList = $this->requestAction('/contents/get_page_list_recursive', array('pass' => array($pageCategoryId, $recursive)));
1427		$params = array('pageList' => $pageList);
1428		if(empty($_SESSION['Auth']['User'])) {
1429			$params = am($params, array(
1430				'cache' => array(
1431					'time' => Configure::read('BcCache.defaultCachetime'),
1432					'key' => $pageCategoryId))
1433			);
1434		}
1435		
1436		$this->element('sitemap', $params);
1437		
1438	}
1439/**
1440 * Flashを表示する
1441 * 
1442 * @param string $path
1443 * @param string $id
1444 * @param int $width
1445 * @param int $height
1446 * @param array $options
1447 * @return string 
1448 */
1449	function swf($path, $id, $width, $height, $options = array()) {
1450		
1451		$options = array_merge(array(
1452			'version'	=> 7,
1453			'script'	=> 'swfobject-2.2',
1454			'noflash'	=> '&nbsp;'
1455		), $options);
1456		extract($options);
1457		
1458		if(!preg_match('/^\//', $path)) {
1459			$path = '/img/'.$path;
1460		}
1461		if(strpos($path, "\.") === false) {
1462			$path .= '.swf';
1463		}
1464		$path = $this->webroot($path);
1465		$path = 'http://projects.localhost:8888'.$path;
1466		$out .= $this->js($script, true)."\n";
1467		$out = <<< END_FLASH
1468<div id="{$id}">{$noflash}</div>
1469<script type="text/javascript">
1470	swfobject.embedSWF("{$path}", "{$id}", "{$width}", "{$height}", "{$version}");
1471</script>
1472END_FLASH;
1473		
1474		echo $out;
1475		
1476	}
1477/**
1478 * URLをリンクとして利用可能なURLに変換する
1479 * ページの確認用URL取得に利用する
1480 * /smartphone/about → /s/about
1481 * 
1482 * @param string $url
1483 * @param string $type mobile / smartphone
1484 * @return string URL 
1485 */
1486	function changePrefixToAlias($url, $type) {
1487		$alias = Configure::read("BcAgent.{$type}.alias");
1488		$prefix = Configure::read("BcAgent.{$type}.prefix");
1489		return preg_replace('/^\/'.$prefix.'\//is', '/'.$alias.'/', $url);
1490	}
1491/**
1492 * 現在のログインユーザーが管理者グループかどうかチェックする
1493 * 
1494 * @return boolean 
1495 * @access public
1496 */
1497	function isAdminUser($id = null) {
1498		if(!$id && !empty($this->_view->viewVars['user']['user_group_id'])) {
1499			$id = $this->_view->viewVars['user']['user_group_id'];
1500		}
1501		if($id == 1) {
1502			return true;
1503		} else {
1504			return false;
1505		}
1506	}
1507/**
1508 * 固定ページ判定
1509 * 
1510 * @return boolean
1511 * @access public
1512 */
1513	function isPage() {
1514		return $this->Page->isPageUrl($this->getHere());
1515	}
1516/**
1517 * 現在のページの純粋なURLを取得
1518 * スマートURLかどうか、サブフォルダかどうかに依存しないスラッシュから始まるURL
1519 * 
1520 * @return string
1521 * @access public
1522 */
1523	function getHere() {
1524		return '/' . preg_replace('/^\//', '', $this->params['url']['url']);
1525	}
1526/**
1527 * ページカテゴリのトップ判定
1528 * 
1529 * @return boolean
1530 * @access public
1531 */
1532	function isCategoryTop() {
1533		
1534		$url = $this->getHere();
1535		$url = preg_replace('/^\//', '', $url);
1536		if(preg_match('/\/$/', $url)) {
1537			$url .= 'index';
1538		}
1539		if(preg_match('/\/index$/', $url)) {
1540			$param = explode('/', $url);
1541			if(count($param) >= 2) {
1542				return true;
1543			}
1544		}
1545		return false;
1546		
1547	}
1548/**
1549 * ページをエレメントとして読み込む
1550 * 
1551 * ※ レイアウトは読み込まない
1552 * @param int $id 
1553 */
1554	function page($id, $params = array(), $options = array()) {
1555
1556		if(isset($this->_view->viewVars['pageRecursive']) && !$this->_view->viewVars['pageRecursive']) {
1557			return;
1558		}
1559
1560		$options = array_merge(array(
1561			'loadHelpers'	=> false,
1562			'subDir'		=> true,
1563			'recursive'=> true
1564		), $options);
1565		
1566		extract($options);
1567
1568		$this->_view->viewVars['pageRecursive'] = $recursive;
1569		
1570		// 現在のページの情報を退避
1571		$currentId = null;
1572		$description = $this->getDescription();
1573		$title = $this->getContentsTitle();
1574		if(!empty($this->_view->loaded['bcPage'])) {
1575			$currentId = $this->_view->loaded['bcPage']->data['Page']['id'];
1576		}
1577		
1578		// urlを取得
1579		$PageClass =& ClassRegistry::init('Page');
1580		$page = $PageClass->find('first', array('conditions' => am(array('Page.id' => $id), $PageClass->getConditionAllowPublish()), 'recursive' => -1));
1581		
1582		if($page) {
1583			$url = '/../pages'.$PageClass->getPageUrl($page);
1584
1585			$this->element($url, $params, $loadHelpers = false, $subDir = true);
1586
1587			// 現在のページの情報に戻す
1588			$this->setDescription($description);
1589			$this->setTitle($title);
1590			if($currentId) {
1591				$this->setPageEditLink($currentId);
1592			}
1593		}
1594		
1595	}
1596}
1597?>