6

私はSDLTridion2011SP1でDreamweaverTBBに取り組んでいます。

DreamweaverTBBでコンポーネントリンクを処理していることに気づいていません。

私のコンポーネント名が「A」で、別のコンポーネント「B」にリンクしているとします。

コンポーネントAのソースは次のようになります。

<Content xmlns="Some UUID">
    <Name xlink:type="simple" xlink:href="tcm:184-1897" 
          xmlns:xlink="http://www.w3.org/1999/xlink" xlink:title="B"></Name>
</Content>

コンポーネントBのソースは次のとおりです。

<Content xmlns="Some other UUID">
    <first>first field</first>
    <second>second field</second>
</Content>

コンポーネントAからリンクされたコンポーネントBのフィールドにアクセスできるDWTTBBを作成したいと思います。

RenderComponentFieldレンディションメソッドを使用したい。

それに拡張機能を追加する必要がありますか、SiteEditを適用できますか?

それについてのあなたの意見を共有してください。

ありがとうございました。

4

4 に答える 4

6

このトピックには2つの別々の質問があります。

  1. DWTのリンクされたコンポーネントからフィールドにアクセスするにはどうすればよいですか?
  2. リンクされたコンポーネントのフィールドをSiteEdit2009で編集可能にするにはどうすればよいですか?

これが質問1の答えです。質問2には別の答えを提供します。

TridionのDWTテンプレートでの式のデフォルトの処理では、パッケージ内のコンポーネントのフィールドにのみアクセスできます。したがって、コンポーネントBのフィールドにアクセスする場合は、そのコンポーネントをパッケージにプッシュするC#TBBを作成する必要があります。

サンプルC#フラグメント:

var componentA = (Component) engine.GetObject(package.GetValue("Component.ID"));
var fieldsA = new ItemFields(componentA.Content, componentA.Schema);
var linkField = (ComponentLinkField) fieldsA["Name"];
var componentB = linkField.Value;
var itemB = package.CreateTridionItem(ContentType.Component, componentB);
package.PushItem("ComponentB", itemB);

これをC#フラグメントTBBに入れ、DWTの前にCTにドロップすると、DWTでこれを行うことができます。

@@ComponentB.Fields.first@@

または、NunoのDreamweaver Get eXtension(DGX)を使用して、TBBを記述せずにこのようなフィールドにアクセスできます。

@@Get("Fields.Name.first")@@"/>

DGXを使用することの唯一の欠点は、すべてのTridionサーバーにDGXをインストールする必要があることです。その後、拡張機能のヒープがDWTで使用可能になります。

于 2012-04-21T12:18:53.730 に答える
5

リンクされたコンポーネントのフィールドを編集できるようにすることが、SiteEdit2009SP2で導入されました。SiteEditフロントエンドは、ステージングサーバーから返されるHTMLに埋め込まれているSiteEditコマンド言語に基づいて機能します。

したがって、そこに単一のコンポーネントがあるとしましょう。

<div class="cp">
    <!-- Start SiteEdit Component Presentation: {"ID" : "cp_1", 
         "ComponentID" : "tcm:12-549", "ComponentTemplateID" : "tcm:12-568-32",
         "ComponentVersion" : 5, "IsQueryBased" : false  } -->
    <label>Title: </label>
    <span>
        <!-- Start SiteEdit Component Field: {"ID": "cf_1", 
             "XPath": "tcm:Content/custom:Content/custom:Title", 
             "IsMultiValued":false} -->
        Tips for getting insurance when you have a pre-existing condition
    </span>
</div>

HTMLがSiteEditStart SiteEditに与えるコマンドがあり、それらがコンポーネントプレゼンテーションとタイトルフィールドをどのようにマークしているかを確認できます。

リンクされたコンポーネントのフィールドをレンダリングする場合は、次のような対応するコンポーネントプレゼンテーションコマンドも必要です。

<div class="cp">
    <!-- Start SiteEdit Component Presentation: {"ID" : "cp_1", 
         "ComponentID": "tcm:12-54", "ComponentTemplateID": "tcm:12-56-32",
         "ComponentVersion" : 5, "IsQueryBased" : false  } -->
    <label>Title: </label>
    <span>
        <!-- Start SiteEdit Component Field: {"ID": "cf_1", 
             "XPath": "tcm:Content/custom:Content/custom:Title", 
             "IsMultiValued":false} -->
        Tips for getting insurance when you have a pre-existing condition
    </span>
    <br />
    <div class="cp">
        <!-- Start SiteEdit Component Presentation: {"ID" : "cp_2", 
            "ComponentID": "tcm:12-85", "ComponentTemplateID": "tcm:12-60-32", 
            "ComponentVersion" : 2, "IsQueryBased" : true  } -->
        <label>Byline: </label>
        <span>
            <!-- Start SiteEdit Component Field: {"ID": "cf_2", 
                 "XPath": "tcm:Metadata/custom:Metadata/custom:ByLine", 
                 "IsMultiValued":false} -->
            "It's a huge problem, because ..." says one expert.
        </span>
        <br />
        <label>Copyright: </label>
        <span>
            <!-- Start SiteEdit Component Field: {"ID": "cf_3", 
                 "XPath": "tcm:Metadata/custom:Metadata/custom:Copyright", 
                 "IsMultiValued":false} -->
            Getty Images
        </span>
    </div>
</div>

これで、2つのStart SiteEdit Component Presentationコマンドがあります。1つは外部コンポーネント用で、もう1つはリンクされたコンポーネント用です。ここで注意すべき重要な点の1つは、ネストされたコンポーネントプレゼンテーションのIsQueryBasedプロパティをtrueに設定する必要があることです。これは、SiteEditフロントエンドに、コンポーネントプレゼンテーションが実際にTridionから取得するページXMLに存在することを想定していないことを通知します。

SiteEditフロントエンドでは、コマンドがHTMLにどのように配置されるかは問題ではありません。

最も一般的なのは、対応する部分をマークするRenderComponentPresentationandを呼び出すことです。RenderComponentFieldただし、残念ながら、このRenderComponentField関数は、次のように表示される、いわゆる「コンテキストコンポーネント」からフィールドをレンダリングするためにのみ使用できます。

Item component = _package.GetByType(ContentType.Component);

これは、単一のDWTで、へのすべての呼び出しがRenderComponentField同じコンテキストコンポーネントで機能することを意味します。RenderComponentFieldしたがって、単一のDWTを呼び出して、2つの異なるコンポーネントからフィールドをレンダリングすることはできません。

これを解決するには、次の2つのオプションがあります。

  1. RenderComponentPresentationリンクされたコンポーネントを呼び出す
  2. Start SiteEdit Component PresentationStart SiteEdit Component FieldコマンドをDWTで自分でレンダリングします

オプション1は、取得できる最もクリーンな分離です。別のコンポーネントからフィールドをレンダリングしているため、基本的に別のコンポーネントプレゼンテーションをレンダリングしています。リンクされたフィールドのレイアウトを別のDWTに分割し、その周りにCTを構築すると、メインのDWTで次のようにレンダリングできます。

@@RenderComponentPresentation(Component.Fields.Name, "tcm:1-2-32")@@

Walterは、Tridionテンプレートに関する彼の記事でこれを最もよく説明しています。

このDreamweaverテンプレートのスコープは、現在のコンポーネントフィールドの表示に限定されているため、RenderComponentPresentation関数を使用して追加の手順を実行する必要があります。マルチメディアコンポーネントのTCMURIを、別のDreamweaverテンプレートのTCMURIと一緒にこの関数に渡す必要があります。

RenderComponentFieldより多くのCTとDWTにつながりますが、これらのDWTは、通常どおりに使用できるようになるため、はるかに単純になります。

オプション2は、実際には、DWTのSiteEditコマンドを使用してHTMLコメントを出力していることを意味します。コマンド言語はAPIの一部として文書化されているため(上​​記のリンクを参照)、SiteEdit2009の将来のバージョンで変更される可能性はほとんどありません。

長い話で申し訳ありませんが、あなたはたまたまここでトリッキーなユースケースを引き起こしました。私はそれが理にかなっていることを願っています。

于 2012-04-21T14:28:54.797 に答える
2

SiteEdit 2009を使用している場合は可能ですが、メインコンポーネントフィールドを使用する場合よりも少し難しくなります。SiteEditは、コンテンツフィールドをJSONマークアップでラップすることで機能します。パブリケーションターゲットがステージングされているかどうかを検出して、このJSONを自分で書き出すことができない理由はありません。

あるいは、Will Priceは、SiteEditを支援するためのいくつかのテンプレートビルディングブロックを開発しました。これらはここで入手できます。

これらには、ここにガイドが付属しています。具体的には、組み込みコンポーネントに関するセクションが役立ちます。

于 2012-04-21T11:47:59.547 に答える
-2

標準のDreamweaverテンプレートを使用してBからフィールドを読み取ることはできません。リンクされたコンポーネントを抽出し、コンポーネントタイプとしてパッケージに配置するには、C#TBBを作成する必要があります。次に、DWT構文を使用して、そのコンポーネントからフィールドを読み取ることができます。例:@@linkedComponent.Fields.first @@

Siteeditはこれに問題があり、バージョンが異なれば構文と機能も異なります。最新バージョンでは、そのようなフィールドを編集できないのではないかと思います...

于 2012-04-21T08:20:13.413 に答える