プラグインでテンプレートを切り替えても入力欄が切り替わらない

質問全般・改善要望
kazuike
メンバー
メンバー
記事: 493
登録日時: 2009年8月12日(水) 12:53

プラグインでテンプレートを切り替えても入力欄が切り替わらない

投稿記事by kazuike » 2020年9月29日(火) 15:27

MODX1.0.23Jにおいて、
リソースやウェブリンクを新規作成する際、
イベント「OnDocFormPrerender」でプラグインを起動し、使用するテンプレートを切り替えても、
編集画面上のテンプレート変数は、デフォルトテンプレートのものになります。

具体的には、プラグイン「SwitchDefaultTemplate」
http://www.hikidas.com/hikidas/modx_resource/modx_elements/SwitchDefaultTemplate.ja.html
を使用して、
新規作成時の使用テンプレートが、条件によって自動的に切り替わり、入力欄も切り替わるはずが、
上記のように、テンプレート変数が切り替わらないという現象が起こっています。

調べたところ、
manager/actions/document/mutate_content/functions.php
の関数「getTmplvars」が、
パラメータを変えて呼び出しても、2回目以降は常に無視するため、
テンプレート変数が切り替わらないということがわかりました。

対処法として、
manager/actions/document/mutate_content/functions.php
8行目~11行目の

コード: 全て選択

    static $tmplVars = null;
    if($tmplVars!==null) {
        return $tmplVars;
    }
の箇所が問題のようですので、
この箇所を

コード: 全て選択

    static $tmplVars = null;
    static $last_docid = null;
    static $last_template_id = null;
    static $last_docgrp = null;
    if($tmplVars!==null && $last_docid==$docid && $last_template_id==$template_id && $last_docgrp==$docgrp) {
        return $tmplVars;
    }
    $last_docid = $docid;
    $last_template_id = $template_id;
    $last_docgrp = $docgrp;
のように変更して、
パラメータが変わった場合は、無視せず、処理を行うようにしました。
この変更による副作用があるかどうかはわかっていません。
▼ウェブ屋のCMS→modxヒキダス流(備忘録)
http://d.hatena.ne.jp/hikidas_ikeda/
mod_kks
メンバー
メンバー
記事: 30
登録日時: 2017年11月04日(土) 01:31

プラグインでテンプレートを切り替えても入力欄が切り替わらない

投稿記事by mod_kks » 2020年11月20日(金) 12:27

プラグイン間の連携を含めて、OnDocFormPrerenderイベントの中で全て処理
するのは発火順序とか内部処理が複雑に絡むので無理があるのではないかと
考えています。この際、プラグイン側の刷新を考えてみるのはどうでしょう?

デフォルトのシステムでテンプレートを切り替えた時にsubmit送信を行なって
フレーム内のリロードが発生するのですが、条件に合致した場合だけロードの
タイミングで同じことを発生させる方法で処理してみるのはいかがでしょうか。

公開されているプラグインの内容を元にサンプルを作成してみました。
リロード発生で一瞬ちらつきが発生しますが、比較的健全な方法での切り替え
なので、連携も問題ないように思います。
$_REQUESTで取れていない内容は$docObjectから代用できるものは代用したり
しましたが、途中の判別についてはあまり精査していないので、確認が必要です
が、一応動作するようです。
添付ファイル
SwitchDefaultTemplate-1.4.1.txt.zip
サンプルプラグイン
(1.94 KiB) ダウンロード数: 8 回