컨텐츠 유형에 새 필드를 추가 한 후 기본 필드로 모든 노드를 업데이트하십시오.


15

여러 노드가있는 기존 컨텐츠 유형이 있습니다. 방금 기본값이 "off"인 새 부울 필드를 추가했습니다.

그러나 각 노드를 다시 저장할 때까지 기본값이 설정되지 않으므로 새 필드에서 기본값을 사용하는 노드 만 표시해야하는보기가 현재 비어 있습니다.

필드를 추가하기 전에 생성 된 기존 노드를 업데이트하여 해당 필드를 기본값으로 설정하려면 어떻게해야합니까?


이 환상적인 비디오에서 설명한대로 Views 대량 작업 및 규칙을 사용하여이 문제를 해결했습니다. commerceguys.com/resources/articles/217
DanH

Resave nodes (노드 재 저장) 모듈을 사용하면 강제로 업데이트 노드를 만들 수 있습니다.
Supriya Rajgopal

답변:


9

슬프게도, VBO / 규칙 외에도이 작업을 수행하는 매우 간단한 방법은 없지만 새 필드를 추가 한 후 특정 노드 유형의 필드 값을 미리 채워야 할 때 사용자 정의 모듈 설치 파일의 업데이트 기능에 사용하는 코드는 다음과 같습니다 ( 이 경우 '페이지'노드) :

<?php
// Get all nodes of 'page' type, populate the field with a value of '1'.
$pages = db_query("SELECT nid, vid FROM {node} WHERE type = 'page'")->fetchAllAssoc('nid');
foreach ($pages as $nid => $values) {
  $fields = array(
    'entity_type' => 'node',
    'bundle' => 'page',
    'deleted' => 0,
    'entity_id' => $values->nid,
    'revision_id' => $values->vid,
    'language' => LANGUAGE_NONE,
    'delta' => 0,
    'field_page_new_field_value' => 1,
  );
  db_insert('field_data_field_page_new_field')
    ->fields($fields)
    ->execute();
  db_insert('field_revision_field_page_new_field')
    ->fields($fields)
    ->execute();
}
?>

이 답변에 언급 된 다른 수동 방법 은 EntityFieldQuery를 사용하고 각 노드를로드 / 저장합니다. Drupal-y는 많지만 성능은 떨어집니다 ... (각 노드에 대한 전체 노드로드 및 저장 작업이 필요합니다!).


그것은 매우 슬프다
AlxVallejo

필드 기본값 모듈을 보셨습니까? dgo.to/field_defaults
forest

이다 버그 : 또한 엔티티 부하 캐시에서 영향을받는 모든 노드를 플래시는 실시하지 않고 같은 코드를 실행하는 entity_get_controller('node')->resetCache($nids);다른 후속 - node_load()캐시에서 오래된 데이터를로드 할 수 있으며, 어떤 node_save()객체의는 것이다 쓰기 데이터베이스에 그 오래된 데이터 다시.
phils

2

최선의 방법은 MySQl에 직접 있습니다. 테이블은 다음과 같습니다.

field_data_field_newbooleanfieldname
field_revision_field_newbooleanfieldname

그것들을 보면 매우 간단합니다. 쿼리가 어떻게 생겼는지 또는 여기서부터 괜찮습니까?


감사합니다 Mike, 아니요 SQL을 실제로 처리 할 수있는 문제는 아닙니다. 나는 '재 저장'옵션이나 대량 작업으로 제공되는 것이 있어야한다고 생각합니다. 실제로 VBO와 규칙 통합을 볼 수 있다고 생각합니다.
DanH

이해했다. 비슷한 위치에 있으며 다른 CMS에서 약 30,000 개의 기사를 Drupal로 마이그레이션하고 있습니다. SQL이 빠르고 더러울 때 다른 모듈을 추가해야 할 시점을 보지 못했습니다. 어쩌면 모든 노드에 대해 node_load ()를 호출하는 빠른 함수를 작성할 수도 있습니다.
Mike

0

벨로우즈 로직을 사용해보십시오. 훨씬 빠르며 모든 후크 구현도 통과합니다. 자세한 내용은 . 간단한 직접 db_select 쿼리를 작성하여 모든 nid를 가져 와서이 샘플 코드로 반복 할 수 있습니다.

$node = new stdClass();
$node->nid = $val;
$node->type = 'NODETYPE';
$node-field_whatever[LANGUAGE_NONE][0]['value'] = 'VALUE';
field_attach_presave('node', $node);
field_attach_update('node', $node);

0

필드 값이 설정되지 않은 노드는 다음을 고려하여 sql 사용

SELECT nid,vid
 from node where type='procedure' and nid not in (select entity_id from field_data_field_pr_choix_du_document)

field_data_field_pr_choix_du_document 내 필드에 해당하는 테이블이며 엔티티 ID가 노드를 참조하도록 설정된 하나의 항목 par 값을 포함하는 테이블

SQL insert ... select 구문을 사용했습니다.

https://dev.mysql.com/doc/refman/5.5/en/insert-select.html

INSERT INTO `field_data_field_pr_choix_du_document` (`entity_type`, `bundle`, `deleted`, `entity_id`, `revision_id`, `language`, `delta`, `field_pr_choix_du_document_value`)
SELECT 'node','procedure',0,nid,vid,'und',0,'Importer un document'
from node where type='procedure' and nid not in (select entity_id from field_data_field_pr_choix_du_document)

0

Views Bulk Operations 모듈을 설치하고 사용 가능하게하고 페이지 표시가있는보기를 작성하십시오.

추가 => 대량 작업 : 컨텐츠 (컨텐츠) 필드를 봅니다.

보내다

여기에 이미지 설명을 입력하십시오

기본값을 설정하려는 필드를 선택하십시오.

보기를 저장하고 작성된 페이지로 이동하십시오. 결과 페이지가 둘 이상인 경우 현재 페이지의 모든 항목, 모든 페이지의 모든 항목을 선택하거나 개별 노드에 해당하는 확인란을 수동으로 선택할 수 있습니다. 계속하려면 하나 이상의 확인란을 선택해야합니다.

이제 기본값을 설정하고 저장하십시오.


0

이 모듈을 사용하여 컨텐츠 유형의 필드를 쉽게 업데이트 할 수있는 방법을 찾았습니다. 필드 기본값

스크린 샷을 참조하십시오. 기존 컨텐츠를 기본값으로 업데이트하거나 기존 값을 유지할 수 있습니다.

D7에서 테스트했으며 작동합니다.

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.