Mayaaでテーブル列の表示/非表示

2008/03/17

Mayaaで、特定のテーブル列の表示/非表示の制御にはまる。

こんなテーブルがあって、

列A列B列C
データAデータBデータC

列Bは条件により、表示させたりさせなかったりしたい。

thやtdをdivやspanで囲んだりするとhtml文法的に正しくないので、単純にdivやspanで囲んでm:ifで表示/非表示制御、とはしたくない。

まずmayaaで、
<m:if m:id="visible" test="${条件}" />
とやってしまうと、列Bが出る条件のときに、
<table border="1">
  <tr>
    <th>列A</th>
    列B
    <th>列C</th>
  </tr>
  <tr>
    <td>データA</td>
    データB
    <td>データC</td>
  </tr>
</table>

のようなhtmlが出力され、thやtdがなくなって、残念な出力になってしまう。
Mayaaはidのついたタグ単位でごっそり置き換えるので、あたりまえといえばあたりまえ。

で、
<m:if m:id="visible" test="${条件}" replace="false" />
というふうに、replace="false"をつけてあげると、htmlのタグは置き換わらず残って、
<table border="1">
  <tr>
    <th>列A</th>
    <th id="xxx">列B</th>
    <th>列C</th>
  </tr>
  <tr>
    <td>データA</td>
    <td id="xxx">データB</td>
    <td>データC</td>
  </tr>
</table>

となってうまくいく。

ところが今度は列Bが出ない条件のときに、
<table border="1">
  <tr>
    <th>列A</th>
    <th id="xxx"></th>
    <th>列C</th>
  </tr>
  <tr>
    <td>データA</td>
    <td id="xxx"></td>
    <td>データC</td>
  </tr>
</table>

と空タグが残ってしまい、残念な結果となる。

結局、以下のように対応。
これがベストプラクティスなのかどうかはわかりませんが、やりたいことはできました。
まず、表示/非表示用のタグをid="visible"として書いて、その内側にthタグやtdタグの出力用spanタグを書く。表示させるデータも可変であればさらにその内側にデータ用spanタグを書く。
mayaaでは、m:ifでid="visible"に対する記述でそもそもの表示/非表示を制御し、m:elementでthタグやtdタグを出力する。
これで、望みの結果が得られた。
[html]
<table border=1>
  <tr>
    <th>列A</th>
    <th id="visible">
      <span id="th">列B</span>
    </th>
    <th>列C</th>
  </tr>
  <tr>
    <td>データA</td>
    <td id="visible">
      <span id="td">
        <span id="datab">データB</span>
      </span>
    </td>
    <td>データC</td>
  </tr>
</table>


[mayaa]
  <m:if m:id="visible" test="${条件}" />
  <m:element m:id="th" name="th" />
  <m:element m:id="td" name="td" />
  <m:write m:id="datab" value="データBです" />


デザインとロジックの分離がイマイチになっちゃうのが難点。

うーん、やりたいことは簡単なのに。。。
もっとベストなやり方があるのだろうか。。。

------------------------------
5/17 追記
コメントでm:echoを使ったやり方を教えていただきました。
<m:if m:id="visible" test="${条件}" />
のところを、
<m:if m:id="visible" test="${条件}">
  <m:echo><m:doBody /></m:echo>
</m:if>

にすれば、m:elementが不要になり、mayaaがスッキリします。
よって、tdやthを出すために使っているspanも不要なり、htmlもスッキリします。
m:echoはタグの属性を変えるものだとばかり思ってましたが、ちょっとわかりずらいけどこういう使い方もあるのか、と勉強になりました。

Java | コメント(2) | トラックバック(0)
トラックバック
トラックバックURL:
コメント
suga
2008/05/16

遅い反応ですが は以下のように書けます。 td や th を出すために使っている span は不要です。 m:echo は他のプロセッサの内側に書いてもテンプレートのタグを出力できること、ただしその場合 m:doBody を書かないとボディが処理されないこと、がポイントです。

ryu
2008/05/17

sugaさん、ご教示ありがとうございます。 コメントがうまく反映されなかったみたいですが、m:echoとm:doBodyをヒントに考えてみたところ、以下のような方法でうまくいきました。 <m:if m:id="visible" test="${条件}"> <m:echo><m:doBody /></m:echo> </m:if> おかげさまでm:elementなんてしなくてよくなりました。 ありがとうございました。また教えてください。

コメントをどうぞ
名前 (入力しなければ「通りすがり」):

メールアドレス (入力しても公開されません):

URL (入力すればリンクが張られます):


コメント:

(コメントにタグなどを使ってもタグがそのままが表示されます)