2012.02.01

[symfony] HTMLタグを含む文字列をエスケープせずに出力する

symfonyでHTMLのタグを記述した文字列($this->str = '<p>文字列</p>'みたいなの)を出力すると、view.ymlでの設定にもよるらしいけど'<''>'が実体参照(それぞれ'&lt;''&gt;')に変換されて結局ブラウザにはHTMLコードがそのまま表示されてしまうんですよね(実は本日知りましたw)

赤い文字を表示したいと思って、以下のようにしてもダメなのね。

//アクション:actions.class.php

public function executeAction(
    sfWebRequest $request)
{
  $this->str =
    '<p style="color:red;">'.
      '文字列</p>';
}
//テンプレート actionSuccess.php
<?= $str ?>
<?php echo $str;?>

これを意図する通り表示させたいなら、テンプレート側で以下のようにすれば良いらしい。

//テンプレート actionSuccess.php
<?= $sf_data->get(
    'str', ESC_RAW) ?>

?。いやマジでなんのこっちゃと思いますけど、こうなのだから仕方がない。

通常、アクション側で$this->hogehogeとして使用された変数は、テンプレート側で単に $hogehoge と表記しますけど、果たしてその実体は?というと$sf_data->get('hogehoge')ということなんでしょうな(自信ないけどw)。そして、このgetメソッドは文字列をエスケープして返してくるけど、第二引数にESC_RAWという定数を与えるとエスケープしないってことなのだろうね。と推測した。

が、それだけでは説明が付かない事態。自作のクラスのgetterからHTMLを出力する場合もエスケープされてしまう。困った。

//HogeHogeは自作クラス
$obj = new HogeHoge();
echo $obj->getHtmlString();

これはどう対処するのかというと、、、
↓こうするんだって。

//HogeHogeは自作クラス
$obj = new HogeHoge();
echo $obj->getHtmlString(ESC_RAW);

驚いた。HogeHogeは自作クラスだから、getHtmlStringというメソッドも自作。引数は取らないように宣言しているのに、無理やり身に覚えのないESC_RAWを渡すと、エスケープ無しで返してくれる。つまりsymfonyさんが勝手にいろいろやってくれているんですね。

まさか使い始めて半年経ってこういうことを知る羽目になるとは、symfonyって深いなー。というか変態的だなw
こんなの知らなきゃわからないね。

アンジャッシュのネタが中国にぱくられるとかw。あのダブルミーニング的なネタは中国人でなくてもパクリたくなる気持ちはわかる。

| | コメント (0) | トラックバック (0)

2012.01.31

Google Maps Geocoding API V3 で動的ジオコーディングの制限と変換に失敗する住所の傾向と対策

Google Maps API V3 を使って600件くらいのジオコーディングを行う必要があったのだけど、一気にやると最初の数件以外ほとんど失敗。やばそうな雰囲気を感じたので、あわてて200msの待ちを入れてみたら、1件成功して4件失敗を繰り返す。どうやら秒間一回しか許可されていないような雰囲気。でもこの制限、日本語ドキュメントでは明記されていないように思う。ま、常識的に「あってしかるべき制限」だとは思うけど。

で、本題のジオコーディングに失敗するケースについて。

600件あまりを10分かけてジオコーディングしましたら、緯度経度が見つからず失敗した住所が30件くらいありました。実際に間違っていた住所もありましたが、それ以外では以下のどれかに該当しておりました。要するに住所の書き方なので、試行錯誤しながら最終的には全て変換できました。めでたい。ま、ちゃんと検証したわけではないので、あくまでも傾向として書いておきます。

  1. 番地の後に続けてマンション名などを記述している。スペースを入れたらたいてい成功
  2. 番地以降の建物の名前が、英文字で始まっている。「メゾン一刻」じゃなくて「MAISON一刻」だと失敗するとか。基本的に建物の名前は検索に使われていないような気がしますのでばっさり削除しておけばOK
  3. 細かい番地まで指定しすぎている。郊外の住所に多かったような気がします。○丁目○番地○号みたいな感じで、○号の部分をなくすと成功したり。
  4. マンション・アパート名などが全てカタカナで最後に部屋番号がくっついている。ちょっとあいまいですけど、そんな気がしました。信憑性低いです。

| | コメント (0) | トラックバック (0)

2012.01.30

一日限り?の弁当男子42歳のありがとう

生まれて初めてお弁当を作ってみた。興味本位の軽い気持ちで手を出したが、周囲の状況とかイロイロひっくるめての感想は、

弁当は戦い、、、やな。

ただでさえあわただしい朝の時間帯。あっちでは洗濯機が「スマン!もう回されへんわ」とピーピーいうてて、こっちでは寝ぼけ眼で「腹減ったー」とまたまたピーピーいうてる小学生。勘弁してくれ。

中途半端な人間タイムシェアリングシステムのエンジンを奥歯ガータガタ言わしながら無理やり回して、あっちを片づけこっちを投げ捨て、、、朝から切った貼ったの弁当作って腹減って、本末転倒ウンジャラゲ(←ここ意味ないです)

いやしかし、今回作ったのは自分がお昼に食うものであるから、モチベーションの維持はまだ容易なほうだ。これを、家族とはいえ自分以外の者のために、毎日のように、半ば自動的にやっているというその精神力と処理能力に感服した。「どこのスパコン頭に仕込んでんねん」というレベルの驚きとともに深く感謝っ!カーチャンありがと

ただ会社帰りの電車の中で「明日のお弁当はなんにするかなー♪」と考えるのはナカナカ楽しいものであるな。クセになりそうな予感もチラホラ

弁当は男気満載!感謝っ!

| | コメント (0) | トラックバック (0)

2012.01.29

10キロランでちょうどええ

土曜日はおうちの用事で運動できずだったので、今日は久しぶりにレーパン履いて自転車で25キロほど走った(1000円散髪へ行ったw)後、12キロのランニング♪

ホントは15キロの予定だったが、走りはじめてすぐに「あ、今日はアカンわ」と。元気なんだけどスピードが上げられない。とかいいながら、軽い追い風に乗って、調子こいて7.5キロで折り返す。

そう、布袋モデルの堤防の辺り

そして、10km過ぎたら「毎度いらっしゃいませ」なハンガーノックの予感で予兆がオヨヨのヨ(意味無し)

「止まったら死ぬ~」と脳内ループ再生しながら何とかコーラにありつき、どうにか回復。再び走り始めたはいいけれど、12キロ到達時点で空から雪がちらついてきて心が折れた。

「もうこのへんでええやん」という感じ。

いやホント、10キロ超えて、いちいちハンガーノックになっているわけですから、「別に無理して10キロ以上走らんでもええんちゃう?」と、そんな心境。あーしんど。

思わずつられるこのタイトルw

| | コメント (0) | トラックバック (0)

2012.01.27

fetchAllとexecute

DoctrineでSELECT文を実行するのに、無意識にexecuteしてしまっていて、2回目のforeachが回ってくれないという現象にやられました。

$sql="SELECT foo,bar FROM hogeHoge ...";
$con = Doctrine_Manager::connection();
$this->record_list = $con->execute($sql);
                            //↑ここ
foreach($this->record_list as $record) {
    //一回目のループはOK
}
foreach($this->record_list as $record) {
    //二回目はループしない
}

一回のループで済ませるか、fetchAllに変えればOKですね。

実際には一回目のループはオートロードのクラス側で、二回目のループはsymfonyのテンプレート側に書いていました。

それに、「なんで配列がforeachで回らないのか?」という暗澹たる思いにとらわれていましたけど、あとでfetchAllexecuteの戻り値の型を調べてみますと、fetchAllの戻り値は配列ですが、executeの戻り値はPDOStatementというクラスオブジェクトでした。PHPってクラスオブジェクトもforeachにかけられるのですね。

いろんな条件が重なって気づくのが遅れたともいえるなー。

ドクトリンの日本語の本てほとんど無いですねー。
↓これくらいかw

| | コメント (0) | トラックバック (0)

«デイ・アフター・トゥモロー