Smartyにどうアサインするか。
常に大きな問題でした。
とりあえず、ありがちな話題として、「速度」というのがありますが、これはあまり問題にならないことがほぼ判っています。テンプレートで使われる変数だけをチマチマと渡しても、配列やオブジェクトをドカンとまるごと渡しても、速度的には大差ありません。オブジェクトは参照で渡りますし、配列はリファレンスカウントという仕組みのおかげで、参照で渡しても実体で渡しても速度的な差はありません。むしろ、チマチマと渡すコードが羅列されている方が、よほど負荷になりそうです。
問題は、渡すべきデータをどうするか、どんな形式で渡すか。その2点です。
Cube 2.1では、可能な限りオブジェクトで渡します。そして、基本的に生データ渡しです。これは、とても明確なルールであり、素晴らしい設計だと思います。
ただ、これでデザイナーがついてこれるか、というと難しいかもしれません。生データをescapeフィルターに渡さずにそのままテンプレートに書いてしまえば、XSS or ScriptInsertionです。そういう責任をデザイナーにおわせて良いのか…。
とりあえず、D3モジュールでは、コア互換性のために、オブジェクトでアサインすることはしません。あくまで配列です。
例えば、d3forumでは、
$post
$topic
$forum
$category
という判りやすい配列でアサインされ、それぞれ統一された命名規則の要素を持ちます(表記の揺れを極力減らす、ということ)。各配列のタイトルは、$category.title, $forum.title, $topic.title です($postだけはあえて$post.subjectにしていますが…)。このように、アサイン配列の構造を整理すれば、オブジェクトでなくても、データ取得方法が統一されていると言えるでしょう。
配列アサインあれば、altsysのDreamweaver支援機能もそのまま素直に利用できる、というメリットも大きいでしょう。(オブジェクトアサインでは不可能)
そして、これらの配列は、基本的に「そのまま表示して良い」文字列に変換済です。だから、デザイナーはXSSの心配なく、<{$topic.title}> と記述することができます。これは、良い言い方をすれば「プログラムが責任を持つ」、悪い言い方をすれば「デザイナーを信用しない」やり方です。
どちらの方法が良いか、現時点では判断できません。実際に、Cube2.1やD3モジュールが普及して、デザイナーがいじる段階になって初めて評価が下されることでしょう。