エントリーのプレビューで悩んでます。

24 views
Skip to first unread message

野田 純生

unread,
Sep 7, 2007, 11:45:59 AM9/7/07
to mtos-ja
野田です。

何かいつも質問ばかりですいませんっ!

エントリーのプレビュー(「確認」ボタンクリック)で悩んでいます。

MT4から、「見たまんまプレビュー」が実装されましたが、プラグイン
等で拡張する場合、

・カラムを増やすと素直にプレビューに反映される
※でも、カラムを増やすと何だかなぁ...
・別テーブルを作る。Commentとかと同じ位置づけで、
entry_idで紐づいているようなものです。あるいはカテゴリーのような
もの。
・で、エントリーを編集してプレビュー画面。拡張した部分は普通には
反映されません。保存していないのだから当然ですね。

※例えば、「テンプレートを切り替えるプラグイン」とか...別
テーブルにしたところでひっかかってしまいました。
http://junnama.alfasado.net/online/2007/09/movable_type4.html

MT::Entryを拡張する分には何も意識する必要がないのですが、やっぱ
望ましくないだろうから別のテーブルをつくってentryの
idで紐づけて...ってしたわけですが、プレビューのところでつ
まづいてしまいました。(一応自前でプレビューのコード書いて
確認はできたのですが、別のプラグインを書いている時にひっかかりま
した。独自のコードはぶつかるし。

一旦保存すればいいんですが、保存しないと確認できないってのは仕様
としてはあり得ないものだろうし。

一応CMSのコード読みましたがうまい解決方法が浮かびませんで
した。プレビュー用HTMLの生成の時に呼ばれるコールバックも見
当たらないし...

良い知恵ございましたらご教授ください。

よろしくお願いします。

Hirotaka Ogawa

unread,
Sep 7, 2007, 11:15:32 PM9/7/07
to mtos-ja
小川です。

MT::Entryのカラムを追加するのは別にタブー視する必要はないと思います。現状で安全に操作する方法が確立されていないというだけで、やがて解
決されるでしょうし、有用なプラグインならそういうデメリットに目をつぶって利用されることもあるでしょう。public beta中の
CustomFieldsはこのあたりの実装はどうなっているのか調べていませんが、参考になるかもしれません。

また、それを行わないものとすると、MT::Entryを拡張するオブジェクトに対して、リスティング・編集・プレビューを実現するのは手間でしょう
か。例えば、MT::PageはMT::Entryを拡張するクラス(ただしカラムなどは追加しない)ですが、エントリーとは別にリスティング・編集・
プレビューする機能を実装しています。同様に、つまり野田さんが試みられているようにMT::Entryの画面を乗っ取るのではなく、独立したリスティ
ング・編集・プレビュー画面を実装すれば大幅に制約が緩和される気がするのですが...。面倒なのは確かですよ。

野田 純生

unread,
Sep 8, 2007, 11:18:18 PM9/8/07
to mto...@googlegroups.com
野田です。

結局「プレビュー」を乗っ取る? Transformerを書いて対応しま
した。汎用性をもたせるために別途単独のプラグインにしたので、もう
ちょっと整理できたら公開しますね。


$plugin->registry({
callbacks => {
'MT::App::CMS::template_source.preview_strip'
=> {
handler => \&_preview_param,
priority => 1,
},

# ここでテンプレートを上書き、MT::Entryをベー
スに拡張したサブクラスのデータを一旦仮保存


'MT::App::CMS::template_output.preview_strip'
=> {
handler => \&_style_preview,
priority => 9,
}
# ここで、テンプレートから Buildした後、一時
データの破棄
},
});


「確認」ボタンクリックでちゃんと値が反映されるようになりました。

仮保存とはいえ、一旦保存されちゃうのが気持ち悪いっちゃぁ気持ち悪
いですが...

今回思ったのは、プレビューの前と後にコールバックが呼ばれると便利
かなぁと。

build_preview_filter($eh, %args)
build_preview_page($eh, %args)

みたいな感じで。

プラグインからコールバック定義できたと思うので、うまく出来たら実
装したいと思います。(もうちょっと整理したら公開します、のところ
はそれです。)

あと、プレビューって一時ファイル生成してiframeで読み込んで
いるので、ブラウザウィンドウ閉じたりバックボタンで戻ったりすると
「ゴミ」残りますね。まぁこれは「仕様」なんでしょうが、作成中の
データがファイルとして生成されてしまうのは何となく気持ち悪いの
で、そのあたりもクリアできればいいなぁと思ってます。


On 2007/09/08, at 12:15, Hirotaka Ogawa wrote:

>
> 小川です。
>
> MT::Entryのカラムを追加するのは別にタブー視する必要はないと思
> います。現状で安全に操作する方法が確立されていないというだけ
> で、やがて解
> 決されるでしょうし、有用なプラグインならそういうデメリットに目
> をつぶって利用されることもあるでしょう。public beta中の
> CustomFieldsはこのあたりの実装はどうなっているのか調べていませ
> んが、参考になるかもしれません。
>
> また、それを行わないものとすると、MT::Entryを拡張するオ
> ブジェクトに対して、リスティング・編集・プレビューを実現するの
> は手間でしょう
> か。例えば、MT::PageはMT::Entryを拡張するクラス
> (ただしカラムなどは追加しない)ですが、エントリーとは別に
> リスティング・編集・
> プレビューする機能を実装しています。同様に、つまり野田さんが試
> みられているようにMT::Entryの画面を乗っ取るのではなく、
> 独立したリスティ
> ング・編集・プレビュー画面を実装すれば大幅に制約が緩和される気
> がするのですが...。面倒なのは確かですよ。

(CHEEBOW) Motokazu Sekine

unread,
Sep 9, 2007, 12:55:34 AM9/9/07
to mto...@googlegroups.com
CHEEBOWです

これですけど、preview_entryのparamで

for my $key ($q->param) {
if ($key =~ /^hoge_/) {
my $input = {
'data_name' => $key,
'data_value' => $q->param($key),
};
push(@{$param->{'entry_loop'}}, $input);
}
}

みたいな感じで、拡張分のフィールドの内容を埋め込んで、

edit_entryのparamで

if ($q->param('reedit')) {
for my $key ($q->param) {
if ($key =~ /^hoge_/) {
$param->{$key} = $q->param($key);
}
}
}

もう一度、戻してやれば良くないですか?
ってそういう問題ではなかったらごめんなさい。

--
M o t o k a z u S e k i n e / C H E E B O W
E-Mail : che...@gmail.com

野田 純生

unread,
Sep 9, 2007, 1:22:50 AM9/9/07
to mto...@googlegroups.com
CHEEBOWさん

野田です。
はい。お示しいただいた例で「値は引き継げる」(保存
や'reedit'はできます) のですがエントリーの「プレ
ビュー」に反映されないのです。

具体的には、以下のムービーのようにエントリーにフィールドを追加し
ていく例です。
(値は mt_entryテーブルではなく、別のテーブル
(mt_extfields)に保存させ、 entry_id で紐づけるようにしてい
ます。)

http://junnama.alfasado.net/MTExtFieldDemo.mov

この最後の「確認」ボタンをクリックした時に、通常のプレビューだと
新しく追加したフィールドの値が表示されません(このムービー
では表示されていますが、この部分を今回書いていた、というお話で
す)。

テンプレートエンジンがタグを処理する(build)時に、タグは
以下のようにDBから値を引っ張ってくるものなので、既に保存さ
れているものは表示されますが、追加したフィールドの値は処理対象に
ならないので(当然ですよね)。


function => {
'ExtFieldText' => \&_ext_field_text,
...

sub _ext_field_text {
my ($ctx, $args, $cond) = @_;
my $label = $args->{label};
if ($label) {
my $entry = $ctx->stash('entry') or return $ctx-
>_no_entry_error('ExtFieldText');
my $extfields = ExtFields::Extfields->load( { entry_id =>
$entry->id,
status => 1,
label =>
$label} );
return $extfields->text;
} else {
return $ctx->stash('text');

(CHEEBOW) Motokazu Sekine

unread,
Sep 9, 2007, 1:49:54 AM9/9/07
to mto...@googlegroups.com
CHEEBOWです

07/09/09 に 野田 純生<jun...@alfasado.jp> さんは書きました:


> や'reedit'はできます) のですがエントリーの「プレ
> ビュー」に反映されないのです。

 なるほど!
 そういうことですね。
 確かに、これはできないですね。
 ごめんなさい。

 ふむー、このプレビュー、結構悩ましいですねー。

Reply all
Reply to author
Forward
0 new messages