日にちが過ぎたものを自動で別ページに移動したい。

質問全般・改善要望
返信する
8nda3
メンバー
メンバー
記事: 52
登録日時: 2011年10月14日(金) 13:42

日にちが過ぎたものを自動で別ページに移動したい。

投稿記事 by 8nda3 »

トップページではないのですが、Aページに表示させているものを、
ある日にちが過ぎたらBページに自動で移動させる方法が分かりません。

有効期限は、テンプレート変数の『Date Only』で入力するようにしています。

Let's enjoy MODXさんや、以下のフォーラムの質問を参考にさせていただきましたが、
よく分かりませんでした;
http://forum.modx.jp/viewtopic.php?f=34&t=429
そもそも、PHPはどこに記入すればいいのでしょうか?(初歩的な質問で本当にすみません・・・)

膨大な量になるため、手作業でするのはあまりにも効率が悪く、自分のスキル内でと思ってはいますが、
こればかりは自動化したいです。

初心者で申し訳ありませんが、どなたか詳しく教えていただけないでしょうか?
よろしくお願いいたします。

 PHPバージョン : 5.2
 DB : MySQL 5.1.34
[modx]
 バージョン : 1.0.5J-r7
アバター
yama
管理人
記事: 3236
登録日時: 2009年7月29日(水) 02:50

Re: 日にちが過ぎたものを自動で別ページに移動したい。

投稿記事 by yama »

コード: 全て選択

$limit = strtotime($modx->documentObject['有効期限'][1]);
if(time() < $limit) return $output;
テンプレート変数名が「有効期限」として、上記のようなPHxモディファイアを作れば対応できそうな気がします。(実際に試してなくて、strtotimeがうまく動かないかもしれませんが)

{{チャンク:モディファイア名}}
上記のように書くと、そのチャンクに書かれた内容が、期日になると表示されなくなります。

コントロール対象のデータをリソースとして作るのであれば、Dittoのフィルターパラメータを使うのもよいかもです
soushi
管理人
記事: 224
登録日時: 2009年7月30日(木) 01:59

Re: 日にちが過ぎたものを自動で別ページに移動したい。

投稿記事 by soushi »

soushiです。

こちらはPHxを使わない方法です。その代りスニペットが一つ増えます。

1.AページとBページに表示させたい文字をチャンクにする。
名前は適当に付けてください。ここでは「msg01」という名前で作成したことにします。

2.テンプレート変数を作成する。
名前は「pnt_msg_limit」にします。
入力タイプは「Date Only」を選択します。
あとは利用したいテンプレートにチェックを付けておいてください。

3.スニペットを作成する
名前は「pnt_msg」とします。
以下のphpコードを入力して保存します。

コード: 全て選択

<?php
$date=$modx->getTemplateVar('pnt_msg_limit');
$date=strtotime($date['value']);
$view = (isset($modx) && $mode=='limit_close')?0:1;

if( time() > ($date+86400)){
  $view = 1 - $view;
}
if( $view == 1 ){
  return $modx->getChunk($chunkname);
}
?>
4.有効期限まで表示したいAページ
次のスニペットコードを埋め込みます。

[!pnt_msg &mode=`limit_close` &chunkname=`msg01`!]

pnt_msg_limitで設定した有効期限になるまでチャンクの「msg01」が表示されます。


5.有効期限後から表示したいBページ

[!pnt_msg &mode=`limit_open` &chunkname=`msg01`!]

pnt_msg_limitで設定した有効期限になるとチャンクの「msg01」が表示されます。
8nda3
メンバー
メンバー
記事: 52
登録日時: 2011年10月14日(金) 13:42

Re: 日にちが過ぎたものを自動で別ページに移動したい。

投稿記事 by 8nda3 »

お二方ともご返信ありがとうございます。

soushiさま、
ご返信のとおり作成してみましたが、有効期限になるとAページから表示されなくなりますがBページには反映されません。

Aページには以下を記入しました。
[!Ditto? &parents=`2` &display=`3` &sortBy=`pub_date` &dateSource=`pub_date` &dateFormat=`%m/%d` &tpl=`msg01`!]
[!pnt_msg &mode=`limit_close` &chunkname=`msg01`!]

テストを繰り返すので、テンプレート変数は「DateTime」にしました。
テスト1、テスト2のリソースを作成し、テスト1を時間指定したところ、Aページからテスト1のみ非表示になりました。

Bページには
[!pnt_msg &mode=`limit_open` &chunkname=`msg01`!]
と記入しましたが、テスト1が反映されません。
どのようにすればよろしいのでしょうか。

すみません、初歩的なことが分かっていなくて、本当に申し訳ないです・・・。

よろしくお願いいたします。
soushi
管理人
記事: 224
登録日時: 2009年7月30日(木) 01:59

Re: 日にちが過ぎたものを自動で別ページに移動したい。

投稿記事 by soushi »

soushiです。

返信が遅れました(汗

僕の書いたものは基本的にリソースごとにテンプレート変数「pnt_msg_limit」を指定する必要があります。
そのためリソースのAページ、Bページ共にテンプレート変数を有効にして日付を設定してください。

またこちら、
Aページには以下を記入しました。
[!Ditto? &parents=`2` &display=`3` &sortBy=`pub_date` &dateSource=`pub_date` &dateFormat=`%m/%d` &tpl=`msg01`!]
[!pnt_msg &mode=`limit_close` &chunkname=`msg01`!]
これはAページの本文内に書かれたのでしょうか。
チャンクmsg01はDitto用のテンプレートでも指定しているので、表示が変になっていたりしてませんか。
(Dittoの内容が表示され、次にmsg01が表示されていると思います)

もしDittoの表示をコントロールしたい場合、こんな感じでうまくいくかもです。

1.チャンクmsg01に書かれているDittoのテンプレートをチャンクditto_tplに名前を変更する

2.チャンクmsg01を新規に作成し、こちらにDittoを記述
[!Ditto? &parents=`2` &display=`3` &sortBy=`pub_date` &dateSource=`pub_date` &dateFormat=`%m/%d` &tpl=`ditto_tpl`!]

3.リソースの本文には以下を記述
[!pnt_msg &mode=`limit_close` &chunkname=`msg01`!]
時間が来て公開する場合は
[!pnt_msg &mode=`limit_open` &chunkname=`msg01`!]
8nda3
メンバー
メンバー
記事: 52
登録日時: 2011年10月14日(金) 13:42

Re: 日にちが過ぎたものを自動で別ページに移動したい。

投稿記事 by 8nda3 »

soushiさま、

お忙しいなか、ご回答ほんとうにありがとうございますm(__)m

さっそく、2つチャンクを作成し試してみましたが、Aページには
[!Ditto? &parents=`2` &display=`3` &sortBy=`pub_date` &dateSource=`pub_date` &dateFormat=`%m/%d` &tpl=`ditto_tpl`!]
と表示されてしまいます・・・。
ご回答いただいてから何度も何度も原因を考えながら色々試すも、うまくいきません・・・。

申し訳ありませんが、再度状況を整理し、説明させていただきます。

「イベント(2)」のエイリアスに子エイリアスの「テスト1」、「テスト2」、「テスト3」を作成しました。
子リソースの各[*content*]はリソース名と同じです。

「イベント」の[*content*]は[[Ditto]](デフォルトのスニペット)です。
(要はトップページの新着情報です。)

エイリアス「A」にまず「テスト1」、「テスト2」、「テスト3」の3件を表示させて
テスト1を「pnt_msg_limit」で時間指定をします。
(エイリアスAは募集中のイベント一覧)

時間になったらエイリアス「B」にテスト1が移動し、
「A」には指定した時間がまだ来ていない「テスト2」「テスト3」が残っている、
という風にしたいです。
(Bは過去のイベント一覧)


以下、アドバイスいただいた通り

1.チャンクmsg01に書かれているDittoのテンプレートをチャンクditto_tplに名前を変更する

2.チャンクmsg01を新規に作成し、こちらにDittoを記述
[!Ditto? &parents=`2` &display=`3` &sortBy=`pub_date` &dateSource=`pub_date` &dateFormat=`%m/%d` &tpl=`ditto_tpl`!]

3.リソースの本文には以下を記述
[!pnt_msg &mode=`limit_close` &chunkname=`msg01`!]
時間が来て公開する場合は
[!pnt_msg &mode=`limit_open` &chunkname=`msg01`!]

→「ditto_tpl」のチャンクコードは[+content+]にしました。

そうすると、ページAには
[!Ditto? &parents=`2` &display=`3` &sortBy=`pub_date` &dateSource=`pub_date` &dateFormat=`%m/%d` &tpl=`ditto_tpl`!]
と表示されます・・・。


スニペットは「pnt_msg」でスニペットコードは以下の記述です。
<?php
$date=$modx->getTemplateVar('pnt_msg_limit');
$date=strtotime($date['value']);
$view = (isset($modx) && $mode=='limit_close')?0:1;

if( time() > ($date+86400)){
$view = 1 - $view;
}
if( $view == 1 ){
return $modx->getChunk($chunkname);
}
?>


どこが違うんでしょうか・・・?

ほんとうに、何度もすみません(>_<)

実は、もうひとつしなければならないことがあります。
イベント一覧の中には2種類のイベントがあり、それも分けたいのです。

ご参考に画像をご覧いただければと思います。
画像
この場合、子Aは、親A募集中に作成するべきですよね?

最終的にやりたいことは実はこれなのです。
これですと、もうひとつチャンクを増やすことになるのかなと思っておりますが・・・。
これまでのご回答をヒントに自分でチャレンジしようと思ったのですが、もう、お尋ねさせていただきました :oops:

分かりづらい質問の仕方で本当にすみません;;;;

ご返信いただけると幸いです。
どうかよろしくお願いいたしますm(__)m
返信する