대량 현장 업데이트?


35

이미 많은 노드가있는 Drupal 7 컨텐츠 유형에 새 (텍스트) 필드를 추가했습니다.

이 모든 노드의 기본값으로 필드를 채우려면 어떻게해야합니까?

답변:


37

EntityFieldQuery노드 목록을 검색 한 후 다음을 사용하여 노드 필드를 업데이트 할 수 있습니다 node_save().

$lang = LANGUAGE_NONE; // Replace with ISO639-2 code if localizing
$node_type = 'page'; // Machine name of the content type

$query = new EntityFieldQuery;
$result = $query
  ->entityCondition('entity_type', 'node')
  ->propertyCondition('type', $node_type)
  ->execute();

if (!empty($result['node'])) {
  $nodes = entity_load('node', array_keys($result['node']));

  foreach($nodes as $node) {
    // Replace field_foo with the machine name of the field to update.
    // - 0 refers to specific value within the field array, for when the field contains
    //    multiple values. If the field only has one value, it should be 0.
    $node->field_foo[$lang][0]['value'] = 'New Value';
    node_save($node);
  }
}

이 작업이 일회성 작업 인 경우 Devel 모듈의 PHP 실행 기능을 사용하여 위를 실행할 수 있습니다. 그렇지 않으면 간단한 사용자 지정 모듈을 만들 수 있습니다.


2
devel 또는 vbo를 사용하는 것 외에도 "drush scr myscript.php"를 사용하여 완전히 부트 스트랩 된 환경에서 위 코드를 실행할 수 있습니다.
fietserwin

용어 참조 필드에 동일한 작업을 수행하기 위해이 코드는 어떻게 변경됩니까?
Screenack

17

내가 사용하는 것이 조회수 운영 (원자재) 및 사용 위의 본질적 항목을 할 "임의의 PHP 스크립트를 실행",하지만 당신은 모든 당신이 (처럼 원하는 것을 추가 코드, 단지 작은 조각을 할 필요가 없습니다 $object->field_foo['und'][0]['value'] = 'some_value')


9

일부 값으로 필드를 업데이트하려는 경우 허용되는 답변의 성능이 뛰어난 대안은 다음과 같습니다.

$lang = LANGUAGE_NONE; // Replace with ISO639-2 code if localizing
$node_type = 'page'; // Machine name of the content type

$query = new EntityFieldQuery;
$result = $query
  ->entityCondition('entity_type', 'node')
  ->propertyCondition('type', $node_type)
  ->execute();

if (!empty($result['node'])) {
  $nodes = entity_load('node', array_keys($result['node']));

  foreach($nodes as $node) {
    // Replace field_foo with the machine name of the field to update.
    // - 0 refers to specific within the field array, for when the field contains
    //    multiple values. If the field only has one value, it should be 0.
    $node->field_foo[$lang][0]['value'] = 'New Value';
    field_attach_presave('node', $node);
    field_attach_update('node', $node);
  }
}

차이점은 직접 사용하는 기능 field_attach_presavefield_attach_update노드 필드 만 올바르게 업데이트하고 나머지 노드 저장 프로세스를 건너 뛰는 기능입니다. 이는 노드 사전 저장 / 저장 후크가 호출되지 않고 "변경된"날짜가 현재 날짜 등으로 업데이트되지 않는 영향을 미칩니다. 사용 사례에 따라 전체 node_save () 프로세스를 사용하는 것이 더 좋습니다.


4

실제로 VBO (Views Bulk Operations)는 좋은 솔루션입니다. 또한 최신 버전에서는 한 번의 작업으로 노드 언어를 매우 쉽게 업데이트 할 수있는 "엔터티 값 수정"옵션이 있습니다.


2

Views Bulk Operations 모듈을 설치 및 활성화하고 페이지 표시가있는보기를 작성하십시오.

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

보내다

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

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

귀하의 경우 제목입니다. 이미지에서는 태그입니다.

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

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

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