Symfony2 twigでnl2brフィルタが使えない
前回の記事でnl2brフィルタの便利さを伝えたけど今回はtwigフィルタの微妙な話。
twigで使えるフィルタ同士の順番や相性?の問題で何故かnl2brが反映されない状態になったので一応メモ。
Symfonyについてはさっぱりわからないので原因や理由を把握しないまま野蛮的知識人的に強引に解決法だけ書いて終わり。
今回(といっても随分前だけど)引っかかったのは、
我らがnl2brフィルタとlengthフィルタの同時使用におけるフィルタ効いてないよー問題。
DBから取り出した改行コード入りのテキストデータをまずはnl2brを使って出力させる。
{{ str|nl2br }}
上記のようにすれば問題なく改行されて出力される。
ここに最初の100文字だけを取り出すフィルタを追加するとおかしいことになった。
単純に知識がないのでそのままゴリゴリ書く。
失敗1:
{ str|length > 100 ? str|nl2br|slice(0, 100) ~ ' ...' : str|nl2br|slice(0, str|nl2br|length -1) }}
すると array などと意図しない表示が出力される・・・
あー、strに付けるのが間違ってるんだなきっと。と浅はかな知恵を働かせる。
(後ろで再度sliceをしてるのは特殊データ形式のためスルーで)
失敗2:
{ str|length > 100 ? str|slice(0, 100)|nl2br ~ ' ...' : str|slice(0, str|length -1)|nl2br }}
あれ?今度は
がそのまま表示されてしまう。
なぜかsliceすると
がそのまま出力されるという謎。
この謎が解決出来ないどころか理由を知ろうともしない私はそのまま強引な解決策をピコーンと閃く。
失敗3:
{ str|length > 100 ? str|slice(0, 100)|nl2br|raw ~ ' ...' : str|slice(0, str|length -1)|nl2br|raw }}
rawが効いてない・・・だと?
もうフィルタはいいやと思い始めたけど、念のためエスケープ外してみるか。
成功:
{% autoescape false %}{{ str|length > 100 ? str|slice(0, 100)|nl2br ~ ' ...' : str|slice(0, str|length -1)|nl2br }}{% endautoescape %}
これでバッチリ改行されつつ表示されましたとさ。
切った後にnl2brをしないとそりゃ改行タグが途中で切れておかしくなるんだから失敗1はそもそも有り得ないミスです。
でもボリュームのある単純作業をやってると何も考えずに指だけ動いてることって結構あるんですよね。。。
しかしなぜ{% autoescape false %}をしないといけないのかよくわかりません。
英語が致命的に出来ないので調べようともしてないんですがなんでなんでしょう。
{% debug %}を使って出力しろって言われそうですが長くつき合うつもりがないので華麗にスルー。
どう考えてもviewでやる処理じゃないけど一つ上の行でnl2br使ってるのにそこだけ違うもおかしいので今回はtwig側に処理を書き入れての対応になりました。
出来る天才プログラマの方がtwigマニュアルを作ってくれることを切に願っています。
Symfony2 twigでnl2brを使って改行する
ググる力がないのかSymfonyの記事が全然出て来ないのでメモ。
古い記事がヒットするもnl2brについては書かれておらずnl2brはないものとして代替手段が書かれていた。
しかし最新のtwigにはいくつもフィルタが追加され、その中にnl2brもバッチリ収録されている。
テキストエリアからPOSTしたデータをそのままMySQLなんかのデータベースに突っ込んでいても、
{{ str|nl2br }}
と書くだけで改行をそのまま出力してくれる。
これまでstr_replaceを使ってわざわざ改行コードを
に変換させた上で、
{% autoescape false %}{{ str }}{% endautoescape %}なんかしてましたがnl2brさえ使えれば一発OK!
しかし、複数のフィルタを使おうとするとフィルタ同士の相性や順番の問題でおかしなことになったりする。
それはまた別の話なので別エントリーにて。
Mac Chromeのローカルストレージの場所
MacのChromeにデフォルトで備わっている「全てのcookieとサイトデータ」にはソートがないので、
・ローカルストレージだけを個別に消したいんじゃハゲ!
・サイズの大きいローカルストレージを上から順に並べて消したいんじゃボケ!
ってなって非常に不便。
そんなときはローカルストレージの保存場所にいって直接消してしまえってことで、
/Users/ユーザ名/Library/Application Support/Google/Chrome/Default/Local Storage
に行ってザクザク削除!(直接ゴミ箱にぶん投げる)
ローカルストレージは下記みたいな名前で保存されてます。
http_www.google.com_0.localstorage
http_www.google.com_0.localstorage-journal
ウェブサイトで出来たローカルストレージは先頭が「http_」または「https_」で始まり、
先頭が「chrome-extension_」になってるものは拡張機能で使っているローカルストレージです。
ローカルストレージは扱われ方がまだまだぞんざいでゴミのように溜まっていくのでメモ。
SiteSuckerの日本語化
ダウンロードソフトをいくつか試したけど使い勝手がいい!
ということで日本語しようと思ったらたまたまなのか、パッチファイルが検索で上位に出なかった。
見つけたーと思ったらリンク切れしてたりするので一応書いておこう。
パッチファイルは
ここから(SiteSucker 日本語リソース (Japanese.lproj for SiteSucker)バージョンにあったもの(基本最新バージョンで問題なし)をダウンロード
あとはアプリケーションフォルダに移動してSiteSuckerを右クリックして、パッケージの内容を表示
ContentsのResourcesフォルダに、ダウンロードしたパッチファイル(Japanese.lproj)まるごと入れて終わり
正規表現が使えるのが素晴らしい
JavaScript parseInt()で文字列を整数に変換する場合の注意
parseIntで文字列を数値に変換する際に、先頭が0で始まる文字列を渡すと
8進数として処理してしまう
alert( parseInt("08") ); // 0 が表示される
そこで、10進数で計算するように第二引数に10を指定してやる必要がある
alert( parseInt("08") ); // 8 が表示される
小数点以下の値を変換する際などは注意が必要
Web共有が起動しない 入りにならない Mac
Lionアップデート後にローカルホストに接続出来なくなった場合はここを参照するといいみたいです
https://discussionsjapan.apple.com/thread/10096783?start=0&tstart=0
httpd.confなんかをいじって立ち上がらなくなった場合はこっちのエントリーをどうぞ