11

「保存」コマンドの拡張機能を作成しています。基本的に、特定のフィールドを検証し、ポップアップを表示して、編集者が現在の日付、リリース番号、その他の属性に基づいて特定のキーワードまたはその他の値を選択できるようにします。

$display.getItem()エディターが変更した可能性のある現在の値ではなく、CMに格納されているアイテムを返すことが最終的にわかるまで、順調に進んでいると思いました。

この情報を取得するための組み込みの方法はありますか?または、DOMを解析して把握する必要がありますか?

これは私が現在持っているコードです

var item = $display.getItem();
if (item.getItemType() == "tcm:16") {
   if (item.getSchema().getStaticTitle() == "Test Schema") {
      var content = $xml.getNewXmlDocument(item.getContent());
      var fieldXml = $xml.getInnerText(content, "//*[local-name()='NewField']");
      alert(fieldXml);
   }
}

動作しています-「NewField」の値を取得します-しかし、これはアイテムがロードされたときに持っていた値であり、現在の値ではありません。

興味深いことに、item.getTitle()タイトルフィールドの現在の値を示しているので、カスタムフィールドでもこれを実現する方法があると思います。

4

2 に答える 2

9

これが適切な方法かどうかはわかりませんが、アイテムに対して「collectdata」イベントを発生させることができます。これにより、これまでに編集画面に入力された内容でデータが更新されます。

var item = $display.getView().getItem();
item.fireEvent("collectdata");
$log.message(item.getXml());
于 2012-05-07T09:00:45.417 に答える
3

Peterのアプローチでは、HTMLのコントロールからアイテムのXMLに値をコピーします。これは、更新されるアイテムを気にしない場合に最適なアプローチです。これにより、HTMLではなくXMLを簡単に操作できるようになります。

ただし、アイテムをまだ更新したくない場合は、HTMLで正しいコントロールを見つけて、そこから値を読み取る以外に選択肢はありません。

私はそれのためにこの小さなヘルパー関数を書きました:

function getControlForFieldName(name)
{
    var fieldBuilder = $display.getView().properties.controls.fieldBuilder;
    var fieldsContainer = fieldBuilder.properties.input;
    var fieldsNode = fieldsContainer.getElement();
    var fieldContainer = $dom.getFirstElementChild(fieldsNode);
    while (fieldContainer)
    {
        var labelNode = $dom.getFirstElementChild(fieldContainer);
        var fieldNode = $dom.getNextElementSibling(labelNode);
        var control = fieldNode.control;
        if (control.getFieldName() == name)
        {
            return control;
        }
        fieldContainer = $dom.getNextElementSibling(fieldContainer);
    }
}

この関数を使用すると、名前が付けられたフィールドのコントロールを簡単に検索できます。コントロールがあると、そこから値を簡単に取得できます。

var fieldControl = getControlForFieldName('Body');
if (fieldControl)
{
    var values = fieldControl.getValues();
    // values is an array, since it caters for multi-value fields
    // if this is a single-value field, get the value from values[0]
}

私のアプローチでは、Peterのアプローチよりもはるかに多くのコードが必要であり、かなりの数の非公開APIに触れていることに注意してください。

于 2012-05-07T14:19:29.540 に答える