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のローカルストレージの場所

MacChromeにデフォルトで備わっている「全ての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の日本語化

ダウンロードソフトをいくつか試したけど使い勝手がいい!

ということで日本語しようと思ったらたまたまなのか、パッチファイルが検索で上位に出なかった。

見つけたーと思ったらリンク切れしてたりするので一応書いておこう。

パッチファイルは

http://jppd.tripod.com/

ここから(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なんかをいじって立ち上がらなくなった場合はこっちのエントリーをどうぞ

http://d.hatena.ne.jp/akagamiman/20120422/1335078670

httpd.confを元に戻す方法 Mac

なんらかの設定をしてhttpd.confを書き間違ってしまうとWeb共有のチェックが「入」にならず、一時的に「−」になって元に戻ってしまいます。

それを防ぐ為に、httpd.confを書き換える際には毎回バックアップを取っておくのがおすすめです。

もしバックアップを取っていない時でも、最初からhttpd.default.confというファイルが用意されているので、このファイルの中身をhttpd.confに丸ごとコピーすれば一番最初の状態に戻すことが出来ます。


今回はターミナルを使わずにテキストエディタで中身を元に戻す方法を説明します。

続きを読む