【EC-CUBE3】ブロック削除したら落ちた。

出来心だったんです。

1.system_error

やりたかったことは本当に単純で
テストで追加したブロックを消したかっただけだったのです。
これは流石に3.0.2では直るでしょう、たぶん。

2.bloc_delete

お約束のログ確認

[2015-07-17 06:01:43] myapp.INFO: > POST /eccube-3.0.1/html/sogakudo_admin/content/block/11/delete [] []
[2015-07-17 06:01:43] myapp.CRITICAL: BadMethodCallException: Undefined method 'getTemplatePath'. The method name must start with either findBy or findOneBy! (uncaught exception) at C:\xampp\htdocs\eccube-3.0.1\vendor\doctrine\orm\lib\Doctrine\ORM\EntityRepository.php line 226 {"exception":"[object] (BadMethodCallException(code: 0): Undefined method 'getTemplatePath'. The method name must start with either findBy or findOneBy! at C:\\xampp\\htdocs\\eccube-3.0.1\\vendor\\doctrine\\orm\\lib\\Doctrine\\ORM\\EntityRepository.php:226)"} []
[2015-07-17 06:01:43] myapp.INFO: < 500 [] []

何かメソッドないって言われてる?

Grepかけます

まずは、この「getTemplatePath」が本当にないか調べてみます。

3.grep

……ないな。

類似名称のメソッドを調べてみる

BlockController.phpを開いて類似名称のメソッドがないか調査です。
きっとTemplatePathとかで調べたらひっかかるんじゃないの?

4.TemplatePath

本当にひっかかるとは思わなかった……。

えっと、getWriteTemplatePathですね。定義を見てみましょう。

\src\Eccube\Repository\BlockRepository.php

/**
 * 書き込みパスの取得
 * User定義の場合: /html/user_data
 * そうでない場合: /app/template/{template_code}
 *
 * @param  boolean $isUser
 * @return string
 */
public function getWriteTemplatePath($isUser = false)
{
    return ($isUser) ? $this->app['config']['user_block_realdir'] : $this->app['config']['block_realdir'];
}

あ、もうこれですね。
これ呼べばいいんじゃないですか。

そして、修正

というわけでgetTemplatePathをgetWriteTemplatePathに書き換えます。

public function delete(Application $app, $id)
{
    $DeviceType = $app['eccube.repository.master.device_type']
        ->find(DeviceType::DEVICE_TYPE_PC);

    $Block = $app['eccube.repository.block']->findOrCreate($id, $DeviceType);

    // ユーザーが作ったブロックのみ削除する
    if ($Block->getDeletableFlg() > 0) {
        $tplDir = $app['eccube.repository.page_layout']
            ->getWriteTemplatePath($DeviceType);
        $tplDir .= $app['config']['block_dir'];
        $file = $tplDir . $Block->getFileName();
        $fs = new Filesystem();
        if ($fs->exists($file)) {
            $fs->remove($file);
        }
        $app['orm.em']->remove($Block);
        $app['orm.em']->flush();
    }

    return $app->redirect($app->url('admin_content_block'));
}

問題なくブロックが消えました。

5.complete

……うん、でも、削除完了してもメッセージって出ないんですね。
これはまた今度調べてみましょう。



コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です