你應該寫一個模塊來做到這一點。
你將需要做一些事情這樣的功能:
<?php
$type = "publications";
$nodes = node_load_multiple(array(), array('type' => $type));
foreach($nodes as $node){
$node->field_authors[LANGUAGE_NONE][0]['nid'] = $node->field_first_author[LANGUAGE_NONE][0]['nid'];
node_save($node);
}
?>
對於一個單獨的腳本,則需要添加如下內容:
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
然後上面的代碼。
,你會因此有一個叫updateAuthors.php具有以下內容PHP:
<?php
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
$type = "publications";
$nodes = node_load_multiple(array(), array('type' => $type));
foreach($nodes as $node){
$node->field_authors[LANGUAGE_NONE][0]['nid'] = $node->field_first_author[LANGUAGE_NONE][0]['nid'];
node_save($node);
}
?>
要first_author在field_authors新node_reference添加值,你需要做的是這樣的:
<?php
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
$type = "publications";
$nodes = node_load_multiple(array(), array('type' => $type));
foreach($nodes as $node){
$firstAuthor = $node->field_first_author[LANGUAGE_NONE][0]['nid'];
if ($firstAuthor === false){
continue;
}
$numberOfValuesInFieldAuthors = count($node->field_authors[LANGUAGE_NONE]);
$node->field_authors[LANGUAGE_NONE][$numberOfValuesInFieldAuthors]['nid'] = $firstAuthor
node_save($node);
}
?>
這將跳過沒有第一個作者集的節點,而對於有一個集合的節點,將field_first_author中的值作爲新節點引用添加到field_authors字段中
作爲編寫模塊的替代方案,您可以簡單地將一個php文件放在drupal根目錄中,包含bootstrap include,然後添加上面的代碼 - 然後您只需導航到瀏覽器中的腳本。例如。 http://localhost/migrate-authors.php – PiX06
非常感謝您的幫助,我是Drupal的新手,並且因此而迷失。我將如何編寫一個模塊?它困難嗎?它會如何工作?代碼只提到field_authors,它如何知道抓取所有field_first_author並將其複製到那裏? 對不起所有的問題,我真的需要幫助!另一種選擇是將php文件放在drupal根目錄中,但是,包含「bootstrap include」的含義是什麼,以及如何包含它? 非常感謝您的幫助,希望您能多幫助我:) – user3385791
我犯了一個錯字,賦值運算符右側引用的字段名稱應該是field_author。我已經更新了上面的答案,其中包含了加載所有drupal函數和模塊的drupal bootstrap代碼 – PiX06