[EC-CUBE]カテゴリにコンテンツを登録できるようにする

SC_UploadFile.phpを編集する

/data/class/SC_UploadFile.phpを編集します*1
どうもこのSC_UploadFileには継承クラスがないので*2 直接SC_UploadFile.phpをいじることになります。正直ちょっと抵抗がありますが、「ほんの1行足すだけだし…」と自分をごまかして修正してみましょう。

moveTempFileクラスのmoveTemplateFileを修正します。
修正前

    // 一時ファイルを保存ディレクトリに移す
    function moveTempFile() {
        $cnt = 0;
        $objImage = new SC_Image($this->temp_dir);

        foreach($this->keyname as $val) {
            if(isset($this->temp_file[$cnt]) && $this->temp_file[$cnt] != "") {

                $objImage->moveTempImage($this->temp_file[$cnt], $this->save_dir);

                // すでに保存ファイルがあった場合は削除する。
                if(isset($this->save_file[$cnt])
                   && $this->save_file[$cnt] != ""
                   && !ereg("^sub/", $this->save_file[$cnt])) {

                    $objImage->deleteImage($this->save_file[$cnt], $this->save_dir);
                }
            }
            $cnt++;
        }
    }

この仕様だとアップロードした画像情報が$this->temp_fileと$this->save_fileの両方に残ってしまい、編集完了後の編集モードでカテゴリを再表示したときに画像が表示されません。*3
ですのでunset($this->temp_file[$cnt]);でtemp画像の情報を削除してやろうというわけです。

修正後

    // 一時ファイルを保存ディレクトリに移す
    function moveTempFile() {
        $cnt = 0;
        $objImage = new SC_Image($this->temp_dir);

        foreach($this->keyname as $val) {
            if(isset($this->temp_file[$cnt]) && $this->temp_file[$cnt] != "") {

                $objImage->moveTempImage($this->temp_file[$cnt], $this->save_dir);
                /*
                 * fixed save_dirにファイルを移動したら元ファイル情報(temp_file[$cnt])をunset
                 * 200811111610
                 */
                unset($this->temp_file[$cnt]);

                // すでに保存ファイルがあった場合は削除する。
                if(isset($this->save_file[$cnt])
                   && $this->save_file[$cnt] != ""
                   && !ereg("^sub/", $this->save_file[$cnt])) {

                    $objImage->deleteImage($this->save_file[$cnt], $this->save_dir);
                }
            }
            $cnt++;
        }
    }

ちなみに$this->save_fileへの代入はLC_Page_Admin_Products_Category_Exクラスのprocessメソッドのswitch($_POST[‘mode’]) { case ‘edit’:の最後で呼んでいる「setDBFileList」で行われています*4

一応これでカテゴリに画像とコメントを追加できるようになったんじゃないかと思います。
ただ、何度も言いますが全ての関連クラスを全部読んで書いたわけではないのでホントにバグ、あると思います。無い方がおかしいくらいのソースなので、おかしな部分がありましたらどんどんご指摘いただけると助かります。

最後にEC-CUBEの学校 穂満先生に感謝と尊敬の念を込めましてトラックバックさせていただきたいと思います。
穂満先生、超感謝&超リスペクト!!

  1. 20090128:パスが間違っていたので修正いたしました。ymさんありがとうございます! []
  2. CakePHPみたいにcakeフォルダからappフォルダにコピーするだけでOKとかそんな仕様はないですよね?そもそも継承するときにファイルの中身変わるからねぇ。 []
  3. $this->temp_fileの情報を元に/upload/temp_imageディレクトリから画像を開こうとするようです []
  4. たしかそうだったと思う…汗 []
スポンサーリンク
336x280_1
336x280_1

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
336x280_1

コメント

  1. homan より:

    トラックバックありがとうございます&反映が遅くなってしまって申し訳ないです(まさかトラックバックされているとは夢にも思わず、確認を怠っておりました)

    こうやって感化されて広がっていくのって、オープンソースらしくていいなーと感じているところです。僕もまだまだ勉強の途中なので、一緒にEC-CUBEを盛り上げていきましょうね♪

    ソースも見やすくていいサイトですね^^

  2. suzukenn より:

    おぉ!先生!
    いつも大変お世話になっております。
    お褒めいただき大変恐縮です。
    思いやりが足りないせいか先生のように見る人に優しい記事は書けずにいるのですが、先生を見習って精進したいと思っております。
    これからもご指導のほどよろしくお願いいたします。
    私も微力ながらこのBLOGでEC-CUBEを盛り上げる一助となれば幸いです。
    わざわざどうもありがとうございました!

  3. Side8810 より:

    こんにちは。とても参考にさせていただいております。
    上記のカスタマイズの件ですが、そのままコピーした状態ではファイルのアップロードができないようです。(アップロードボタンしても反応しない)
    非常に有用なカスタムだと思いますので、ぜひ実装したいです。
    宜しくお願いします。

  4. suzukenn より:

    Side8810さん、こんにちは 🙂
    コメントありがとうございます。

    アップロードボタンが反応しないとのことですので、おそらくは
    <input type="button" name="btn" onclick="selectAll(‘category_id’); fnModeSubmit(‘upload_image’, ‘image_key’, ‘<!–{$key}–>’)" value="アップロード">
    ボタンをonclickしたときのfnModeSubmit();呼び出しに失敗しているんじゃないかと思うんですが、すぐには原因の特定が難しいです。
    そのうちまとまった時間が取れたらこちらで検証してみたいと思いますので、今しばらくお時間ください。

    ちなみに、僕がこの記事を書くのに参考にさせていただいた穂万先生の記事
    http://www.eccube-school.jp/products/detail43.html
    の方法でもuploadフォルダにアップした画像を表示することが可能です。
    もしお急ぎでしたら先生の方法をご利用になることをお薦めします。

    この記事の内容を実装するには少なくともPHPの知識がある程度ないと正直難しいと思います。まずは穂万先生に習って、ただコピペするのではなくソースを理解しながら実装して、それから僕の方法にチャレンジしてもらうと理解も進んでいいんじゃないかなと思います。

    最後に余計な事とは思いつつ…
    僕もつい1,2年前まではPHPの事は何もわからない素人でした。
    なので、Webで見つけたコードをそのままコピペしてカスタマイズとかしてましたが、それだと何か想定外のことが起こると対応できないのですよね。
    ですので時間がかかってもそこに書かれたコードが何を意味するのか理解する努力をしてみるといいと思います。そうこうするうち今まで読めなかったソースが読めるようになって、楽しくなってくる。そうすると今度は自分で作ってみたくなる。どんどん上達するにつれて、実践でも活用できるようになりSide8810さんのお仕事の役にも立つと。
    一朝一夕というわけにはいきませんがぜひ頑張ってみてくださいね。

  5. ym より:

    通りすがりのものです。
    数日前に EC-CUBE を使い始めました。
    アップロードできない件ですがアップロードボタンにはりついている
    JavaScript の selectAll() 関数が未定義のようでした。
    (これは product.tpl からコピペ)
    あと、アップロード直後にファイル名を入れておく
    hidden フィールドも足りないような気がします。
    v2.3.3 で確認しました。
    単にカテゴリーに画像を貼るだけなのに、こんなに面倒とは。。
    このあたり想定できる機能なので標準でいれてほしいですよね。
    もしくはもっと簡単に拡張できないと。
    HTML タグで貼るのもなぁという気がします。

  6. suzukenn より:

    ymさん、はじめまして 🙂
    拙い僕の記事をフォローをしていただきましてありがとうございます!
    仰るとおり、このカスタマイズかなり苦労した覚えがありまして、見直すのは難儀だなぁと…なかなか手をつけられずにおりまして…(言い訳)
    ご指摘いただき大変助かりました。

    EC-CUBEは一筋縄ではいかないですね^^;
    特に管理画面は使い勝手にやや難がある上にカスタマイズが大変ということもあって、不便さを解消するためにCakePHPベースで管理機能を作って、そっちでDB操作をするようになりました(笑)
    商品の一括変更とか一覧からフラグを切り替えたりとか簡単なものばかりですけど重宝します 🙂
    EC-CUBEがCakePHP(他のフレームワークでもいいけど)ベースで作られてたら、もっと盛り上がるし開発も進むような気がするんですけどねぇ…なんて無責任な独り言でした。

  7. ym より:

    さっそく反映していただきましてありがとうございます。
    hidden フィールドですがもう一つ必要かもしれません。
    $arrHidden にセットされるものです。クラスのほうを
    ちゃんと確認してませんので、これで本当に良いのかどうか
    わかりませんが、category.tpl の先頭数行は次のようにしました。
    (v2.3.3 で確認したので他のバージョンには合わないかもしれません)
    ———————-8<————————-

    // target の子要素を選択状態にする
    function selectAll(target) {
    $(‘#’ + target).children().attr({selected: true});
    }

    <form name=”form1″ id=”form1″ method=”post” action=”” enctype=”multipart/form-data”>

    <input type=”hidden” name=”parent_category_id” value=”“>
    <input type=”hidden” name=”category_id” value=”“>

    <input type=”hidden” name=”” value=”“>

    ———————-8<————————-
    あと、v2.3.3 では管理画面のテンプレートだけは常に default のほうが
    使われるみたいですね。。これを理解するのにずいぶん時間が掛かってしまいました ^^;)

  8. suzukenn より:

    ymさん、本当にありがとうございます!ミスばかりで大変恐縮です >_< 仰るとおり、foreach で $arrHiddenを回す記述を忘れてました^^; 早速記事に反映させていただきますね 😉 ご迷惑ばかりおかけしますが、これからもご指導のほどよろしくお願いいたします。