CakePHP3でログイン認証を構築

CakePHP3でログイン認証を構築

細かいところは公式マニュアルをチェック
https://book.cakephp.org/3.0/ja/controllers/components/authentication.html

AppController.php – コントローラー全体の認証設定を行う
LoginController.php – ログインフォーム、ログイン処理など
TUsersController.php – ユーザー表示、登録、編集など

■認証設定(AppController.php)

initializeに認証処理を追記します。

loginAction – ログイン処理を行うコントローラーとアクションを指定
loginRedirect – ログイン後に移動するコントローラーとアクションを指定
logoutRedirect – ログアウト後に移動するコントローラーとアクションを指定
authenticate – 認証の詳細設定
 Form:ユーザーID、パスワードを入力するフォームを作成して認証処理をさせるタイプ。他にはBasicやDigestがあります。
  userModel:認証に使用するモデルを指定(デフォルトはUsers)
   fields:認証に使用するカラムを指定(デフォルトはusernameとpassword)

■ログインフォーム(index.ctp)、認証処理(LoginController.php)

LoginController.php

index.ctp

■ユーザーの表示、追加、編集など
コントローラーに継承用の一文を追記します。
これがないとログイン後でもログインフォームに飛ばされちゃいます。

TUsersController.php

ユーザ作成、編集時にパスワードをハッシュ化させる。

Model/Entity/TUser.php

こうやって書くと単純だけど結構苦戦しました。
AppControllerに書きましたけど、コントローラー単位でやる方法は分かりません(w

XAMPPでCakePHP3

XAMPPでCakePHP3

ポータブルタイプだとパスの問題でなんかうまくいかない。
うちはUSBにポータブルタイプのXAMPPを入れてたのでそれにCakePHP3を入れようとしたけど駄目だった。
(各モジュールがあるのに読み込めないエラーが大量発生)

ということで別ドライブにXAMPPを入れてそこで実行

ブラウザからアクセスするとエラー

Fatal error: You must enable the intl extension to use CakePHP ~~~

PHPの設定でintlを使用する設定になっていないかも。

php.iniを開いて下記を修正

;extension=php_intl.dll
↓↓↓↓↓↓↓↓↓↓↓↓
extension=php_intl.dll

これでApachを再起動

これで直るかな。

タイムゾーン変更でエラー

config/app.php
config/bootstrap.php

上記のtimezoneを変更するとMySQLでエラーが発生

Error: SQLSTATE[HY000]: General error: 1298 Unknown or incorrect time zone: ‘Asia/Tokyo’

下記の公式サイトよりtimezoneのファイルをダウンロードします。
http://downloads.mysql.com/general/timezone_2016a_posix.zip

/xampp/mysql/data/mysql にファイルを上書きします。
その後MySQLを再起動

これでCakePHP3も動くようになったかな。

【EC-CUBE2】非公開カテゴリーの作成

一部カテゴリーを非表示としたい(特別会員専用ページのようなもの)

要件は下記のような感じ
・カテゴリーID指定であれば一覧を表示
・全商品一覧には表示しない
・キーワード検索では表示しない
・対象カテゴリーの一覧、商品にはmetaタグで検索エンジンにindexされないようにする。
・カテゴリー一覧に表示されないようにする

■検索処理の修正
修正ファイル
/data/config/config.php
/data/class/pages/products/LC_Page_Products_List.php

▼config.php

ここに会員専用カテゴリーの値を設定する。
配列をsirialize化した値を設定する。

カテゴリーIDが10の場合は下記の配列になる。
array(0=>10);
これをsirialize化すると上記のような値になります。

▼LC_Page_Products_List.php

404行目のlfGetSearchConditionメソッドに処理を追加します。
下記の処理に追加します。

これで全商品一覧、キーワード検索で対象商品が出てこなくなります。

■カテゴリー一覧の修正
カテゴリが自動生成されるので生成されないように処理を追加
/data/Smarty/templates/default/frontparts/bloc/category.tpl
/data/Smarty/templates/sphone/frontparts/bloc/category.tpl

必要あればガラケーのテンプレートも修正
/data/Smarty/templates/mobile/frontparts/bloc/category.tpl

まずはconfig.phpに設定したカテゴリーIDの値をテンプレートに渡します。
* 29行目付近の</script>の後に追記

指定カテゴリーでなければ表示という処理を追加

下記のような感じ

■metaタグの埋め込み
/data/Smarty/templates/default/site_frame.tpl

以下のコードを埋め込み

以上です。

さくらレンタルサーバーで無料SSL設定(htaccess)

さくらレンタルサーバーで無料SSLのhtaccess設定する

htaccessを使ってhttpからhttpsへの転送設定!

WordPressであればプラグインがあるようです。
今回はプラグインを使わない方法を採用しました。

htaccessで転送設定

— 通常

— 追加

WordPressのwp-config.phpに下記の設定を追加します。

下記のサイトを参考にさせて頂きました。
詳しくは下記サイトをご参照ください。

さくらのレンタルサーバでHTTPS(SNI SSL)な独自ドメインのWordpressサイトを構築する際の注意点

【EC-CUBE3】ProductOptionプラグイン導入後に管理画面でエラー

ProductOptionプラグイン導入後に管理画面でエラーが発生

今回は下記の2パターンのエラーが発生
どちらも管理画面からの操作です。

1.受注詳細を見る
2.受注のステータスを「キャンセル」に変更

1のエラーは「ORMException in ORMException.php line 259」
これはエラーメッセージ生成しているプログラムだったような・・・
このエラー内容から原因を辿るのは難しいかな。

2のエラーは「FatalErrorException in OrderOptionRepository.php line 71」
$OptionCategory->getId()が取れないor空だよってエラーっぽい
こっちのほうが原因特定しやすそう。

IDが抜けている可能性があるので、DBでデータをたどって行く。

order_idからorder_detail_idを割り出す。
ProductOptionプラグインが原因っぽいので、plg_productoption系のテーブルを探っていく。

order_detail_idからorder_option_idを割り出す(plg_productoption_dtb_order_detail)
order_option_idで検索(plg_productoption_dtb_order_option)

serialカラムのデータ内容を確認

どうやらデータ内容が以前のオプション内容になっているっぽい。
運用途中でオプション内容を変えたのが原因かも。
serialの内容を修正

dtb_shipment_itemからitem_idを抽出

plg_productoption_dtb_shipment_itemを検索するもデータがない

ということでplg_productoption_dtb_shipment_itemにデータ登録(item_id, order_option_id)

これでどうするようになりました。

そして原因1も上記方法で解決できました。