タグ別アーカイブ: FuelPHP

【FuelPHP】Validationでmax_lengthとかmax_minとかexact_lengthを使うときの罠

投稿日: 2016/10/20

あんまり自分にとってPPAPは響かないです。

今回はFuelPHPのValideationで少しムムッ!?となった所があったのでメモしておきます。
なお、FuelPHPのバージョンは1.7.2です。
※ 1.8でも一緒だと思います

例えば以下の様なviewがあったとして

  • 改行コードはLF
  • 簡易入力文字数カウンターがある
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
</head>
<body>
  <form method="post">
    <textarea name="message" rows="10" cols="50" id="t"><?= $message; ?></textarea><br>
    <input type="submit">  入力文字数カウンター:<span id="c"></span>
  </form>
  <script>
  var target = document.querySelector('#t');
  var counter = document.querySelector('#c');

  counter.innerHTML = target.value.length;

  target.addEventListener('keyup', function(e){
    counter.innerHTML = e.currentTarget.value.length;
  });
  </script>
</body>
</html>

コントローラとかでこんなバリデーションをするとします。

  • 入力文字は3文字(3byte)まで許可する
  • 文字列はマルチバイトも1byteとカウントする
  • 改行も1byte
$val = Validation::forge();
$val->add('message')->add_rule('max_length', 3);

if (!$val->run()) {
  echo 'error!!';
  exit;
}

echo 'おk';

そしてテキストエリアに

a
b

と入力します。
(カウンターには 3 と表示されている)
ほいで、送信。

すると、あら不思議。

error!!

と表示される(はず)。

つまり、上記の文字数はPHP的に3より多いと思われるようです。。

Why??何故なんだぜ???

jsでは3ってちゃんとでてるじゃあーりませんか。
クライアント側(ブラウザ)はwindowsでもmacでもやったけど結果は一緒。

種明かし

そんなときはソースを見てみます。
続きを読んでみようかな…

【FuelPHP】Twigでテンプレートのキャッシュファイルを作りたくない場合

投稿日: 2016/07/28

こんばんわー。今深夜1時半ですがめっちゃセミ鳴いています。
メモでーす。

Twigをそのまま使っていると、fuel/app/cache/twigにコンパイル後のテンプレートファイルがキャッシュされますが、何かしらの理由でキャッシュファイルを作成したくない場合、fuel/packages/parser/config/parser.phpを以下の様にします。

View_Twig.environment.cacheの値をfalseにする

<?php
/**
 * Fuel
 *
 * Fuel is a fast, lightweight, community driven PHP5 framework.
 *
 * @package    Fuel
 * @version    1.7
 * @author     Fuel Development Team
 * @license    MIT License
 * @copyright  2010 - 2014 Fuel Development Team
 * @link       http://fuelphp.com

/**
 * NOTICE:
 *
 * If you need to make modifications to the default configuration, copy
 * this file to your app/config folder, and make them in there.
 *
 * This will allow you to upgrade fuel without losing your custom config.
 */

return array(
    // ----- 抜粋 -----
    
    // TWIG ( http://www.twig-project.org/documentation )
    // ------------------------------------------------------------------------
    'View_Twig' => array(
        'auto_encode' => true,
        'views_paths' => array(APPPATH.'views'),
        'delimiters' => array(
            'tag_block'     => array('left' => '{%', 'right' => '%}'),
            'tag_comment'   => array('left' => '{#', 'right' => '#}'),
            'tag_variable'  => array('left' => '{{', 'right' => '}}'),
        ),
        'environment' => array(
            'debug'                => false,
            'charset'              => 'utf-8',
            'base_template_class'  => 'Twig_Template',
            'cache'                => false, // falseにする
            'auto_reload'          => true,
            'strict_variables'     => false,
            'autoescape'           => false,
            'optimizations'        => -1,
        ),
        'extensions' => array(
            'Twig_Fuel_Extension'
        ),
    ),
    
    // ----- 抜粋 -----
);

このようにすればTwigのキャッシュファイルは作成されません。

環境ごとに設定を分けたい場合、fuel/app/config/{環境変数}/parser.phpに上記のView_Twigの部分を書けばOKです。環境変数はFuel::$envの値です。
fuel/packages/parser/config/parser.phpに記載した設定は元に戻しておきます。

以上です。他に方法あったら教えて下さい。

【FuelPHP】Twigにアクセサクラスをsetしたら表示されなくてはまった

投稿日: 2016/07/27

長男(6歳)に「外でポケモンGOをやったら絶対駄目!危ないからね!」と忠告を受けて、大人としてどう対応すべきか悩んでいます。

さて、前回 【FuelPHP】PresenterのViewをTwigにする | Shimabox Blog を書きました。
PresenterのViewをTwigに置き換えるのは簡単に出来たのですが、一つだけ思わぬ落とし穴があったのでメモしておきます。

アクセサクラスをsetしても表示されない

はい。アクセサクラスって何?って話ですが、簡単に言うと__set()__get()だけのクラスです。自分はAPIとかの結果をオブジェクトに格納する時によく使ったりします。
(プロパティをいちいち定義するのめんどくさいし。。)

そういうクラスをアクセサクラスって勝手に言っています。
そのアクセサクラスを定義してTwigにsetした時に、__get()が呼ばれずにTwigがNULLしか返さないという現象に出くわしました。
それを解決というか、自分の認識不足だった部分が埋められたので以下に書き連ねていきます。

サンプルのソースは前回のソースを使います。

アクセサクラスを定義する

こんな感じでアクセサクラスを定義したとします。

続きを読んでみようかな…

【FuelPHP】PresenterのViewをTwigにする

投稿日: 2016/07/26

ポケモンGo全然興味なかったのにあれやばいっすわー。

というわけで、FuelPHPにおいてPresenterのViewをTwigにしました。
その経緯をメモしておきます。

前提条件

  • FuelPHPのバージョンは1.7.2でインストール済みである
  • composerの導入も済んでいる
    • Twigのインストールはcomposerを使います

手順

では手順を書いていきます。

続きを読んでみようかな…

【FuelPHP】Presenterのviewで共通変数をセットする

投稿日: 2015/06/04

前にも書きましたが、最近案件で何故かfuelを使う事が多くなってきました。
バージョンは1.7.2を使っているんだけど、ちょっとPresenterを使うところで頭を悩ませた事(Presenterで共通変数をセットしてviewで見たいぃぃ)があったのでその時のメモです。
※Presenterは以下から、プレゼンターと書きます

プレゼンターって?

一応、プレゼンターって何?って話なんですが、
http://fuelphp.jp/docs/1.8/general/presenters.htmlから引用すると

プレゼンタとは?
プレゼンタはビューの生成に必要なロジックを含むクラスです。コントローラがユーザ入力を処理し、必要なアクションを処理すると、プレゼンタにビューに必要なデータを取得するように処理を引き継ぎます。プレゼンタはデータの操作を一切すべきではありませんが、データベースの呼び出しや他のデータの取得、ビューの生成に必要な準備の操作を含めます。

との事。

自分は、
プレゼンターは(データの取得/整形に関しての)ビジネスロジックをゴリゴリ書くとこ〜?
みたいな感じで捕らえています。

この辺はこちらが分かりやすかったです。
一生涯プログラマ : FuelPHPのViewModelについて
(でも、まだよくわかっていません。えへへ。)

プレゼンターはそんな感じ。

ちなみに、今までViewModelだったのが、1.7.2からPresenterに変わったようです。
でも日本語の1.7系のチュートリアル(http://fuelphp.jp/docs/1.7/)を見てもプレゼンターの事は書いていないので、プレゼンターに関しては1.8系のチュートリアル(http://fuelphp.jp/docs/1.8/)を読むことになります。
でもこれ、何も知らないでfuel始める人混乱しないかな。。
(http://fuelphp.com/docs/ を読むという手もあるけど。。)

んで、話を戻して、何で頭を悩ませたかというと、

  • プレゼンターのメインのviewで共通部品(headerとかfooter)をレンダリングする
  • メインのviewと、その共通部品のviewで一緒の値を見る必要がある
  • その値はなるべく一箇所でsetしたい
  • はて、プレゼンターでどうやんだべ

というところ。

続きを読んでみようかな…