6

GetItem および CheckOutItem コマンドで動作するデータ エクステンダー クラスを開発し、ビジネス固有の検証を行って、ユーザーがアイテムを変更するためのアクセス権を持っているかどうかを判断します (基本的に、ワークフローの最初の「作成者」タスクを過ぎている場合、誰もデフォルトでは、Tridion はワークフロー内の「レビュー担当者」がアイテムを編集することを許可していますが、これは私たちのビジネスでは禁止されています)。

ある時点でこれが機能したことは比較的確信していますが、現在は機能していません。何が変わったのかを調べていますが、誰かがアイデアを持っている場合はここで質問すると思いました.

アイテムを変更できない場合は、IsEditable 属性を false に設定しています。これにより、実際には [保存して閉じる] ボタンと [保存して新規作成] ボタンが無効になりますが、何らかの理由で [保存] ボタンが有効になります。なぜ違いが生じるのか、よくわかりません。(誰かが何らかの方法で保存ボタンを拡張したかどうかを調べていますが、それが行われていないことを確認しています)。他のボタンが有効になっていない場合に、[保存] ボタンが有効になる方法について何か考えはありますか?

提案をありがとう、

〜ワーナー

public override XmlTextReader ProcessResponse(XmlTextReader reader, PipelineContext context)
{
    using (new Tridion.Logging.Tracer())
    {
        string command = context.Parameters["command"].ToString();
        if (command == CHECKOUT_COMMAND || command == GETITEM_COMMAND)
        {
            XmlDocument xmlDoc = ExtenderUtil.GetExtenderAsXmlDocument(reader);
            XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmlDoc.NameTable);
            nsmgr.AddNamespace("tcm", Constants.TcmNamespace);
            try
            {
                //is this a page or component?
                XmlNode thisItemNode = null;
                thisItemNode = xmlDoc.SelectSingleNode("//tcm:Component", nsmgr) ?? xmlDoc.SelectSingleNode("//tcm:Page", nsmgr);
                if (thisItemNode == null) return ExtenderUtil.GetExtenderAsXmlTextReader(xmlDoc);
                // need to impersonate system admin in order to get workflow version of item later
                Session sessionSystemAdmin = Util.SystemAdminSession;
                XmlAttribute idAttribute = thisItemNode.Attributes.GetNamedItem("ID") as XmlAttribute;
                //if ID attribute is null, we don't have the actual object being used (just a referenced item. so, we'll ignore it)
                if (idAttribute != null)
                {
                    string itemId = idAttribute.Value;
                    VersionedItem tridionObject = Util.ObtainValidTridionIdentifiableObject(sessionSystemAdmin, itemId) as VersionedItem;
                    //logic has been moved to separate method, just for maintainablility...
                    //the logic may change when workflow code is finished.
                    bool allowSave = IsItemValidForEdit(tridionObject, nsmgr);
                    if (!allowSave)
                    {
                        //not the WIP ("author") task... make item read-only
                        Logger.WriteVerbose("setting iseditable to false for item: " + itemId);
                        XmlAttribute isEditableAttribute = thisItemNode.Attributes.GetNamedItem("IsEditable") as XmlAttribute;
                        isEditableAttribute.Value = "false";
                    }
                }
            }
            catch (Exception e)
            {
                Logger.WriteError("problem with get item data extender", ErrorCode.CMS_DATAEXTENDER_GETITEM_FAILURE, e);
            }
            return ExtenderUtil.GetExtenderAsXmlTextReader(xmlDoc);
        }
        else
        {
            return reader;
        }
    }
}
4

2 に答える 2

2

Tridion GUI のほとんどは、おそらく、いわゆる許可されたアクションに基づいて提示されるオプションに基づいています。これは、 list-calls (要求された場合) と item XML に存在するAllowとの属性の組み合わせです。Deny

したがって、少なくとも属性から CheckIn および Edit アクションを削除する必要がありAllowます (おそらくそれらをDeny属性に追加します)。コア サービス ドキュメント (または他の Tridion API ドキュメント: これらの値は長い間変更されていません) を見るとActions、可能なアクションとそれに対応する値を保持する Enum が呼び出されていることがわかります。AllowおよびDeny属性は、これらの数値の単純な追加です。

私が言及する CheckIn アクションは number2で、Edit は2048です。


更新

AllowedActionsをデコードするための小さなコマンド ライン プログラムがあります。あなたの質問を祝うために、私はあなたがここで見つけることができるウェブページにすぐに変換しました. 主な作業馬は以下にあり、数値をデコードする方法と操作する方法の両方を示しています。この場合はすべて減算ですが、数値を追加することで、許可されたアクションを簡単に追加できます。

var AllowedActionsEnum = {
    AbortAction:                134217728,
    ExecuteAction:               67108864,
    FinishProcessAction:         33554432,
    RestartActivityAction:       16777216,
    FinishActivityAction:         8388608,
    StartActivityAction:          4194304,
    BlueprintManagedAction:       2097152,
    WorkflowManagedAction:        1048576,
    PermissionManagedAction:       524288,
    EnableAction:                  131072,
    CopyAction:                     65536,
    CutAction:                      32768,
    DeleteAction:                   16384,
    ViewAction:                      8192,
    EditAction:                      2048,
    SearchAction:                    1024,
    RePublishAction:                  512,
    UnPublishAction:                  256,
    PublishAction:                    128,
    UnLocalizeAction:                  64,
    LocalizeAction:                    32,
    RollbackAction:                    16,
    HistoryListAction:                  8,
    UndoCheckOutAction:                 4,
    CheckInAction:                      2,
    CheckOutAction:                     1
};
function decode() {
    var original = left = parseInt(prompt('Specify Allow/Deny actions'));
    var msg = "";
    for (var action in AllowedActionsEnum) {
        if (left >= AllowedActionsEnum[action]) {
            msg += '\n' + action + ' ('+AllowedActionsEnum[action]+')';
            left -= AllowedActionsEnum[action];
        }
    }
    alert(original+msg);
}
于 2012-08-15T19:05:10.077 に答える
1

解決策は、ソリューション全体を実際に見て、[保存] ボタンを台無しにし、舞台裏で魔法のようにそれを有効にしている何かが最近こっそり入っていないことを完全に肯定することです. コードを再編集して、最初にどのように使用したかを示しました。そして、それは機能します。保存、保存/閉じる、保存/新規ボタンを無効にし、すべてのフィールドを無効にします。フランクの時間を無駄にしてごめんなさい。うまくいけば、これを歴史的な目的のためにここに置くことは、将来同様の要件を持つ他の誰かにとって便利になるかもしれません.

于 2012-08-16T18:04:48.127 に答える