Як програмно дублювати вузол?


11

Я хочу створити створену нами копію веб-форми з новою адресою електронної пошти в якості одержувача.

Після завантаження вузла node_load, чи можу я просто зберегти його за допомогою node_save? Чи створить це новий вузол із новими часовими позначками та ідентифікаторами?

Як я можу отримати нід нового створеного вузла?

Відповіді:


17

Просто зніміть ідентифікатор вузла з 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містить ідентифікатор вузла для новоствореної рядки бази даних.


Об'єкт веб-форми вузла має багато ключів nid у своїх масивах, що містять старий nid, що мені робити з ними?
Аросборо

Drupal просто перевірити $node->nid. Якщо жоден із цих ідентифікаторів вузла не є ідентифікатором завантаженого вузла, який потрібно змінити з ідентифікатором збереженого вузла, ви можете залишити ці ідентифікатори вузла такими, якими вони є.
kiamlaluno

2
Якщо ви використовуєте модуль шляху, можливо, вам також захочетьсяunset($node->path);
Патрік Джеймс МакДугле

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 ви повинні скасувати ідентифікатор вузла unset($node->nid)та ідентифікатор редакції unset($node->vid). Я будую форму для клонування вузлів одного певного типу (продукту), що мають одне певне посилання на термін (із заміною цього терміна ідентифікатором). Ось остаточне подання:

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.


Якщо на початковому вузлі є поле посилання на сутність, воно не зберігає свого значення на клонованому вузлі, а також суттєве формальне визначення піднімається для невказання типу вузла. Я тестую в D7. якась підказка?
kiranking

2

Спробуйте повторити модуль .
Мені потрібно було легко клонувати та змінювати речі на сайті, який я нещодавно робив, і я виявив, що цей модуль працює добре.
Перегляньте файл replicate.api.php, щоб побачити, наскільки це просто у використанні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.