0

多数の計算フィールドを含む Drupal コンテンツ タイプがあります。cron によってトリガーされる RSS フィード インポーターを介して、一部の (すべてではない) アイテムがこのコンテンツ タイプに追加されています。hook_cron で新しいアイテムの計算フィールド生成をトリガーしようとしています。次のコードは、「送信済み」としてタグ付けされていないすべてのアイテムを取得し、ノードをロードして再保存し、ノードを「送信済み」としてマークします。

$query = db_select('node', 'n');
$query->fields('n', array('nid'));
$table_alias = $query->join('field_data_field_submitted', 'r', 'n.nid = r.entity_id AND r.field_submitted_value = 0');
$result = $query->execute();
foreach ($result as $record){
    $q = $record->nid;
    $n = node_load($q);
    node_save($n);
    $query = db_update('field_data_field_submitted')
        ->fields(array('field_submitted_value' => 1))
        ->condition('entity_id', $q)
        ->execute();
}

このコードは、モジュールで生成されたページ (ページ コールバック関数で hook_menu を使用して作成) から呼び出すと、期待どおりに機能します。ノードが再送信され、計算フィールド データが生成されます。このコードを hook_cron 関数に入れると、クエリが機能し、レコードをループして「送信された」値を更新しますが、計算フィールドは計算されません。これがcronでトリガーされない理由について混乱しています。何か助けはありますか?

4

2 に答える 2

1

どっ!ついに、これは完全に自分の行いであることに気付きました。このコンテンツ タイプの性質上、匿名ユーザーに新しいコンテンツの作成を許可しますが、コンテンツの作成時に計算フィールドを明示的にトリガーしません (長い話ですが、簡単に言えば、認証されたユーザーがこのコンテンツを検証して強化するということです。計算フィールドの出番です)。そのため、初期コンテンツを設定していたときに、匿名ユーザーの計算フィールドを無効にし ($user->uid > 0 の場合)、それを完全に忘れていました。そのロジックを微調整して、インポート時に計算フィールドを処理できるようにすると (インポートされたコンテンツの値を持つが、他のコンテンツの値を持たないフィールドでトリガーする)、問題は解決しました。

于 2012-08-08T16:42:43.537 に答える
0

cron の実行では完全なブートストラップにアクセスできるため、そのコンテキストでコードが異なる結果を生成する論理的な理由はありません。

つまり、field_data_field_submittedテーブルを更新する必要がある場合にのみテーブルを更新しているfield_revision_field_submittedため、何らかの形で不一致が説明される可能性があります。

Drupal はフィールド システム用の API を提供しているため、この種の問題を完全に回避できます。「Drupal」の方法で書き直した、使用した同じコードは次のようになります。

$query = new EntityFieldQuery;
$query->entityCondition('entity_type', 'node')
  ->fieldCondition('field_submitted', 'value', 0);

$results = $query->execute();

if (!empty($results['node'])) {
  $nodes = node_load_multiple(array_keys($results['node']));

  foreach ($nodes as $node) {
    $node->field_submitted[$node->language][0]['value'] = 1;
    node_save($node);
  }
}

上記のコードがcronでも失敗する正当な理由が思いつかないので、試してみる価値があるかもしれません。

于 2012-07-19T17:27:43.700 に答える