Home> MT4第2回 > 追加課題: 2008年7月アーカイブ
追加課題: 2008年7月アーカイブ
追加課題1:解答編(oscar varsion)
- 2008年7月 9日 22:56
- 追加課題
それでは、追加課題1の解答です。
もちろん私のバージョンです。そしてあくまでも、解答の一例でしかありません。
テーブル部分のみのコードになります。
<$MTSetVar name="thumb_count" value="0"$> <MTEntries days="70"> <MTEntryAssets type="image"> <$MTSetVar name="thumb_count" op="++"$> <MTIf name="thumb_count" eq="1"><table class="thumbnail" summary="最近(さいきん)の写真"></MTIf> <MTIf name="thumb_count" value="3" op="%" eq="1"><tr></MTIf> <td><p><a href="<$MTEntryPermalink$>" title="<$MTEntryTitle encode_html="1"$>"> <img src="<$MTAssetThumbnailURL height="208"$>" alt="<$MTEntryTitle encode_html="1"$>" title="<$MTEntryTitle encode_html="1"$>" /> </a></p> <h3><span class="<$MTEntryAuthorUsername$>"><a href="<$MTEntryPermalink$>"><$MTEntryTitle encode_html="1"$></a></span></h3></td> <MTIf name="thumb_count" value="3" op="%" eq="0"></tr></MTIf> </MTEntryAssets> <MTIf name="__Last__"> <MTIf name="thumb_count" value="3" op="%" ne="0"> <$MTGetVar name="thumb_count" value="3" op="%" setvar="amari"$> <$MTSetVar name="amari" value="3"op="-"$> <td colspan="<$MTGetVar name="amari" value="-1"op="*"$>"> </td> </tr> </MTIf> <MTIf name="thumb_count" ne="0"></table></MTIf> </MTIf> </MTEntries>
改行をわざと入れないで、コンパクトに(出力の改行を少なく)書こうとするので、見ずらいですね。でもホントは、さらに見づらく書いたりするんですよ。
<$MTSetVar name="thumb_count" value="0"$><MTEntries days="120"><MTEntryAssets type="image"><$MTSetVar name="thumb_count" op="++"$> <MTIf name="thumb_count" eq="1"><table class="thumbnail" summary="最近(さいきん)の写真"> </MTIf><MTIf name="thumb_count" value="3" op="%" eq="1"><tr> </MTIf><td><p><a href="<$MTEntryPermalink$>" title="<$MTEntryTitle encode_html="1"$>"> <img src="<$MTAssetThumbnailURL height="208"$>" alt="<$MTEntryTitle encode_html="1"$>" title="<$MTEntryTitle encode_html="1"$>" /> </a></p> <h3><span class="<$MTEntryAuthorUsername$>"><a href="<$MTEntryPermalink$>"><$MTEntryTitle encode_html="1"$></a></span></h3></td> <MTIf name="thumb_count" value="3" op="%" eq="0"></tr> </MTIf></MTEntryAssets><MTIf name="__Last__"><MTIf name="thumb_count" value="3" op="%" ne="0"><$MTGetVar name="thumb_count" value="3" op="%" setvar="amari"$><$MTSetVar name="amari" value="3"op="-"$> <td colspan="<$MTGetVar name="amari" value="-1"op="*"$>" class="amari"> </td> </tr></MTIf> <MTIf name="thumb_count" ne="0"></table></MTIf></MTIf></MTEntries>
通常は見やすいコードで書いて、デバッグ済んだ後で、改行調整して本コードにするようにしています。
あと、すでにことわった通り、<td colspan="1">というコードになる時があります。さらに条件分岐をはさんで、これを回避する事も可能です。
今回__last__を使っている部分は、MTEntriesFooterでも可能です。慣れている方を使いましょう。(ただし__last__とMTEntriesFooterを同一のものと思ってはいけません)
なおこの様なコードを書く場合に、すべてのエントリーに画像アイテムが含まれなかった場合に、空のセルをテーブル内に出力するのか、テーブルタグ自身(<table>)も出力させないのかを考えることが重要です。私のコードではテーブル自身が出力されません。
テーブルの開始タグの位置が変だったので、修正しました。
ちなみに出力結果がこれです。
- Comments: 0
- TrackBacks: 0
追加課題1:余り部分の処理・捻った回答
- 2008年7月 8日 19:51
- 追加課題
別解も表示しときます。
ほんの少しだけ、捻りいれてます。
最初に0の場合を除外します。
変数amariに、3で割った余りをセットします。
amariから3を引くと、負の符号が付いていますが、足りないセル数になります。
amariに-1をかけて、符号を反転させたものを、colspanにセットします。
colspan="1"というのが、絶対許せない方には、お勧めできません。
<MTIf name="__last__"> <MTIf name="thumb_count" value="3" op="%" ne="0"> <$MTGetVar name="thumb_count" value="3" op="%" setvar="amari"$> <$MTSetVar name="amari" value="3"op="-"$> <td colspan="<$MTGetVar name="amari" value="-1"op="*"$>"> </td> </tr> </MTIf> </MTIf>
- Comments: 0
- TrackBacks: 0
追加課題1:余り部分の処理をするには2
- 2008年7月 8日 19:04
- 追加課題
カウンターは引き継がれていますので、3で割った余りが1の場合は、残りは2つになります。その場合、colspanは2です。行は閉じていませんので閉じタグを追加します。
余りが1の場合はcolspan指定無しで空セルを追加、この時も閉じタグを追加します。
なお、割り切れる場合には、セルの追加の必要はありませんし、行の閉じタグもすでに追加されています。
以上の内容だと下の様なテンプレートになります。
<MTIf name="__last__"> <MTIf name="thumb_count" value="3" op="%" eq="1"> <td colspan="2"> </td> </tr> <MTElseIf name="thumb_count" value="3" op="%" eq="2"> <td> </td> </tr> </MTIf> </MTIf>
割り切れる場合には、条件に合致しませんから、何も出力されません。
- Comments: 0
- TrackBacks: 0
追加課題1:余り部分の処理をするには1
- 2008年7月 8日 17:48
- 追加課題
さぁ、大分形になってきました。
後足りないのは、「最後に3つ並べるのに足りなくなった場所」の処理です。
ここで登場するのが、出題のヒントにある<MTIf name="__last__">です。__last__はブロックタグ内の繰り返しの中で、一番最後であることを表す変数です。
MTIfと組み合わせて、最後のみ処理されるブロックを指定できます。
<MTEntries>
<MTEntryAssets>
・内部処理
</MTEntryAssets>
<MTIf name="__last__">
・最後の処理
</MTIf>
</MTEntries>
とする事で、今回のケースの様な処理を行わせる事が可能です。
つまり一番最後のエントリーで、アイテム処理が終了した後で、足りない部分を埋める処理をさせる訳です。
セットしたカウンター変数には、画像アイテムの個数がセットされています。後は余りがいくつになるかで、colspan処理を変えます。
- Comments: 0
- TrackBacks: 0
追加課題1:表示列で処理を分岐する
- 2008年7月 8日 10:49
- 追加課題
次は内部での分岐です。
最初に説明した、繰り返し毎の出力を使います。
画像アイテムが3つずつ繰り返し配置になります。
最初の列ではアイテムを囲む<td>のほかに、行を開始する<tr>が必要になります。
2列目はそのままアイテムを囲む<td>を出力します。
3列目では、行を終了する</tr>がアイテムを囲む<td>の後に必要です。
出力はこの繰り返しになります。
実際には1列目の最初に<tr>を出力し、3列目の最後に</tr>を出力するよう、処理を追加すればよいことになります。
1列目はかうんたーの数字を3で割って、余りが1になるケースです。
2列目は余りが2で、3列目は割り切れるケースになります。これ以外の状態はありません。
<カウンターを3で割った余りが1の場合>
・<tr>を出力
</1の場合の追加処理終了>
・すべてに共通な、<td>で囲んだ画像アイテムの出力
<カウンターを3で割りきれる(余りが0)場合>
・</tr>を出力
</3の場合の処理終了>
これをテンプレートにすると以下のようになります。
<table class="thumbnail" summary="最近(さいきん)の写真"> <$MTSetVar name="thumb_count" value="0"$> <MTEntries days="70"> <MTEntryAssets type="image"> <$MTSetVar name="thumb_count" op="++"$> <MTIf name="thumb_count" value="3" op="%" eq="1"><tr></MTIf> <td><a href="<$MTEntryPermalink$>" title="<$MTEntryTitle$>"> <img src="<$MTAssetThumbnailURL width="208"$>" alt="<$MTEntryTitle$>" title="<$MTEntryTitle$>" /> </a></td> <MTIf name="thumb_count" value="3" op="%" eq="0"></tr></MTIf> </MTEntryAssets> </MTEntries> </table>
ここまででは、余り分の処理は行っていません。
- Comments: 0
- TrackBacks: 0
追加課題1:ブロックタグが入れ子になった時のカウント2
- 2008年7月 8日 05:35
- 追加課題
カウンター変数は、ブロックタグの外側で初期化(ゼロにセット)します。
カウントしたいものの前後どちらかで、カウンターを一つ増やします(インクリメント)。
初期化する位置、初期化する値(0か1か)、カウントする位置は、常に決まっている訳ではありません。何をカウントするかを考えて、挿入位置を決定します。
<$MTSetVar name="thumb_count" value="0"$> <MTEntries days="70"> <MTEntryAssets type="image"> <$MTSetVar name="thumb_count" op="++"$> <a href="<$MTEntryPermalink$>" title="<$MTEntryTitle encode_html="1"$>"> <img src="<$MTAssetThumbnailURL width="208"$>" alt="<$MTEntryTitle encode_html="1"$>" title="<$MTEntryTitle encode_html="1"$>" /> </a> </MTEntryAssets> </MTEntries>
__counter__ではなく、独自の変数(上のケースでは「thumb_count」)をカウンターに使っているので、ブロックタグの繰り返し内のどの部分でも、アイテム数を取り出せます。またブロックタグを抜けても、変数は保持されていますので、後から参照できます。
- Comments: 0
- TrackBacks: 0
- Older: 追加課題: 2008年6月