aswww log

エンジニアの技術録。アプリとかウェブとか

fuelPHP1.7で日付Validation関数(valid_date)の使用とサンプル

以前の記事fuelPHP1.6くらいで日付Validation関数独自実装では
日付の入力チェックvalid_dateの使い方がよくわからなくて思わず独自実装しちゃったけど改めて日付チェックする機会が訪れたのでもう一度使い方調べてみた。
なお、前回同様google先生に聞いても使用例とか出てこない模様。

というわけで大人しくfuel/core/classes/Validation.phpのソースを覗いてみた。そしたらvalid_dateの実態が見つかったよ

    public function _validation_valid_date($val, $format = null, $strict = true)
    {
        if ($this->_empty($val))
        {
            return true;
        }

        if ($format)
        {
            $parsed = date_parse_from_format($format, $val);
        }
        else{
       ・
       ・
       (略)

このdate_parse_from_formatって関数でチェックしてるみたい。
以下のように使えるんだって。

array date_parse_from_format ( string $format , string $date )

参考:http://www.php.net//manual/ja/function.date-parse-from-format.php

ここの$formatに指定するのは「DateTime::createFromFormat() が理解できるフォーマット。」らしい。

参考:http://www.php.net/manual/ja/datetime.createfromformat.php

サン プルをみてみるとフォーマットを'Y-m-d'とかで指定してるね。というわけで同じようにformatの指定を変えて見ると

        $val = Validation::forge();
        $val->add('date', '生年月日')->add_rule('required')
            ->add_rule('valid_date', 'Y-m-d');

無事できた!前回はフォーマットを'YYMMDD'とかサポートしてない形式で指定してたからうまくいなかなったんだね。独自実装しなくてもできるね!まあ勉強になったからよしとしよう。

Windows7でfuelPHP1.8の設定してみる(composer.phar編)

Windows7でfuelPHP1.8を使うことになり、色々設定してブラウザでいざアクセスしてみると、
「composer.pharをupdateしてくれ!」的なエラーが出たのでproject直下あったcomposer.pharをupdateしてみた
すると以下のとおりうまくいかず。

$ /c/php-5.4.28/php.exe composer.phar update
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - facebook/php-sdk v3.2.3 requires ext-curl * -> the requested PHP extension
 curl is missing from your system.
    - facebook/php-sdk v3.2.2 requires ext-curl * -> the requested PHP extension
 curl is missing from your system.
    - facebook/php-sdk v3.2.1 requires ext-curl * -> the requested PHP extension
 curl is missing from your system.
    - facebook/php-sdk v3.2.0 requires ext-curl * -> the requested PHP extension
 curl is missing from your system.
    - facebook/php-sdk dev-master requires ext-curl * -> the requested PHP exten
sion curl is missing from your system.
    - Installation request for facebook/php-sdk * -> satisfiable by facebook/php
-sdk[dev-master, v3.2.0, v3.2.1, v3.2.2, v3.2.3].

以下を読んでphp.iniでcurlが設定されてないからかな?と解釈して早速設定してみることに。

http://stackoverflow.com/questions/19335305/composer-install-error-requires-ext-curl-when-its-actualy-enabled

php.iniの次の箇所を以下のとおり修正

;extension=php_curl.dll

extension="C:\php-5.4.28\ext\php_curl.dll"

コメントアウト外すだけだと以下とおり「C:\php-5.4.28直下にphp_curl.dllが無いよ!」と怒られるので絶対パスで指定

C:\www\project>php composer.phar install
PHP Warning:  PHP Startup: Unable to load dynamic library 'C:\php\php_curl.dll'
- 指定されたモジュールが見つかりません。

そしたらできたよ!
以下のサイトによるとgitのインストールも必須らしい。(今回は予め入ってたので躓かなかった)
http://piyopiyocs.blog115.fc2.com/blog-entry-515.html

FuelPHPにてFUEL_ENVが設定されていない時のデフォルト参照先変更

FuelPHPでoilコマンドでoilコマンドを直叩きで実行する時。.htaccessにてFUEL_ENVで何を設定していようが、fuel/app/config/development/db.phpを見に行ってしまう。
 .htaccessを読み込むのはhttpdなので、httpアクセスを介さないで直接phpを実行するoilが参照しないのは当然のことなのだけど、そもそもFuelPHPはFUEL_ENVが設定されていない時はデフォルトでdevelopmentを参照しにいってしまうらしい。
リリースミスとか恐いし、せめてFUEL_ENVが設定されていないときはproductionを参照するようにしたいよね。なのでfuel/app/bootstrap.phpを以下のとおり修正してみた。

Fuel::$env = (isset($_SERVER['FUEL_ENV']) ? $_SERVER['FUEL_ENV'] : Fuel::DEVELOPMENT);

Fuel::$env = (isset($_SERVER['FUEL_ENV']) ? $_SERVER['FUEL_ENV'] : Fuel::PRODUCTION);

これでFUEL_ENVが設定されていない時はデフォルトでproductionの設定が優先的に読み込まれるようになったよ。

マルチドメインしてるXserverのPHPバージョン設定する時は対象ドメインに気をつける

XseverのレンタルサーバーでPHPバージョンの変更でつまづいたのでメモ。

Xseverのレンタルサーバーでは管理画面にてマウスクリックのみでPHPバージョンが変更できます。

やり方はマニュアルにあるとおり、XserverSeverPanelのメニューにある[PHPバージョン切り替え]をクリック、[変更後のバージョン][バージョン]を切り替えるボタンを押して完了。しかしここでのバージョン切り替えるが反映されるのは[PHPバージョン切り替え]の画面右上にある"★現在の設定対象ドメイン:tigau.com"のドメインのみ。Xserverはドメイン単位でPHPバージョン切り替えられるので注意!もし対象ドメインが違うようならXserverSeverPanelのトップの左下にある[設定対象ドメインの変更]でドメインを切り替えましょう!

なぜこんなマニュアルに書いてありそうなことをわざわざブログにあげるかと言うと、自分がこれで丸一日ハマったからorzこういう設定系に弱いのねん。いつか同じような目にあった誰かの役に立つはず?

fuelPHP1.6で同じControllerの別アクションに遷移したい場合

FuelPHPの場合一つのControllerに複数のアクションを定義することができる。(例えばよくある入力・確認・完了画面が一つのContorllerで実装されたりする)その際にバリデーションとかで確認アクションの処理を途中で中断して同一Controller内の入力アクションに処理を移行したいことがままある。
そういったときはFuelPHPでは以下のとおり指定してあげるだけでOK。

//同Controllerのaction_input()を返す
return $this->action_input($param);

大変シンプル。たったこれだけのことなのだけど、個人的に$this->template->contentに入れなきゃいけないのかとかView::forge使うのかとか色々試行錯誤してしまったので、忘れないためにメモ。

FuelPHP1.6系でEmailパッケージの使用とハマったとこ

FuelPHPに元から付いているEmailパッケージを使ってみる。以下の公式の解説を見る限りかなりシンプルな実装になる。

 Email パッケージ
 http://press.nekoget.com/fuelphp_doc/packages/email/introduction.html

 Email パッケージの使用方法
 http://press.nekoget.com/fuelphp_doc/packages/email/usage.html

Email パッケージの使用方法どおりにとりあえず実装して実行したものの、エラーになる。Exceptionをcar_dumpで見てみたところ以下のメッセージが。

Failed sending email

ぐーぐる先生にお伺いしつつパッケージをパッケージのソースを見てエラーの発生場所を突き止めた。fuel/packages/email/classes/email/driver/mail.phpに以下の記載がある。

・
・
・
protected function _send()
{
    ・
    ・
    ・
    if ( ! @mail(static::format_addresses($this->to), $this->subject, $message['body'], $message['header'], '-oi -f '.$return_path))
    {
	throw new \EmailSendingFailedException('Failed sending email');
    }

FuelPHPのEmailパッケージは結局のところphpのmail関数で送っていたのだった。もしやmail関数は何かメールサーバーを立てないと使えないのでは?と考えまたぐーぐる先生にお伺い書けてみた。

» phpのmb_send_mail()利用にかんして
https://forums.ubuntulinux.jp/viewtopic.php?id=7394

やはりそうだったみたい。PEAR::MailはPHPだけでメールを送れるけど、mail関数はsendmailSMTPが必要みたい。急遽レンタルサーバーにてメールアカウントを設定。fuel/packages/email/config/email.php
fuel/app/config/email.phpにコピーして、以下を修正。

return array(
    'defaults' => array(
    'useragent'	=> 'FuelPHP, PHP 5.3 Framework',
    'driver'		=> 'smtp',
    ・
    ・
    ・
    'smtp' => array(
        'host'		=> 'server.host.jp',
        'port'		=> 25,
        'username'	=> 'account@server.host.jp',
        'password'	=> 'password',
        'timeout'	=> 5,
    ),

これでやっと動くようになった。。。いつも思うんだけどmail関数のマニュアルとかmail関数使用するパッケージとか、メールサーバーの準備が必要不可欠ってことをどこかに書いてほしい。設定だけですぐ使える思えちゃう。そしたらこんな迷わないのに。ヽ(`Д´#)ノ ムキー!!

IEでCSS3のボタンの背景が表示されない時は画像で対応

CSSでボタンを作成したのだけど、FFやChromeでは背景が表示されるのにIE9では表示されなかった。IE9用のCSSを追記しなければならないかったのだけども、その際に参考にしたのは以下のサイト。

CSS3の-ms-linear-gradientが、いつの間にかいらない子になってた

このサイトに書いてあるとおり、IE9用のCSSを書くよりも最終的には以下のとおり画像を表示させるようにしたほうがスマートだという結論に至る。

 background: url(/img/assets/button_bg.png) 0 0 repeat-x;

画像なら崩れることも無いし、一番確実。エンジニアはついつい最新のCSS3のうんちゃらを使いたくてデザインでも強行しがちだったりするけど、時にはより鉄板なやり方のが良かったりするのねん。