web-dev-qa-db-ja.com

プログラムでノードを公開および非公開にする:匿名アクセス

特定の日に「オープン」および「クローズ」する必要がある求人公募として機能するノードがいくつかあります。これを達成するために、それに応じてそれらを公開および非公開にします。

nodeテーブルとnode_revisionテーブルの両方を正常に更新するクエリ( publish unpublished node に基づく)があります。

$result = db_query('update node n
JOIN field_data_field_jobs_date d ON d.entity_id = n.nid and d.revision_id = n.vid
JOIN node_revision r ON n.nid = r.nid and n.vid = r.vid
# Update the node_revision table
SET r.status = IF(
    ( 
    CURDATE() >= d.field_jobs_date_value 
    AND 
    CURDATE() <= d.field_jobs_date_value2
    ),1,0
),
# Update the node table
n.status = IF(
    ( 
    CURDATE() >= d.field_jobs_date_value 
    AND 
    CURDATE() <= d.field_jobs_date_value2
    ),1,0
)
# Only update our custom content type
WHERE n.type = \'job_posting\'');

これにより、データベースのノードステータスとノードリビジョンステータスが正常に更新されます。

ただし、この方法でノードが公開されても、匿名ユーザーはそれを見ることができません(ノードへの直接リンクが与えられている場合、アクセスは拒否されます)。

各ノードを手動で編集し、公開されたステータスを「取得」するには、保存ボタンをクリックする必要があります。これにより、ノードへのアクセスまたはノードのアクセス許可を適切に更新する同様の呼び出しへの何らかの呼び出しが省略されていると私は信じるようになります。

匿名ユーザーがプログラムで公開されたノードを見るのを防ぐことができるステータスフィールド以外のアイデアはありますか?

1
oranges13

ノード/リビジョンを更新するためにフォローしている方法は、一般的にDrupalコミュニティによって嫌われています。しかし、あなたが何をしているか、そしてデータベースに対して実行する変更を知っているようですので何も壊さないでください、私はそれを修正する方法について提案を与えることができます。

データベーステーブルを更新した後、 node_load および node_save 関数を使用して、適切なDrupalの方法でノードをプログラムで取得および保存できます。これは基本的に、ノードを開いて保存することと同じです。

これが発生している理由については、node_save関数のコードを確認してください。具体的には、ノードアクセステーブルを次のようなもので更新しないという事実です。

    node_access_acquire_grants($node);

あなたが直面している問題を引き起こしている可能性があるもののようです。

3
F1234k

おそらくキャッシング。データベース内の何かを直接変更することは、最速ですが、Drupalで物事を行うための最も安全で信頼できる方法ではありません。

enity_query (またはこの場合はデータベースに直接アクセスする)を使用して更新するノードのノードIDを取得し、「正しい」を使用することをお勧めしますdrupal方法->すべてのノードをロードし、個別に公開ステータスを変更して保存します。

これらの線に沿って何か...

$nodes = node_load_multiple($nids);
foreach ($nodes as $node) {
  // set status property to 1
  $node->status = 1;
  // re-save the node
  node_save($node);
}
4
Petrroll