ฉันสามารถสร้างการแก้ไขโหนดใหม่แบบเป็นโปรแกรมโดยไม่ต้องมีการแก้ไขใหม่กลายเป็น "ปัจจุบัน" หรือไม่


9

เมื่อใดก็ตามที่การนำเข้าฟีดของฉันพบชิ้นส่วนเนื้อหาที่มีอยู่ใหม่เวอร์ชันนั้นจะสร้างการแก้ไขใหม่ของโหนดนี้แทนการเขียนทับข้อมูล

โดยปกติการแก้ไขใหม่จะกลายเป็น "ปัจจุบัน" ทันที ฉันต้องการให้การแก้ไขที่แสดงอยู่ในปัจจุบันยังคงเหมือนเดิมและให้ผู้ดำเนินการตัดสินใจในภายหลังว่าควรจะเผยแพร่ใหม่หรือไม่


1
คุณเคยลองใช้ Workbench Moderation, Workflow หรือโมดูลใด ๆ ที่ทำสิ่งเดียวกันหรือไม่?
mpdonadio

ฉันยังไม่ได้ ฉันเริ่มสันนิษฐานว่าเพราะฉันสร้างโหนดในรหัสพวกเขาไม่ได้ใช้ บางทีนั่นอาจไม่ใช่กรณี
Letharion

คำตอบ:


13

การติดตั้ง Drupal มาตรฐานไม่อนุญาตให้คุณสร้างการแก้ไข "รอ" คุณมีสองทางเลือก:

  1. สร้างการแก้ไขใหม่โดยทางโปรแกรม แต่กลับสู่การแก้ไขดั้งเดิมโดยทางโปรแกรม (ซึ่งสร้างการแก้ไขที่ใหม่กว่า แต่มีเนื้อหาต้นฉบับ)
  2. (แนะนำ) ใช้ Workbench Moderation, Revisioning หรือ Workflow ซึ่งเป็นทางออกที่ดีสำหรับการควบคุมเวอร์ชันและ / หรือการควบคุมการเข้าถึง

สำหรับตัวเลือกที่ 1: คุณสามารถเพิ่มรหัสนี้เป็นกฎใหม่หรือใช้ในโมดูลใหม่

<?php
  // Programatically load the existing revision and save it
  // Taken from http://api.drupal.org/api/drupal/modules!node!node.module/function/node_save/7
  // Load the revision
  $original_revision = node_load($nid);
  $original_revision->revision = 1;
  $original_revision->log = t('Copy of the revision from %date.', array('%date' => format_date($original_revision->revision_timestamp)));

  $new_revision = node_load($nid);
  // Make any changes to the new revision here...
  $new_revision->revision = 1;
  $new_revision->log = t('Summarize your changes here');

  // Save the new revision first
  node_save($new_revision);

  // Save the original one again so that it is still the current revision
  node_save($original_revision);

  watchdog('content', '@type: reverted %title revision %revision.', array('@type' => $node_revision->type, '%title' => $node_revision->title, '%revision' => $node_revision->vid));
  drupal_set_message(t('@type %title was saved with a new revision, but reverting to original revision from %revision-date.', array('@type' => node_type_get_name($node_revision), '%title' => $node_revision->title, '%revision-date' => format_date($node_revision->revision_timestamp))));
  drupal_goto('node/' . $node_revision->nid . '/revisions');
?>

สำหรับตัวเลือกที่ 2: ฉันอยากจะแนะนำ Workbench มากกว่า Revision หรือ Workflow แต่แต่ละอันนั้นแตกต่างกันไปตามความต้องการของคุณ Workbench เป็นผู้สืบทอดการแก้ไขและเวิร์กโฟลว์เป็นมากกว่าการควบคุมเวอร์ชันดังนั้นมันอาจจะเหมาะกับความต้องการของคุณหรือไม่ก็ได้

นี่คือรายละเอียดด่วนของความแตกต่างระหว่าง Workbench และ Workflow


ตัวเลือกแรกจะยอดเยี่ยม แต่ฉันจะทำการยกเลิกได้อย่างไร
Letharion

เพิ่มรหัสสำหรับตัวเลือก 1 แต่จริงๆแล้วตัวเลือกที่ 2 น่าจะเป็นทางออกที่ดีที่สุดของคุณเพราะมันเพิ่มฟังก์ชันการทำงานสำหรับการจัดการเวอร์ชันปัจจุบันแทนที่จะเป็นเพียงการทำซ้ำต้นฉบับซ้ำแล้วซ้ำอีก
Johnathan Elmore

ลิงก์ใช้งานไม่ได้
digitgopher

จะเขียนที่ไหนใน hook_form_alter
KTM

ลิงก์ถูกแก้ไขแล้ว @ IcecreamJelly ลอง hook_node_update
Johnathan Elmore

2

นี่คือการคาดเดา แต่ฉันจะให้โมดูลย่อย Workbench Moderation ในโมดูลWorkbench ฉันได้พบนี้ง่ายมากที่จะตั้งค่ากว่าเวิร์กโฟลว์

ความจริงที่ว่าคุณกำลังสร้างโหนดในรหัสไม่ควรมีความสำคัญตราบใดที่การnode_save()รันในฐานะผู้ใช้ที่มีการตั้งค่าที่เหมาะสมสำหรับประเภทเนื้อหา (สถานะการควบคุมจะได้รับการจัดการกับโหนด API) แม้ว่านี่อาจหมายถึงว่าคุณต้องทำเซียนนิแกนบางช่วงเพื่อให้ได้สิ่งต่าง ๆ ในฐานะผู้ใช้ที่เหมาะสมเมื่อฟีดทำงาน


2
การปรับแต่ง +1 workbench เป็นโมดูลที่ยอดเยี่ยมที่ฉันได้ใช้งานมาระยะหนึ่งแล้ว
Clive
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.