tezutaku

製品関連情報をマトリックスで表示したい

0

サポートページで製品に対するFAQやダンロード情報があるかないかで○×を表示するためのテンプレートを作成しました。
製品名カテゴリを対象にエントリーが一件でもあるかどうかで判別する方法です。
製品ブログのエントリーから製品名を取り出し、FAQブログやダウンロードブログでその製品名と同じ製品カテゴリにエントリーがあるかどうかを判断します。
対象ブログを入れ子にしてそれぞれ製品名と製品カテゴリのエントリーの有無を判断していくことで期待した結果を得られていますが、どうにもスマートとは言えない感じです。
おそらく配列を使えばもっとすっきりと処理できるのでしょうけど、なにぶん勉強不足で思い至りません。
FAQ カタログ ソフトウェア
製品A ○    ○    ×
製品B ×    ○    ×
のような表の作成ですが、もっと良い方法があればどなたかご教授いただければと。

<dl>
<mt:Entries include_blogs="$products_blogid">
<mt:SetVarBlock name="pname"><$mt:EntryTitle$></mt:SetVarBlock>
<dt><$mt:Var name="pname"$></dt>

<mt:Blogs include_blogs="$download_blogid">
<mt:SubCategories category="ソフトウェア">
<mt:SetVarBlock name="catname"><$mt:CategoryLabel$></mt:SetVarBlock>
<mt:If name="catname" eq="$pname">
<mt:SetVarBlock name="pname_cat">1</mt:SetVarBlock>
<mt:If tag="mt:CategoryCount">
<dd>ソフトウェア:○</dd>
<mt:Else>
<dd>ソフトウェア:×</dd>
</mt:If>
</mt:If>
</mt:SubCategories>
<mt:If name="pname_cat" eq="1">
<mt:Else><dd>ソフトウェア:×</dd>
</mt:If>
<mt:SetVarBlock name="pname_cat">0</mt:SetVarBlock>

<mt:Blogs include_blogs="$download_blogid">
<mt:SubCategories category="カタログ">
<mt:SetVarBlock name="catname"><$mt:CategoryLabel$></mt:SetVarBlock>
<mt:If name="catname" eq="$pname">
<mt:SetVarBlock name="pname_cat">1</mt:SetVarBlock>
<mt:If tag="mt:CategoryCount">
<dd>カタログ:○</dd>
<mt:Else>
<dd>カタログ:×</dd>
</mt:If>
</mt:If>
</mt:SubCategories>
<mt:If name="pname_cat" eq="1">
<mt:Else><dd>カタログ:×</dd>
</mt:If>
<mt:SetVarBlock name="pname_cat">0</mt:SetVarBlock>

<mt:Blogs include_blogs="$faq_blogid">
<mt:SubCategories category="ソフトウェア">
<mt:SetVarBlock name="catname"><$mt:CategoryLabel$></mt:SetVarBlock>
<mt:If name="catname" eq="$pname">
<mt:SetVarBlock name="pname_cat">1</mt:SetVarBlock>
<mt:If tag="mt:CategoryCount">
<dd>FAQ:○</dd>
<mt:Else><dd>FAQ:×</dd></mt:Else>
</mt:If>
</mt:If>
</mt:SubCategories>
<mt:If name="pname_cat" eq="1">
<mt:Else><dd>FAQ:×</dd>
</mt:If>
<mt:SetVarBlock name="pname_cat">0</mt:SetVarBlock>

</mt:Blogs>
</mt:Blogs>
</mt:Blogs>
</mt:Entries>
</dl>

返信(7)

| 返信する
  • >tezutakuさん
    以下のコードでご要望の機能が実現できると思います(ただしMT4の古いバージョンでは動作しません)。勝手にtable要素にしてしまっているので、定義リストに変更する場合は該当箇所を書き換えてください。

    使い方ですが、最初の3行あるSetVarタグのname属性に、読み込みたいブログID、value属性にそのブログで取得したいカテゴリ名を設定してください。SetVarタグは何行でも追加可能です。
    テンプレートの説明は別途ブログの方で行いたいと思います。

    <mt:SetHashVar name="list">
      <$mt:SetVar name="1" value="ソフトウェア"$>
      <$mt:SetVar name="2" value="カタログ"$>
      <$mt:SetVar name="3" value="FAQ"$>
    </mt:SetHashVar>
     
    <mt:SetVarTemplate name="foo">
      <$mt:SetVar name="pname_cat" value="0"$>
      <mt:TopLevelCategories category="$category">
        <$mt:CategoryLabel setvar="catname"$>
        <mt:If name="catname" eq="$pname">
          <$mt:SetVar name="pname_cat" value="1"$>
          <mt:If tag="CategoryCount">
    <td>○</td>
          <mt:Else>
    <td>×</td>
          </mt:If>
        </mt:If>
        <$mt:SubCatsRecurse$>
      </mt:TopLevelCategories>
      <mt:Unless name="pname_cat">
    <td>×</td>
      </mt:Unless>
    </mt:SetVarTemplate>
     
    <table>
      <thead>
        <tr>
          <th></th>
    <mt:Loop name="list">
      <th><$mt:GetVar name="__value__"$></th>
    </mt:Loop>
        </tr>
      </thead>
      <tbody>
    <mt:Entries>
      <$mt:EntryTitle setvar="pname"$>
        <tr><td><$mt:GetVar name="pname"$></td>
      <mt:Loop name="list">
        <$mt:GetVar name="__key__" setvar="blog_id"$>
        <$mt:GetVar name="__value__" setvar="category"$>
        <mt:Blogs include_blogs="$blog_id">
          <$mt:GetVar name="foo"$>
        </mt:Blogs>
      </mt:Loop>
        </tr>
    </mt:Entries>
      </tbody>
    </table>
    • yujiroさん

      早速の回答ありがとうございます!!
      テンプレートまでご呈示頂いて恐縮です。

      やはり配列を使うと良いのですね。
      それと製品情報の各項目の部分は先にテンプレート化しておくわけですか。

      ハッシュ配列も考えたのですが、
      製品名をキーとして、情報項目を値としてと考えると1個しか使えないのでどうしたものかと考えていました。
      ブログとカテゴリをハッシュに使うのは思い至りませんでした。

      SetHashVarで指定したカテゴリのサブカテゴリだけ(製品名カテゴリ)を対象にしたいので、

      <mt:SubCategories category="$category">

      として
       <$mt:SubCatsRecurse$>

      は外しました。

      また、メーカーブログ毎の製品エントリーに対して処理を行いたいので
      製品名を取り出すブロックの外側にメーカー名を取り出すブロックをかぶせるのは問題無いでしょうか?
      Webページでメーカーごとの情報を記録していてそれを利用します。
      ・メーカーサイトの製品ブログのIDをカスタムフィールド「pblogid」に入力しています。
      ・メーカー別製品ブログのサポート情報ページURL(○の場合にリンクする)を追加したいのでカスタムフィールド「maker_supporturl」に
      サポートページのURLを入力しています。

      下記のように変更しました。

      <mt:SetHashVar name="list">
        <$mt:SetVar name="1" value="software"$>
        <$mt:SetVar name="2" value="catalog"$>
        <$mt:SetVar name="3" value="faq"$>
      </mt:SetHashVar>
       
      <mt:SetVarTemplate name="foo">
        <$mt:SetVar name="pname_cat" value="0"$>
       <mt:SubCategories category="$category">
          <$mt:CategoryLabel setvar="catname"$>
          <mt:If name="catname" eq="$pname">
            <$mt:SetVar name="pname_cat" value="1"$>
            <mt:If tag="CategoryCount">
      <td><a href="<$mt:GetVar name="maker_support_url"$>/<$mt:GetVar name="category"$>">○</a></td>
            <mt:Else>
      <td>×</td>
            </mt:If>
          </mt:If>
        </mt:SubCategories>
        <mt:Unless name="pname_cat">
      <td>×</td>
        </mt:Unless>
      </mt:SetVarTemplate>
       
      <table>
        <thead>
          <tr>
            <th></th>
      <mt:Loop name="list">
        <th><$mt:GetVar name="__value__"$></th>
      </mt:Loop>
          </tr>
        </thead>
        <tbody>
      <mt:Pages folder="maker">
      <$mt:PageTitle$>
      <mt:SetVarBlock name="productBlog_Id"><$mt:pblogid$></mt:SetVarBlock>
      <mt:SetVarBlock name="maker_support_url"><$mt:maker_supporturl$></mt:SetVarBlock>
      <mt:Entries  include_blogs="$productBlog_Id">
        <$mt:EntryTitle setvar="pname"$>
          <tr><td><$mt:GetVar name="pname"$></td>
        <mt:Loop name="list">
          <$mt:GetVar name="__key__" setvar="blog_id"$>
          <$mt:GetVar name="__value__" setvar="category"$>
          <mt:Blogs include_blogs="$blog_id">
            <$mt:GetVar name="foo"$>
          </mt:Blogs>
        </mt:Loop>
          </tr>
      </mt:Entries>
      </mt:Pges>
        </tbody>
      </table>
  • >tezutakuさん
    MTPagesとMTEntiresを入れ子にすると、内側のMTEntiresが正常に動作しないかもしれません。試してみてください。

    • 試してみました。
      メーカーのWebページに設置したカスタムフィールドのデータを変数に格納した値はMTEntiresの中で反映されています。
      ただ、MTPageTitleが入れ子に入らずに一行で繰り返して表示されてしまったので、
      tableの外側にMTPagesを記述して、メーカー名をテーブルのキャプション内に記述しました。
      これで、期待した結果を得られているように思えるのですが、問題は無いでしょうか?

      <mt:Pages>
      <table>
        <caption>
          <$mt:PageTitle$>
        </caption>
        <thead>
          <tr>
            <th></th>
      <mt:Loop name="list">
        <th><$mt:GetVar name="__value__"$></th>
      </mt:Loop>
          </tr>
        </thead>
        <tbody>
      <mt:SetVarBlock name="productBlog_Id"><$mt:maker_pblog_id$></mt:SetVarBlock>
      <mt:SetVarBlock name="maker_support_url"><$mt:maker_supporturl$></mt:SetVarBlock>
      <mt:Entries  include_blogs="$productBlog_Id">
        <$mt:EntryTitle setvar="pname"$>
          <tr><td><$mt:GetVar name="pname"$></td>
        <mt:Loop name="list">
          <$mt:GetVar name="__key__" setvar="blog_id"$>
          <$mt:GetVar name="__value__" setvar="category"$>
          <mt:Blogs include_blogs="$blog_id">
            <$mt:GetVar name="foo"$>
          </mt:Blogs>
        </mt:Loop>
          </tr>
      </mt:Entries>
        </tbody>
      </table>
      </mt:Pages>
  • >tezutakuさん
    気がつきませんでしたが、MTEntriesにinclude_blogsモディファイアを設定しているので正常に動作するようですね。
    期待している動作になっているようであれば大丈夫だと思います。

  • yujiroさん

    おかげさまで表の作成ができました。
    ありがとうございました。

  • 作成された表で、すべて×の製品行が表示されないようにして欲しいとの要望があり、
    FAQやカタログ、ソフトウェアでの製品カテゴリーのエントリーがすべて無いかどうかを
    先に調べて、無い場合はその製品行の処理をしないように修正しました。
    mt:SetVarTemplate name="pname_catItemCheck"を実行して判断し、
    mt:SetVar name="pname_itemYes" value="1"をセットします。
    MTIf name="pname_itemYes"の場合は、行の処理を行うようにしました。

    <mt:SetHashVar name="list">
      <$mt:SetVar name="2" value="ソフトウェア"$>
      <$mt:SetVar name="25" value="カタログ"$>
      <$mt:SetVar name="26" value="FAQ"$>
    </mt:SetHashVar>
    
    

    <mt:SetVarTemplate name="pname_catItemCheck">
    <mt:SubCategories category="$category">
    <$mt:CategoryLabel setvar="catname"$>
    <mt:If name="catname" eq="$pname">
    <mt:If tag="CategoryCount">
    <$mt:SetVar name="pname_itemYes" value="1"$>
    <mt:Else>
    </mt:If>
    </mt:If>
    </mt:SubCategories>
    </mt:SetVarTemplate>

    <mt:SetVarTemplate name="pname_td_process">
    <$mt:SetVar name="pname_cat" value="0"$>
    <mt:SubCategories category="$category">
    <$mt:CategoryLabel setvar="catname"$>
    <mt:If name="catname" eq="$pname">
    <$mt:SetVar name="pname_cat" value="1"$>
    <mt:If tag="CategoryCount">
    <td><a href="<$mt:GetVar name="maker_support_url"$>/<$mt:GetVar name="category"$>">○</a></td>
    <mt:Else>
    <td>×</td>
    </mt:If>
    </mt:If>
    </mt:SubCategories>
    <mt:Unless name="pname_cat">
    <td>×</td>
    </mt:Unless>
    </mt:SetVarTemplate>

    <mt:Pages>
    <table>
    <caption>
    <$mt:PageTitle$>
    </caption>
    <thead>
    <tr>
    <th></th>
    <mt:Loop name="list">
    <th><$mt:GetVar name="__value__"$></th>
    </mt:Loop>
    </tr>
    </thead>
    <tbody>
    <mt:SetVarBlock name="productBlog_Id"><$mt:maker_pblog_id$></mt:SetVarBlock>
    <mt:SetVarBlock name="maker_support_url"><$mt:maker_supporturl$></mt:SetVarBlock>
    <mt:Entries include_blogs="$productBlog_Id">
    <$mt:EntryTitle setvar="pname"$>

    <$mt:SetVar name="pname_itemYes" value="0"$>
    <mt:Loop name="list">
    <$mt:GetVar name="__key__" setvar="blog_id"$>
    <$mt:GetVar name="__value__" setvar="category"$>
    <mt:Blogs include_blogs="$blog_id">
    <$mt:GetVar name="pname_catItemCheck"$>
    </mt:Blogs>
    </mt:Loop>

    <MTIf name="pname_itemYes">
    <tr><td><$mt:GetVar name="pname"$></td>
    <mt:Loop name="list">
    <$mt:GetVar name="__key__" setvar="blog_id"$>
    <$mt:GetVar name="__value__" setvar="category"$>
    <mt:Blogs include_blogs="$blog_id">
    <$mt:GetVar name="pname_td_process"$>
    </mt:Blogs>
    </mt:Loop>
    </tr>
    </MTIf>
    </mt:Entries>
    </tbody>
    </table>
    </mt:Pages>

返信する


カテゴリグループ

OpenID対応しています OpenIDについて