diff --git a/docs/en/index.md b/docs/en/index.md index be9610e..c565963 100644 --- a/docs/en/index.md +++ b/docs/en/index.md @@ -106,6 +106,17 @@ class Item extends DataObject { } ``` +### Versioning +By default `GridFieldOrderableRows` will handle versioning but won't automatically publish any records. The user will need to go into each record and publish them manually which could get cumbersome for large lists. + +You can configure the list to automatically publish a record if the record is the latest version and is already published. This won't publish any records which have draft changes. + +```php +$orderable = GridFieldOrderableRows::create()->setRepublishLiveRecords(true); +``` + +There are caveats with both approaches so consideration should be made for which approach best suits the requirements. + **Please NOTE:** There is a limitation when using `GridFieldOrderableRows` on unsaved data objects; namely, that it doesn't work as without data being saved, the list of related objects has no context. Please check `$this->ID` before adding the `GridFieldOrderableRows` component to the grid field config (or even, before adding the gridfield at all). Configurable Paginator diff --git a/src/GridFieldOrderableRows.php b/src/GridFieldOrderableRows.php index 6b3d8bb..3c4efde 100755 --- a/src/GridFieldOrderableRows.php +++ b/src/GridFieldOrderableRows.php @@ -82,6 +82,15 @@ class GridFieldOrderableRows extends RequestHandler implements */ protected $extraSortFields = null; + /** + * If the items in the list are versioned and this is set to true, then + * we will check to see if the version we're sorting is the latest published + * version and if so then we will re-publish the item. + * + * @var boolean + */ + protected $republishLiveRecords = false; + /** * The number of the column containing the reorder handles * @@ -147,6 +156,28 @@ public function getExtraSortFields() return $this->extraSortFields; } + /** + * @see $republishLiveRecords + * + * @return boolean + */ + public function getRepublishLiveRecords() + { + return $this->republishLiveRecords; + } + + /** + * @see $republishLiveRecords + * + * @param boolean $bool + * @return GridFieldOrderableRows $this + */ + public function setRepublishLiveRecords($bool) + { + $this->republishLiveRecords = $bool; + return $this; + } + /** * Checks to see if the relationship list is for a type of many_many * @@ -628,7 +659,15 @@ protected function reorderItems($list, array $values, array $sortedIDs) if ($record->$sortField != $newSortValue) { $record->$sortField = $newSortValue; + + // We need to do this before writing otherwith isLiveVersion() will always be false + $shouldRepublish = $this->getRepublishLiveRecords() && $record->isLiveVersion(); + + // Write our staged record and publish if required $record->write(); + if ($shouldRepublish) { + $record->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE, true); + } } } }