프로그래밍 방식으로 노드를 복제하는 방법?


11

새 이메일 주소를 수신자로하여 내가 만든 웹 양식의 사본을 만들려고합니다.

node_load로 노드를로드 한 후 node_save로 저장할 수 있습니까? 새로운 타임 스탬프와 ID로 새 노드를 만들 수 있습니까?

생성 된 새 노드를 어떻게 구할 수 있습니까?

답변:


17

그냥 노드와 ID 설정을 해제 unset($node->nid)하고, node_save ()를 새 노드를 생성합니다.

실행 된 코드 node_save()는 다음과 같습니다.

// Insert a new node.
$node->is_new = empty($node->nid);
// ...
if ($node->is_new) {
  _node_save_revision($node, $user->uid);
  drupal_write_record('node', $node);
  db_query('UPDATE {node_revisions} SET nid = %d WHERE vid = %d', $node->nid, $node->vid);
  $op = 'insert';
}    

drupal_write_record () 의 마지막 인수는 전달되지 않습니다. 이는 함수가 기존 데이터베이스 행을 업데이트하지 않음을 의미합니다.

노드 객체에 저장되면 node_save(), $node->nid새로 만든 데이터베이스 행에 대한 노드 ID가 포함되어 있습니다.


노드의 webform 객체에는 배열에 오래된 nid를 포함하는 많은 nid 키가 있습니다. 어떻게해야합니까?
Arosboro

Drupal은 그냥 확인하십시오 $node->nid. 해당 노드 ID가로드 된 노드의 ID가 아닌 경우 저장된 노드의 ID로 변경해야하는 경우 해당 노드 ID를 그대로 둘 수 있습니다.
kiamlaluno

2
경로 모듈을 사용하는 경우 다음을 수행 할 수도 있습니다.unset($node->path);
Patrick James McDougle

6

의견을 작성하기 전에 시스템에서 50 점의 평판을 얻었으므로이를 답변으로 게시해야했습니다.

어쨌든 @koivo와 그의 답변에 대한 답변. 나는 단지 그것을 위해 그것을 추가하고 싶었고 또한 $node->vid속임수를 해제 했다. 따라서 설정을 해제하고 저장하는 코드는

// Load a node
$node = node_load(1);

// unset version and node id's
unset($node->nid);
unset($node->vid);
unset($node->path);

// Save the copy
node_save($node);

2

D7에서는 노드 ID unset($node->nid)와 개정 ID를 unset($node->vid)모두 설정 해제해야합니다 . 하나의 특정 용어 참조가있는 하나의 특정 유형 (제품)의 노드를 복제하는 양식을 작성합니다 (해당 용어 ID를 대체 함). 최종 제출은 다음과 같습니다.

function MYMODULE_form_submit($form, &$form_state) {
    $old_tid = $form_state['values']['old_tid'];
    $new_tid = $form_state['values']['new_tid'];

    $query = new EntityFieldQuery();
    $result = $query
    ->entityCondition('entity_type', 'node')
    ->entityCondition('bundle', 'product')
    ->fieldCondition('field_some_term_reference', 'tid', $old_tid)
    ->execute();

    foreach ($result['node'] as $product) {
        $node = node_load($product->nid);
        $node->field_some_term_reference[LANGUAGE_NONE][0]['tid'] = $new_tid;
        unset($node->nid);
        unset($node->vid);
        node_save($node);
    }   
}

타임 스탬프를 다시 저장하는 것도 고려할 수 있습니다 $node->uid.


원래 노드에 entityreference 필드가 있으면 복제 된 노드에서 해당 값을 유지하지 않으며 노드 유형을 지정하지 않은 엔티티 형식 예외도 발생합니다. D7에서 테스트 중입니다. 어떤 단서?
19:47에

2

복제 모듈을 사용해보십시오 .
최근에 한 사이트에서 쉽게 복제하고 변경해야했으며이 모듈이 제대로 작동한다는 것을 알았습니다.
아웃 확인 replicate.api.php의 그것을 사용하는 것이 얼마나 쉽게 볼 수있는 파일을.

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