/** * ページのレイアウト情報を取得し, 設定する. * * 現在の URL に応じたページのレイアウト情報を取得し, LC_Page インスタンスに * 設定する. * * @access public * @param LC_Page $objPage LC_Page インスタンス * @param boolean $preview プレビュー表示の場合 true * @param string $url ページのURL($_SERVER['SCRIPT_NAME'] の情報) * @param integer $device_type_id 端末種別ID * @return void */ public function sfGetPageLayout(&$objPage, $preview = false, $url = '', $device_type_id = DEVICE_TYPE_PC) { // URLを元にページ情報を取得 if ($preview === false) { $url = preg_replace('|^' . preg_quote(ROOT_URLPATH) . '|', '', $url); $arrPageData = $this->getPageProperties($device_type_id, null, 'url = ?', array($url)); // プレビューの場合は, プレビュー用のデータを取得 } else { $arrPageData = $this->getPageProperties($device_type_id, 0); } if (empty($arrPageData[0])) { trigger_error('ページ情報を取得できませんでした。', E_USER_WARNING); $objPage->arrPageLayout = array(); $objPage->tpl_column_num = 1; } else { $objPage->tpl_mainpage = $this->getTemplatePath($device_type_id) . $arrPageData[0]['filename'] . '.tpl'; if (!file_exists($objPage->tpl_mainpage)) { $msg = 'メイン部のテンプレートが存在しません。[' . $objPage->tpl_mainpage . ']'; trigger_error($msg, E_USER_WARNING); } $objPage->arrPageLayout =& $arrPageData[0]; if (strlen($objPage->arrPageLayout['author']) === 0) { $arrInfo = Application::alias('eccube.helper.db')->getBasisData(); $objPage->arrPageLayout['author'] = $arrInfo['company_name']; } // ページタイトルを設定 if (Utils::isBlank($objPage->tpl_title)) { $objPage->tpl_title = $objPage->arrPageLayout['page_name']; } // 該当ページのブロックを取得し, 配置する $masterData = Application::alias('eccube.db.master_data'); $arrTarget = $masterData->getMasterData('mtb_target'); $arrBlocs = $this->getBlocPositions($device_type_id, $objPage->arrPageLayout['page_id']); // 無効なプラグインのブロックを取り除く. $objPlugin = PluginHelper::getSingletonInstance(); $arrBlocs = $objPlugin->getEnableBlocs($arrBlocs); // php_path, tpl_path が存在するものを, 各ターゲットに配置 foreach ($arrTarget as $target_id => $value) { foreach ($arrBlocs as $arrBloc) { if ($arrBloc['target_id'] != $target_id) { continue; } if (array_key_exists($arrBloc['filename'], $this->classes) || is_file($arrBloc['tpl_path'])) { $objPage->arrPageLayout[$arrTarget[$target_id]][] = $arrBloc; } else { $error = "ブロックが見つかりません\n" . 'tpl_path: ' . $arrBloc['tpl_path'] . "\n" . 'php_path: ' . $arrBloc['php_path']; trigger_error($error, E_USER_WARNING); } } } // カラム数を取得する $objPage->tpl_column_num = $this->getColumnNum($objPage->arrPageLayout); } }
/** * Page を初期化する. * LC_Page_Adminクラス内でエラーページを表示しようとした際に無限ループに陥るのを防ぐため, * ここでは, parent::init() を行わない.(フロントのエラー画面出力と同様の仕様) * * @return void */ public function init() { HandleErrorHelper::$under_error_handling = true; $this->template = LOGIN_FRAME; $this->tpl_mainpage = 'login_error.tpl'; $this->tpl_title = 'ログインエラー'; // ディスプレイクラス生成 $this->objDisplay = Application::alias('eccube.display'); // transformでフックしている場合に, 再度エラーが発生するため, コールバックを無効化. $objHelperPlugin = PluginHelper::getSingletonInstance($this->plugin_activate_flg); $objHelperPlugin->arrRegistedPluginActions = array(); // キャッシュから店舗情報取得(DBへの接続は行わない) $this->arrSiteInfo = Application::alias('eccube.helper.db')->getBasisDataCache(false); }
/** * Page を初期化する. * * @return void */ public function init() { // 開始時刻を設定する。 $this->timeStart = microtime(true); $this->tpl_authority = $_SESSION['authority']; // ディスプレイクラス生成 $this->objDisplay = Application::alias('eccube.display'); $this->setTplMainpage($this->blocItems['tpl_path']); // トランザクショントークンの検証と生成 $this->setTokenTo(); // ローカルフックポイントを実行. $objPlugin = PluginHelper::getSingletonInstance($this->plugin_activate_flg); $this->doLocalHookpointBefore($objPlugin); }
/** * Page のレスポンス送信. * * @return void */ public function sendResponse() { $objPlugin = PluginHelper::getSingletonInstance($this->plugin_activate_flg); // ローカルフックポイントを実行 $parent_class_name = get_parent_class($this); $objPlugin->doAction($parent_class_name . '_action_after', array($this)); $class_name = get_class($this); if ($class_name != $parent_class_name) { $objPlugin->doAction($class_name . '_action_after', array($this)); } // HeadNaviにpluginテンプレートを追加する. $objPlugin->setHeadNaviBlocs($this->arrPageLayout['HeadNavi']); // スーパーフックポイントを実行. $objPlugin->doAction('LC_Page_process', array($this)); $this->objDisplay->prepare($this, true); $this->objDisplay->response->write(); }
/** * Registers services on the given app. * * This method should only be used to configure services and parameters. * It should not get services. * * @param BaseApplication $app An Application instance */ public function register(BaseApplication $app) { // PEAR $app['smarty'] = function () { return new \Smarty(); }; $app['mobile.detect'] = function () { return new \Mobile_Detect(); }; $app['pear.archive.tar'] = $app->protect(function ($p_tarname, $p_compress = null) { return new \Archive_Tar($p_tarname, $p_compress); }); $app['pear.cache.lite'] = $app->protect(function ($options = array()) { return new \Cache_Lite($options); }); $app['pear.calendar.month.weekdays'] = $app->protect(function ($y, $m, $firstDay = null) { return new \Calendar_Month_Weekdays($y, $m, $firstDay); }); $app['pear.http.request'] = $app->protect(function ($url = '', $params = array()) { return new \HTTP_Request($url, $params); }); $app['pear.mail'] = $app->protect(function ($driver, $params = array()) { return \Mail::factory($driver, $params); }); $app['pear.net.user_agent.mobile'] = $app->protect(function ($userAgent = null) { return \Net_UserAgent_Mobile::singleton($userAgent); }); $app['pear.net.url'] = $app->protect(function ($url = null, $useBrackets = true) { return new \Net_URL($url, $useBrackets); }); $app['pear.services.json'] = $app->protect(function ($use = 0) { return new \Services_JSON($use); }); $app['pear.text.password'] = $app->protect(function ($length = 10, $type = 'pronounceable', $chars = '') { return \Text_Password::create($length, $type, $chars); }); $app['pear.xml.serializer'] = $app->protect(function ($options = null) { return new \XML_Serializer($options); }); // framework $app['eccube.cart_session'] = $app->protect(function ($cartKey = 'cart') { return new \Eccube\Framework\CartSession($cartKey); }); $app['eccube.customer'] = function () { return new \Eccube\Framework\Customer(); }; $app['eccube.customer_list'] = $app->protect(function ($array, $mode = '') { return new \Eccube\Framework\CustomerList($array, $mode); }); $app['eccube.cookie'] = $app->protect(function ($day = COOKIE_EXPIRE) { return new \Eccube\Framework\Cookie($day); }); $app['eccube.check_error'] = $app->protect(function ($array = '') { return new \Eccube\Framework\CheckError($array); }); $app['eccube.date'] = $app->protect(function ($start_year = '', $end_year = '') { return new \Eccube\Framework\Date($start_year, $end_year); }); $app['eccube.display'] = $app->protect(function ($hasPrevURL = true) { return new \Eccube\Framework\Display($hasPrevURL); }); $app['eccube.form_param'] = function () { return new \Eccube\Framework\FormParam(); }; $app['eccube.page_navi'] = $app->protect(function ($now_page, $all_row, $page_row, $func_name, $navi_max = NAVI_PMAX, $urlParam = '', $display_number = true) { return new \Eccube\Framework\PageNavi($now_page, $all_row, $page_row, $func_name, $navi_max, $urlParam, $display_number); }); $app['eccube.product'] = $app->protect(function () { return new \Eccube\Framework\Product(); }); $app['eccube.response'] = $app->protect(function () { return new \Eccube\Framework\Response(); }); $app['eccube.query'] = $app->protect(function ($dsn = '', $force_run = false, $new = false) { return \Eccube\Framework\Query::getSingletonInstance($dsn, $force_run, $new); }); $app['eccube.site_session'] = $app->share(function () { return new \Eccube\Framework\SiteSession(); }); $app['eccube.sendmail'] = $app->protect(function () { return new \Eccube\Framework\Sendmail(); }); // db $app['eccube.db.factory'] = $app->protect(function ($db_type = DB_TYPE) { return \Eccube\Framework\DB\DBFactory::getInstance($db_type); }); $app['eccube.db.master_data'] = $app->share(function () { return new \Eccube\Framework\DB\MasterData(); }); // graph $app['eccube.graph.bar'] = $app->protect(function ($bgw = BG_WIDTH, $bgh = BG_HEIGHT, $left = LINE_LEFT, $top = LINE_TOP, $area_width = LINE_AREA_WIDTH, $area_height = LINE_AREA_HEIGHT) { return new \Eccube\Framework\Graph\BarGraph($bgw, $bgh, $left, $top, $area_width, $area_height); }); $app['eccube.graph.line'] = $app->protect(function ($bgw = BG_WIDTH, $bgh = BG_HEIGHT, $left = LINE_LEFT, $top = LINE_TOP, $area_width = LINE_AREA_WIDTH, $area_height = LINE_AREA_HEIGHT) { return new \Eccube\Framework\Graph\LineGraph($bgw, $bgh, $left, $top, $area_width, $area_height); }); $app['eccube.graph.pie'] = $app->protect(function ($bgw = BG_WIDTH, $bgh = BG_HEIGHT, $left = PIE_LEFT, $top = PIE_TOP) { return new \Eccube\Framework\Graph\PieGraph($bgw, $bgh, $left, $top); }); // helper $app['eccube.helper.address'] = $app->share(function () { return new \Eccube\Framework\Helper\AddressHelper(); }); $app['eccube.helper.best_products'] = $app->share(function () { return new \Eccube\Framework\Helper\BestProductsHelper(); }); $app['eccube.helper.bloc'] = $app->protect(function ($devide_type_id = DEVICE_TYPE_PC) { return new \Eccube\Framework\Helper\BlocHelper($devide_type_id); }); $app['eccube.helper.category'] = $app->protect(function ($count_check = false) { return new \Eccube\Framework\Helper\CategoryHelper($count_check); }); $app['eccube.helper.csv'] = function () { return new \Eccube\Framework\Helper\CsvHelper(); }; $app['eccube.helper.customer'] = $app->share(function () { return new \Eccube\Framework\Helper\CustomerHelper(); }); $app['eccube.helper.db'] = $app->share(function () { return new \Eccube\Framework\Helper\DbHelper(); }); $app['eccube.helper.delivery'] = $app->share(function () { return new \Eccube\Framework\Helper\DeliveryHelper(); }); $app['eccube.helper.file_manager'] = $app->share(function () { return new \Eccube\Framework\Helper\FileManagerHelper(); }); $app['eccube.helper.fpdi'] = $app->protect(function ($orientation = 'P', $unit = 'mm', $size = 'A4') { return new \Eccube\Framework\Helper\FpdiHelper($orientation, $unit, $size); }); $app['eccube.helper.holiday'] = $app->share(function () { return new \Eccube\Framework\Helper\HolidayHelper(); }); $app['eccube.helper.kiyaku'] = $app->share(function () { return new \Eccube\Framework\Helper\KiyakuHelper(); }); $app['eccube.helper.mail'] = $app->share(function () { return new \Eccube\Framework\Helper\MailHelper(); }); $app['eccube.helper.mailtemplate'] = $app->share(function () { return new \Eccube\Framework\Helper\MailtemplateHelper(); }); $app['eccube.helper.maker'] = $app->share(function () { return new \Eccube\Framework\Helper\MakerHelper(); }); $app['eccube.helper.mobile'] = $app->share(function () { return new \Eccube\Framework\Helper\MobileHelper(); }); $app['eccube.helper.news'] = $app->share(function () { return new \Eccube\Framework\Helper\NewsHelper(); }); $app['eccube.helper.page_layout'] = $app->share(function () { return new \Eccube\Framework\Helper\PageLayoutHelper(); }); $app['eccube.helper.payment'] = $app->share(function () { return new \Eccube\Framework\Helper\PaymentHelper(); }); $app['eccube.helper.plugin'] = function () { $plugin_activate_flg = PLUGIN_ACTIVATE_FLAG; return \Eccube\Framework\Helper\PluginHelper::getSingletonInstance($plugin_activate_flg); }; $app['eccube.helper.purchase'] = $app->share(function () { return new \Eccube\Framework\Helper\PurchaseHelper(); }); $app['eccube.helper.session'] = $app->share(function () { return new \Eccube\Framework\Helper\SessionHelper(); }); $app['eccube.helper.tax_rule'] = $app->share(function () { return new \Eccube\Framework\Helper\TaxRuleHelper(); }); $app['eccube.helper.transform'] = $app->protect(function ($source) { return new \Eccube\Framework\Helper\TransformHelper($source); }); // util $app['eccube.util.utils'] = $app->share(function () { return new \Eccube\Framework\Util\Utils(); }); $app['eccube.util.gc_utils'] = $app->share(function () { return new \Eccube\Framework\Util\GcUtils(); }); // smarty $app['smarty'] = $app->extend('smarty', function ($smarty) { /* @var $DbHelper \Eccube\Framework\Helper\DbHelper */ $DbHelper = Application::alias('eccube.helper.db'); /* @var $Utils \Eccube\Framework\Util\Utils */ $Utils = Application::alias('eccube.util.utils'); /* @var $GcUtils \Eccube\Framework\Util\GcUtils */ $GcUtils = Application::alias('eccube.util.gc_utils'); $smarty->left_delimiter = '<!--{'; $smarty->right_delimiter = '}-->'; $smarty->plugins_dir = array(realpath(__DIR__ . '/../../smarty_extends'), realpath(__DIR__ . '/../../../vendor/smarty/smarty/libs/plugins')); $smarty->register_modifier('sfDispDBDate', array($Utils, 'sfDispDBDate')); $smarty->register_modifier('sfGetErrorColor', array($Utils, 'sfGetErrorColor')); $smarty->register_modifier('sfTrim', array($Utils, 'sfTrim')); $smarty->register_modifier('sfCalcIncTax', array($DbHelper, 'calcIncTax')); $smarty->register_modifier('sfPrePoint', array($Utils, 'sfPrePoint')); $smarty->register_modifier('sfGetChecked', array($Utils, 'sfGetChecked')); $smarty->register_modifier('sfTrimURL', array($Utils, 'sfTrimURL')); $smarty->register_modifier('sfMultiply', array($Utils, 'sfMultiply')); $smarty->register_modifier('sfRmDupSlash', array($Utils, 'sfRmDupSlash')); $smarty->register_modifier('sfCutString', array($Utils, 'sfCutString')); $smarty->register_modifier('sfMbConvertEncoding', array($Utils, 'sfMbConvertEncoding')); $smarty->register_modifier('sfGetEnabled', array($Utils, 'sfGetEnabled')); $smarty->register_modifier('sfNoImageMainList', array($Utils, 'sfNoImageMainList')); // XXX register_function で登録すると if で使用できないのではないか? $smarty->register_function('sfIsHTTPS', array($Utils, 'sfIsHTTPS')); $smarty->register_function('sfSetErrorStyle', array($Utils, 'sfSetErrorStyle')); $smarty->register_function('printXMLDeclaration', array($GcUtils, 'printXMLDeclaration')); $smarty->default_modifiers = array('script_escape'); $smarty->force_compile = SMARTY_FORCE_COMPILE_MODE === true; return $smarty; }); }
/** * アプリケーション内でリダイレクトする * * 内部で生成する URL の searchpart は、下記の順で上書きしていく。(後勝ち) * 1. 引数 $inheritQueryString が true の場合、$_SERVER['QUERY_STRING'] * 2. $location に含まれる searchpart * 3. 引数 $arrQueryString * @param string $location 「url-path」「現在のURLからのパス」「URL」のいずれか。「../」の解釈は行なわない。 * @param array $arrQueryString URL に付加する searchpart * @param bool $inheritQueryString 現在のリクエストの searchpart を継承するか * @param bool|null $useSsl true:HTTPSを強制, false:HTTPを強制, null:継承 * @return void * @static */ public function sendRedirect($location, $arrQueryString = array(), $inheritQueryString = false, $useSsl = null) { // ローカルフックポイント処理 $objPlugin = PluginHelper::getSingletonInstance(); if (is_object($objPlugin)) { $arrBacktrace = debug_backtrace(); if (is_object($arrBacktrace[0]['object']) && method_exists($arrBacktrace[0]['object'], 'getMode')) { $parent_class_name = get_parent_class($arrBacktrace[0]['object']); $objPlugin->doAction($parent_class_name . '_action_' . $arrBacktrace[0]['object']->getMode(), array($arrBacktrace[0]['object'])); $class_name = get_class($arrBacktrace[0]['object']); if ($class_name != $parent_class_name) { $objPlugin->doAction($class_name . '_action_' . $arrBacktrace[0]['object']->getMode(), array($this)); } } elseif (is_object($arrBacktrace[0]['object'])) { $pattern = '/^[a-zA-Z0-9_]+$/'; $mode = null; if (isset($_GET['mode']) && preg_match($pattern, $_GET['mode'])) { $mode = $_GET['mode']; } elseif (isset($_POST['mode']) && preg_match($pattern, $_POST['mode'])) { $mode = $_POST['mode']; } $parent_class_name = get_parent_class($arrBacktrace[0]['object']); $objPlugin->doAction($parent_class_name . '_action_' . $mode, array($arrBacktrace[0]['object'])); $class_name = get_class($arrBacktrace[0]['object']); if ($class_name != $parent_class_name) { $objPlugin->doAction($class_name . '_action_' . $mode, array($this)); } } } // url-path → URL 変換 if ($location[0] === '/') { $netUrl = new \Net_URL($location); $location = $netUrl->getUrl(); } // URL の場合 if (preg_match('/^https?:/', $location)) { $url = $location; if (is_bool($useSsl)) { if ($useSsl) { $pattern = '/^' . preg_quote(HTTP_URL, '/') . '(.*)/'; $replacement = HTTPS_URL . '\\1'; $url = preg_replace($pattern, $replacement, $url); } else { $pattern = '/^' . preg_quote(HTTPS_URL, '/') . '(.*)/'; $replacement = HTTP_URL . '\\1'; $url = preg_replace($pattern, $replacement, $url); } } // 現在のURLからのパス } else { if (!is_bool($useSsl)) { $useSsl = Utils::sfIsHTTPS(); } $netUrl = new \Net_URL($useSsl ? HTTPS_URL : HTTP_URL); $netUrl->path = dirname($_SERVER['SCRIPT_NAME']) . '/' . $location; $url = $netUrl->getUrl(); } $pattern = '/^(' . preg_quote(HTTP_URL, '/') . '|' . preg_quote(HTTPS_URL, '/') . ')/'; // アプリケーション外へのリダイレクトは扱わない if (preg_match($pattern, $url) === 0) { trigger_error('', E_USER_ERROR); } $netUrl = new \Net_URL($url); if ($inheritQueryString && !empty($_SERVER['QUERY_STRING'])) { $arrQueryStringBackup = $netUrl->querystring; // XXX メソッド名は add で始まるが、実際には置換を行う $netUrl->addRawQueryString($_SERVER['QUERY_STRING']); $netUrl->querystring = array_merge($netUrl->querystring, $arrQueryStringBackup); } $netUrl->querystring = array_merge($netUrl->querystring, $arrQueryString); $session = SessionFactory::getInstance(); if (Application::alias('eccube.display')->detectDevice() == DEVICE_TYPE_MOBILE || $session->useCookie() == false) { $netUrl->addQueryString(session_name(), session_id()); } $netUrl->addQueryString(TRANSACTION_ID_NAME, SessionHelper::getToken()); $url = $netUrl->getURL(); header("Location: {$url}"); exit; }
/** * Add product to authenticated user's favorites. (for Smart phone) * * @param Customer $objCustomer * @return void */ public function doAddFavoriteSphone(Customer $objCustomer) { // ログイン中のユーザが商品をお気に入りにいれる処理(スマートフォン用) if ($objCustomer->isLoginSuccess() === true && $this->objFormParam->getValue('favorite_product_id') > 0) { $this->arrErr = $this->lfCheckError($this->mode, $this->objFormParam); if (count($this->arrErr) == 0) { if ($this->lfRegistFavoriteProduct($this->objFormParam->getValue('favorite_product_id'), $objCustomer->getValue('customer_id'))) { $objPlugin = PluginHelper::getSingletonInstance($this->plugin_activate_flg); $objPlugin->doAction('LC_Page_Products_Detail_action_add_favorite_sphone', array($this)); print 'true'; Application::alias('eccube.response')->actionExit(); } } print 'error'; Application::alias('eccube.response')->actionExit(); } }
/** * クラスのオートローディング本体 * * LC_* には対応していない。 * @return void */ public static function autoload($class) { $arrClassNamePart = explode('_', $class); $is_ex = end($arrClassNamePart) === 'Ex'; $count = count($arrClassNamePart); $classpath = $is_ex ? CLASS_EX_REALDIR : CLASS_REALDIR; if (($arrClassNamePart[0] === 'GC' || $arrClassNamePart[0] === 'SC') && $arrClassNamePart[1] === 'Utils') { $classpath .= $is_ex ? 'util_extends/' : 'util/'; } elseif ($arrClassNamePart[0] === 'SC' && $is_ex === true && $count >= 4) { $arrClassNamePartTemp = $arrClassNamePart; // FIXME クラスファイルのディレクトリ命名が変。変な現状に合わせて強引な処理をしてる。 $arrClassNamePartTemp[1] = $arrClassNamePartTemp[1] . '_extends'; $classpath .= strtolower(implode('/', array_slice($arrClassNamePartTemp, 1, -2))) . '/'; } elseif ($arrClassNamePart[0] === 'SC' && $is_ex === false && $count >= 3) { $classpath .= strtolower(implode('/', array_slice($arrClassNamePart, 1, -1))) . '/'; } elseif ($arrClassNamePart[0] === 'SC') { // 処理なし } else { // PEAR用 // FIXME トリッキー $classpath = ''; $class = str_replace('_', '/', $class); } $classpath .= "{$class}.php"; // プラグイン向けフックポイント // MEMO: プラグインのローダーがDB接続を必要とするため、Queryがロードされた後のみ呼び出される。 // プラグイン情報のキャッシュ化が行われれば、全部にフックさせることを可能に? $objPlugin = PluginHelper::getSingletonInstance(true); if (is_object($objPlugin)) { // 元の設定を一時保存 $plugin_class = $class; $plugin_classpath = $classpath; $objPlugin->doAction('loadClassFileChange', array(&$plugin_class, &$plugin_classpath)); // FIXME: トリッキーな処理で _Ex ファイルを無視しないようにする(無視するとユーザーカスタマイズで分かりにくい) // XXXX_Ex がロードされる場合にextendsのchainを // XXXX_Ex -> XXXX から、 XXXX_Ex -> $class (-> XXXX) と変える。 // そうでない場合は、直接置き換えと想定して帰ってきたクラスをロードする if (is_array($plugin_class) && count($plugin_class) > 0) { $arrPluginClassName = $plugin_class; $arrPluginClassPath = $plugin_classpath; foreach ($arrPluginClassName as $key => $plugin_class) { $plugin_classpath = $arrPluginClassPath[$key]; if ($is_ex) { // Ex ファイルへのフックの場合のみチェイン変更する。 if ($parent_classname) { $exp = "/(class[ ]+{$plugin_class}[ ]+extends +)[a-zA-Z_\\-]+( *{?)/"; $replace = '$1' . $parent_classname . '$2'; $base_class_str = file_get_contents($plugin_classpath); $base_class_str = str_replace(array('<?php', '?>'), '', $base_class_str); $base_class_str = preg_replace($exp, $replace, $base_class_str, 1); eval($base_class_str); } else { include $plugin_classpath; } $parent_classname = $plugin_class; } else { include $plugin_classpath; } } if ($is_ex) { $exp = "/(class[ ]+{$class}[ ]+extends +)[a-zA-Z_\\-]+( *{?)/"; $replace = '$1' . $parent_classname . '$2'; $base_class_str = file_get_contents($classpath); $base_class_str = str_replace(array('<?php', '?>'), '', $base_class_str); $base_class_str = preg_replace($exp, $replace, $base_class_str, 1); eval($base_class_str); return; } } } if (file_exists($classpath)) { include $classpath; } else { $arrPath = explode(PATH_SEPARATOR, get_include_path()); foreach ($arrPath as $path) { if (file_exists($path . '/' . $classpath)) { include $classpath; break; } } } }
/** * Page のResponse. * * todo たいした処理でないのに異常に処理が重い * @return void */ public function sendResponse() { // TODO sendResponseをオーバーライドしている為、afterフックポイントが実行されない.直接実行する.(#1790) $objPlugin = PluginHelper::getSingletonInstance($this->plugin_activate_flg); $objPlugin->doAction('LC_Page_Mypage_DownLoad_action_after', array($this)); $this->objDisplay->noAction(); // パラメーター取得 $customer_id = $_SESSION['customer']['customer_id']; $order_id = $_GET['order_id']; $product_class_id = $_GET['product_class_id']; //DBから商品情報の読込 $arrForm = $this->lfGetRealFileName($customer_id, $order_id, $product_class_id); //ファイル情報が無い場合はNG if ($arrForm['down_realfilename'] == '') { Utils::sfDispSiteError(DOWNFILE_NOT_FOUND, '', true); } //ファイルそのものが無い場合もとりあえずNG $realpath = DOWN_SAVE_REALDIR . $arrForm['down_realfilename']; if (!file_exists($realpath)) { Utils::sfDispSiteError(DOWNFILE_NOT_FOUND, '', true); } //ファイル名をエンコードする Safariの対策はUTF-8で様子を見る $encoding = 'Shift_JIS'; if (isset($_SERVER['HTTP_USER_AGENT']) && strpos($_SERVER['HTTP_USER_AGENT'], 'Safari')) { $encoding = 'UTF-8'; } $sdown_filename = mb_convert_encoding($arrForm['down_filename'], $encoding, 'auto'); // flushなどを利用しているので、現行のDisplayは利用できません。 // DisplayやResponseに大容量ファイルレスポンスが実装されたら移行可能だと思います。 // ダウンロード実行 モバイル端末はダウンロード方法が異なる if (Application::alias('eccube.display')->detectDevice() == DEVICE_TYPE_MOBILE) { // キャリアがAUのモバイル端末はさらにダウンロード方法が異なる if (MobileUserAgent::getCarrier() == 'ezweb') { // AUモバイル $this->lfMobileAuDownload($realpath, $sdown_filename); } else { // AU以外のモバイル $this->lfMobileDownload($realpath, $sdown_filename); } } else { // PC、スマフォ $this->lfDownload($realpath, $sdown_filename); } }
/** * Page のレスポンス送信. * * @return void */ public function sendResponse() { $objPlugin = PluginHelper::getSingletonInstance($this->plugin_activate_flg); // ローカルフックポイントを実行. $this->doLocalHookpointAfter($objPlugin); // HeadNaviにpluginテンプレートを追加する. $objPlugin->setHeadNaviBlocs($this->arrPageLayout['HeadNavi']); // スーパーフックポイントを実行. $objPlugin->doAction('Eccube.Page.process', array($this)); // ページクラス名をテンプレートに渡す $arrBacktrace = debug_backtrace(); if (strlen($this->tpl_page_class_name) === 0) { $this->tpl_page_class_name = preg_replace('/Eccube(\\\\Plugin\\\\\\w+)?\\\\Page\\\\/', '', $arrBacktrace[1]['class']); } $this->objDisplay->prepare($this); $this->objDisplay->addHeader('Vary', 'User-Agent'); $this->objDisplay->response->write(); }