2012-07-19 3 views
0

나는 여러 개의 계산 된 필드를 포함하는 Drupal 컨텐트 유형을 가지고 있습니다. 일부 (전부는 아님) 항목이 cron 트리거 RSS 피드 가져 오기 도구를 통해이 콘텐츠 유형에 추가됩니다. hook_cron의 새 항목에 대해 계산 된 필드 생성을 트리거하려고합니다. 다음 코드는 '제출'태그가 지정되지 않은 모든 항목을 가져 와서 노드를로드하고 다시 저장 한 다음 노드를 '제출'으로 표시합니다.Drupal 7 node_save가 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에서 방아쇠되지 않을 이유에 대해 혼란 스럽다. 어떤 도움이 필요합니까?

답변

0

크론 런은 전체 부트 스트랩에 액세스 할 수 있으므로 코드가 해당 컨텍스트에서 다른 결과를 생성하는 논리적 인 이유가 없습니다.

즉, field_revision_field_submitted 테이블을 업데이트해야 할 때 field_data_field_submitted 테이블 만 업데이트하므로 불일치가 발생할 수 있습니다.

Drupal은 필드 시스템 용 API를 제공하므로 이러한 종류의 문제를 완전히 피할 수 있습니다. '드루팔'방법을 다시 당신이 사용했던 동일한 코드는 다음과 같습니다 위의 코드는 크론에 실패하는 이유

$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); 
    } 
} 

가 나도 그래서 그것을주는 가치가있을 수도 있습니다 좋은 이유를 생각할 수 없다 소용돌이 치다.

+0

코드 팁 주셔서 감사합니다. 앞으로 나아갈 엔터티 필드 쿼리를 사용합니다. 불행히도, 나는 여전히 동일한 동작을 보았습니다.이 코드는 모듈 생성 페이지의 일부로 완벽하게 작동합니다. hook_cron에 포함되었을 때, 제출 된 값은 변경되지만 계산 된 필드의 계산은 트리거되지 않습니다 ... – Zeth

+0

나는 모듈 생성 페이지에 코드를 배치하고 drupal_http_request로 해당 페이지를 트리거하려고했습니다. 동일한 동작 - field_submitted를 업데이트하지만 계산 된 필드를 트리거하지 않습니다 ... – Zeth

1

Doh! 마침내 이것이 완전히 내 자신의 일이라는 것을 깨달았습니다. 익명 사용자가 새 콘텐츠를 만들 수 있지만 콘텐츠를 만들 때 계산 된 필드를 명시 적으로 트리거하지 않는이 콘텐츠 형식의 특성으로 인해 (긴 이야기이지만 짧은 형식은 인증 된 사용자 인 경우 &이 콘텐츠를 향상 시키도록 확인합니다. 계산 된 필드가 들어있는 곳). 그래서 초기 컨텐트를 설정하면서 익명 사용자 ($ user-> uid> 0 인 경우)에 대해 계산 된 필드를 비활성화하고 완전히 잊어 버렸습니다. 계산 된 필드를 가져올 때 처리 할 수 ​​있도록 논리를 수정 한 후에 (가져온 콘텐츠의 값은 있지만 다른 콘텐츠의 값은없는 필드로 트리거) 문제가 해결되었습니다.

관련 문제