July 28, 2012

FuelPHPでProfilerが表示されない件。

自分を含め、ポツポツと遭遇される方がいるようなのでメモしておきます。

FuelPHPでProfilingの設定が正しくされているにも関わらずProfilerが表示されない場合、
まず間違いなく
fuel/core/vendor/phpquickprofiler/display.php
の改行コードがLFでは無いです。

これが原因で、display.phpの以下をスルーしてしまい、ブラウザ側でエラーとなっているはずです。
--
$css = str_replace("\n", "",  ...(略)
--


2012/07/30 追記
上記の$cssは、HTML上にjsのコードとして出力され、その時に改行コードが
残っているとjsのエラーとなり、Profilerが表示されません。

尚、FuelPHPの各ファイルはLFとなっており、この問題が発生するのは
GItの設定や、各種解凍ソフトによる、改行コードの自動変換に起因すると思われます。

pull requestは出してみたのですが、マージはされませんでした。
https://github.com/fuel/core/pull/1083
結論としては、ユーザ側で正しく設定して下さい。(LFにして下さい。)
となります。

確かに、改行コードが絡む問題がたまたまProfilerで発生しただけで
他所で発生し得る可能性も当然あり、そういった意味では当たり前の結果とも思います。

この問題に限っては、あたかもProfilerの設定が間違っているように
見えてしまうのが厄介ではありますが。


2012/07/31 追記
ドキュメントのCoding Standardsにも
--
Line Endings
Line endings should be Unix-style LF.
--
と記載がありました。
http://docs.fuelphp.com/general/coding_standards.html

FuelPHPのORMの$_propertiesでform設定と除外フィールド。その2。



以前、以下の記事を書きました。

FuelPHPのORMの$_propertiesでform設定と除外フィールド。
http://madroom-project.blogspot.jp/2012/07/fuelphpormpropertiesform.html

この方法、以下の問題が発生しましした。
(1) モデルの$_propertiesにvalidationを定義。
(2) $_observersにOrm\Observer_Validationを設定、before_saveで自動実行。
(3) (2)のタイミングで、skip設定したカラムのvalueが消えてしまう。

結果として、例えばskip設定したカラムのvalueが整数型だった場合、
値が飛ぶことにより0がinsertされてしまう。
(結果はMySQLの設定等で異なると思います。)

解決策は、$_propertiesの該当フィールドに対して、
skip設定を使わず、typeにfalseを設定することです。
--
'form' => array('type' => false),
--

参考:
http://docs.fuelphp.com/packages/orm/creating_models.html


P.S.
skip設定は、入力項目上は必要だけどDBには保存しない項目。
という認識でOKなのだろうか。
ボケてました。skip設定したら入力項目に出て来ませんね。

July 21, 2012

FacebookのAPIで画像をアルバムにpostする時、プライバシー設定が効かない。


FacebookのAPIを用いて画像をpostする時に、プライバシー(公開範囲)設定で
少しハマったのでメモしておきます。

ドキュメント:
https://developers.facebook.com/docs/reference/api/post/

FacebookのAPIでpostする時、privacyパラメータで公開範囲の指定が可能です。
* PHPでの例
'privacy' => array(
    'value' => 'CUSTOM',
    'friends' => 'SELF',
),

この時に注意しなければならないのが、前述のドキュメントのprivacy項に記載されている
Note: This privacy setting only applies to ...
の部分。

自アカウントへのpostなら指定されたプライバシー設定を受け付けるが、
他アカウントへのpost時には無視します。みたいな事が書かれています。

Facebookはユーザのみでなく、アルバムや画像にも同等なidを付与する仕様から、
自身が所有するアルバムも、Facebook側では他アカウントとみなすと思われます。

具体的には、ユーザにもアルバムにも画像にも、その他全ての情報(?)に
以下の形式でアクセスが可能な仕様です。
ttps://www.facebook.com/[id]

つまり、自身のidと、自身の所有するアルバムのidは異なり、
他アカウント扱いとなるようです。

なので、このアルバムにこのプライバシー設定で画像をpostする。と処理を書いても、
他アカウントへのpostとして扱われてしまい、そのプライバシー設定は無視される。
(アルバム側の設定に依存する。)
となるのかなーと。

だとすれば納得ですね。。。
誤認識を含んでいたらすみません。

July 15, 2012

FuelPHPのORMの$_propertiesでform設定と除外フィールド。

2012/07/28 追記

当記事の方法は、若干の問題を含みます。
併せて以下も御覧ください。

FuelPHPのORMの$_propertiesでform設定と除外フィールド。その2。
http://madroom-project.blogspot.jp/2012/07/fuelphpormpropertiesform2.html

--

ORMモデルではFieldsetで使用されるformの設定が可能です。

呼び出しは、以下の形式になります。
$fieldset = Fieldset::forge()->add_model('Model_Xxx');
その際、created_atとupdated_atも入力項目として表示されてしまいました。
ちょっと迷走しかけたのですが、skip設定が可能なことを教えて頂き解決しました。
* primary keyは勝手にskipされるので設定不要です。
protected static $_properties = array(
    'id',
    'name' => array(
        'form' => array('type' => 'text'),
    ),
    'created_at' => array(
        'skip' => true,
    ),
    'updated_at' => array(
        'skip' => true,
    ),
);
$_propertiesにはform設定だけでなく、Validation設定も可能なので
上手くここでまとめると便利だろうなー。

July 14, 2012

FuelPHPでMySQLのビューライクなModel_Crud

MySQLのビューみたいなニュアンスのModel_Crudを試してみました。

以下、実験結果です。

テーブルを2つ、適当に用意します。

create table parents
(
    id int not null auto_increment,
    parent_name varchar(255) not null,
    parent_gender enum('male','female') not null,
    primary key (id)
);

create table children
(
    id int not null auto_increment,
    parent_id int not null,
    child_name varchar(255) not null,
    child_gender enum('male','female') not null,
    primary key (id)
);


Modelを用意します。(Model_Crudを継承。)
app/classes/model/dummyview.php

<?php class Model_DummyView extends \Model_Crud {     public static function get() {         $sql = 'select                     c.child_name,                     c.child_gender,                     p.parent_name,                     p.parent_gender                 from                     children as c                 inner join parents as p on p.id = c.parent_id';         return DB::query($sql)->as_object(get_class())->execute()->as_array();     } }

コントローラ等、任意の場所でgetメソッドを呼んで出力してみます。
Debug::dump(Model_DummyView::get());

メリットは
* as_objectで自身にデータをセットすることで、FuelPHP流の処理を継続できること。
* $_propertiesが不要なので、1つのモデルで複数のメソッドを用意できること。

以下の場合に、出番があるかも。
* 複雑なjoin等を必要とする。
* 表示にしか使わない。

July 7, 2012

Open extern(Eclipseプラグイン)メモ。


選択したフォルダを右クリックから
* MACならコンソール、Winならコマンドプロンプト
* MACならファインダー、Winならエクスプローラ
をダイレクトで開けるプラグインです。

Open extern:
http://code.google.com/p/openextern/

アップデートサイト:
http://openextern.googlecode.com/svn/trunk/openextern_update/

MACの場合は、以下の設定が必要です。Winだと特に設定不要です。
Open Folder command: open {path}
Open Shell command:  open -a Terminal {path}

参考:

July 5, 2012

FuelPHPでリンクを作る方法。

1)
Html::anchor
http://docs.fuelphp.com/classes/html.html#/method_anchor
... aタグ全体を生成。

2)
Uri::create
http://docs.fuelphp.com/classes/uri.html#/method_create
... URLを生成。

どちらも、configのbase_urlを付与した絶対パスを作れるので
各ローカル開発環境のパスが異なっていても安心です。
ちなみにHtml::anchorも内部でUri::createを使っていました。

余談ですが、Uri::baseでconfigのbase_urlを取れます。

macのgitにパスを通す。

DL:
http://git-scm.com/

~/.bash_profileの編集:
--
export PATH="/usr/local/git/bin:$PATH"
--

ターミナルを再起動して
git --version

メモメモ。