/** * WEBサイトのベースとなるURLを取得する * * コントローラーが初期化される前など {$this->base} が利用できない場合に利用する * / | /index.php/ | /subdir/ | /subdir/index.php/ * * ※ プログラムフォルダ内の画像やCSSの読み込み時もbootstrap.php で呼び出されるのでサーバーキャッシュは利用しない * * @return string ベースURL */ function baseUrl() { $baseUrl = Configure::read('App.baseUrl'); if ($baseUrl) { if (!preg_match('/\\/$/', $baseUrl)) { $baseUrl .= '/'; } } else { $script = $_SERVER['SCRIPT_FILENAME']; $script = str_replace(docRoot(), '', $script); if (BC_DEPLOY_PATTERN == 1) { $baseUrl = preg_replace('/' . preg_quote('app' . DS . 'webroot' . DS . 'index.php', '/') . '/', '', $script); $baseUrl = preg_replace('/' . preg_quote('app' . DS . 'webroot' . DS . 'test.php', '/') . '/', '', $baseUrl); // ↓ Windows Azure 対策 SCRIPT_FILENAMEに期待した値が入ってこない為 $baseUrl = preg_replace('/index\\.php/', '', $baseUrl); } elseif (BC_DEPLOY_PATTERN == 2) { $baseUrl = preg_replace('/index\\.php/', '', $script); } $baseUrl = preg_replace("/index\$/", '', $baseUrl); } $baseUrl = str_replace(DS, '/', $baseUrl); if (!$baseUrl) { $baseUrl = '/'; } return $baseUrl; }
/** * ドキュメントルートを取得する */ public function testDocRoot() { $_SERVER['SCRIPT_FILENAME'] = WWW_ROOT . 'test.php'; if (isConsole()) { $expected = str_replace('app' . DS . 'Console' . DS . 'cake.php', '', $_SERVER['SCRIPT_NAME']); } else { $path = explode('/', $_SERVER['SCRIPT_NAME']); krsort($path); $expected = $_SERVER['SCRIPT_FILENAME']; foreach ($path as $value) { $reg = "/\\/" . $value . "\$/"; $expected = preg_replace($reg, '', $expected); } } $result = docRoot(); $this->assertEquals($expected, $result); }
require BASER . 'Error' . DS . 'exceptions.php'; /** * インストール状態 */ define('BC_INSTALLED', isInstalled()); /** * Baserパス追加 */ App::build(array('Controller' => array_merge(App::path('Controller'), array(BASER_CONTROLLERS)), 'Model' => array_merge(App::path('Model'), array(BASER_MODELS)), 'Model/Behavior' => array_merge(App::path('Model/Behavior'), array(BASER_BEHAVIORS)), 'Model/Datasource' => array_merge(App::path('Model/Datasource'), array(BASER_DATASOURCE)), 'Model/Datasource/Database' => array_merge(App::path('Model/Datasource/Database'), array(BASER_DATABASE)), 'Controller/Component' => array_merge(App::path('Controller/Component'), array(BASER_COMPONENTS)), 'Controller/Component/Auth' => array_merge(App::path('Controller/Component/Auth'), array(BASER_COMPONENTS . 'Auth' . DS)), 'View' => array_merge(array(WWW_ROOT), App::path('View'), array(BASER_VIEWS)), 'View/Helper' => array_merge(App::path('View/Helper'), array(BASER_HELPERS)), 'Plugin' => array_merge(App::path('Plugin'), array(BASER_PLUGINS)), 'Vendor' => array_merge(App::path('Vendor'), array(BASER_VENDORS)), 'Locale' => array_merge(App::path('Locale'), array(BASER_LOCALES)), 'Lib' => array_merge(App::path('Lib'), array(BASER_LIBS)), 'Console' => array_merge(App::path('Console'), array(BASER_CONSOLES)), 'Console/Command' => array_merge(App::path('Console/Command'), array(BASER_CONSOLES . 'Command' . DS)), 'Routing/Filter' => array_merge(App::path('Routing/Filter'), array(BASER . 'Routing' . DS . 'Filter' . DS)))); App::build(array('Event' => array(APP . 'Event', BASER_EVENTS), 'Routing/Filter' => array(BASER . 'Routing' . DS . 'Filter' . DS), 'Configure' => array(BASER . 'Configure' . DS), 'TestSuite' => array(BASER_TEST_SUITE), 'TestSuite/Reporter' => array(BASER_TEST_SUITE . 'Reporter' . DS), 'TestSuite/Fixture' => array(BASER_TEST_SUITE . 'Fixture' . DS), 'Network' => array(BASER . 'Network' . DS)), App::REGISTER); /** * 配置パターン * Windows対策として、「\」を「/」へ変換してチェックする */ if (!defined('BC_DEPLOY_PATTERN')) { if (!preg_match('/' . preg_quote(str_replace('\\', '/', docRoot()), '/') . '/', str_replace('\\', '/', ROOT))) { // CakePHP標準の配置 define('BC_DEPLOY_PATTERN', 3); } elseif (ROOT . DS == WWW_ROOT) { // webrootをドキュメントルートにして、その中に app / baser / cake を配置 define('BC_DEPLOY_PATTERN', 2); } else { // baserCMS配布時の配置 define('BC_DEPLOY_PATTERN', 1); } } /** * baserUrl取得 */ define('BC_BASE_URL', baseUrl()); /**
/** * Checks if a file exists when theme is used, if no file is found default location is returned * * PENDING Core Hack * * @param string $file * @return string $webPath web path to file. */ public function webroot($file) { // CUSTOMIZE ADD 2015/02/15 ryuring // >>> // フルパスの場合はそのまま返す if (preg_match('/^(http|https):\\/\\//', $file)) { return $file; } // <<< $asset = explode('?', $file); $asset[1] = isset($asset[1]) ? '?' . $asset[1] : null; // CUSTOMIZE MODIFY 2009/10/6 ryuring // Rewriteモジュールが利用できない場合、$this->Html->css / $javascript->link では、 // app/webroot/を付加してURLを生成してしまう為、vendors 内のパス解決ができない。 // URLの取得方法をRouterに変更 // Dispatcherクラスのハックが必須 // // CUSTOMIZE MODIFY 2010/02/12 ryuring // ファイルの存在チェックを行い存在しない場合のみRouterを利用するように変更した。 // // CUSTOMIZE MODIFY 2011/04/11 ryuring // Rewriteモジュールが利用できない場合、画像等で出力されるURL形式(/app/webroot/img/...)が // $file に設定された場合でもパス解決ができるようにした。 // // >>> //$webPath = "{$this->request->webroot}" . $asset[0]; // --- $asset[0] = preg_replace('/^\\//', '', $asset[0]); if ($this->request->webroot && $this->request->webroot != '/') { $filePath = preg_replace('/' . preg_quote($this->request->webroot, '/') . '/', '', $asset[0]); } else { $filePath = $asset[0]; } $filePath = str_replace('/', DS, $filePath); $docRoot = docRoot(); if (file_exists(WWW_ROOT . $filePath)) { $webPath = $this->request->webroot . $asset[0]; } elseif (file_exists($docRoot . DS . $filePath) && strpos($docRoot . DS . $filePath, ROOT . DS) !== false) { // ※ ファイルのパスが ROOT 配下にある事が前提 $webPath = $asset[0]; } else { $webPath = Router::url('/' . $asset[0]); } // <<< $file = $asset[0]; if (!empty($this->theme)) { $file = trim($file, '/'); $theme = $this->theme . '/'; if (DS === '\\') { $file = str_replace('/', '\\', $file); } if (file_exists(Configure::read('App.www_root') . 'theme' . DS . $this->theme . DS . $file)) { $webPath = "{$this->request->webroot}theme/" . $theme . $asset[0]; } else { $themePath = App::themePath($this->theme); $path = $themePath . 'webroot' . DS . $file; if (file_exists($path)) { // CUSTOMIZE 2013/6/18 ryuring // >>> // $webPath = Configure::read('App.baseUrl')."{$this->request->webroot}theme/" . $theme . $asset[0]; //} // --- if ($baseUrl) { // スマートURLオフ $webPath = Configure::read('App.baseUrl') . "/theme/" . $theme . $asset[0]; } else { // スマートURLオン $webPath = "{$this->request->webroot}theme/" . $theme . $asset[0]; } } else { // フロントのWebページを表示する際に、管理システム用のアセットファイルを参照する為のURLを生成する if (property_exists($this->_View, 'adminTheme') && $this->_View->adminTheme) { if (file_exists($themePath = Configure::read('App.www_root') . 'theme' . DS . $this->_View->adminTheme . DS . $file)) { $adminTheme = $this->_View->adminTheme . '/'; if ($baseUrl) { // スマートURLオフ $webPath = Configure::read('App.baseUrl') . "/theme/" . $adminTheme . $asset[0]; } else { // スマートURLオン $webPath = "{$this->request->webroot}theme/" . $adminTheme . $asset[0]; } } } } // <<< } } if (strpos($webPath, '//') !== false) { return str_replace('//', '/', $webPath . $asset[1]); } // >>> CUSTOMIZE ADD 2013/06/18 ryuring if (strpos($webPath, '\\') !== false) { $webPath = str_replace("\\", '/', $webPath); } // <<< return $webPath . $asset[1]; }
/** * [ADMIN] サイト基本設定 */ public function admin_form() { $writableInstall = is_writable(APP . 'Config' . DS . 'install.php'); if (empty($this->request->data)) { $this->request->data = $this->_getSiteConfigData(); } else { $this->SiteConfig->set($this->request->data); if (!$this->SiteConfig->validates()) { $this->setMessage('入力エラーです。内容を修正してください。', true); } else { $mode = 0; $smartUrl = false; $siteUrl = $sslUrl = ''; if (isset($this->request->data['SiteConfig']['mode'])) { $mode = $this->request->data['SiteConfig']['mode']; if ($mode > 0) { clearAllCache(); } } if (isset($this->request->data['SiteConfig']['smart_url'])) { $smartUrl = $this->request->data['SiteConfig']['smart_url']; } if (isset($this->request->data['SiteConfig']['ssl_url'])) { $siteUrl = $this->request->data['SiteConfig']['site_url']; if (!preg_match('/\\/$/', $siteUrl)) { $siteUrl .= '/'; } } if (isset($this->request->data['SiteConfig']['ssl_url'])) { $sslUrl = $this->request->data['SiteConfig']['ssl_url']; if ($sslUrl && !preg_match('/\\/$/', $sslUrl)) { $sslUrl .= '/'; } } $adminSsl = @$this->request->data['SiteConfig']['admin_ssl']; $mobile = @$this->request->data['SiteConfig']['mobile']; $smartphone = @$this->request->data['SiteConfig']['smartphone']; unset($this->request->data['SiteConfig']['id']); unset($this->request->data['SiteConfig']['mode']); unset($this->request->data['SiteConfig']['smart_url']); unset($this->request->data['SiteConfig']['site_url']); unset($this->request->data['SiteConfig']['ssl_url']); unset($this->request->data['SiteConfig']['admin_ssl']); unset($this->request->data['SiteConfig']['mobile']); unset($this->request->data['SiteConfig']['smartphone']); // DBに保存 if ($this->SiteConfig->saveKeyValue($this->request->data)) { $this->setMessage('システム設定を保存しました。'); // 環境設定を保存 if ($writableInstall) { $this->BcManager->setInstallSetting('debug', $mode); $this->BcManager->setInstallSetting('BcEnv.siteUrl', "'" . $siteUrl . "'"); $this->BcManager->setInstallSetting('BcEnv.sslUrl', "'" . $sslUrl . "'"); $this->BcManager->setInstallSetting('BcApp.adminSsl', $adminSsl ? 'true' : 'false'); $this->BcManager->setInstallSetting('BcApp.mobile', $mobile ? 'true' : 'false'); $this->BcManager->setInstallSetting('BcApp.smartphone', $smartphone ? 'true' : 'false'); } if ($this->BcManager->smartUrl() != $smartUrl) { $this->BcManager->setSmartUrl($smartUrl); } // キャッシュをクリア if ($this->request->data['SiteConfig']['maintenance'] || $this->siteConfigs['google_analytics_id'] != $this->request->data['SiteConfig']['google_analytics_id'] || !$smartphone && Configure::read('BcApp.smartphone') || !$mobile && Configure::read('BcApp.mobile')) { clearViewCache(); } // リダイレクト if ($this->BcManager->smartUrl() != $smartUrl) { $adminPrefix = Configure::read('Routing.prefixes.0'); if ($smartUrl) { $redirectUrl = $this->BcManager->getRewriteBase('/' . $adminPrefix . '/site_configs/form'); } else { $redirectUrl = $this->BcManager->getRewriteBase('/index.php/' . $adminPrefix . '/site_configs/form'); } header('Location: ' . FULL_BASE_URL . $redirectUrl); exit; } else { $this->redirect(array('action' => 'form')); } } } } /* スマートURL関連 */ $apachegetmodules = function_exists('apache_get_modules'); if ($apachegetmodules) { $rewriteInstalled = in_array('mod_rewrite', apache_get_modules()); } else { $rewriteInstalled = -1; } if (BC_DEPLOY_PATTERN != 3) { $htaccess1 = ROOT . DS . '.htaccess'; } else { $htaccess1 = docRoot() . DS . '.htaccess'; } $htaccess2 = WWW_ROOT . '.htaccess'; $writableHtaccess = is_writable($htaccess1); if ($htaccess1 != $htaccess2) { $writableHtaccess2 = is_writable($htaccess2); } else { $writableHtaccess2 = true; } $baseUrl = str_replace('/index.php', '', BC_BASE_URL); if ($writableInstall && $writableHtaccess && $writableHtaccess2 && $rewriteInstalled !== false) { $smartUrlChangeable = true; } else { $smartUrlChangeable = false; } $UserGroup = ClassRegistry::init('UserGroup'); $userGroups = $UserGroup->find('list', array('fields' => array('UserGroup.id', 'UserGroup.title'))); $disableSettingSmartUrl = array(); $disableSettingInstallSetting = array(); if (!$smartUrlChangeable) { $disableSettingSmartUrl = array('disabled' => 'disabled'); } if (!$writableInstall) { $disableSettingInstallSetting = array('disabled' => 'disabled'); } $this->set(compact('baseUrl', 'userGroups', 'rewriteInstalled', 'writableInstall', 'writableHtaccess', 'writableHtaccess2', 'smartUrlChangeable', 'disableSettingSmartUrl', 'disableSettingInstallSetting')); $this->subMenuElements = array('site_configs'); $this->pageTitle = 'サイト基本設定'; $this->help = 'site_configs_form'; }
/** * Checks if a file exists when theme is used, if no file is found default location is returned * * PENDING Core Hack * * @param string $file * @return string $webPath web path to file. */ function webroot($file) { // CUSTOMIZE ADD 2010/05/19 ryuring // CakePHP1.2.6以降、Rewriteモジュールを利用せず、App.baseUrlを利用した場合、 // Dispatcherでwebrootが正常に取得できなくなってしまったので、ここで再設定する // CUSTOMIZE MODIFY 2011/03/17 ryuring // BC_DEPLOY_PATTERN 2 について対応 // >>> $dir = Configure::read('App.dir'); $webroot = Configure::read('App.webroot'); $baseUrl = Configure::read('App.baseUrl'); if ($baseUrl) { switch (BC_DEPLOY_PATTERN) { case 1: if (strpos($this->webroot, $dir) === false) { $this->webroot .= $dir . '/'; } if (strpos($this->webroot, $webroot) === false) { $this->webroot .= $webroot . '/'; } break; case 2: $baseDir = str_replace('index.php', '', $baseUrl); $this->webroot = $baseDir; break; } } //<<< // CUSTOMIZE MODIFY 2009/10/6 ryuring // Rewriteモジュールが利用できない場合、$html->css / $javascript->link では、 // app/webroot/を付加してURLを生成してしまう為、vendors 内のパス解決ができない。 // URLの取得方法をRouterに変更 // Dispatcherクラスのハックが必須 // // CUSTOMIZE MODIFY 2010/02/12 ryuring // ファイルの存在チェックを行い存在しない場合のみRouterを利用するように変更した。 // // CUSTOMIZE MODIFY 2011/04/11 ryuring // Rewriteモジュールが利用できない場合、画像等で出力されるURL形式(/app/webroot/img/...)が // $file に設定された場合でもパス解決ができるようにした。 // // >>> // $webPath = "{$this->webroot}" . $file; // --- $filePath = str_replace('/', DS, $file); $docRoot = docRoot(); if (file_exists(WWW_ROOT . $filePath)) { $webPath = $this->webroot . $file; } elseif (file_exists($docRoot . DS . $filePath) && strpos($docRoot . DS . $filePath, ROOT . DS) !== false) { // ※ ファイルのパスが ROOT 配下にある事が前提 $webPath = $file; } else { $webPath = Router::url('/' . $file); } // <<< if (!empty($this->themeWeb)) { $os = env('OS'); if (!empty($os) && strpos($os, 'Windows') !== false) { if (strpos(WWW_ROOT . $this->themeWeb . $filePath, '\\') !== false) { $path = str_replace('/', '\\', WWW_ROOT . $this->themeWeb . $filePath); } } else { $path = WWW_ROOT . $this->themeWeb . $filePath; } if (file_exists($path)) { $webPath = "{$this->webroot}" . $this->themeWeb . $file; } } if (strpos($webPath, '//') !== false) { return str_replace('//', '/', $webPath); } // >>> CUSTOMIZE ADD 2010/02/12 ryuring if (strpos($webPath, '\\') !== false) { $webPath = str_replace("\\", '/', $webPath); } // <<< return $webPath; }
* vendors内の静的ファイルの読み込みの場合はスキップ */ $uri = @$_SERVER['REQUEST_URI']; $baseUrl = baseUrl(); if (strpos($uri, $baseUrl . 'css/') !== false || strpos($uri, $baseUrl . 'js/') !== false || strpos($uri, $baseUrl . 'img/') !== false) { $assets = array('js', 'css', 'gif', 'jpg', 'png'); $ext = array_pop(explode('.', $uri)); if (in_array($ext, $assets)) { Configure::write('Baser.Asset', true); return; } } /** * 配置パターン */ if (!preg_match('/' . preg_quote(docRoot(), '/') . '/', ROOT)) { // CakePHP標準の配置 define('DEPLOY_PATTERN', 3); } elseif (ROOT . DS == WWW_ROOT) { // webrootをドキュメントルートにして、その中に app / baser / cake を配置 define('DEPLOY_PATTERN', 2); } else { // baserCMS配布時の配置 define('DEPLOY_PATTERN', 1); } /** * 設定ファイル読み込み * install.php で設定している為、一旦読み込んで再設定 */ $baserSettings = Configure::read('Baser'); if (Configure::load('baser') === false) {
/** * [ADMIN] サイト基本設定 * * @return void * @access public */ function admin_form() { if (empty($this->data)) { $this->data = $this->_getSiteConfigData(); } else { $this->SiteConfig->set($this->data); if (!$this->SiteConfig->validates()) { $this->Session->setFlash('入力エラーです。内容を修正してください。'); } else { $mode = 0; $smartUrl = false; $siteUrl = $sslUrl = $adminSslOn = ''; if (isset($this->data['SiteConfig']['mode'])) { $mode = $this->data['SiteConfig']['mode']; } if (isset($this->data['SiteConfig']['smart_url'])) { $smartUrl = $this->data['SiteConfig']['smart_url']; } if (isset($this->data['SiteConfig']['ssl_url'])) { $siteUrl = $this->data['SiteConfig']['site_url']; if (!preg_match('/\\/$/', $siteUrl)) { $siteUrl .= '/'; } } if (isset($this->data['SiteConfig']['ssl_url'])) { $sslUrl = $this->data['SiteConfig']['ssl_url']; if ($sslUrl && !preg_match('/\\/$/', $sslUrl)) { $sslUrl .= '/'; } } $adminSslOn = $this->data['SiteConfig']['admin_ssl_on']; $mobile = $this->data['SiteConfig']['mobile']; $smartphone = $this->data['SiteConfig']['smartphone']; unset($this->data['SiteConfig']['id']); unset($this->data['SiteConfig']['mode']); unset($this->data['SiteConfig']['smart_url']); unset($this->data['SiteConfig']['site_url']); unset($this->data['SiteConfig']['ssl_url']); unset($this->data['SiteConfig']['admin_ssl_on']); unset($this->data['SiteConfig']['mobile']); unset($this->data['SiteConfig']['smartphone']); // DBに保存 if ($this->SiteConfig->saveKeyValue($this->data)) { $this->Session->setFlash('システム設定を保存しました。'); // 環境設定を保存 $this->writeDebug($mode); $this->writeInstallSetting('Baser.siteUrl', "'" . $siteUrl . "'"); $this->writeInstallSetting('Baser.sslUrl', "'" . $sslUrl . "'"); $this->writeInstallSetting('Baser.adminSslOn', $adminSslOn ? 'true' : 'false'); $this->writeInstallSetting('Baser.mobile', $mobile ? 'true' : 'false'); $this->writeInstallSetting('Baser.smartphone', $smartphone ? 'true' : 'false'); if ($this->readSmartUrl() != $smartUrl) { $this->writeSmartUrl($smartUrl); } // キャッシュをクリア if ($this->siteConfigs['maintenance'] || $this->siteConfigs['theme'] != $this->data['SiteConfig']['theme'] || $this->siteConfigs['google_analytics_id'] != $this->data['SiteConfig']['google_analytics_id']) { clearViewCache(); } // ページテンプレートの生成 if ($this->siteConfigs['theme'] != $this->data['SiteConfig']['theme']) { if (!$this->Page->createAllPageTemplate()) { $this->Session->setFlash('テーマ変更中にページテンプレートの生成に失敗しました。<br />' . '表示できないページはページ管理より更新処理を行ってください。'); } } // リダイレクト if ($this->readSmartUrl() != $smartUrl) { if ($smartUrl) { $redirectUrl = $this->getRewriteBase('/admin/site_configs/form'); } else { $redirectUrl = $this->getRewriteBase('/index.php/admin/site_configs/form'); } header('Location: ' . FULL_BASE_URL . $redirectUrl); exit; } else { $this->redirect(array('action' => 'form')); } } } } /* スマートURL関連 */ $apachegetmodules = function_exists('apache_get_modules'); if ($apachegetmodules) { $rewriteInstalled = in_array('mod_rewrite', apache_get_modules()); } else { $rewriteInstalled = -1; } $writableInstall = is_writable(CONFIGS . 'install.php'); if (DEPLOY_PATTERN != 3) { $htaccess1 = ROOT . DS . '.htaccess'; } else { $htaccess1 = docRoot() . DS . '.htaccess'; } $htaccess2 = WWW_ROOT . '.htaccess'; $writableHtaccess = is_writable($htaccess1); if ($htaccess1 != $htaccess2) { $writableHtaccess2 = is_writable($htaccess2); } else { $writableHtaccess2 = true; } $baseUrl = str_replace('/index.php', '', baseUrl()); if ($writableInstall && $writableHtaccess && $writableHtaccess2 && $rewriteInstalled !== false) { $smartUrlChangeable = true; } else { $smartUrlChangeable = false; } $UserGroup = ClassRegistry::init('UserGroup'); $userGroups = $UserGroup->find('list', array('fields' => array('UserGroup.id', 'UserGroup.title'))); $this->set('userGroups', $userGroups); $this->set('themes', $this->SiteConfig->getThemes()); $this->set('rewriteInstalled', $rewriteInstalled); $this->set('writableInstall', $writableInstall); $this->set('writableHtaccess', $writableHtaccess); $this->set('writableHtaccess2', $writableHtaccess2); $this->set('baseUrl', $baseUrl); $this->set('smartUrlChangeable', $smartUrlChangeable); $this->subMenuElements = array('site_configs'); $this->pageTitle = 'サイト基本設定'; }