ページ 1 / 1
保存後のプレビュー
Posted: 2010年7月26日(月) 22:47
by sgur
いつもフォーラムにお世話になっております。
表題の件について、調べていたのですが見つからず
何か情報があればお教えいただきたく投稿します。
やりたきことは、以下の挙動です。
・リソースを保存後、自動的にプレビュー表示
理想は、別ウィンドウでプレビューではなく、MODx画面右側(リソースの詳細情報)の部分に表示されるのが最高なのですが。。。
※ツリー右クリックや、上部のボタンでもプレビューはできるのですが、1アクション増えてしまうので極力避けたい
理想はあくまでも理想なので、保存後に別ウィンドウでプレビューが開くなどでも問題ないです。
※プレビューとは言っても、正確には保存がされた後のサイトが自動的に見れればいいって感じですかね
(本来的にはプレビューって保存前の下見って意味だと思いますし。このフォーラムのプレビューボタンの意味合いが正確だと思います。)
なにかご存知の方居ましたら情報お寄せください。
Re: 保存後のプレビュー
Posted: 2010年7月26日(月) 23:00
by yama
sgur さんが書きました:
理想はあくまでも理想なので、保存後に別ウィンドウでプレビューが開くなどでも問題ないです。
※プレビューとは言っても、正確には保存がされた後のサイトが自動的に見れればいいって感じですかね
(本来的にはプレビューって保存前の下見って意味だと思いますし。このフォーラムのプレビューボタンの意味合いが正確だと思います。)
理論的には可能ですよ。リソースを「非公開」のままでプレビューすれば、公開前の下見としても使えますよね。
0963まではこれに近い仕様だったのですが、パフォーマンス面を考慮して外されたのでした。Evoで実装する場合はプラグイン実装になりますが、可能です。数行程度のプラグイン作るだけでよさそう。ちょっと今は時間がなくて対応できませんが、のんびり待っていただけるなら考えてみます。
できれば保存前にワンアクションかませるのがいいけど、それはちょっと難しいかも・・できそうな心当たりはあるのですが(※RTEを投稿画面内で切り替える時、データが一時的にどこかに保存されるっぽいので)
Re: 保存後のプレビュー
Posted: 2010年7月27日(火) 10:47
by sgur
yamaさん
ご丁寧に回答ありがとうございます。
なるほど、、、可能ですか。。。
プラグインはまだ作ったこと無く、勉強も先延ばしにしているのですが
数行程度でいけそうですか。。
※まだ、使い始めて1ヶ月程度なので、テンプレやスニペットいじってる程度orz
ちと自分でもプラグインの勉強してみます!
環境をまた書き忘れてしまい、申し訳ありません。
※以前にも質問させてもらったことあるのですが、そのときも書き忘れていたので。。。
念のため書いておきます。
MODx 1.0.4J
もし、ご対応いただけたりした場合、返信いただけるとうれしいです。
自身でも、何か進捗あったら書き込みさせていただきます。
それまでは、しばらく解決ステータスにはしませんのでご了承ください。
以上、宜しくお願いします
Re: 保存後のプレビュー
Posted: 2010年7月27日(火) 14:45
by jeyson
おそらくですが
http://forum.modx.jp/viewtopic.php?f=7&t=366
のパッチを当てていただいて
プラグインを作成し
システムイベント「OnDocFormSave」を設定し
下のソースを書けばいいかな?
と思います。
//----------------------------------------------------------------
//<?php
$contents_id = $modx->event->params['id'];
$jump = '../index.php?id='.$contents_id.'&preview_sw=1&manprev=z';
echo "<script type=\"text/javascript\">";
echo "window.open('".$jump."', 'mywindow1', 'width=400, height=300, menubar=no, toolbar=no, scrollbars=yes');";
echo "</script>";
//?>
//-----------------------------------------------------------------
まぁ乱暴なスクリプトですけど、一応別ウインドウでプレビューが表示されると思います。
(ちなみにテストしていないです。すみません。)
Re: 保存後のプレビュー
Posted: 2010年7月27日(火) 17:29
by jeyson
一応当方のテストサイトで実験しました。
動きますね。
ただし、ポップアップブロックだけは解除してください。
(ポップアップブロックが厳しいと、そもそも画像の挿入を行うだけで怒られるので解除している場合もあると思いますが)
echo "window.open('".$jump."', 'mywindow1', 'width=400, height=300, menubar=no, toolbar=no, scrollbars=yes');";
は
echo "window.open('".$jump."', 'mywindow1', 'width=700, height=500, menubar=no, toolbar=no, scrollbars=yes');";
ぐらいに大きくしたほうがいいかも
Re: 保存後のプレビュー
Posted: 2010年7月27日(火) 21:28
by sgur
jeysonさん
ご教授ありがとうございます。
自身のテスト環境にてためしてみましたが、確かに動きますね。
ただ。。。
申し訳ないのですが、コア部分へ手を入れるのには抵抗が。。。
自分だけのサイトであれば、じゃんじゃんやっていくのですが
現在作っているサイトは、知人も吹含め、複数人で運用していく予定です。
商用利用のサイトではないので、別にいいといえば言いのですが。いかんせんコア部分に何かあったときに対処しきれないので。。
※アップデートも含め対応するのが困難になりそうで、おそらく手に余ります。
お教えいただいたことは、自身のノウハウとして納めさせていただきますorz
※プラグインの作成勉強しようとした矢先でしたので、入門として非常に役立ちました!
教えてもらう立場なのにもかかわらず、申し訳ございません。
Re: 保存後のプレビュー
Posted: 2010年7月27日(火) 21:37
by yama
これに近いアイデアで、$contents_idをセッション渡しでゴニョゴニョすればよさそうな気もします。画面遷移まわりはあまり得意ではないので間違ってるかもしれませんが、、
Re: 保存後のプレビュー
Posted: 2010年7月28日(水) 23:16
by sgur
yamaさん,jeysonさん
とりあえず現状報告しておきます。
yamaさんのお知恵を参考に簡単なプラグイン作成してみました。
ちゃんと動くものではないので、書き込みはしませんが概要は以下のとおり
1.リソース保存時に、対象リソースIDをSESSION変数に保持
2.OnManagerPageInitというのが、画面切り替え時に動くイベントに用なので
それをトリガーに動くプラグインを作成
テスト的に、echoでSESSION変数を表示するだけ
今は単純にこれだけ
問題点
OnManagerPageInitだと、ツリー部分の描写のときにも動くようで
ツリー側にもecho結果が表示されてしまう。
中途半端な返信ですが、現状急ぎ書き込みしておきます。
Re: 保存後のプレビュー
Posted: 2010年7月28日(水) 23:48
by yama
ツリーペインはアクションIDが1(index.php?a=1&f=tree)ですが、$_GET['a']で判定を加えるとよさそうな気がします。アクションIDが3か27のどちらかの場合のみ表示する、みたいな感じで。
Re: 保存後のプレビュー
Posted: 2010年7月29日(木) 13:32
by sgur
yamaさん、jeysonさん
お世話になっております。
その後、試していて、とりあえず動作するもの作れましたので
共有、同じようなことやりたい方のため返信しておきます。
まず、プラグインを2つ作ります。
■Aプラグイン
(自身では名称:Set_Preview_Idとしています。)
システムイベント:OnDocFormSave
//<?php
if(!isset($_SESSION['set_preview_id'])){$_SESSION['set_preview_id']='';}
if(!isset($_SESSION['set_preview_flg'])){$_SESSION['set_preview_flg']='';}
$_SESSION['set_preview_id']=$modx->event->params['id'];
$_SESSION['set_preview_flg']='1';
※見ればわかるかと思いますが、一応説明
セッション変数が存在していない場合、空にて値セット
編集されたリソースIDをセッション変数へ保持
同様にプレビュー表示用フラグを保持
■Bプラグイン
(自身では名称:Show_Previewとしています。)
システムイベント:OnManagerPageInit
//<?php
if(!isset($_SESSION['set_preview_id'])){return;}
if(!isset($_SESSION['set_preview_flg'])){return;}
if($_SESSION['set_preview_id']===''){ return;}
if($_SESSION['set_preview_flg']===''){ return; }
if($_SESSION['set_preview_flg']!=='1'){ return; }
if($_GET['a']!=='3' && $_GET['a']!=='27'){ return; }
$jump = '/index.php?id='.$_SESSION['set_preview_id'].'&preview_sw=1&manprev=z';
$_SESSION['set_preview_id']='';
$_SESSION['set_preview_flg']='';
echo '<script type="text/javascript">';
echo 'location.href="'.$jump.'"';
echo '</script>';
※見ればわかるかと思いますが、一応説明
セッション変数が存在していない場合、何もせず終了
セッション変数が存在していても、からの場合終了
プレビュー表示フラグが1と等しくない場合は何もせず終了
アクションIDが3、7と等しくない場合は終了
プレビューURLを作成
セッションを空にする
JavaScriptにてFrame内のページ切り替え
という具合です。
・セッション変数など、普通にPHPでの取得にしていますが
MODxにて、セッション変数の扱いに決まりがあるのか?
・$_GET['a']の値(アクションID)3はわかったのですが
7はいつ使われるのか?
など、まだ勉強不足な部分もありますし、上記プラグインが
「良い」ものかは悩んでいます。
もっと勉強しないとですが、とりあえず動作するものができたので
共有しておきます。
Re: 保存後のプレビュー
Posted: 2010年7月29日(木) 17:58
by jeyson
sgurさんが作成されたコードに少し手を加えさせていただきました。
これなら、一つのプラグインでOKとなります。
//<?php
// ----------------------------------------------------------------
// Get a reference to the event
// ----------------------------------------------------------------
$e = & $modx->Event;
switch($e->name) {
case 'OnDocFormSave ':
if(!isset($_SESSION['set_preview_id'])){$_SESSION['set_preview_id']='';}
if(!isset($_SESSION['set_preview_flg'])){$_SESSION['set_preview_flg']='';}
$_SESSION['set_preview_id']=$modx->event->params['id'];
$_SESSION['set_preview_flg']='1';
break;
case 'OnManagerPageInit':
if(!isset($_SESSION['set_preview_id'])){return;}
if(!isset($_SESSION['set_preview_flg'])){return;}
if($_SESSION['set_preview_id']===''){ return;}
if($_SESSION['set_preview_flg']===''){ return; }
if($_SESSION['set_preview_flg']!=='1'){ return; }
if($_GET['a']!=='3' && $_GET['a']!=='27'){ return; }
$jump = '/index.php?id='.$_SESSION['set_preview_id'].'&preview_sw=1&manprev=z';
$_SESSION['set_preview_id']='';
$_SESSION['set_preview_flg']='';
$output = "";
$output .= '<script type="text/javascript">';
$output .= 'location.href="'.$jump.'"';
$output .= '</script>';
$e->output($output);
break;
default:
return;
break;
}
// ?>
Re: 保存後のプレビュー
Posted: 2010年7月29日(木) 23:23
by sgur
jeysonさん
ありがとうございます!!!!!!
2つのプラグインはいやだな、、と思っていたので助かりました。
いま調べていますが、頂いたものだと下記記述部分で動かないようです。。。
$e->output($output);
これをコメントアウトしてechoなら動くのですが。。。
また、ご存知でしたらお教えいただきたいのですが
特定のテンプレートを使っているリソースの場合にのみこの処理を動かしたいんですが
特定方法が見つからず。。。
$modx->event->params['id'] のように templateIDを取れればいいのですが
現状上手く取れません。
$modxをvar_dumpとかで中身チェックしてるのですが、それっぽい値見つからないんですよね
$modx->event->params['id']は処理されたドキュメントのIDなのはわかりますが
処理されたドキュメントのtemplateIDの取得方法ご存知でしょうか?
Re: 保存後のプレビュー
Posted: 2010年7月30日(金) 08:44
by jeyson
こんな感じでしょうか
//<?php
// ----------------------------------------------------------------
// Get a reference to the event
// ----------------------------------------------------------------
$e = & $modx->Event;
switch($e->name) {
case 'OnDocFormSave ':
if(!isset($_SESSION['set_preview_id'])){$_SESSION['set_preview_id']='';}
if(!isset($_SESSION['set_preview_flg'])){$_SESSION['set_preview_flg']='';}
$contents_id=$modx->event->params['id'];
$a_data=getContentData( $contents_id );
if ($a_data['template']=='特定のテンプレートID') {
$_SESSION['set_preview_id']=$contents_id;
$_SESSION['set_preview_flg']='1';
}
break;
case 'OnManagerPageInit':
if(!isset($_SESSION['set_preview_id'])){return;}
if(!isset($_SESSION['set_preview_flg'])){return;}
if($_SESSION['set_preview_id']===''){ return;}
if($_SESSION['set_preview_flg']===''){ return; }
if($_SESSION['set_preview_flg']!=='1'){ return; }
if($_GET['a']!=='3' && $_GET['a']!=='27'){ return; }
$contents_id=$_SESSION['set_preview_id'];
$a_data=getContentData( $contents_id );
if ($a_data['template']=='特定のテンプレートID') {
$jump = '/index.php?id='.$_SESSION['set_preview_id'].'&preview_sw=1&manprev=z';
$_SESSION['set_preview_id']='';
$_SESSION['set_preview_flg']='';
$output = "";
$output .= '<script type="text/javascript">';
$output .= 'location.href="'.$jump.'"';
$output .= '</script>';
echo $output;
}
break;
default:
return;
break;
}
function getContentData( $contents_id ) {
global $modx;
// ページデータ取得
$a_data = $modx->getTemplateVarOutput( "*" , $contents_id );
if ( $a_data ['pagetitle'] == "" ) {
$a_data = $modx->getTemplateVarOutput( "*" , $contents_id , 0 );
}
return ($a_data);
}
// ?>
あと、outputのほうはすみません。
(あっちのほうが美しいと思ったのですが、動かなければ意味ないですね)
Re: 保存後のプレビュー
Posted: 2010年7月30日(金) 13:15
by yama
今回は$_GET['a']で問題ないですが、確実にアクションIDを得られる$modx->manager->actionを使うようにするほうがきれいかも。1.0.3までのMODxでは$_GET['a']に数値以外の特定の文字列を入れることで、軽いSQLインジェクションを引き起こすことができるようになってます。