2016年4月26日火曜日

【ECcube3】追加したブロックにスクリプトを割り当てたい カゴの中身変数など

(この記事でのECcubeのヴァージョンは3.0.8 です。)

ECcube3で、「ロゴ」「カゴの中」「ログイン」のみっつのブロックをひとつにまとめたヘッダーブロックを新規に作成したいとする。

しかし、管理画面から新規作成したブロック内では、カゴの中ブロックで使われている「Cart」など、プログラムが用意しているであろう高機能な変数が使えない。

自ら追加したブロックにおいて、通常は使えないECcube変数などを使えるようにするにはどうするか。
自分が追加したブロックに対応するスクリプト(コントローラー)が追加でき、コントローラーで作成した変数をView(twigファイル)に渡すことができればよい。

ECcube2系では、データベースの「dtb_bloc」テーブルの「php_path」が鍵だった。
以前仕事でECcube2系をカスタマイズした時につけておいたメモがあったのでコピペしておく。

-------------------------------------
ECキューブのディフォルトのページには、ページのクラスとその拡張クラスとが紐付いていて、いろいろPHPで複雑なことが出来る。

大雑把に言って4つのPHPファイルがワンセットになってる。
■HTML側のPHP(URLに対応するもの)
 例:products/list.php
■テンプレートファイル
 例:data/Smarty/templates/default/products/list.tpl
■DATA側、ECキューブ標準の処理の書かれたクラスファイル
 例:data/class/pages/products/LC_Page_Products_List.php
■DATA側、ユーザーが拡張処理を書くための拡張クラスファイル
 例:data/class_extends/page_extends/products/LC_Page_Products_List_Ex.php

これらのファイルがあらかじめいろいろな処理をして、テンプレートで使える変数や配列を作っている。
管理画面から新規に作成したページで、他のページが使っているECキューブの変数が使えないのは、ECキューブ標準ページはこれらのファイルによってあらかじめ処理を経てきているから。
なので、新規追加ページでECキューブのいろいろな変数を使いたい場合、上記のクラスファイルや拡張クラスファイルを同様に追加して、処理を書いておかないといけない。


で、
そういう感じでPHPで色々なことを仕込んだ、ブロックも作りたい。

【方法】
管理画面からブロックを新規作成。

\public_html\frontparts\bloc に、block_任意の名前.php というファイル(※)を作成。
\public_html\data\class_extends\page_extends\frontparts\bloc に、LC_Page_FrontParts_Bloc_任意の名前_Ex.php という拡張クラスファイルを作成。その処理の内容は、同ディレクトリにある他のクラスを参考に。
このクラスファイルを、このHTMLディレクトリ側のPHPから呼び出す。

データベース管理画面に入り、「dtb_blocテーブル」を開く。
追加したブロックの「php_path」コラムに、「frontparts/bloc/block_任意の名前.php」と入力。(※)で作成したファイル。

LC_Page_FrontParts_Bloc_任意の名前_Ex.phpに、処理を書く!
-------------------------------------


今回はECcube3系で、フレームワークが変わってしまっているので同じ手法は使えない。だが似たような方法でできるはず。

うまくいったのでやり方をメモる。

-----------------
1.データベースのレコードの書き換え
管理画面からブロックを追加すると「dtb_block」テーブルに該当のレコードが増えている。
「logic_flg」のフィールドの値を1にすると、対応するクラスを読み込みに行くらしい。対応するクラスは何らかの命名規則があるはずで自動的に導き出されるはず。

-----------------
2.ブロックのためのコントローラーを作成
\src\Eccube\Controller\Block に、自分が追加したブロックのためのコントローラーを作成する。名前はおそらく、ブロックのファイル名をキャメル表記にしてControllerをつけたもの。

【例】
ブロックのファイル名 : my_header
→ブロックのコントローラーファイル名 MyHeaderController.php
→ブロックのコントローラー名 MyHeaderController

既存のブロックのためのコントローラーファイルを参考にして処理を書く。
indexという名前のファンクションが必要らしい。

ログインブロックのように、
public function index(Application $app, Request $request)
という、引数がふたつある関数にする場合、

use Symfony\Component\HttpFoundation\Request;
の指定が必要なので注意。

戻り値は
$app->render(
'Block/対応するブロックのファイル名.twig',
twigファイル(View)に渡す連想配列
)
にするらしい。

-----------------
3.コントローラープロバイダーの編集
\src\Eccube\ControllerProvider\FrontControllerProvider.php
を編集。
72行目あたりからブロックのための設定が書かれているのが見つかるので、自分のブロックのための記述を追加。

こんな感じ。
$c->match('/block/my_header', '\Eccube\Controller\Block\MyHeaderController::index')->bind('block_my_header');

これで、スクリプトにエラーがなければ動く(コントローラーで用意してViewに渡した変数がtwigファイル内で使える)はず。

2016年4月20日水曜日

【ECcube3系】ディフォルトテンプレートを複製する

ECキューブでECサイトをまた作らなくてはならず、作業しています。
さくらのレンタルサーバーを使っている環境で、さくらの管理画面からECキューブを楽にインストールできる機能があったのでインストールまではスムーズにできました。

ところがECキューブのバージョンが3.0.8で、過去に使ったことのある2系とはいろいろがらりと違う。

テンプレートの構造も違うようなので過去のECキューブサイトで取っておいたバックアップをあてはめることも出来ないらしい。

なのでディフォルトのテンプレートを複製してテンプレート枠を増やし、また一から独自に編集しようかと思ったんだけど、テンプレートの増やし方が分からないし、ECキューブ3系のデザインテンプレートには無料のものがない。

でも出来ました。

管理画面
>オーナーズストア
>テンプレート
>テンプレート一覧
>ディフォルトのテンプレートの「…」をクリックしてダウンロード
>「default.tar.gz」がダウンロードされる

この default.tar.gz をアップロードすればいいかというと、そうではないところが罠である。
一旦この default.tar.gz を解凍する。
すると

default
├app
└html

という構造のディレクトリになって解凍される。
default ディレクトリに入って、「app」「html」のふたつを選択し、zipに圧縮する。

これを「テンプレート>アップロード」からアップすればよい。
「テンプレート名」と「テンプレートコード」はよく分からなかったので両方アルファベットのみで名付けておきました。たぶん「テンプレート名」には日本語文字使っても大丈夫なのではないかと思います。

2016年4月10日日曜日

【C# .NET Framework】C#の勉強を始めました

エンジニア職で転職活動をしていて、Unityでのゲーム開発を仕事にできたらいいなあと思っています。
ただ、いままでUnityを使ったこともなければゲームで使うような C系の言語もやったことがないので、すこしずつ勉強を始めました。

まずはUnityで使う言語であるC#を勉強しようということで入門書を購入しコードを書きながら読み進める。

やっぱりなにか作らないと勉強もはかどらないなということで、複数の画像をひとつのウィンドウに同時に表示する画像ビューワーのWindowsのアプリケーションを作っていました。

まだプロトタイプですが今日作った分を GitHubにアップしました。
https://github.com/ishiitakeru/MultiImagesViewer/blob/master/MultiImagesViewer/MultiImagesViewer.cs

■ドラッグアンドドロップによって、そのディレクトリ内の複数の画像を横に並べて連続的に表示する。
■設定によって表示画像数を2~4枚から選択できる。
■ウィンドウのタイトル部分に開いているディレクトリのパスを表示する。
■矢印キーの左右で画像を次・前と順次入れ替えられる。

手応えとしては、C#はJavaに似てて、.NET Framework はAndroidに似てますね。

この練習用のアプリ、あと追加したい機能:
■矢印キーの上下でディレクトリ移動が出来る。