fuelphp1.8 – コアクラスのカスタマイズ

参考:http://fuelphp.jp/docs/1.8/general/extending_core.html#extend_and_replace

type=”file”のformに、「required」というバリデーションルールを適用しても、うまく動作しない。ファイルをアップロードしても、ファイルがアップロードしたことにならない。だから、requiredというルールを適用するのをやめたんだけど、そうすると、form.phpで設定できる、required_markの表示がなくなるので、それも嫌だ。required_markというのは、requiredルールを設定してあるFieldをview等でbuildした時に、勝手に必須項目であることを示す文字列等を表示してくるものであります。なので、Fieldをbuild関数をいじって、required_markを表示する条件を変更してみようと思った。

fuel/core/classes/fieldset/field.phpの591行目に、下記があります。

get_attributeで「required」があれば、form.phpのrequired_markに設定している文字列を返しています。なので、get_attributeに渡すものを「required」だけではなく、array(‘required’, ‘required_upload’)にしてみます。でも、fuel/core内を勝手にいじってはダメなので、下記のようにします。

コアクラスを継承したクラスを作成する

fuel/app/classes/fieldset/field.phpを下記のように作成する。

これを、fuel/app/bootstrap.phpを設定して、読み込めるようにします。

bootstrap.phpの設定

fuelphp 1.8 – カスタムバリデーション

どうも、Uploadをすると、Uploadクラスのバリデーションを使うことになりますが、これとfieldsetのValidationクラスとの連動がいまいちうまくできない。Fieldsetはform.phpの、inline_errorsをtrueにすると勝手にエラーを表示してくれるが、このエラーに自動的にuploadのエラーも連動するようにしたい。他にやり方があるかもしれないが、Upload関連のエラーをValidationのカスタマイズルールとして作成することで、実現してみる。

モデルでFieldsetを作成する

fileというフィールドに、uploadというルールを設定している。これはデフォルトではないので、カスタマイズルールになります。引数は、フィールド名。あとでこのuploadというルールを作成します。

カスタムバリデーションのクラスファイルを作成する

fuel/app/classes/model/validation/upload.phpというのを作成してみる。

コントローラを作成する

フィールドセットを作って、Upload:processを走らせて、フィールドセットからバリデーションを取りだして、バリデーションにuploadルールを読めるように設定する。

View

uploadは、enctypeの表示が必要。Fieldsetのフィールドをbuildしてるだけ。bootstrapを使っているので、set_attributeでform-controlクラスを設定している。

fuelphp1.8 – Formとバリデーション

fieldsetを使うと、入力した内容を保持できるし、バリデーションチェックも簡単に行える。エラーも自動で表示できる。core/config/form.phpにformを表示する際のHTMLの設定が書いてあるので、これをシンプルにすることで、多様なデザインにもデザイナがviewの設定のみで大体対応できるようになるかなと思った。

form.phpの設定項目

引用:FuelPHPのFieldsetクラスをまとめてみた。1

項目名 説明
form_method formのmethod属性の値
form_template formを作る際のテンプレートです。{open}がformの開始、{fields}がフィールド部分、{close}がformの終了です。こちらはFormクラスで使用されます。
fieldset_template ↑のfieldset版。
field_template fieldのテンプレート。そのままですね。
multi_field_template fieldが複数だった時のテンプレート。{fields}から{fields}までが項目のループ部分。セレクトボックスはどうやってるのかは不明
error_template エラーのテンプレート。$user_form->validation()->error()メソッドで使われている模様。
required_mark {required}に対応する値を指定。
inline_errors エラーを表示するかどうか。
error_class エラー表示に使うクラス名。デフォルトではtdに指定しているのでこのクラスに対してエラーだった時のbackground-color等を指定することになる。

バリデーションエラーメッセージの日本語化

・core/lang/en/validation.phpを、app/lang/ja/にコピーして編集する。
・app/config/config.phpの「language」を「ja」に設定する。

モデルの例

app/config/form.phpのfield_templateの例

コントローラの例

fuelphp 1.8 – Auth – simpleauthで使うデフォルトのusersテーブル

参考:[FuelPHP] FuelPHPで作るログイン管理

cakephp2 – csvダウンロード

CsvHelperがあります。
https://github.com/dai199/cakephp-csv-helper

書き方は、下記のような感じになります。(上記GitHubの使い方の説明を引用)

これは、ここに記載している内容と基本同じようです。下記記載のリンクからヘルパーのファイルにたどり着かなかったので、再度投稿します。
http://endoyuta.com/2014/04/28/cakephp-csv%E3%83%98%E3%83%AB%E3%83%91%E3%83%BC/

あと、このプラグインのCsvHelper.phpの28行目が、下記のようになっていて、$rowがありませんエラーが出ていたので、$rowを追加する必要があると思った。

あと、下記コードを書いたら文字化けした。
echo $this->Csv->render(true, ‘sjis’, ‘utf-8’);

WordPress – BackWPupで自動バックアップ

backWPupというプラグインを使うと、データベース、ファイルの定期的バックアップを自動化することができます。設定も非常に簡単なので便利です。

データベースのバックアップは、SQLをそのままバックアップする形式と、XMLをエクスポートする形式の2つがあります。サーバを変えない想定であればSQLバックアップで問題ないし復旧も楽ですが、サーバを変える可能性がある場合は、XMLエクスポートもしておく必要があります。DBの中にサーバのパス情報等が入っているので、サーバを変えた時にそれらを手動で変更しないといけなくなる等の可能性があるからです。

設定方法は下記サイトで詳しく解説してくれています。
BackWPup – WordPressを丸ごとバックアップできるプラグイン

ロリポップの場合、PHPのバージョンは5.4以上に上げておく必要があります。バージョン5.3でDBバックアップを実行しようとすると、下記のようなエラーがでます。

ERROR: No MySQLi extension found. Please install it.

WP-CRONについて

定期実行するための方法は、管理画面の下記で選択します。

backWPup

「with WordPress cron」を選択すると、WordPressに標準搭載されている、擬似的なcronである、WP-CRONが利用されます。これは、wordpressのサイトにアクセスがあった際に、WP-CRONの設定を自動でチェックし、設定されている実行日時が過ぎていれば実行するようにするものです。つまり、アクセスがなければ実行されません。

参考:
[解決済み] BackWPup有料になりました?

google search consoleで「updated がありません」と言われる

googleのsearch consoleで「updated がありません」と言われます。
記事の更新日時を表示しているタグのクラスをupdatedにする必要があるらしい。

タグにupdatedとつけることで、検索エンジン等がこのデータは更新日時を表しているのだなと分かるようになります。このupdatedのようなものを構造化データと呼ぶそうです。

ちなみに、この構造化データについてテストできるツールが下記です。URLを入れると、そのページの構造化データを全部取得・表示し、問題ないか教えてくれます。でもこれで、search consoleでエラーが出ているURLを入力しても、エラーは表示されない。

Structured Data Testing Tool

wordpressの記事更新日時タグのクラスをupdatedにする

wp-contentというディレクトリに、テーマとかプラグインが入っているようです。私は今ampleというテーマを利用していますが、wp-content/themes/ampleにそのテーマのファイルが入っていました。どのファイルに該当箇所があるのか検索します。

$ grep -rn ‘entry-date published’ *
inc/functions.php:415: $time_string = ‘<time class=”entry-date published” datetime=”%1$s”>%2$s</time>’;

ソースコードは下記のようになってました。

作成日時と更新日時が異なる場合のみ、updatedクラスのタグを追加しています。でも画面には作成日時しか表示されないので、updatedクラスのタグはdisplay:noneとかにしてあるようです。全く問題ない気もしますが、更新日時がない場合は、作成日時と同じ日時でupdatedクラスのタグを表示させるようにコードを修正します。

Structured Data Testing Toolでみると、作成日時と更新日時が違う場合でないと、検証結果にupdatedが表示されませんでした。search consoleもすぐにテストできないみたいなので、しばらく時間経ってから確認してみたいと思います。

参考:
WordPress で構造化データエラー(entry-title, updated, author)にハイブリッド対応
WordPressの仕組みを理解する

WordPressを速くする

WordPressが遅すぎるので速くしてみます。

参考:WordPress高速化|1秒前半で表示する誰でもできる簡単な方法

画像を圧縮したり、スタイルシートとかも圧縮したり一つにまとめたり、headerに書かないようにしたり、キャッシュ使ったりします。WordPressは色々なプラグインがありますので、上記を参考にとりあえずプラグインを入れてどの程度速くなるか確認してみます。

現時点の速度はどのくらいなのか?

GoogleのPageSpeed Insightsで解析してもらってみます。

3.8秒で応答するらしい。画像圧縮とかキャッシュとかできてないと言われている。下の画像はパソコンで見たときの結果ですが、スマホでも同じような点を指摘されている。点数は50点とPCよりも悪い。ユーザー エクスペリエンスは95点になっている。

pagespeed_pc

画像の圧縮

上記参考サイトで紹介されている、EWWW Image Optimizerというプラグインを使ってみる。

コンテンツに使用する画像を一枚ずつ、いちいち圧縮していると効率が悪い。そこで、自動的に画像サイズを圧縮してくれるのが、EWWW Image Optimizer というプラグインだ。

参考:EWWW Image Optimizer の設定方法と使い方

上記のとおりインストールと設定しました。既存画像も全部圧縮しました。1点上がった。

pagespeed_score_pc2

画像の読み込みを後回しにする

Lazy Loadというプラグインを使うといいらしい。
インストールして、有効化しました。2点上がった。スマホも2点上がって52点になった。

pagespeed_score_pc3

キャッシュを使う

WordPressには、この仕組みを簡単に導入できるプラグインがある。それが W3 Total Cache だ。今まで、キャッシュによる高速化をやったことがない方は、これを導入するだけでサイト表示スピードの劇的な高速化を実感できるだろう。

参考:W3 Total Cache のおすすめの設定方法

Head Cleanerを使う

参考:Head Cleaner の最も理想的な設定方法

キャッシュとHead Cleanerを参考サイトのとおりに設定しました。ありがたい参考サイトです。CDNサービスの設定はまだしていません。

ここまでで、81点になりました!スマホは、71点。ユーザーエクスペリエンスは99点。pagespeed_score_pc4

zendのログ出力

cakePHP – Shellでコンポーネントを使う

参考:[CakePHP 2.x] shell(シェル)からComponent(コンポーネント)を呼び出す

cakephpでいつも忘れるやつ

■ボタン押したら、確認ボックスが出て、OKを押したらPOSTアクセスするやつ

phpstorm9 – xdebugが使えなくなった (cakephp)

下記のようなエラーが出る。

Error: Fatal Error (4): syntax error, unexpected ‘;’ in [xdebug://debug-eval, line 1]
Error: [FatalErrorException] syntax error, unexpected ‘;’
Request URL: /hogehoge
Stack Trace:
#0 /Applications/XAMPP/xamppfiles/htdocs/hogehoge/cgi/lib/Cake/Error/ErrorHandler.php(205): ErrorHandler::handleFatalError(4, ‘syntax error, u…’, ‘xdebug://debug-…’, 1)
#1 [internal function]: ErrorHandler::handleError(4, ‘syntax error, u…’, ‘xdebug://debug-…’, 1, Array)
#2 /Applications/XAMPP/xamppfiles/htdocs/hogehoge/cgi/lib/Cake/Core/App.php(931): call_user_func(‘ErrorHandler::h…’, 4, ‘syntax error, u…’, ‘xdebug://debug-…’, 1, Array)
#3 /Applications/XAMPP/xamppfiles/htdocs/hogehoge/cgi/lib/Cake/Core/App.php(904): App::_checkFatalError()
#4 [internal function]: App::shutdown()
#5 {main}

ここに同じようなエラーが出ているが、解決策などは書いてない。
Avoide debug eval error

下記に、Are you watching any variables in Netbeans/Xdebug? I had some weird errors like that until I cleared my watch list. とかいてあって、watchしてる変数を削除したらいいのかなと思った。watch変数を削除して、ブラウザのセッションを削除したら、とりあえずなおった。ブラウザ(chrome)のセッション削除だけでなおったのかもしれない。

http://www.yiiframework.com/forum/index.php/topic/50746-getting-unknown-property-yiiwebapplicationvalue/