public function add(Application $app, Request $request)
{
/** @var $Template \Eccube\Entity\Template */
$Template = new \Eccube\Entity\Template();
$form = $app['form.factory']->createBuilder('admin_template', $Template)->getForm();
if ('POST' === $request->getMethod()) {
$form->handleRequest($request);
if ($form->isValid()) {
/** @var $Template \Eccube\Entity\Template */
$tem = $app['eccube.repository.template']->findByCode($form['code']->getData());
// テンプレートコードの重複チェック.
if ($tem) {
$form['code']->addError(new FormError('すでに登録されているテンプレートコードです。'));
return false;
}
// 該当テンプレートのディレクトリ
$config = $app['config'];
$templateCode = $Template->getCode();
$targetRealDir = $config['root_dir'] . '/app/template/' . $templateCode;
$targetHtmlRealDir = $config['root_dir'] . '/html/template/' . $templateCode;
// 一時ディレクトリ
$uniqId = sha1(Str::random(32));
$tmpDir = $config['template_temp_realdir'] . '/' . $uniqId;
$appDir = $tmpDir . '/app';
$htmlDir = $tmpDir . '/html';
$formFile = $form['file']->getData();
// ファイル名
$archive = $templateCode . '.' . $formFile->getClientOriginalExtension();
// ファイルを一時ディレクトリへ移動.
$formFile->move($tmpDir, $archive);
// 一時ディレクトリへ解凍する.
try {
if ($formFile->getClientOriginalExtension() == 'zip') {
$zip = new \ZipArchive();
$zip->open($tmpDir . '/' . $archive);
$zip->extractTo($tmpDir);
$zip->close();
} else {
$phar = new \PharData($tmpDir . '/' . $archive);
$phar->extractTo($tmpDir, null, true);
}
} catch (\Exception $e) {
$form['file']->addError(new FormError('アップロードに失敗しました。圧縮ファイルを確認してください。'));
return $app->render('Store/template_add.twig', array('form' => $form->createView()));
}
// appディレクトリの存在チェック.
if (!file_exists($appDir)) {
$form['file']->addError(new FormError('appディレクトリが見つかりません。ファイルの形式を確認してください。'));
if (file_exists($tmpDir)) {
$fs = new Filesystem();
$fs->remove($tmpDir);
}
return $app->render('Store/template_add.twig', array('form' => $form->createView()));
}
// htmlディレクトリの存在チェック.
if (!file_exists($htmlDir)) {
$form['file']->addError(new FormError('htmlディレクトリが見つかりません。ファイルの形式を確認してください。'));
if (file_exists($tmpDir)) {
$fs = new Filesystem();
$fs->remove($tmpDir);
}
return $app->render('Store/template_add.twig', array('form' => $form->createView()));
}
// 一時ディレクトリから該当テンプレートのディレクトリへコピーする.
$fs = new Filesystem();
$fs->mirror($appDir, $targetRealDir);
$fs->mirror($htmlDir, $targetHtmlRealDir);
// 一時ディレクトリを削除.
$fs->remove($tmpDir);
$DeviceType = $app['eccube.repository.master.device_type']->find(DeviceType::DEVICE_TYPE_PC);
$Template->setDeviceType($DeviceType);
$app['orm.em']->persist($Template);
$app['orm.em']->flush();
$app->addSuccess('admin.content.template.add.complete', 'admin');
return $app->redirect($app->url('admin_store_template'));
}
}
return $app->render('Store/template_add.twig', array('form' => $form->createView()));
}