Adds drag and drop functionality to SilverStripe's GridField
Go to file
ismooth 3dfe104b53 Initial sorting equals sortColumn
After a user has changed sorting order of objects in the list, and when drag&drop is disabled, sorting is made by $default_sort from that DataObjects property or default set by SS. This results in different sorting when checkbox is enabled or disabled what confuses users. This change always sorts the list by $sortColumn, so that user always sees same sorting.
2014-10-03 16:01:27 +02:00
.tx Transifex support 2013-10-24 23:14:40 +02:00
code/forms Initial sorting equals sortColumn 2014-10-03 16:01:27 +02:00
css MINOR: Added label to the "Allow Drag and Drop" text so that clicking this will activate the checkbox 2012-05-31 19:50:33 -03:00
docs Updated docs to correctly work for 3.1.x and future (mentioned in issue #52) 2014-01-27 17:04:32 -04:00
images Added missing image 2012-05-18 19:28:13 -03:00
javascript Removed extra language that was not needed 2013-07-18 20:54:33 -03:00
lang New translations 2014-03-02 15:11:12 -04:00
templates/Includes Transifex support 2013-10-24 23:14:40 +02:00
tests/forms Fixed issue #48 where duplicate sort indexes would occur when appending to top instead of the bottom 2013-10-22 10:36:08 -03:00
_config.php Removed Director::absoluteBaseURL() as it is not required 2012-10-13 12:51:55 -03:00
.gitignore Update .gitignore 2012-11-15 15:48:12 -04:00
.travis.yml Changed travis to not allow any failures 2014-05-03 17:07:22 -03:00
composer.json Updated requirements to restrict to 3.0.x and 3.1.x 2014-01-22 15:40:36 -04:00
LICENSE Update LICENSE 2013-09-09 10:11:15 -03:00
README.md Corrected documentation example for appending to top 2014-02-24 16:03:50 -04:00

SortableGridField

Build Status

Adds drag and drop functionality to SilverStripe 3's GridField

Requirements

  • SilverStripe 3.0.x or 3.1.x

Installation

  • Download the module from here https://github.com/UndefinedOffset/SortableGridField/archive/master.zip
  • Extract the downloaded archive into your site root so that the destination folder is called SortableGridField, opening the extracted folder should contain _config.php in the root along with other files/folders
  • Run dev/build?flush=all to regenerate the manifest
  • Upon entering the cms and using GridFieldSortableRows component for the first time you make need to add ?flush=all to the end of the address to force the templates to regenerate

If you prefer you may also install using composer:

composer require undefinedoffset/sortablegridfield

Usage

To enable sorting on a has_many relationship set up an integer field on your data object. Also for has_many relationships make sure to set the $default_sort on the dataobject to this new integer field to ensure that the sort order is applied when the relationship is requested. For many_many relationships you must add a $many_many_extraFields static to the data object defining the relationship, see the SilverStripe documentation for more information on this. If you are using a many_many relationship you will need to do a custom getter to set the sort order of this relationship for use on the front end see below for an example. For new DataObjects you do not need to increment the Sort order yourself in your DataObject GridFieldSortableRows will automatically do this the next time the grid is displayed.

public function getMyManyManyRelationship() {
    return $this->getManyManyComponents('MyManyManyRelationship')->sort('SortColumn');
}

To enable drag and drop sorting on the grid field add the following to your grid field's config Grid Field Config

$myGridConfig->addComponent(new GridFieldSortableRows('{Column to store sort}'));

To move an item to another page drag the row over the respective page button and release.

Full code Examples

Events

GridFieldSortableRows provides 4 "events" onBeforeGridFieldRowSort(), onAfterGridFieldRowSort(), onBeforeGridFieldPageSort() and onAfterGridFieldPageSort(). These "events" are passed a clone of the DataList used in GridFieldSortableRows, in the case of page sorting this list has a limit that shows you the current page plus/minus one object. For GridFieldSortableRows that are on ModelAdmin decendents these events are called on the ModelAdmin if they do not have a owner DataObject, if you are using GridFieldSortableRows on a GridField for a DataObject's relationship the events are called on that DataObject.

Appending to the top instead of the bottom

By default GridFieldSortable rows appends to the bottom of the list for performance on large data sets, however you can set new records to append new records to the top by calling setAppendToTop(true) on your GridFieldSortableRows instance.

$myGridConfig->addComponent($sortable=new GridFieldSortableRows('SortOrder'));
$sortable->setAppendToTop(true);

Migrating from SilverStripe 2.4 and Data Object Manager's SortableDataObject

SortableGridField is not the same as SortableDataObject, since it is only a component of GridField it does not have the ability to catch the object when it is saved for the first time. So SortableGridField uses 1 as the first sort index because 0 is the default for an integer field/column in the database. For migrations from 2.4 with SortableDataObject you need to setup your DataObject based on the instructions above however you must name your sort column "SortOrder" to maintain your sort indexes defined by SortableDataObject. Then you need to run the following query on the table containing your sort field, for many_many relationships this will be something like {RelationshipClass}_{RelationshipName}. This query will maintain your sort order from SortableDataObject but increment the index by 1 giving it a starting number of 1.

UPDATE YourTable SET SortOrder=SortOrder+1;

Reporting an issue

When you're reporting an issue please ensure you specify what version of SilverStripe you are using i.e. 3.0.5, 3.1beta3, 3.0-master etc. Also be sure to include any JavaScript or PHP errors you receive, for PHP errors please ensure you include the full stack trace. Also please include your implementation code (where your setting up your grid field) as well as how you produced the issue. You may also be asked to provide some of the classes to aid in re-producing the issue. Stick with the issue, remember that you seen the issue not the maintainer of the module so it may take allot of questions to arrive at a fix or answer.

Notes

  • When using with GridFieldManyRelationHandler make sure that you add GridFieldSortableRows to your config before for example GridFieldManyRelationHandler:

    $config->addComponent(new GridFieldSortableRows('SortOrder'), 'GridFieldManyRelationHandler');
    

Contributing

Translations

Translations of the natural language strings are managed through a third party translation interface, transifex.com. Newly added strings will be periodically uploaded there for translation, and any new translations will be merged back to the project source code.

Please use https://www.transifex.com/projects/p/silverstripe-sortablegridfield to contribute translations, rather than sending pull requests with YAML files.