はてなスター
なんかはてダに変なの付いたと思って見てたらこういうことか。
http://d.hatena.ne.jp/hatenadiary/20070711/1184149817
これが、はてなのネガティブブックマーク(ネガブ)に対する対策ってことだろう。
はてブに規制をかけるのではなく、
システム上プラスにしか働かないシステムで相殺しようっていう発想は好きだ。
なんか人気ないみたいだけど。
自分で間違ってつけたスターが消せないらしいけど、
システムの性質上、別にそれでよいんじゃないか。
間違うのは最初の数回くらいだろうし、
そのための追加コードは無意味だと思う。
僕は別に無くても困らないし、
そもそもこの追加機能自体、使うことも無いかもしれん。
CakePHP
plugin の存在を完全にスルーしてた。
CakePHP | 13章 プラグイン
汎用的な controller は plugin として作るべきなのか。
しまった。component として作ってた。
CakePHP 1.2.0.5427alpha リリース
CakePHP 1.2.0.5427alpha がリリースされました。
まだ alpha。
console 周りが結構変更されてます。
bake コマンドの元ファイルが template になったみたいですね。
妥当な流れだと思います。
とはいえ。
そのテンプレートの中身はこんなんなんですよ。
/cake/console/libs/templates/views/view.ctp より一部抜粋。
$i = 0; foreach ($fields as $field) { $class = null; if ($i++ % 2 == 0) { $class = ' class="altrow"'; } if (in_array($field['name'], array_keys($foreignKeys))) { $otherModelClass = $foreignKeys[$field['name']][1]; $otherModelKey = Inflector::underscore($otherModelClass); $otherControllerName = Inflector::pluralize($otherModelClass); $otherControllerPath = Inflector::underscore($otherControllerName); if (isset($foreignKeys[$field['name']][2])) { $otherModelClass = $foreignKeys[$field['name']][2]; } $otherSingularVar = Inflector::variable($otherModelClass); $otherModelObj =& ClassRegistry::getObject($otherModelKey); $otherPrimaryKey = $otherModelObj->primaryKey; $otherDisplayField = $otherModelObj->displayField; echo "\t\t<dt{$class}>".Inflector::humanize($otherModelClass)."</dt>\n"; echo "\t\t<dd{$class}>\n\t\t\t<?php echo \$html->link(\${$singularVar}['{$otherModelClass}']['{$otherDisplayField}'], array('controller'=> '{$otherControllerPath}', 'action'=>'view', \${$singularVar}['{$otherModelClass}']['{$otherPrimaryKey}'])); ?>\n\t\t\t \n\t\t</dd>\n"; } else { echo "\t\t<dt{$class}>".Inflector::humanize($field['name'])."</dt>\n"; echo "\t\t<dd{$class}>\n\t\t\t<?php echo \${$singularVar}['{$modelClass}']['{$field['name']}']?>\n\t\t\t \n\t\t</dd>\n"; } } ?> </dl> </div>
だめだ、やっぱりなじめない。。。
cake_smarty の対応はどうしよっかな。
今回はスルーして、ベータ版出てからにしよっかな。
靴ずれた
買ったばかりのサンダル履いて会社行ったらおもっきり靴ずれした。
親指と人差し指の間の鼻緒的なものが当たる個所がベローンってなった。
まあ、試着した時からその予感はあったんだけど。
サンダルずれしないように、鼻緒の部分をやさしくコーティング
してくれるような商品はこの世にないもんだろうか。
あるとすれば、商品名は「サンダルズレナーイ」以外に考えられなかったので、
それで検索してみたら、ヒットしなかった。
誰か作ったらよいのにと思う。
でも、誰か作っても、商品名が「サンダルズレナーイ」じゃなかったら
潜在顧客を逃すことになるので注意すること。
追記
「サンダルズレテナーイ」でも可。
PHP におけるクロージャの用途
PHPでクロージャ
作ってみたものの、実はあんまり用途が思い浮かんでない。
なんとなく、 array_walk がキーワードに浮かんでは来るけど。
てことで、とりあえず smarty で使ってみようと思う。
CakePHP を完全 smarty 化してみたものの、
smarty 内での配列の扱いが微妙だ。
↓事の顛末はこの辺に。
http://d.hatena.ne.jp/am11op/20070614/1181837256
要は、php ならこう書くべきところを
<?php echo $html->link('Edit', array('action'=>'edit', 2));?>
smarty では view に変なメソッド作った上でこう書く必要があった。
{$html->link('Edit', $view->_array('action=>edit', 2))}
まあ、これでもよいんだけど、せっかくなんで closure (的なもの)を使ってみる。
Closure はこんなの。
class Closure { var $_args; var $_func; /** * @private */ function Closure($func=null, $args=null) { if ($func) { $this->_args = $args; $func = ereg_replace("^function\([^\)]*\) *\{", "", $func); $func = ereg_replace("\}$", "", $func); $this->_func = $func; } } /** * @param $func string closure * @param $arg1 $mixed first object/var which is used in $func * @param $arg2 $mixed second object/var which is used in $func * ... */ function bind() { $args = func_get_args(); return new Closure(array_shift($args), $args); } /** * use this method to call closure */ function call() { $func = create_function('$args', $this->_func); return $func($this->_args); } function func() { $args = func_get_args(); $obj = new Closure(array_shift($args), $args); return $obj->call(); } }
無駄にインスタンス量産してるのは、書き直すのが面倒だったから。
このクラスを closure という名前で assign_by_ref してやって、
smarty 内からこう使う。
{*$html->link('Edit', $view->_array('action=>edit', 2))*} {$html->link('Edit', $closure->func("return array('action'=>'edit', 2);"))}
文字数増えてる!
ネタです!
まあ、ちょっと変数を php で処理して何かのメソッドに渡したい時、
一回しか使わないような modifier をいちいち作らなくてよいので便利かも。
ただし、入力値に対して使う場合は任意のコードを実行されないように気をつけること(棒読み)。
validation 時、rule 別にエラーメッセージを切り替える方法
cake1.2の話
CakePHP では view で エラーメッセージを指定することで
任意のエラーメッセージを出力できます。
{$form->error('name', 'ちょwww名前wwwww')}
rule が一つの場合ならこれでも問題ないのですが、
メールアドレスの validation など、
入力が無い場合と入力値が不適切な場合で
違うエラーメッセージを表示したい場合には
view だけでは実現できません。
そんな時には
model の $validate を以下のように指定すれば OK です。
class User extends AppModel { var $name = 'User'; var $validate = array( 'name' => array( 'rule'=>VALID_NOT_EMPTY, 'message'=>'名前を入力してください' ), 'email' => array( array( 'rule'=>VALID_EMAIL, 'message'=>'メールアドレスが不適切です。' ), array( 'rule'=>VALID_NOT_EMPTY, 'message'=>'メールアドレスを入力してください' ), ), 'comment' => array( 'rule'=>VALID_NOT_EMPTY, 'message'=>'コメントを入力してください' ), ); }
manual には書いてないけど、ソースには書いてありました。
よくありますね、こういうこと。