EC-CUBE /
ec-cube
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
| 1 | <?php |
||
| 2 | /* |
||
| 3 | * This file is part of EC-CUBE |
||
| 4 | * |
||
| 5 | * Copyright(c) 2000-2015 LOCKON CO.,LTD. All Rights Reserved. |
||
| 6 | * |
||
| 7 | * http://www.lockon.co.jp/ |
||
| 8 | * |
||
| 9 | * This program is free software; you can redistribute it and/or |
||
| 10 | * modify it under the terms of the GNU General Public License |
||
| 11 | * as published by the Free Software Foundation; either version 2 |
||
| 12 | * of the License, or (at your option) any later version. |
||
| 13 | * |
||
| 14 | * This program is distributed in the hope that it will be useful, |
||
| 15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
| 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
| 17 | * GNU General Public License for more details. |
||
| 18 | * |
||
| 19 | * You should have received a copy of the GNU General Public License |
||
| 20 | * along with this program; if not, write to the Free Software |
||
| 21 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
||
| 22 | */ |
||
| 23 | |||
| 24 | |||
| 25 | namespace Eccube\Controller\Install; |
||
| 26 | |||
| 27 | use Doctrine\DBAL\Migrations\Configuration\Configuration; |
||
| 28 | use Doctrine\DBAL\Migrations\Migration; |
||
| 29 | use Doctrine\DBAL\Migrations\MigrationException; |
||
| 30 | use Doctrine\ORM\EntityManager; |
||
| 31 | use Doctrine\ORM\Tools\SchemaTool; |
||
| 32 | use Eccube\Application; |
||
| 33 | use Eccube\Common\Constant; |
||
| 34 | use Eccube\InstallApplication; |
||
| 35 | use Eccube\Util\Str; |
||
| 36 | use Symfony\Component\Filesystem\Filesystem; |
||
| 37 | use Symfony\Component\Finder\Finder; |
||
| 38 | use Symfony\Component\Form\Form; |
||
| 39 | use Symfony\Component\HttpFoundation\Request; |
||
| 40 | use Symfony\Component\Yaml\Yaml; |
||
| 41 | |||
| 42 | class InstallController |
||
| 43 | { |
||
| 44 | private $app; |
||
| 45 | |||
| 46 | private $PDO; |
||
| 47 | private $session_data; |
||
| 48 | |||
| 49 | private $required_modules = array('pdo', 'phar', 'mbstring', 'zlib', 'ctype', 'session', 'JSON', 'xml', 'libxml', 'OpenSSL', 'zip', 'cURL', 'fileinfo'); |
||
| 50 | private $recommended_module = array('hash', 'mcrypt'); |
||
| 51 | |||
| 52 | // path |
||
| 53 | private $config_path; |
||
| 54 | private $dist_path; |
||
| 55 | private $cache_path; |
||
| 56 | |||
| 57 | const SESSION_KEY = 'eccube.session.install'; |
||
| 58 | |||
| 59 | 5 | public function setup(InstallApplication $app) |
|
|
0 ignored issues
–
show
introduced
by
Loading history...
|
|||
| 60 | { |
||
| 61 | 5 | $this->app = $app; |
|
| 62 | |||
| 63 | 5 | $this->config_path = $this->app->rootDir . '/app/config/eccube'; |
|
| 64 | 5 | $this->dist_path = __DIR__ . '/../../Resource/config'; |
|
| 65 | 5 | $this->cache_path = $this->app->rootDir . '/app/cache'; |
|
| 66 | } |
||
| 67 | |||
| 68 | /** |
||
| 69 | * 最初からやり直す場合、SESSION情報をクリア |
||
| 70 | * |
||
| 71 | * @param InstallApplication $app |
||
| 72 | * @param Request $request |
||
|
0 ignored issues
–
show
|
|||
| 73 | */ |
||
|
0 ignored issues
–
show
|
|||
| 74 | 1 | public function index(InstallApplication $app, Request $request) |
|
| 75 | { |
||
| 76 | $this->setup($app); |
||
| 77 | |||
| 78 | $request->getSession()->remove(self::SESSION_KEY); |
||
| 79 | |||
| 80 | return $app->redirect($app->url('install_step1')); |
||
| 81 | 1 | } |
|
| 82 | |||
| 83 | /** |
||
| 84 | * ようこそ |
||
| 85 | * |
||
| 86 | * @param InstallApplication $app |
||
| 87 | * @param Request $request |
||
|
0 ignored issues
–
show
|
|||
| 88 | */ |
||
|
0 ignored issues
–
show
|
|||
| 89 | 1 | public function step1(InstallApplication $app, Request $request) |
|
| 90 | { |
||
| 91 | $this->setup($app); |
||
| 92 | |||
| 93 | $form = $app['form.factory'] |
||
| 94 | ->createBuilder('install_step1') |
||
| 95 | ->getForm(); |
||
| 96 | $sessionData = $this->getSessionData($request); |
||
| 97 | $form->setData($sessionData); |
||
| 98 | |||
| 99 | if ($this->isValid($request, $form)) { |
||
| 100 | return $app->redirect($app->url('install_step2')); |
||
| 101 | } |
||
| 102 | |||
| 103 | $this->checkModules(); |
||
| 104 | |||
| 105 | 1 | return $app['twig']->render('step1.twig', array( |
|
| 106 | 1 | 'form' => $form->createView(), |
|
| 107 | )); |
||
| 108 | 1 | } |
|
| 109 | |||
| 110 | /** |
||
| 111 | * 権限チェック |
||
| 112 | * |
||
| 113 | * @param InstallApplication $app |
||
| 114 | * @param Request $request |
||
|
0 ignored issues
–
show
|
|||
| 115 | */ |
||
|
0 ignored issues
–
show
|
|||
| 116 | 1 | public function step2(InstallApplication $app, Request $request) |
|
| 117 | { |
||
| 118 | $this->setup($app); |
||
| 119 | |||
| 120 | $this->getSessionData($request); |
||
| 121 | |||
| 122 | $protectedDirs = $this->getProtectedDirs(); |
||
| 123 | |||
| 124 | // 権限がある場合, キャッシュディレクトリをクリア |
||
| 125 | 1 | if (empty($protectedDirs)) { |
|
| 126 | 1 | $finder = Finder::create() |
|
| 127 | 1 | ->in($this->cache_path) |
|
| 128 | 1 | ->directories() |
|
| 129 | ->depth(0); |
||
| 130 | $fs = new Filesystem(); |
||
| 131 | $fs->remove($finder); |
||
| 132 | } |
||
| 133 | |||
| 134 | 1 | return $app['twig']->render('step2.twig', array( |
|
| 135 | 'protectedDirs' => $protectedDirs, |
||
| 136 | )); |
||
| 137 | 1 | } |
|
| 138 | |||
| 139 | /** |
||
| 140 | * サイトの設定 |
||
| 141 | * |
||
| 142 | * @param InstallApplication $app |
||
| 143 | * @param Request $request |
||
|
0 ignored issues
–
show
|
|||
| 144 | */ |
||
|
0 ignored issues
–
show
|
|||
| 145 | public function step3(InstallApplication $app, Request $request) |
||
| 146 | { |
||
| 147 | $this->setup($app); |
||
| 148 | |||
| 149 | $form = $app['form.factory'] |
||
| 150 | ->createBuilder('install_step3') |
||
| 151 | ->getForm(); |
||
| 152 | $sessionData = $this->getSessionData($request); |
||
| 153 | |||
| 154 | if (empty($sessionData['shop_name'])) { |
||
| 155 | |||
| 156 | $config_file = $this->config_path . '/config.yml'; |
||
|
0 ignored issues
–
show
|
|||
| 157 | $fs = new Filesystem(); |
||
| 158 | |||
| 159 | if ($fs->exists($config_file)) { |
||
| 160 | // すでに登録されていた場合、登録データを表示 |
||
| 161 | $this->setPDO(); |
||
| 162 | $stmt = $this->PDO->query("SELECT shop_name, email01 FROM dtb_base_info WHERE id = 1;"); |
||
| 163 | |||
| 164 | foreach ($stmt as $row) { |
||
| 165 | $sessionData['shop_name'] = $row['shop_name']; |
||
| 166 | $sessionData['email'] = $row['email01']; |
||
| 167 | } |
||
| 168 | |||
| 169 | // セキュリティの設定 |
||
| 170 | $config_file = $this->config_path . '/path.yml'; |
||
|
0 ignored issues
–
show
|
|||
| 171 | $config = Yaml::parse(file_get_contents($config_file)); |
||
| 172 | $sessionData['admin_dir'] = $config['admin_route']; |
||
| 173 | |||
| 174 | $config_file = $this->config_path . '/config.yml'; |
||
|
0 ignored issues
–
show
|
|||
| 175 | $config = Yaml::parse(file_get_contents($config_file)); |
||
| 176 | |||
| 177 | $allowHost = $config['admin_allow_host']; |
||
| 178 | if (count($allowHost) > 0) { |
||
| 179 | $sessionData['admin_allow_hosts'] = Str::convertLineFeed(implode("\n", $allowHost)); |
||
| 180 | } |
||
| 181 | $sessionData['admin_force_ssl'] = (bool)$config['force_ssl']; |
||
| 182 | |||
| 183 | // メール設定 |
||
| 184 | $config_file = $this->config_path . '/mail.yml'; |
||
| 185 | $config = Yaml::parse(file_get_contents($config_file)); |
||
| 186 | $mail = $config['mail']; |
||
| 187 | $sessionData['mail_backend'] = $mail['transport']; |
||
| 188 | $sessionData['smtp_host'] = $mail['host']; |
||
| 189 | $sessionData['smtp_port'] = $mail['port']; |
||
| 190 | $sessionData['smtp_username'] = $mail['username']; |
||
| 191 | $sessionData['smtp_password'] = $mail['password']; |
||
| 192 | } else { |
||
| 193 | // 初期値にmailを設定 |
||
| 194 | $sessionData['mail_backend'] = 'mail'; |
||
| 195 | } |
||
| 196 | } |
||
| 197 | |||
| 198 | $form->setData($sessionData); |
||
| 199 | if ($this->isValid($request, $form)) { |
||
| 200 | $data = $form->getData(); |
||
| 201 | |||
| 202 | return $app->redirect($app->url('install_step4')); |
||
| 203 | } |
||
| 204 | |||
| 205 | return $app['twig']->render('step3.twig', array( |
||
| 206 | 'form' => $form->createView(), |
||
| 207 | )); |
||
| 208 | } |
||
| 209 | |||
| 210 | /** |
||
| 211 | * データベースの設定 |
||
| 212 | * |
||
| 213 | * @param InstallApplication $app |
||
| 214 | * @param Request $request |
||
|
0 ignored issues
–
show
|
|||
| 215 | */ |
||
|
0 ignored issues
–
show
|
|||
| 216 | public function step4(InstallApplication $app, Request $request) |
||
| 217 | { |
||
| 218 | $this->setup($app); |
||
| 219 | |||
| 220 | $form = $app['form.factory'] |
||
| 221 | ->createBuilder('install_step4') |
||
| 222 | ->getForm(); |
||
| 223 | |||
| 224 | $sessionData = $this->getSessionData($request); |
||
| 225 | |||
| 226 | if (empty($sessionData['database'])) { |
||
| 227 | |||
| 228 | $config_file = $this->config_path.'/database.yml'; |
||
| 229 | $fs = new Filesystem(); |
||
| 230 | |||
| 231 | if ($fs->exists($config_file)) { |
||
| 232 | // すでに登録されていた場合、登録データを表示 |
||
| 233 | |||
| 234 | // データベース設定 |
||
| 235 | $config = Yaml::parse(file_get_contents($config_file)); |
||
| 236 | $database = $config['database']; |
||
| 237 | $sessionData['database'] = $database['driver']; |
||
| 238 | if ($database['driver'] != 'pdo_sqlite') { |
||
| 239 | $sessionData['database_host'] = $database['host']; |
||
| 240 | $sessionData['database_port'] = $database['port']; |
||
| 241 | $sessionData['database_name'] = $database['dbname']; |
||
| 242 | $sessionData['database_user'] = $database['user']; |
||
| 243 | $sessionData['database_password'] = $database['password']; |
||
| 244 | } |
||
| 245 | } |
||
| 246 | } |
||
| 247 | |||
| 248 | $form->setData($sessionData); |
||
| 249 | |||
| 250 | if ($this->isValid($request, $form)) { |
||
|
0 ignored issues
–
show
|
|||
| 251 | |||
| 252 | return $app->redirect($app->url('install_step5')); |
||
| 253 | } |
||
| 254 | |||
| 255 | return $app['twig']->render('step4.twig', array( |
||
| 256 | 'form' => $form->createView(), |
||
| 257 | )); |
||
| 258 | } |
||
| 259 | |||
| 260 | /** |
||
| 261 | * データベースの初期化 |
||
| 262 | * |
||
| 263 | * @param InstallApplication $app |
||
| 264 | * @param Request $request |
||
|
0 ignored issues
–
show
|
|||
| 265 | */ |
||
|
0 ignored issues
–
show
|
|||
| 266 | 1 | public function step5(InstallApplication $app, Request $request) |
|
| 267 | { |
||
| 268 | $this->setup($app); |
||
| 269 | |||
| 270 | set_time_limit(0); |
||
| 271 | $form = $app['form.factory'] |
||
| 272 | ->createBuilder('install_step5') |
||
| 273 | ->getForm(); |
||
| 274 | $sessionData = $this->getSessionData($request); |
||
| 275 | $form->setData($sessionData); |
||
| 276 | |||
| 277 | if ($this->isValid($request, $form)) { |
||
|
0 ignored issues
–
show
|
|||
| 278 | |||
| 279 | $this |
||
| 280 | ->createDatabaseYamlFile($sessionData) |
||
| 281 | ->createMailYamlFile($sessionData) |
||
| 282 | ->createPathYamlFile($sessionData, $request); |
||
| 283 | |||
| 284 | if (!$form['no_update']->getData()) { |
||
| 285 | set_time_limit(0); |
||
| 286 | $this->createConfigYamlFile($sessionData); |
||
| 287 | |||
| 288 | $this |
||
| 289 | ->setPDO() |
||
| 290 | ->dropTables() |
||
| 291 | ->createTables() |
||
| 292 | ->doMigrate() |
||
| 293 | ->insert(); |
||
| 294 | } else { |
||
| 295 | // データベースを初期化しない場合、auth_magicは初期化しない |
||
| 296 | $this->createConfigYamlFile($sessionData, false); |
||
| 297 | |||
| 298 | $this |
||
| 299 | ->setPDO() |
||
| 300 | ->update(); |
||
| 301 | } |
||
| 302 | |||
| 303 | if (isset($sessionData['agree']) && $sessionData['agree'] == '1') { |
||
| 304 | $host = $request->getSchemeAndHttpHost(); |
||
| 305 | $basePath = $request->getBasePath(); |
||
| 306 | $params = array( |
||
| 307 | 'http_url' => $host . $basePath, |
||
| 308 | 'shop_name' => $sessionData['shop_name'], |
||
| 309 | ); |
||
| 310 | |||
| 311 | $this->sendAppData($params); |
||
| 312 | } |
||
| 313 | $this->addInstallStatus(); |
||
| 314 | |||
| 315 | $request->getSession()->remove(self::SESSION_KEY); |
||
| 316 | |||
| 317 | return $app->redirect($app->url('install_complete')); |
||
| 318 | } |
||
| 319 | |||
| 320 | 1 | return $app['twig']->render('step5.twig', array( |
|
| 321 | 1 | 'form' => $form->createView(), |
|
| 322 | )); |
||
| 323 | 1 | } |
|
| 324 | |||
| 325 | /** |
||
| 326 | * インストール完了 |
||
| 327 | * |
||
| 328 | * @param InstallApplication $app |
||
| 329 | * @param Request $request |
||
|
0 ignored issues
–
show
|
|||
| 330 | */ |
||
|
0 ignored issues
–
show
|
|||
| 331 | 1 | public function complete(InstallApplication $app, Request $request) |
|
| 332 | { |
||
| 333 | $this->setup($app); |
||
| 334 | |||
| 335 | 1 | $config_file = $this->config_path . '/path.yml'; |
|
|
0 ignored issues
–
show
|
|||
| 336 | $config = Yaml::parse(file_get_contents($config_file)); |
||
| 337 | |||
| 338 | $host = $request->getSchemeAndHttpHost(); |
||
| 339 | $basePath = $request->getBasePath(); |
||
| 340 | |||
| 341 | 1 | $adminUrl = $host . $basePath . '/' . $config['admin_dir']; |
|
| 342 | |||
| 343 | 1 | return $app['twig']->render('complete.twig', array( |
|
| 344 | 'admin_url' => $adminUrl, |
||
| 345 | )); |
||
| 346 | 1 | } |
|
| 347 | |||
| 348 | /** |
||
| 349 | * マイグレーション画面を表示する. |
||
| 350 | * |
||
| 351 | * @param InstallApplication $app |
||
| 352 | * @param Request $request |
||
|
0 ignored issues
–
show
|
|||
| 353 | * |
||
| 354 | * @return \Symfony\Component\HttpFoundation\Response |
||
| 355 | */ |
||
| 356 | public function migration(InstallApplication $app, Request $request) |
||
| 357 | { |
||
| 358 | return $app['twig']->render('migration.twig'); |
||
| 359 | } |
||
| 360 | |||
| 361 | /** |
||
| 362 | * インストール済プラグインの一覧を表示する. |
||
| 363 | * プラグインがインストールされていない場合は, マイグレーション実行画面へリダイレクトする. |
||
| 364 | * |
||
| 365 | * @param InstallApplication $app |
||
| 366 | * @param Request $request |
||
|
0 ignored issues
–
show
|
|||
| 367 | * |
||
| 368 | * @return \Symfony\Component\HttpFoundation\Response |
||
| 369 | */ |
||
| 370 | public function migration_plugin(InstallApplication $app, Request $request) |
||
| 371 | { |
||
| 372 | $eccube = \Eccube\Application::getInstance(); |
||
| 373 | $eccube->initialize(); |
||
| 374 | $eccube->boot(); |
||
| 375 | |||
| 376 | $pluginRepository = $eccube['orm.em']->getRepository('Eccube\Entity\Plugin'); |
||
| 377 | $Plugins = $pluginRepository->findBy(array('del_flg' => Constant::DISABLED)); |
||
| 378 | |||
| 379 | if (empty($Plugins)) { |
||
| 380 | // インストール済プラグインがない場合はマイグレーション実行画面へリダイレクト. |
||
| 381 | return $app->redirect($app->url('migration_end')); |
||
| 382 | } else { |
||
| 383 | return $app['twig']->render('migration_plugin.twig', array( |
||
| 384 | 'Plugins' => $Plugins, |
||
| 385 | 'version' => Constant::VERSION)); |
||
| 386 | } |
||
| 387 | } |
||
| 388 | |||
| 389 | /** |
||
| 390 | * マイグレーションを実行し, 完了画面を表示させる |
||
| 391 | * |
||
| 392 | * @param InstallApplication $app |
||
| 393 | * @param Request $request |
||
|
0 ignored issues
–
show
|
|||
| 394 | * |
||
| 395 | * @return \Symfony\Component\HttpFoundation\Response |
||
| 396 | */ |
||
| 397 | public function migration_end(InstallApplication $app, Request $request) |
||
| 398 | { |
||
| 399 | $this->doMigrate(); |
||
| 400 | |||
| 401 | $config_app = new \Eccube\Application(); // install用のappだとconfigが取れないので |
||
| 402 | $config_app->initialize(); |
||
| 403 | $config_app->boot(); |
||
| 404 | \Eccube\Util\Cache::clear($config_app, true); |
||
| 405 | |||
| 406 | return $app['twig']->render('migration_end.twig'); |
||
| 407 | } |
||
| 408 | |||
| 409 | 2 | private function isValid(Request $request, Form $form) |
|
| 410 | { |
||
| 411 | $session = $request->getSession(); |
||
| 412 | if ('POST' === $request->getMethod()) { |
||
| 413 | $form->handleRequest($request); |
||
| 414 | if ($form->isValid()) { |
||
| 415 | $sessionData = $session->get(self::SESSION_KEY) ?: array(); |
||
| 416 | $formData = array_replace_recursive($sessionData, $form->getData()); |
||
| 417 | $session->set(self::SESSION_KEY, $formData); |
||
| 418 | |||
| 419 | return true; |
||
| 420 | } |
||
| 421 | } |
||
| 422 | |||
| 423 | 2 | return false; |
|
| 424 | 2 | } |
|
| 425 | |||
| 426 | 3 | private function getSessionData(Request $request) |
|
| 427 | { |
||
| 428 | $this->session_data = $request->getSession()->get(self::SESSION_KEY); |
||
| 429 | |||
| 430 | 3 | return $this->session_data; |
|
| 431 | 3 | } |
|
| 432 | |||
| 433 | private function resetNatTimer() |
||
| 434 | { |
||
| 435 | // NATの無通信タイマ対策(仮) |
||
| 436 | echo str_repeat(' ', 4 * 1024); |
||
| 437 | ob_flush(); |
||
| 438 | flush(); |
||
| 439 | } |
||
| 440 | |||
| 441 | |||
| 442 | 1 | private function checkModules() |
|
|
0 ignored issues
–
show
checkModules uses the super-global variable $_SERVER which is generally not recommended.
Instead of super-globals, we recommend to explicitly inject the dependencies of your class. This makes your code less dependent on global state and it becomes generally more testable: // Bad
class Router
{
public function generate($path)
{
return $_SERVER['HOST'].$path;
}
}
// Better
class Router
{
private $host;
public function __construct($host)
{
$this->host = $host;
}
public function generate($path)
{
return $this->host.$path;
}
}
class Controller
{
public function myAction(Request $request)
{
// Instead of
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;
// Better (assuming you use the Symfony2 request)
$page = $request->query->get('page', 1);
}
}
Loading history...
|
|||
| 443 | { |
||
| 444 | 1 | foreach ($this->required_modules as $module) { |
|
| 445 | if (!extension_loaded($module)) { |
||
| 446 | $this->app->addDanger('[必須] ' . $module . ' 拡張モジュールが有効になっていません。', 'install'); |
||
|
0 ignored issues
–
show
|
|||
| 447 | } |
||
| 448 | } |
||
| 449 | |||
| 450 | if (!extension_loaded('pdo_mysql') && !extension_loaded('pdo_pgsql')) { |
||
| 451 | $this->app->addDanger('[必須] ' . 'pdo_pgsql又はpdo_mysql 拡張モジュールを有効にしてください。', 'install'); |
||
|
0 ignored issues
–
show
|
|||
| 452 | } |
||
| 453 | |||
| 454 | 1 | foreach ($this->recommended_module as $module) { |
|
| 455 | if (!extension_loaded($module)) { |
||
| 456 | $this->app->addWarning('[推奨] ' . $module . ' 拡張モジュールが有効になっていません。', 'install'); |
||
|
0 ignored issues
–
show
|
|||
| 457 | } |
||
| 458 | } |
||
| 459 | |||
| 460 | 1 | if ('\\' === DIRECTORY_SEPARATOR) { // for Windows |
|
| 461 | if (!extension_loaded('wincache')) { |
||
| 462 | $this->app->addWarning('[推奨] WinCache 拡張モジュールが有効になっていません。', 'install'); |
||
| 463 | } |
||
| 464 | } else { |
||
| 465 | if (!extension_loaded('apc')) { |
||
| 466 | $this->app->addWarning('[推奨] APC 拡張モジュールが有効になっていません。', 'install'); |
||
| 467 | } |
||
| 468 | } |
||
| 469 | |||
| 470 | 1 | if (isset($_SERVER['SERVER_SOFTWARE']) && strpos('Apache', $_SERVER['SERVER_SOFTWARE']) !== false) { |
|
| 471 | if (!function_exists('apache_get_modules')) { |
||
| 472 | $this->app->addWarning('mod_rewrite が有効になっているか不明です。', 'install'); |
||
| 473 | } elseif (!in_array('mod_rewrite', apache_get_modules())) { |
||
| 474 | $this->app->addDanger('[必須] ' . 'mod_rewriteを有効にしてください。', 'install'); |
||
|
0 ignored issues
–
show
|
|||
| 475 | } |
||
| 476 | 1 | } elseif (isset($_SERVER['SERVER_SOFTWARE']) && strpos('Microsoft-IIS', $_SERVER['SERVER_SOFTWARE']) !== false) { |
|
| 477 | // iis |
||
| 478 | 1 | } elseif (isset($_SERVER['SERVER_SOFTWARE']) && strpos('nginx', $_SERVER['SERVER_SOFTWARE']) !== false) { |
|
| 479 | // nginx |
||
| 480 | } |
||
| 481 | 1 | } |
|
| 482 | |||
| 483 | private function setPDO() |
||
| 484 | { |
||
| 485 | $config_file = $this->config_path . '/database.yml'; |
||
|
0 ignored issues
–
show
|
|||
| 486 | $config = Yaml::parse(file_get_contents($config_file)); |
||
| 487 | |||
| 488 | try { |
||
| 489 | $this->PDO = \Doctrine\DBAL\DriverManager::getConnection($config['database'], new \Doctrine\DBAL\Configuration()); |
||
| 490 | $this->PDO->connect(); |
||
| 491 | |||
|
0 ignored issues
–
show
|
|||
| 492 | } catch (\Exception $e) { |
||
| 493 | $this->PDO->close(); |
||
| 494 | throw $e; |
||
| 495 | } |
||
| 496 | |||
| 497 | return $this; |
||
| 498 | } |
||
| 499 | |||
| 500 | View Code Duplication | private function dropTables() |
|
| 501 | { |
||
| 502 | $this->resetNatTimer(); |
||
| 503 | |||
| 504 | $em = $this->getEntityManager(); |
||
| 505 | $metadatas = $em->getMetadataFactory()->getAllMetadata(); |
||
| 506 | $schemaTool = new SchemaTool($em); |
||
| 507 | |||
| 508 | $schemaTool->dropSchema($metadatas); |
||
| 509 | |||
| 510 | $em->getConnection()->executeQuery('DROP TABLE IF EXISTS doctrine_migration_versions'); |
||
| 511 | |||
| 512 | return $this; |
||
| 513 | } |
||
| 514 | |||
| 515 | /** |
||
| 516 | * @return EntityManager |
||
| 517 | */ |
||
| 518 | private function getEntityManager() |
||
| 519 | { |
||
| 520 | $config_file = $this->config_path . '/database.yml'; |
||
|
0 ignored issues
–
show
|
|||
| 521 | $database = Yaml::parse(file_get_contents($config_file)); |
||
| 522 | |||
| 523 | $this->app->register(new \Silex\Provider\DoctrineServiceProvider(), array( |
||
| 524 | 'db.options' => $database['database'] |
||
| 525 | )); |
||
| 526 | |||
| 527 | $this->app->register(new \Dflydev\Silex\Provider\DoctrineOrm\DoctrineOrmServiceProvider(), array( |
||
| 528 | 'orm.proxies_dir' => $this->app->rootDir . '/app/cache/doctrine', |
||
|
0 ignored issues
–
show
|
|||
| 529 | 'orm.em.options' => array( |
||
| 530 | 'mappings' => array( |
||
| 531 | array( |
||
| 532 | 'type' => 'yml', |
||
| 533 | 'namespace' => 'Eccube\Entity', |
||
| 534 | 'path' => array( |
||
| 535 | __DIR__ . '/../../Resource/doctrine', |
||
| 536 | __DIR__ . '/../../Resource/doctrine/master', |
||
| 537 | ), |
||
| 538 | ), |
||
| 539 | |||
| 540 | ), |
||
| 541 | ) |
||
| 542 | )); |
||
| 543 | |||
| 544 | return $em = $this->app['orm.em']; |
||
| 545 | } |
||
| 546 | |||
| 547 | View Code Duplication | private function createTables() |
|
| 548 | { |
||
| 549 | $this->resetNatTimer(); |
||
| 550 | |||
| 551 | $em = $this->getEntityManager(); |
||
| 552 | $metadatas = $em->getMetadataFactory()->getAllMetadata(); |
||
| 553 | $schemaTool = new SchemaTool($em); |
||
| 554 | |||
| 555 | $schemaTool->createSchema($metadatas); |
||
| 556 | |||
| 557 | return $this; |
||
| 558 | } |
||
| 559 | |||
| 560 | private function insert() |
||
| 561 | { |
||
| 562 | $this->resetNatTimer(); |
||
| 563 | |||
| 564 | $config_file = $this->config_path . '/database.yml'; |
||
|
0 ignored issues
–
show
|
|||
| 565 | $database = Yaml::parse(file_get_contents($config_file)); |
||
| 566 | $config['database'] = $database['database']; |
||
|
0 ignored issues
–
show
Coding Style
Comprehensibility
introduced
by
$config was never initialized. Although not strictly required by PHP, it is generally a good practice to add $config = array(); before regardless.
Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code. Let’s take a look at an example: foreach ($collection as $item) {
$myArray['foo'] = $item->getFoo();
if ($item->hasBar()) {
$myArray['bar'] = $item->getBar();
}
// do something with $myArray
}
As you can see in this example, the array This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop. Loading history...
|
|||
| 567 | |||
| 568 | $config_file = $this->config_path . '/config.yml'; |
||
|
0 ignored issues
–
show
|
|||
| 569 | $baseConfig = Yaml::parse(file_get_contents($config_file)); |
||
| 570 | $config['config'] = $baseConfig; |
||
| 571 | |||
| 572 | $this->PDO->beginTransaction(); |
||
| 573 | |||
| 574 | try { |
||
|
0 ignored issues
–
show
|
|||
| 575 | |||
| 576 | $config = array( |
||
| 577 | 'auth_type' => '', |
||
| 578 | 'auth_magic' => $config['config']['auth_magic'], |
||
| 579 | 'password_hash_algos' => 'sha256', |
||
| 580 | ); |
||
| 581 | $passwordEncoder = new \Eccube\Security\Core\Encoder\PasswordEncoder($config); |
||
| 582 | $salt = \Eccube\Util\Str::random(32); |
||
| 583 | |||
| 584 | $encodedPassword = $passwordEncoder->encodePassword($this->session_data['login_pass'], $salt); |
||
| 585 | $sth = $this->PDO->prepare('INSERT INTO dtb_base_info ( |
||
| 586 | id, |
||
| 587 | shop_name, |
||
| 588 | email01, |
||
| 589 | email02, |
||
| 590 | email03, |
||
| 591 | email04, |
||
| 592 | update_date, |
||
| 593 | option_product_tax_rule |
||
| 594 | ) VALUES ( |
||
| 595 | 1, |
||
| 596 | :shop_name, |
||
| 597 | :admin_mail, |
||
| 598 | :admin_mail, |
||
| 599 | :admin_mail, |
||
| 600 | :admin_mail, |
||
| 601 | current_timestamp, |
||
| 602 | 0);'); |
||
| 603 | $sth->execute(array( |
||
|
0 ignored issues
–
show
|
|||
| 604 | ':shop_name' => $this->session_data['shop_name'], |
||
| 605 | ':admin_mail' => $this->session_data['email'] |
||
| 606 | )); |
||
| 607 | |||
| 608 | $sth = $this->PDO->prepare("INSERT INTO dtb_member (member_id, login_id, password, salt, work, del_flg, authority, creator_id, rank, update_date, create_date,name,department) VALUES (2, :login_id, :admin_pass , :salt , '1', '0', '0', '1', '1', current_timestamp, current_timestamp,'管理者','EC-CUBE SHOP');"); |
||
| 609 | $sth->execute(array(':login_id' => $this->session_data['login_id'], ':admin_pass' => $encodedPassword, ':salt' => $salt)); |
||
| 610 | |||
| 611 | $this->PDO->commit(); |
||
| 612 | } catch (\Exception $e) { |
||
| 613 | $this->PDO->rollback(); |
||
| 614 | throw $e; |
||
| 615 | } |
||
| 616 | |||
| 617 | return $this; |
||
| 618 | } |
||
| 619 | |||
| 620 | private function update() |
||
| 621 | { |
||
| 622 | $this->resetNatTimer(); |
||
| 623 | |||
| 624 | $config_file = $this->config_path . '/database.yml'; |
||
|
0 ignored issues
–
show
|
|||
| 625 | $database = Yaml::parse(file_get_contents($config_file)); |
||
| 626 | $config['database'] = $database['database']; |
||
|
0 ignored issues
–
show
Coding Style
Comprehensibility
introduced
by
$config was never initialized. Although not strictly required by PHP, it is generally a good practice to add $config = array(); before regardless.
Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code. Let’s take a look at an example: foreach ($collection as $item) {
$myArray['foo'] = $item->getFoo();
if ($item->hasBar()) {
$myArray['bar'] = $item->getBar();
}
// do something with $myArray
}
As you can see in this example, the array This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop. Loading history...
|
|||
| 627 | |||
| 628 | $config_file = $this->config_path . '/config.yml'; |
||
|
0 ignored issues
–
show
|
|||
| 629 | $baseConfig = Yaml::parse(file_get_contents($config_file)); |
||
| 630 | $config['config'] = $baseConfig; |
||
| 631 | |||
| 632 | $this->PDO->beginTransaction(); |
||
| 633 | |||
| 634 | try { |
||
| 635 | $config = array( |
||
| 636 | 'auth_type' => '', |
||
| 637 | 'auth_magic' => $config['config']['auth_magic'], |
||
| 638 | 'password_hash_algos' => 'sha256', |
||
| 639 | ); |
||
| 640 | $passwordEncoder = new \Eccube\Security\Core\Encoder\PasswordEncoder($config); |
||
| 641 | $salt = \Eccube\Util\Str::random(32); |
||
| 642 | |||
| 643 | $stmt = $this->PDO->prepare("SELECT member_id FROM dtb_member WHERE login_id = :login_id;"); |
||
| 644 | $stmt->execute(array(':login_id' => $this->session_data['login_id'])); |
||
| 645 | $rs = $stmt->fetch(); |
||
| 646 | |||
| 647 | $encodedPassword = $passwordEncoder->encodePassword($this->session_data['login_pass'], $salt); |
||
| 648 | |||
| 649 | if ($rs) { |
||
| 650 | // 同一の管理者IDであればパスワードのみ更新 |
||
| 651 | $sth = $this->PDO->prepare("UPDATE dtb_member set password = :admin_pass, salt = :salt, update_date = current_timestamp WHERE login_id = :login_id;"); |
||
| 652 | $sth->execute(array(':admin_pass' => $encodedPassword, ':salt' => $salt, ':login_id' => $this->session_data['login_id'])); |
||
| 653 | |||
|
0 ignored issues
–
show
|
|||
| 654 | } else { |
||
| 655 | // 新しい管理者IDが入力されたらinsert |
||
| 656 | $sth = $this->PDO->prepare("INSERT INTO dtb_member (login_id, password, salt, work, del_flg, authority, creator_id, rank, update_date, create_date,name,department) VALUES (:login_id, :admin_pass , :salt , '1', '0', '0', '1', '1', current_timestamp, current_timestamp,'管理者','EC-CUBE SHOP');"); |
||
| 657 | $sth->execute(array(':login_id' => $this->session_data['login_id'], ':admin_pass' => $encodedPassword, ':salt' => $salt)); |
||
| 658 | } |
||
| 659 | |||
| 660 | $sth = $this->PDO->prepare('UPDATE dtb_base_info set |
||
| 661 | shop_name = :shop_name, |
||
| 662 | email01 = :admin_mail, |
||
| 663 | email02 = :admin_mail, |
||
| 664 | email03 = :admin_mail, |
||
| 665 | email04 = :admin_mail, |
||
| 666 | update_date = current_timestamp |
||
| 667 | WHERE id = 1;'); |
||
| 668 | $sth->execute(array( |
||
|
0 ignored issues
–
show
|
|||
| 669 | ':shop_name' => $this->session_data['shop_name'], |
||
| 670 | ':admin_mail' => $this->session_data['email'] |
||
| 671 | )); |
||
| 672 | |||
| 673 | $this->PDO->commit(); |
||
| 674 | } catch (\Exception $e) { |
||
| 675 | $this->PDO->rollback(); |
||
| 676 | throw $e; |
||
| 677 | } |
||
| 678 | |||
| 679 | return $this; |
||
| 680 | } |
||
| 681 | |||
| 682 | |||
| 683 | private function getMigration() |
||
| 684 | { |
||
| 685 | $eccube = \Eccube\Application::getInstance(); |
||
| 686 | $eccube->initialize(); |
||
| 687 | $eccube->boot(); |
||
| 688 | |||
| 689 | $config = new Configuration($eccube['db']); |
||
| 690 | $config->setMigrationsNamespace('DoctrineMigrations'); |
||
| 691 | |||
| 692 | $migrationDir = __DIR__ . '/../../Resource/doctrine/migration'; |
||
| 693 | $config->setMigrationsDirectory($migrationDir); |
||
| 694 | $config->registerMigrationsFromDirectory($migrationDir); |
||
| 695 | |||
| 696 | $migration = new Migration($config); |
||
| 697 | |||
| 698 | return $migration; |
||
| 699 | } |
||
| 700 | |||
| 701 | private function doMigrate() |
||
| 702 | { |
||
| 703 | try { |
||
| 704 | $migration = $this->getMigration(); |
||
| 705 | |||
| 706 | // DBとのコネクションを維持するためpingさせる |
||
| 707 | if (is_null($this->PDO)) { |
||
| 708 | $this->setPDO(); |
||
| 709 | } |
||
| 710 | $this->PDO->ping(); |
||
| 711 | |||
| 712 | // nullを渡すと最新バージョンまでマイグレートする |
||
| 713 | $migration->migrate(null, false); |
||
| 714 | } catch (MigrationException $e) { |
||
| 715 | } |
||
| 716 | |||
| 717 | return $this; |
||
| 718 | } |
||
| 719 | |||
| 720 | 1 | private function getProtectedDirs() |
|
| 721 | { |
||
| 722 | 1 | $protectedDirs = array(); |
|
| 723 | 1 | $base = $this->app->rootDir; |
|
| 724 | $dirs = array( |
||
| 725 | '/html', |
||
| 726 | '/app', |
||
| 727 | '/app/template', |
||
| 728 | '/app/cache', |
||
| 729 | '/app/config', |
||
| 730 | '/app/config/eccube', |
||
| 731 | '/app/log', |
||
| 732 | '/app/Plugin', |
||
| 733 | 1 | ); |
|
| 734 | |||
| 735 | foreach ($dirs as $dir) { |
||
| 736 | if (!is_writable($base . $dir)) { |
||
| 737 | $protectedDirs[] = $dir; |
||
| 738 | } |
||
| 739 | } |
||
| 740 | |||
| 741 | 1 | return $protectedDirs; |
|
| 742 | } |
||
| 743 | |||
| 744 | private function createConfigYamlFile($data, $auth = true) |
||
| 745 | { |
||
| 746 | $fs = new Filesystem(); |
||
| 747 | $config_file = $this->config_path . '/config.yml'; |
||
| 748 | |||
| 749 | if ($fs->exists($config_file)) { |
||
| 750 | $config = Yaml::parse(file_get_contents($config_file)); |
||
| 751 | $fs->remove($config_file); |
||
| 752 | } |
||
| 753 | |||
| 754 | if ($auth) { |
||
| 755 | $auth_magic = Str::random(32); |
||
| 756 | } else { |
||
| 757 | if (isset($config['auth_magic'])) { |
||
| 758 | $auth_magic = $config['auth_magic']; |
||
| 759 | } else { |
||
| 760 | $auth_magic = Str::random(32); |
||
| 761 | } |
||
| 762 | } |
||
| 763 | |||
| 764 | $allowHost = Str::convertLineFeed($data['admin_allow_hosts']); |
||
| 765 | if (empty($allowHost)) { |
||
| 766 | $adminAllowHosts = array(); |
||
| 767 | } else { |
||
| 768 | $adminAllowHosts = explode("\n", $allowHost); |
||
| 769 | } |
||
| 770 | |||
| 771 | $target = array('${AUTH_MAGIC}', '${SHOP_NAME}', '${ECCUBE_INSTALL}', '${FORCE_SSL}'); |
||
| 772 | $replace = array($auth_magic, $data['shop_name'], '0', $data['admin_force_ssl']); |
||
| 773 | |||
| 774 | $fs = new Filesystem(); |
||
| 775 | $content = str_replace( |
||
| 776 | $target, |
||
| 777 | $replace, |
||
| 778 | file_get_contents($this->dist_path . '/config.yml.dist') |
||
| 779 | ); |
||
| 780 | $fs->dumpFile($config_file, $content); |
||
| 781 | |||
| 782 | $config = Yaml::parse(file_get_contents($config_file)); |
||
| 783 | $config['admin_allow_host'] = $adminAllowHosts; |
||
| 784 | $yml = Yaml::dump($config); |
||
| 785 | file_put_contents($config_file, $yml); |
||
| 786 | |||
| 787 | return $this; |
||
| 788 | } |
||
| 789 | |||
| 790 | private function addInstallStatus() |
||
| 791 | { |
||
| 792 | $config_file = $this->config_path . '/config.yml'; |
||
|
0 ignored issues
–
show
|
|||
| 793 | $config = Yaml::parse(file_get_contents($config_file)); |
||
| 794 | $config['eccube_install'] = 1; |
||
| 795 | $yml = Yaml::dump($config); |
||
| 796 | file_put_contents($config_file, $yml); |
||
| 797 | |||
| 798 | return $this; |
||
| 799 | } |
||
| 800 | |||
| 801 | private function createDatabaseYamlFile($data) |
||
| 802 | { |
||
| 803 | $fs = new Filesystem(); |
||
| 804 | $config_file = $this->config_path . '/database.yml'; |
||
|
0 ignored issues
–
show
|
|||
| 805 | if ($fs->exists($config_file)) { |
||
| 806 | $fs->remove($config_file); |
||
| 807 | } |
||
| 808 | |||
| 809 | if ($data['database'] != 'pdo_sqlite') { |
||
| 810 | switch ($data['database']) { |
||
| 811 | case 'pdo_pgsql': |
||
| 812 | if (empty($data['db_port'])) { |
||
| 813 | $data['db_port'] = '5432'; |
||
| 814 | } |
||
| 815 | $data['db_driver'] = 'pdo_pgsql'; |
||
| 816 | break; |
||
| 817 | case 'pdo_mysql': |
||
| 818 | if (empty($data['db_port'])) { |
||
| 819 | $data['db_port'] = '3306'; |
||
| 820 | } |
||
| 821 | $data['db_driver'] = 'pdo_mysql'; |
||
| 822 | break; |
||
| 823 | } |
||
| 824 | $target = array('${DBDRIVER}', '${DBSERVER}', '${DBNAME}', '${DBPORT}', '${DBUSER}', '${DBPASS}'); |
||
| 825 | $replace = array( |
||
| 826 | $data['db_driver'], |
||
| 827 | $data['database_host'], |
||
| 828 | $data['database_name'], |
||
| 829 | $data['database_port'], |
||
| 830 | $data['database_user'], |
||
| 831 | $data['database_password'] |
||
| 832 | ); |
||
| 833 | |||
| 834 | $fs = new Filesystem(); |
||
| 835 | $content = str_replace( |
||
| 836 | $target, |
||
| 837 | $replace, |
||
| 838 | file_get_contents($this->dist_path . '/database.yml.dist') |
||
| 839 | ); |
||
| 840 | |||
|
0 ignored issues
–
show
|
|||
| 841 | } else { |
||
| 842 | $content = Yaml::dump( |
||
| 843 | array( |
||
|
0 ignored issues
–
show
|
|||
| 844 | 'database' => array( |
||
| 845 | 'driver' => 'pdo_sqlite', |
||
| 846 | 'path' => realpath($this->config_path.'/eccube.db') |
||
| 847 | ) |
||
| 848 | ) |
||
| 849 | ); |
||
| 850 | } |
||
| 851 | $fs->dumpFile($config_file, $content); |
||
| 852 | |||
| 853 | return $this; |
||
| 854 | } |
||
| 855 | |||
| 856 | private function createMailYamlFile($data) |
||
| 857 | { |
||
| 858 | $fs = new Filesystem(); |
||
| 859 | $config_file = $this->config_path . '/mail.yml'; |
||
|
0 ignored issues
–
show
|
|||
| 860 | if ($fs->exists($config_file)) { |
||
| 861 | $fs->remove($config_file); |
||
| 862 | } |
||
| 863 | $target = array('${MAIL_BACKEND}', '${MAIL_HOST}', '${MAIL_PORT}', '${MAIL_USER}', '${MAIL_PASS}'); |
||
| 864 | $replace = array( |
||
|
0 ignored issues
–
show
|
|||
| 865 | $data['mail_backend'], |
||
| 866 | $data['smtp_host'], |
||
| 867 | $data['smtp_port'], |
||
| 868 | $data['smtp_username'], |
||
| 869 | $data['smtp_password'] |
||
| 870 | ); |
||
| 871 | |||
| 872 | $fs = new Filesystem(); |
||
| 873 | $content = str_replace( |
||
| 874 | $target, |
||
| 875 | $replace, |
||
| 876 | file_get_contents($this->dist_path . '/mail.yml.dist') |
||
| 877 | ); |
||
| 878 | $fs->dumpFile($config_file, $content); |
||
| 879 | |||
| 880 | return $this; |
||
| 881 | } |
||
| 882 | |||
| 883 | private function createPathYamlFile($data, Request $request) |
||
| 884 | { |
||
| 885 | $fs = new Filesystem(); |
||
| 886 | $config_file = $this->config_path . '/path.yml'; |
||
|
0 ignored issues
–
show
|
|||
| 887 | if ($fs->exists($config_file)) { |
||
| 888 | $fs->remove($config_file); |
||
| 889 | } |
||
| 890 | |||
| 891 | $ADMIN_ROUTE = $data['admin_dir']; |
||
| 892 | $TEMPLATE_CODE = 'default'; |
||
| 893 | $USER_DATA_ROUTE = 'user_data'; |
||
| 894 | $ROOT_DIR = realpath($this->app->rootDir); |
||
| 895 | $ROOT_URLPATH = $request->getBasePath(); |
||
| 896 | |||
| 897 | $target = array('${ADMIN_ROUTE}', '${TEMPLATE_CODE}', '${USER_DATA_ROUTE}', '${ROOT_DIR}', '${ROOT_URLPATH}'); |
||
| 898 | $replace = array($ADMIN_ROUTE, $TEMPLATE_CODE, $USER_DATA_ROUTE, $ROOT_DIR, $ROOT_URLPATH); |
||
| 899 | |||
| 900 | $fs = new Filesystem(); |
||
| 901 | $content = str_replace( |
||
| 902 | $target, |
||
| 903 | $replace, |
||
| 904 | file_get_contents($this->dist_path . '/path.yml.dist') |
||
| 905 | ); |
||
| 906 | $fs->dumpFile($config_file, $content); |
||
| 907 | |||
| 908 | return $this; |
||
| 909 | } |
||
| 910 | |||
| 911 | private function sendAppData($params) |
||
| 912 | { |
||
| 913 | $config_file = $this->config_path . '/database.yml'; |
||
|
0 ignored issues
–
show
|
|||
| 914 | $db_config = Yaml::parse(file_get_contents($config_file)); |
||
| 915 | |||
| 916 | $this->setPDO(); |
||
| 917 | $stmt = $this->PDO->query('select version() as v'); |
||
| 918 | |||
| 919 | $version = ''; |
||
| 920 | foreach ($stmt as $row) { |
||
| 921 | $version = $row['v']; |
||
| 922 | } |
||
| 923 | |||
| 924 | if ($db_config['database']['driver'] === 'pdo_mysql') { |
||
| 925 | $db_ver = 'MySQL:' . $version; |
||
| 926 | } else { |
||
| 927 | $db_ver = $version; |
||
| 928 | } |
||
| 929 | |||
| 930 | $data = http_build_query( |
||
| 931 | array( |
||
| 932 | 'site_url' => $params['http_url'], |
||
| 933 | 'shop_name' => $params['shop_name'], |
||
| 934 | 'cube_ver' => Constant::VERSION, |
||
| 935 | 'php_ver' => phpversion(), |
||
| 936 | 'db_ver' => $db_ver, |
||
| 937 | 'os_type' => php_uname(), |
||
| 938 | ) |
||
| 939 | ); |
||
| 940 | |||
| 941 | $header = array( |
||
| 942 | 'Content-Type: application/x-www-form-urlencoded', |
||
| 943 | 'Content-Length: ' . strlen($data), |
||
| 944 | ); |
||
| 945 | $context = stream_context_create( |
||
| 946 | array( |
||
|
0 ignored issues
–
show
|
|||
| 947 | 'http' => array( |
||
| 948 | 'method' => 'POST', |
||
| 949 | 'header' => $header, |
||
| 950 | 'content' => $data, |
||
| 951 | ) |
||
| 952 | ) |
||
| 953 | ); |
||
| 954 | file_get_contents('http://www.ec-cube.net/mall/use_site.php', false, $context); |
||
| 955 | |||
| 956 | return $this; |
||
| 957 | } |
||
| 958 | } |
||
| 959 |