2011年11月18日金曜日

Visualforceが憎いいいい



■簡単なこと■


てな感じの罫線入った表を表示したいとします(今回はグラデーション入れませんが)。まぁ日本のWeb屋さんにはごく日常的な作業で、処理系によって違いはあるけど

  • ループを回しながらコントロール・ブレークで行を出力していく
  • 先にコントロール・ブレーク済みの行データを配列にいれておいて出力

のどっちかで対応しますわな。

Visualforceだとループ内側では動的な評価ができないので後者で作ります。作りました。


■Visualforce困ったちゃん■

で、分類と詳細の行はレイアウトが違うので、分類の行だったら分類用のタグ、詳細行には詳細用のタグ…を出力させます。

そのために多くのフレームワークには「この内側のタグsを出力するか否か」をスイッチする機能が用意されてます。史上最高のWebフレームワークたるWebObjectsにはWOConditionalがあって(以下長いので省略

しかし。

Force.comってかVisualforceにはありません。ので、<apex:include>とか<apex:component>などを用いてコンポーネントとして作った要素を埋め込みrenderedでon/offします。

これでHTMLを生成すると…見事に表が崩れます。ソースを読んでみると…componentの前後に勝手に<span></span>が挿入されており、結果として以下のようなソースが生成されてしまいます。
<Table>
  <TR><SPAN><TH>品目</TH><TH>金額</TH></SPAN></TR>
  <TR><SPAN><TD>Mac</TD><TD>128,000</TD></SPAN></TR>
</Table>
そりゃ崩れるわなorz。


■しかし天才はいる■

で、困った時のGoogle先生ってことで apex:component span で検索してみたら、一発でworkaroundが見つかりました。「apex:component rendered in SPAN」、いやー、その手は思いつかなかった。まさに天才です。

さっそく実装してみたら、

<Table>
  <TR>
    <SPAN></SPAN>
    <TH>品目</TH><TH>金額</TH>
    <SPAN></SPAN>
  </TR>
  <TR>
    <SPAN></SPAN>
    <TD>Mac</TD><TD>128,000</TD>
    <SPAN></SPAN>
  </TR>
</Table>
となり、ブラウザ上では意図した通りの表示が出ました。

喜び勇んでrenderAs="PDF"を実行したら…。



…はい、終了。お疲れ様でした。まぁ、そらそうよね、<TR>の内側だしねorz

さて、TABLEを全部DIVで書き直すかな。CSSも全部再定義だ…。ああもう朝だ…。

私の夜はまだ明けそうにないがorz

0 件のコメント:

コメントを投稿