Joomla1.5でdescriptionにtitleの値を設定する

Joomla1.5とかって古っ!!という意見は置いておいて、、。

主にGoogleのSEO対策です。

Joomlaでは、ページのdescriptionが明示的に指定されていないと、グローバルのdescriptionの値が出力されます。

なので、descriptionの指定が無いページは、すべてdescriptionの内容が同じになって、Google先生にサーチコンソールとかで、「HTMLの改善:descriptionの重複!」と怒られます。

Joomlaで書き溜めた何百件もある記事、これから1件1件descriptionを書き足すのはかなり大変ですので、descriptionにはtitleの内容を動的に出力させ、Google先生の警告を回避するという横着な方法です。

1./templates/使用中のテンプレート名/index.phpを開きます。

2.以下のように修正します。

 

以上です。

 

ECCUBE3の商品一覧の並び順に「お気に入り数順」を追加する

  • まず最初に、並び順テーブル(mtb_product_list_order_by)に新しく「お気に入り数順」を追加

(一例)
・id:4
・name:お気に入り数順(任意)
・rank:3

※optionの順番を前に持ってきたければrankの番号を減らす

 

  • /src/Eccube/Resource/config/constant.yml.dist に追加したorderbyパラメタの番号(4)に名前を定義する

参考)
https://github.com/EC-CUBE/ec-cube/issues/2703

 

  • /src/Eccube/Repository/ProductRepository.php に、SQLを定義する

※クエリビルダーを使用する際、JOINするテーブル名やカラム名はdoctrineの定義に基づくので、 /src/Eccube/Resource/doctrine/Eccube.Entity.CustomerFavoriteProduct.dcm.ymlなどの中を確認して、同じ名前にする。

ちなみに、上記は、生のSQLとしては下記のような感じとなる。多分。

 

参考)
https://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=17472&forum=10
https://ameblo.jp/withathena/entry-12173872626.html
https://umebius.com/eccube/sort_admin_product_master/
http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/query-builder.html
https://teratail.com/questions/30434
https://teratail.com/questions/43888
http://www.aiship.jp/knowhow/archives/25107
http://d.hatena.ne.jp/Fivestar/20100423/1272013815

 

以上で、商品一覧ページのドロップダウンに「お気に入り数順」が追加され、選択するとお気に入りに追加された数の多い商品順にソートされる。

ECCUBE3(Symfony)のテンプレート(Twig)内でのシステムURL出力

忘備録として随時更新中。テンプレ内をよく探せば出てくるのだが、、、。

 

  • トップページURL

 

  • カレントページ(現在アクセスしているページ)URL

 

  • 商品一覧ページURL

 

  • 商品画像保存ディレクトリの絶対パス

 

  • 商品詳細ページURL

 

  • 商品詳細ページでのメイン画像URL (Pinterestボタンに画像URLのパラメタ付けたい時とか)

 

参考サイト)

 

ECCUBE3でカテゴリに補足情報を追加する

EC-CUBE 3.0.16
MySQL 5.6.19
PHP 5.6.36

例として、あるカテゴリに「関連A」(assoc_A)という補足情報を追加する場合。

1. テーブルへのカラム追加
dtb_categoryテーブルへ”assoc_A”という名前のカラムをtinyintタイプで追加。また、NULLを許可にする。

2. エンティティファイルに、セッターゲッター追加
/src/Eccube/Entity/Category.php

以下のように追記。

 

3. データベース定義ファイルへカラム追加
/src/Eccube/Resource/doctrine/Eccube.Entity.Category.dcm.yml

fields一覧にassoc_Aの項目を追加。データベースとエンティティクラスを接続するのがdcm.yml(Doctrineマッピングファイル)。これにより、Categoryエンティティのassoc_Aとdtb_categoryのassoc_Aカラムが接続される。

※データ型がint,smallint,tinyintでも、Formでcheckboxタイプを使う予定のため( 論理型(値が1か0のタイプ)と認識されるので)ブーリアンタイプにしておく。

ECCUBE3で使用できるtype一覧は過去記事参照

 

4. フォーム定義ファイルへの項目追加
/src/Eccube/Form/Type/Admin/CategoryType.php

下記のように、管理画面の商品登録フォームへ定義を追加。

 

5. 管理画面(カテゴリ登録画面)へフォーム表示
/app/template/admin/Product/category.twig

フォームを表示したい場所に下記のように記述。

 

6. 商品詳細ページへの表示
/app/template/default/Product/detail.twig

関連付けした情報を使って詳細ページでごにょごにょするには、多少の工夫が必要。これについては別途書く予定。

とりあえず以上。

 

参考URL)

 

 

ECCUBE3で商品に新しい項目を追加

EC-CUBE 3.0.16
MySQL 5.6.19
PHP 5.6.36

例として、商品名かな(name_kana)という項目を追加する場合。

1. テーブルへのカラム追加
dtb_productテーブルへ”name_kana”という名前のカラムをtextタイプ(またはvarchar)で追加。また、NULLを許可にする。

2. エンティティファイルに、セッターゲッター追加
/src/Eccube/Entity/Product.php

以下のように追記。

 

3. データベース定義ファイルへカラム追加
/src/Eccube/Resource/doctrine/Eccube.Entity.Product.dcm.yml

fields一覧にname_kanaの項目を追加。データベースとエンティティクラスを接続するのがdcm.yml(Doctrineマッピングファイル)。これにより、Productエンティティのname_kanaとdtb_productのname_kanaカラムが接続される。

ちなみに、EC-CUBE3が採用しているSymfonyの標準ORM、Doctorineで設定できるフィールドタイプは以下の通り。

 

4. フォーム定義ファイルへの項目追加
/src/Eccube/Form/Type/Admin/ProductType.php

下記のように、管理画面の商品登録フォームへ定義を追加。

上記の書き方で入力必須とならない場合(未入力で保存した際にエラーとならない)場合は、下記のようにする。

 

なお、フォームの入力形式として整数型としたい場合は、第2引数に”integer”, 浮動小数点型としたい場合は、第2引数に”number”を指定するなどして対応。

このほかにも選択型(choice型)も指定できる。詳細は公式ドキュメントを参照。

 

5. 管理画面(商品情報登録画面)へフォーム表示
/app/template/admin/Product/product.twig

フォームを表示したい場所に下記のように記述。

form_rowは、form_label、form_widget、form_errorsを同時に出力する関数。テキストの入力幅を小さくしたい場合などは、form_label、form_widget、form_errorsに分割するなどしてCSSで対応。

 

6. 商品詳細ページへの表示
/app/template/default/Product/detail.twig

フロント側で出力。好きな場所に下記のように記載。未登録であれば何も出力されない。

 

以上。

 

参考URL)

 

Twigの小技まとめ

文字列省略(Twig1.6以降)

 

HTML参照文字エスケープ

 

リプレース

 

改行文字をbrに

 

ループ

 

ループの中で使える便利なやつ

 

その他は随時更新。

 

参考URL)

  •  https://hrroct.hatenablog.com/entry/2017/04/28/184032
  • https://qiita.com/assa/items/4fef2f3abd95248ed626
  • https://twig.symfony.com/doc/2.x/filters/replace.html
  • https://tetra-themes.com/eccube3-dump-498/
  • http://www.tomcky.net/entry/2018/02/08/010639
  • http://mononofu.hatenablog.com/entry/20111209/1323431291

UTF-8のCSVファイルを文字化けなくエクセルで開く

エクセルの仕様なのか、何も考えずにUTF-8のファイルエクセルで開くと、標準文字コードで開くため、だいたいの確率で文字化けします。

ちなみにShift JISであれば、問題なく開けます。

対策としては、適当なテキストエディタなどで開いて、UTF-8(BOM付き)で一度保存すれば、次からはエクセルでも文字化けせず問題なく開くことが出来ます。

このことから、コンテンツの最初にBOMをつけてやれば、ダウンロード後すぐにエクセルで文字化けなく開くことが出来ます。

動的出力するCSVファイルであれば、対策は簡単です。以下はPerlでの例です。

たったこれだけです。

なお、他サイトなどで、BOMは”0xFE 0xFF”などと紹介しているところがありますが、”0xFE 0xFF”はUTF-16のBEエイディアンのBOMであり、UTF-8のBOMは”0xEF 0xBB 0xBF”ですのでご注意ください。

テキストエディタだと”0xFE 0xFF”をつけてもちゃんと解釈してくれることがありますが、エクセルの場合は”0xEF 0xBB 0xBF”を付けないとダメ見たいです。

参考サイト)

 

Postfixのメールログで特定のキューIDを抽出する

あるメール配信で配信エラーになった場合に、相手先からどのようなエラーコードとバナーが返却されているかを調べるときに便利。

ちなみに、postfixのログは、一行ごとに、

といった構造で書かれる。同じキューIDのログを調べれば、一通のメールの一連の動きを追うことが出来る。

直近の”to@hoge.com”宛てのメールのキューIDを取得するシェルスクリプト

結果

ちなみに上記は「said: 550 Invalid recipient: <to@hoge.com>」と返ってきているので、メールを送ったこのユーザ(to@hoge.com>)は存在しなかったということになる。

ちなみに理想としては、エンベロープFROMに、宛て先と送信するたびの履歴番号など、特定の情報を仕込んでおくと、時系列で探しやすい。

sendmail使うなら、

とかしておくとよい。(この場合「to=hoge.com-001@fuga.com」がエンベロープFROM)

そうしておけば、何回も同じ宛先に送っている場合でも、下記のように目的のキューIDを探しやすくなる。

なおヘッダーFROMをいくらいじっても、基本的にはメールログには記録されない。(ログレベルを上げればできるかも。この辺は調べてない。)

参考サイト)

 

エクセルを利用してUnicode(Unicode Code Point)からUTF-8に変換する

このような目的場合、無償サイトだとこちらの「文字番号を入力して調べる」のツールが便利。1つ2つの変換であればこのサイトを利用したほうが早いです。

変換するコードが大量にある場合は、いろいろ方法はあるかと思いますが、あくまでユーティリティなので、エクセルでちゃちゃっと変換する方法を紹介します。

まず、変換したいUnicode(Unicode Code Point)を確認します。ここでは例として「(U+)3042」を変換します。これは、ひらがなの「あ」に相当します。

まず、このUnicodeは16進数ですので、2進数に変換します。この16進数は「30」と「42」に分けられますので、エクセルの関数ですと、

=HEX2BIN(LEFT(セル番号,2),8)&HEX2BIN(RIGHT(セル番号,2),8) 

と書くことが出来ます。

2進数への変換後は、「0011000001000010」となります。

次にこの「(U+)3042」が、こちらのサイトの「表3-9 UnicodeとUTF-8の関係」のどの範囲に該当するか調べます。

今回の場合ですと、3042なので、表の3行目(00000800~0000ffff)の範囲に該当します。(16進数の大小関係が分からない方は、他サイトでお調べください)

(出典: Hitachi, Ltd. 文字コード変換後の値の求め方)

そして、1バイト目から3バイト目を、表に倣って変換します。表の「v」の数だけ、2進数をわけて考えるとわかりやすいです。

今回の場合だと、1バイト目がv4つ、2バイト目がv6つ、3バイト目がv6つですので、0011000001000010は、「0011」と「000001」と「000010」に分けられます。

これらの先頭に、表のように2進数を付け加えます。

1バイト目:「0011」の先頭に「1110」を加えて、「11100011」

2バイト目:「000001」の先頭に「10」を付け加えて「10000001」

3バイト目:「000010」の先頭に「10」を付け加えて「10000010」

これを全部繋げると、「111000111000000110000010」になります。(8bit×3=3byte文字)

ここで行った作業をエクセルの関数で書くと、

=”1110″&LEFT(セル番号,4)&”10″&MID(セル番号,5,6)&”10″&RIGHT(セル番号,6) 

となります。

最後に、この2進数を、再度16進数に戻します。エクセルの関数で書くと、

=BIN2HEX(LEFT(セル番号,8))&BIN2HEX(MID(セル番号,9,8))&BIN2HEX(RIGHT(セル番号,8)) 

となります。

最後に導き出された16進数文字「E38182」が、UTF-8変換後の文字コードとなります。

イメージとしては下記のような感じです。上記の①~③の関数が、以下の図の①~③に対応しています。

あとはオートフィルを使うなり、いろいろと出力を加工して大量の変換ができると思います。