Skip to main content

This site requires you to update your browser. Your browsing experience maybe affected by not having the most up to date version.

We've moved the forum!

Please use forum.silverstripe.org for any new questions (announcement).
The forum archive will stick around, but will be read only.

You can also use our Slack channel or StackOverflow to ask for help.
Check out our community overview for more options to contribute.

General Questions /

General questions about getting started with SilverStripe that don't fit in any of the categories above.

Moderators: martimiz, Sean, Ed, biapar, Willr, Ingo, swaiba

Drag and drop order of Gridfield elements


Go to End


14 Posts   6696 Views

Avatar
esakrielaart

Community Member, 59 Posts

10 July 2012 at 3:10am

Hi there,

is there any way to order elements in a gridfield using drag and drop, like the dataobjectmanager plugin used to do?

Friendly regards,
Maurice

Avatar
UndefinedOffset

Community Member, 30 Posts

10 July 2012 at 11:13am

Shameless plug https://github.com/UndefinedOffset/SortableGridField, it actually missed getting merged into the core of SS 3.0

Avatar
Willr

Forum Moderator, 5523 Posts

10 July 2012 at 10:12pm

Nice work UndefinedOffset!

Avatar
esakrielaart

Community Member, 59 Posts

10 July 2012 at 10:55pm

Well that certainly makes live more easier, thanks!

Only one question, I think your documentation is good up to the point where you state " If you are using a many_many relationship you will need to do a custom getter to set the sort order of this relationship". How should I interpret this, I don't really have a clue on it.

Thanks in advance,
Maurice

Avatar
esakrielaart

Community Member, 59 Posts

11 July 2012 at 1:06am

Hmm, it seems that fixSortColumn() causes some trouble here:

$owner = $gridField->Form->getRecord();
$sortColumn = $this->sortColumn;
$i = 1;
$many_many = ($list instanceof ManyManyList);
if ($many_many) {
	list($parentClass, $componentClass, $parentField, $componentField, $table) = $owner->many_many($gridField->getName());
}

this causes the query further on the line to not execute (for the many_many case at least). Does this have something to do with not setting a 'custom getter'? How should I fix that?

Thanks in advance,
Maurice

Avatar
esakrielaart

Community Member, 59 Posts

11 July 2012 at 1:29am

Temporarely solved this by changing all queries inside if($many_many) { } to

DB::query('UPDATE "' . $table
	. '" SET "' . $sortColumn.'" = ' . $sortPositions[0]
	. ' WHERE "' . $this->componentField . '" = ' . $targetItem->ID . ' AND "' . $this->parentField . '" = ' . $owner->ID);

and putting the following statics in the class

public $table;
public $componentField;
public $parentField;

And naming them in the definition of the GridFieldSortableRows (inside the getCMSFields()):

$config = GridFieldConfig_RelationEditor::create();
$config->addComponent($sort = new GridFieldSortableRows('SortOrder'));
$sort->table = 'ProductHolder_Products';
$sort->parentField = 'ProductHolderID';
$sort->componentField = 'ProductID';

Well, that's it for now, I hope someone else may also find this useful. Also, I don't know i this is a nice way to do this and therefor I'm still interested in a possibly better, more clean way to achieve this.

Friendly regards,
Maurice

Avatar
UndefinedOffset

Community Member, 30 Posts

11 July 2012 at 2:30am

Edited: 11/07/2012 2:37am

Can you post your code that defines the many_many relationship? As well as the line (or lines) you use to create the grid field instance? In my testing many_many relationships seem to work fine.

Avatar
esakrielaart

Community Member, 59 Posts

11 July 2012 at 2:35am

Hi, this is the definition:

class Product:

static $belongs_many_many = array(
        'ProductHolder' => 'ProductHolder'
);

class ProductHolder:

static $many_many = array(
        'Products' => 'Product'
);
    
static $many_many_extraFields = array(
        'Products' => array(
            'Volgorde' => 'Int'
        )
);

        $productList = $this->Products();
        $productList->sort('Volgorde');
        $config = GridFieldConfig_RelationEditor::create();
        $row = "Volgorde";
        $config->addComponent($sort = new GridFieldSortableRows(stripslashes($row)));
        $sort->table = 'ProductHolder_Products';
        $sort->parentField = 'ProductHolderID';
        $sort->componentField = 'ProductID';
        $productfield = new GridField("Product", "Producten op deze pagina", $productList, $config);
        
        $fields->addFieldToTab('Root.Product', $productfield);
        
        return $fields;

Hope this is enough information, wondering if you spot what went wrong.

Friendly regards,
Maurice

Go to Top