1日に3回ノードを公開する方法は?


8

Viewsモジュールで作成された非公開ノードのリストがあります。タスクを1日に3回、指定した時間に実行したい。タスクが実行されるたびに、リスト上のノードの1つだけが公開されます。これどうやってするの?

私が試した手順

スケジューラー

スケジューラモジュールを使用すると、ノードが公開されることはしたい正確な時刻を指定する必要があります。これにより、各ノードが公開されることになっているときに計算する必要があるため、複雑になります。

一括操作+ルール+ルールスケジューラの表示

ビューは、Operationsバルクモジュールを、あなたがにさらされているノードのリストを作成することができますルールモジュールを。その後、ルールはリストに作用し、ノードをリストに公開できます。特定の数のノードのみを公開するようにルールに指示できます。

これは完全に機能します。ただし、ルールを1日に3回実行するようにスケジュールすることはできません。

ルールをメインサイトのCronジョブにリンクできますが、Cronジョブが3回以上実行される可能性があるため、これはあまり正確ではないようです。

ルールスケジューラモジュール(ルールのサブモジュール)がありますが、これをルール条件に使用できるようには見えません。また、実行時間を指定する方法がないようです。

ジョブスケジューラ

これにより時間を設定できますが、ルールビューと統合されていないようです。


カスタムモジュールを通じてこれを実行したくない理由はありますか?このようにしたい場合は、回答を提供できます。
Aram Boyajyan、2015年

@Topsitemakers私は既存のモジュールを使用することを望んでいました。これは、より多くのユーザーに渡されるため、私のモジュールよりも優れたコードになるからです。やりたいことは可能だという印象を受けました。タスクスケジューリングビットを並べ替えるだけです。
big_smile

回答:


5

モジュールVBO、ルール、ルールスケジューラの使用

あなたのアプローチについてモジュールの使用してビューを操作(VBO)バルクルールや規則スケジューラ(のサブモジュール規則あなたが書いたため)、「1 日3回を実行するためのルールをスケジュールすることはできていないように。」:私には表示されます「a」の有効なアプローチ。

実際に行う必要があるのは、ルールスケジューラを使用したチュートリアルの時間単位のタスクで説明されているもののマイナーバリエーションです。この場合、オフセットを1時間ではなく8時間にする必要があります。

そしてそのチュートリアルでも説明されているように:最初にコンポーネントを手動で実行します。(それ以降は、8時間おきにルールが再度実行されます)。

1日1回モジュールのルールとルールを使用する

ルールに関連するかなり新しいモジュール、つまり「1日1回のルール」モジュールがあります。これはどのように機能するかです(モジュール所有者からの問題2495775コメントに従って):

  • このモジュールの管理設定ページでトリガー時間を指定します。
  • ルールトリガーは、その時間の開始後にcronタスクが最初に実行されたときに実行されます。実際の実行時間は、cronタスクのタイミングによって異なります。

私がこれを理解/読む方法(まだ実験はしていません)は次のようになります。

  • 「イベント」は、cronジョブが実行されたときにのみトリガーされます。
  • そして、そのイベントは1日に1回だけトリガーされます。つまり、「トリガー時間が経過すると、次にcronが実行されます」。

したがって、3つの同様のルールを作成することで、そのうちの1つを(たとえば)午後6時に実行し、別のルールを午後2時に実行し、最後のルールを午後10時に実行することができます。

PS:この質問はD7に関するものだと思います。


一度に実行するにはどうすればよいですか。特定の時間にルールをアクティブ化するオプションがないようです。
big_smile 2015年

「1日1回ルール」モジュールに精通していますか?私の更新された回答を参照してください...それがうまくいくかどうか知りたいです...
Pierre.Vriens

「1日1回のルール」は1日に1回のみ実行されます。しかし、希望する時間を取得するためにオフセットを追加できることを願っています。ルールでは、を使用できますstringtotime()。「1日に1回のルール」が真夜中に実行され、ルールを午後6時に実行したい+18 hours場合、stringtotimeコマンドを記述する正しい方法でしょうか?
big_smile 2015

True that Rules Once a Dayは1日に1回のみ実行されます(その名前も示しています)。しかし、3つの(類似した)ルールを定義すると、1日1回3回のルールになりますよね?また、実際のトリガーは、cronジョブが実行されたときです。cronが毎時間、午後6時5分(18:05)に実行するとします。次に、「トリガー時間」はその少し前(+18時間など)にして、次のcronが実行されると(18:05)、トリガーを取得できるようにします。cronが(例えば)12:05と04:05でも実行される場合、+ 12時間のようなトリガー時間と+4時間のような別のルールを持つ別のルールが必要です。
Pierre.Vriens 2015

1
私はこれを90%しかテストしていませんが、これまでのところ最も効果があったのは答えであるため、賞金を獲得します。
big_smile 2015年

1

これは、いくつかのコーディングを使用して実現できます。

  1. スケジューリングのために公開されているすべてのノードをリストするビュー。DraggableViewsも適用する場合は、管理者がドラッグアンドドロップでノードを並べ替えることができます。これは常に便利です。

  2. publishdaily_get_top_node()上記のビューを実行し、最上位ノードのNIDを返すカスタムPHP関数。これをカスタムミニモジュールに入れることをお勧めします。

  3. cronの実行時にトリガーされ、新しいノードを公開するタイミングかどうかを確認するルール(たとえば、時間が00.00と00.15の間にあるかどうかを確認する-cronの実行頻度による)。それが時間である場合、アクション「ノードのロード」を起動しpublishdaily_get_top_node()、NIDをロードするために使用します。次に、読み込まれたノードを公開します。

さらにクリーンにしたい場合は、PHP関数だけでなくルールプラグインを記述します。

よりクリーンにしたくない場合は、任意のPHPコードを実行するアクションで関数を直接記述します。

参照


checking if the time is between 00.00 and 00.15ルールで時間をどのようにチェックしますか?ありがとう。
big_smile 2015

ルールスケジューラまたはジョブスケジューラを使用できます
rfegade

Drupal Answersへようこそ!回答をコピーして貼り付ける場合は、元の投稿をリンクしてください。
kiamlaluno

1
  1. 指定した時刻にcronコマンド使用してcronジョブを構成します。

  2. hook_cron()を実装するモジュールを作成します。最初のノードをとして更新するには$node->status = 1

    $ node-> status = 0、非公開を意味します。
    $ node-> status = 1は、公開済みを意味します。

    function yourmodule_cron() {
      update $node->status = 1;    
    }
  3. views_get_view()を使用してノードのnidを取得できます

    $view = views_get_view('your_views_name');
    
    $view->execute('default');
    
    $view->preview();
    
    $renderer = $view->style_plugin->row_plugin;
    
    foreach ($view->result as $index => $row) {
    
      // get node NID from first row    
    
    }

非公開ノードをターゲットにするにはどうすればよいですか?ありがとう!
big_smile 2015年

views_get_view()を使用してノードのNIDを取得します
Dong Tao

0

ルールまたはコードのどちらを使用してビューの上部から単一のノードを公開するかに関係なく、私はそれをスケジュールする最も簡単な方法はUltimate Cronを使用することだと思います。

スケジューラーをCrontabに設定し、特定のタスクについて、実行するタイミングを正確に伝えることができます。たとえば、午前8時、正午、午後4時が必要な場合は、次のルールを作成できます。

0 8,12,16 * * *

さらに詳しい情報:

Elysia Cronは、カスタムcronタスクを許可しているように見えます。これにより、(おそらくphpコードを介して)特定のルールをターゲットにすることができます。


Ultimate Cronを使用すると、ルールをトリガーすることができます。遊んでみましたが、理解できませんでした。ルールは特定のcronジョブに応答できないようです(すべてのcronジョブに反応します)。
big_smile

そうは思いませんでしたが、Elysia Cronでカスタムジョブを作成できるように思えます。
Darvanen 2015年

0

次のようにルールを作成します。

/ admin / config / workflow / rules / components / add

「アクションセット」を作成します。名前=非公開コンテンツ変数:データタイプ=ノードラベル=ノードマシン名=ノード-続行-

    Add Actions:
      Node > Unpublish content
      Data selector = node
      -Save-

/ admin / config / workflow / rulesで「ルール」を作成します。名前=非公開ルールイベントに反応=ノード>新しいコンテンツを保存した後タイプで制限=コンテンツタイプ-保存-

    Conditions:
              Content is published
            Data selector = node
              -Save-

    Actions:
      Schedule component evaluation
      Component Value = Unpublish Content
      Scheduled evaluation date data selector = node:field-your-node-date-field
      Identifier value = Unpublish content ID [node:nid] ([node:title]).
      Node Data selector = node
      -Save-

つまり、コンポーネントを作成するときにコンテンツをフィルタリングしたり、ルールにコンテンツタイプの条件を追加したりする必要はありません。

さらに、Admin >> Configuration >> System >> Cron(admin / config / system / cron)からウェブサイトのcron設定を確認してください

これに関して何かご質問やご不明な点がありましたらお知らせください。


ありがとう!ルールを実行する時間を指定するにはどうすればよいですか?(特定の時間に実行したいだけです)。非公開ノードのビューリストにあるノードの1つだけを公開するにはどうすればよいですか?
big_smile 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.