2

DotNetNuke 6で、複数のモジュール定義を含むモジュールを作成しました。モジュールは複数のページ(タブ)に追加でき、複数のモジュールを1つのページ(タブ)に追加できます。問題は、1つのインスタンスからすべてのモジュール定義を結び付ける識別子が見つからないことです。

DesktopModuleIdインストールされているすべてのモジュールに対してのみ一意です(インスタンスおよびページごとではありません)。

ModuleIdモジュールインスタンスと定義ごとに一意です。

TabModuleIdすべてのモジュールインスタンスとタブおよび定義に対して一意です。

したがって、私が探しているのは、モジュールをページに配置した瞬間に、どのモジュール定義が互いに属しているかを識別する方法です。

同じ問題を説明するフォーラムの投稿を見つけました。誰かがModuleIdすべての定義を調べて、それらが連続しているかどうかを確認するよう提案しました。私はそれが非常にハッキーだと思います。

編集:
私が開発しているモジュールにはいくつかの異なる定義が含まれていますが、3つ(表示、編集、設定)があるとしましょう。モジュールをインストールするときは、モジュールに使用するカテゴリを設定する必要があります。たとえば、ブログモジュールにします。3つの定義すべてが、同じ一意のID(おそらく)でデータベースからデータを取得します。同じモジュールを再度インストールします。別のカテゴリ(ポートフォリオ)を選択して、そのデータのみを取得します。DNNの現在の動作方法では、3つのブログ定義が互いに属し、他の3つのポートフォリオ定義から分離していることを知る方法がないため、ブログアイテムをポートフォリオアイテムから分離できません。これが理にかなっていることを願っています...

4

3 に答える 3

1

DesktopModuleIdモジュールごとにが個別である場合、DNNに従ってそれらはまったく関連していません。PackageIdがそれらに関連する可能性はわずかですがDesktopModule、同じパッケージに複数のデスクトップモジュールをインストールする方法は見たことがありません(パッケージは機能の最高レベルの封じ込めです)。

すべてのモジュール定義を1つのデスクトップモジュールに含める必要があるようです。モジュールのインストールに使用されるマニフェストで、要素が1つとpackage要素が1つだけであることを確認してcomponent[type="Module"]ください。componentその要素の内部にmoduleDefinition、モジュールの各部分にがあります。その後、単一のモジュールをページに追加できるようになり、それを行うと各ピースが含まれます(不要なピースは自由に削除できます)。

于 2012-05-08T19:31:21.400 に答える
1

私はあなたが正確に何に到達したいのかわかりません。しかし、同じページにモジュールを複数回配置して「一意」に保とうとすると、問題も発生しました。

私の場合、異なるモジュール設定をセットアップし、この設定のPage_Load()で異なる反応を試みました。

私は使用することにしました

Session["8400f2b6-d930-47af-a524-fc16721b4591"] = new List<KeyValuePair<int, string>>();

GUIDは、セッションを一意に保つのに役立ちます。List <>は、ModuleID、mySpecialSettingを使用して特別な設定を保存します。

これは、同じページに1つのモジュールを複数回配置する場合に、固有の特別なモジュール情報を取得するのに役立つ可能性があります。

よろしく、誰も。

于 2012-05-09T10:49:56.263 に答える
0

私は以下のコードで自分の質問を解決しました。これは推奨されるソリューションではありませんが、使用に成功し、DNNが実際のソリューションを実装するまで使用できます。

クラスのすべてのメソッドはController、データベース内のカスタムテーブルを接続します。コードは、すべてのモジュール定義が現在のページ(タブ)にあり、まだデータベースにないかどうかをチェックします。そうでない場合は、新しいインスタンスIDと組み合わせてデータベースに追加します。同じモジュールが2つ以上ページに追加され、このコードが後で実行される場合(たとえば、更新)、シーケンシャルなモジュールIDのみが取得されます(他のモジュールIDは後で追加されます)。

ModuleInstanceId = Controller.GetModuleInstanceId(TabModuleId);
if (ModuleInstanceId == -1)
{
    Dictionary<Int32, String> ModuleInstanceDefinitions = new Dictionary<Int32, String>();
    Dictionary<String, ModuleDefinitionInfo> ModuleDefinitions = new ModuleController().GetModule(ModuleId).DesktopModule.ModuleDefinitions;
    foreach (ModuleDefinitionInfo ModuleDefinition in ModuleDefinitions.Values)
    {
        List<ModuleInfo> Modules = new ModuleController().GetModulesByDefinition(PortalId, ModuleDefinition.FriendlyName).ToList<ModuleInfo>();
        foreach (ModuleInfo Module in Modules)
        {
            if (Module.TabID == TabId)
            {
                if (Controller.GetModuleInstanceId(Module.TabModuleID) == -1 || Controller.GetModuleInstanceId(ModuleDefinition.FriendlyName) == -1)
                {
                    ModuleInstanceDefinitions.Add(Module.TabModuleID, ModuleDefinition.FriendlyName);
                }
            }
        }
    }

    // Probably shouldn't be more then specified in the manifest;
    // Only situatie this could occure is when the module is added to a page twice at the same page;
    ModuleInstanceDefinitions = ModuleInstanceDefinitions.OrderBy(ModuleDefinition => ModuleDefinition.Key).Take(ModuleDefinitions.Count).ToDictionary(Item => Item.Key, Item => Item.Value);

    ModuleInstanceId = Controller.SetModuleInstances(ModuleInstanceDefinitions);
}

うまくいけば、誰かがこれが役立つか、DNNがソースに追加するでしょう:)

于 2012-05-09T21:34:59.377 に答える