保存後のプレビュー

プログラム(機能)関連の開発の話題
返信する
sgur
メンバー
メンバー
記事: 8
登録日時: 2010年7月20日(火) 11:26

保存後のプレビュー

投稿記事 by sgur »

いつもフォーラムにお世話になっております。

表題の件について、調べていたのですが見つからず
何か情報があればお教えいただきたく投稿します。

やりたきことは、以下の挙動です。

・リソースを保存後、自動的にプレビュー表示

理想は、別ウィンドウでプレビューではなく、MODx画面右側(リソースの詳細情報)の部分に表示されるのが最高なのですが。。。

※ツリー右クリックや、上部のボタンでもプレビューはできるのですが、1アクション増えてしまうので極力避けたい

理想はあくまでも理想なので、保存後に別ウィンドウでプレビューが開くなどでも問題ないです。

※プレビューとは言っても、正確には保存がされた後のサイトが自動的に見れればいいって感じですかね
  (本来的にはプレビューって保存前の下見って意味だと思いますし。このフォーラムのプレビューボタンの意味合いが正確だと思います。)

なにかご存知の方居ましたら情報お寄せください。
アバター
yama
管理人
記事: 3236
登録日時: 2009年7月29日(水) 02:50

Re: 保存後のプレビュー

投稿記事 by yama »

sgur さんが書きました: 理想はあくまでも理想なので、保存後に別ウィンドウでプレビューが開くなどでも問題ないです。

※プレビューとは言っても、正確には保存がされた後のサイトが自動的に見れればいいって感じですかね
  (本来的にはプレビューって保存前の下見って意味だと思いますし。このフォーラムのプレビューボタンの意味合いが正確だと思います。)
理論的には可能ですよ。リソースを「非公開」のままでプレビューすれば、公開前の下見としても使えますよね。

0963まではこれに近い仕様だったのですが、パフォーマンス面を考慮して外されたのでした。Evoで実装する場合はプラグイン実装になりますが、可能です。数行程度のプラグイン作るだけでよさそう。ちょっと今は時間がなくて対応できませんが、のんびり待っていただけるなら考えてみます。

できれば保存前にワンアクションかませるのがいいけど、それはちょっと難しいかも・・できそうな心当たりはあるのですが(※RTEを投稿画面内で切り替える時、データが一時的にどこかに保存されるっぽいので)
sgur
メンバー
メンバー
記事: 8
登録日時: 2010年7月20日(火) 11:26

Re: 保存後のプレビュー

投稿記事 by sgur »

yamaさん

ご丁寧に回答ありがとうございます。

なるほど、、、可能ですか。。。

プラグインはまだ作ったこと無く、勉強も先延ばしにしているのですが
数行程度でいけそうですか。。
※まだ、使い始めて1ヶ月程度なので、テンプレやスニペットいじってる程度orz

ちと自分でもプラグインの勉強してみます!

環境をまた書き忘れてしまい、申し訳ありません。
※以前にも質問させてもらったことあるのですが、そのときも書き忘れていたので。。。

念のため書いておきます。

MODx 1.0.4J

もし、ご対応いただけたりした場合、返信いただけるとうれしいです。

自身でも、何か進捗あったら書き込みさせていただきます。

それまでは、しばらく解決ステータスにはしませんのでご了承ください。

以上、宜しくお願いします
jeyson
メンバー
メンバー
記事: 26
登録日時: 2010年7月20日(火) 11:31

Re: 保存後のプレビュー

投稿記事 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>";


//?>
//-----------------------------------------------------------------
まぁ乱暴なスクリプトですけど、一応別ウインドウでプレビューが表示されると思います。
(ちなみにテストしていないです。すみません。)
jeyson
メンバー
メンバー
記事: 26
登録日時: 2010年7月20日(火) 11:31

Re: 保存後のプレビュー

投稿記事 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');";
ぐらいに大きくしたほうがいいかも
sgur
メンバー
メンバー
記事: 8
登録日時: 2010年7月20日(火) 11:26

Re: 保存後のプレビュー

投稿記事 by sgur »

jeysonさん

ご教授ありがとうございます。

自身のテスト環境にてためしてみましたが、確かに動きますね。

ただ。。。

申し訳ないのですが、コア部分へ手を入れるのには抵抗が。。。
自分だけのサイトであれば、じゃんじゃんやっていくのですが
現在作っているサイトは、知人も吹含め、複数人で運用していく予定です。

商用利用のサイトではないので、別にいいといえば言いのですが。いかんせんコア部分に何かあったときに対処しきれないので。。
※アップデートも含め対応するのが困難になりそうで、おそらく手に余ります。

お教えいただいたことは、自身のノウハウとして納めさせていただきますorz

※プラグインの作成勉強しようとした矢先でしたので、入門として非常に役立ちました!

教えてもらう立場なのにもかかわらず、申し訳ございません。
アバター
yama
管理人
記事: 3236
登録日時: 2009年7月29日(水) 02:50

Re: 保存後のプレビュー

投稿記事 by yama »

これに近いアイデアで、$contents_idをセッション渡しでゴニョゴニョすればよさそうな気もします。画面遷移まわりはあまり得意ではないので間違ってるかもしれませんが、、
sgur
メンバー
メンバー
記事: 8
登録日時: 2010年7月20日(火) 11:26

Re: 保存後のプレビュー

投稿記事 by sgur »

yamaさん,jeysonさん

とりあえず現状報告しておきます。

yamaさんのお知恵を参考に簡単なプラグイン作成してみました。

ちゃんと動くものではないので、書き込みはしませんが概要は以下のとおり

1.リソース保存時に、対象リソースIDをSESSION変数に保持

2.OnManagerPageInitというのが、画面切り替え時に動くイベントに用なので
  それをトリガーに動くプラグインを作成
  テスト的に、echoでSESSION変数を表示するだけ

今は単純にこれだけ

問題点

OnManagerPageInitだと、ツリー部分の描写のときにも動くようで
ツリー側にもecho結果が表示されてしまう。

中途半端な返信ですが、現状急ぎ書き込みしておきます。
最後に編集したユーザー sgur [ 2010年7月29日(木) 13:22 ], 累計 1 回
アバター
yama
管理人
記事: 3236
登録日時: 2009年7月29日(水) 02:50

Re: 保存後のプレビュー

投稿記事 by yama »

ツリーペインはアクションIDが1(index.php?a=1&f=tree)ですが、$_GET['a']で判定を加えるとよさそうな気がします。アクションIDが3か27のどちらかの場合のみ表示する、みたいな感じで。
sgur
メンバー
メンバー
記事: 8
登録日時: 2010年7月20日(火) 11:26

Re: 保存後のプレビュー

投稿記事 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はいつ使われるのか?

など、まだ勉強不足な部分もありますし、上記プラグインが
「良い」ものかは悩んでいます。

もっと勉強しないとですが、とりあえず動作するものができたので
共有しておきます。
jeyson
メンバー
メンバー
記事: 26
登録日時: 2010年7月20日(火) 11:31

Re: 保存後のプレビュー

投稿記事 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;
}


// ?>
sgur
メンバー
メンバー
記事: 8
登録日時: 2010年7月20日(火) 11:26

Re: 保存後のプレビュー

投稿記事 by sgur »

jeysonさん

ありがとうございます!!!!!!

2つのプラグインはいやだな、、と思っていたので助かりました。

いま調べていますが、頂いたものだと下記記述部分で動かないようです。。。

$e->output($output);

これをコメントアウトしてechoなら動くのですが。。。

また、ご存知でしたらお教えいただきたいのですが

特定のテンプレートを使っているリソースの場合にのみこの処理を動かしたいんですが
特定方法が見つからず。。。

$modx->event->params['id'] のように templateIDを取れればいいのですが
現状上手く取れません。
$modxをvar_dumpとかで中身チェックしてるのですが、それっぽい値見つからないんですよね

$modx->event->params['id']は処理されたドキュメントのIDなのはわかりますが
処理されたドキュメントのtemplateIDの取得方法ご存知でしょうか?
jeyson
メンバー
メンバー
記事: 26
登録日時: 2010年7月20日(火) 11:31

Re: 保存後のプレビュー

投稿記事 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のほうはすみません。
(あっちのほうが美しいと思ったのですが、動かなければ意味ないですね)
アバター
yama
管理人
記事: 3236
登録日時: 2009年7月29日(水) 02:50

Re: 保存後のプレビュー

投稿記事 by yama »

今回は$_GET['a']で問題ないですが、確実にアクションIDを得られる$modx->manager->actionを使うようにするほうがきれいかも。1.0.3までのMODxでは$_GET['a']に数値以外の特定の文字列を入れることで、軽いSQLインジェクションを引き起こすことができるようになってます。
返信する