Merge pull request #101 from spekulatius/linux-line-endings

linux line endings
This commit is contained in:
Marcus 2015-09-24 10:04:49 +10:00
commit 4c1399ac5c
4 changed files with 614 additions and 614 deletions

View File

@ -1,99 +1,99 @@
<?php <?php
/** /**
* A modal search dialog which uses search context to search for and add * A modal search dialog which uses search context to search for and add
* existing records to a grid field. * existing records to a grid field.
*/ */
class GridFieldAddExistingSearchButton implements class GridFieldAddExistingSearchButton implements
GridField_HTMLProvider, GridField_HTMLProvider,
GridField_URLHandler { GridField_URLHandler {
private static $allowed_actions = array( private static $allowed_actions = array(
'handleSearch' 'handleSearch'
); );
protected $title; protected $title;
protected $fragment; protected $fragment;
protected $searchList; protected $searchList;
/** /**
* @param string $fragment * @param string $fragment
*/ */
public function __construct($fragment = 'buttons-before-left') { public function __construct($fragment = 'buttons-before-left') {
$this->fragment = $fragment; $this->fragment = $fragment;
$this->title = _t('GridFieldExtensions.ADDEXISTING', 'Add Existing'); $this->title = _t('GridFieldExtensions.ADDEXISTING', 'Add Existing');
} }
/** /**
* @return string * @return string
*/ */
public function getTitle() { public function getTitle() {
return $this->title; return $this->title;
} }
/** /**
* @param string $title * @param string $title
* @return GridFieldAddExistingSearchButton $this * @return GridFieldAddExistingSearchButton $this
*/ */
public function setTitle($title) { public function setTitle($title) {
$this->title = $title; $this->title = $title;
return $this; return $this;
} }
/** /**
* @return string * @return string
*/ */
public function getFragment() { public function getFragment() {
return $this->fragment; return $this->fragment;
} }
/** /**
* @param string $fragment * @param string $fragment
* @return GridFieldAddExistingSearchButton $this * @return GridFieldAddExistingSearchButton $this
*/ */
public function setFragment($fragment) { public function setFragment($fragment) {
$this->fragment = $fragment; $this->fragment = $fragment;
return $this; return $this;
} }
/** /**
* Sets a custom list to use to provide the searchable items. * Sets a custom list to use to provide the searchable items.
* *
* @param SS_List $list * @param SS_List $list
* @return GridFieldAddExistingSearchButton $this * @return GridFieldAddExistingSearchButton $this
*/ */
public function setSearchList(SS_List $list) { public function setSearchList(SS_List $list) {
$this->searchList = $list; $this->searchList = $list;
return $this; return $this;
} }
/** /**
* @return SS_List|null * @return SS_List|null
*/ */
public function getSearchList() { public function getSearchList() {
return $this->searchList; return $this->searchList;
} }
public function getHTMLFragments($grid) { public function getHTMLFragments($grid) {
GridFieldExtensions::include_requirements(); GridFieldExtensions::include_requirements();
$data = new ArrayData(array( $data = new ArrayData(array(
'Title' => $this->getTitle(), 'Title' => $this->getTitle(),
'Link' => $grid->Link('add-existing-search') 'Link' => $grid->Link('add-existing-search')
)); ));
return array( return array(
$this->fragment => $data->renderWith('GridFieldAddExistingSearchButton'), $this->fragment => $data->renderWith('GridFieldAddExistingSearchButton'),
); );
} }
public function getURLHandlers($grid) { public function getURLHandlers($grid) {
return array( return array(
'add-existing-search' => 'handleSearch' 'add-existing-search' => 'handleSearch'
); );
} }
public function handleSearch($grid, $request) { public function handleSearch($grid, $request) {
return new GridFieldAddExistingSearchHandler($grid, $this); return new GridFieldAddExistingSearchHandler($grid, $this);
} }
} }

View File

@ -1,109 +1,109 @@
<?php <?php
/** /**
* Used by {@link GridFieldAddExistingSearchButton} to provide the searching * Used by {@link GridFieldAddExistingSearchButton} to provide the searching
* functionality. * functionality.
*/ */
class GridFieldAddExistingSearchHandler extends RequestHandler { class GridFieldAddExistingSearchHandler extends RequestHandler {
private static $allowed_actions = array( private static $allowed_actions = array(
'index', 'index',
'add', 'add',
'SearchForm' 'SearchForm'
); );
/** /**
* @var GridField * @var GridField
*/ */
protected $grid; protected $grid;
/** /**
* @var GridFieldAddExistingSearchButton * @var GridFieldAddExistingSearchButton
*/ */
protected $button; protected $button;
/** /**
* @var SearchContext * @var SearchContext
*/ */
protected $context; protected $context;
public function __construct($grid, $button) { public function __construct($grid, $button) {
$this->grid = $grid; $this->grid = $grid;
$this->button = $button; $this->button = $button;
$this->context = singleton($grid->getModelClass())->getDefaultSearchContext(); $this->context = singleton($grid->getModelClass())->getDefaultSearchContext();
parent::__construct(); parent::__construct();
} }
public function index() { public function index() {
return $this->renderWith('GridFieldAddExistingSearchHandler'); return $this->renderWith('GridFieldAddExistingSearchHandler');
} }
public function add($request) { public function add($request) {
if(!$id = $request->postVar('id')) { if(!$id = $request->postVar('id')) {
$this->httpError(400); $this->httpError(400);
} }
$list = $this->grid->getList(); $list = $this->grid->getList();
$item = DataList::create($list->dataClass())->byID($id); $item = DataList::create($list->dataClass())->byID($id);
if(!$item) { if(!$item) {
$this->httpError(400); $this->httpError(400);
} }
$list->add($item); $list->add($item);
} }
/** /**
* @return Form * @return Form
*/ */
public function SearchForm() { public function SearchForm() {
$form = new Form( $form = new Form(
$this, $this,
'SearchForm', 'SearchForm',
$this->context->getFields(), $this->context->getFields(),
new FieldList( new FieldList(
FormAction::create('doSearch', _t('GridFieldExtensions.SEARCH', 'Search')) FormAction::create('doSearch', _t('GridFieldExtensions.SEARCH', 'Search'))
->setUseButtonTag(true) ->setUseButtonTag(true)
->addExtraClass('ss-ui-button') ->addExtraClass('ss-ui-button')
->setAttribute('data-icon', 'magnifier') ->setAttribute('data-icon', 'magnifier')
) )
); );
$form->addExtraClass('stacked add-existing-search-form'); $form->addExtraClass('stacked add-existing-search-form');
$form->setFormMethod('GET'); $form->setFormMethod('GET');
return $form; return $form;
} }
public function doSearch($data, $form) { public function doSearch($data, $form) {
$list = $this->context->getQuery($data, false, false, $this->getSearchList()); $list = $this->context->getQuery($data, false, false, $this->getSearchList());
$list = $list->subtract($this->grid->getList()); $list = $list->subtract($this->grid->getList());
$list = new PaginatedList($list, $this->request); $list = new PaginatedList($list, $this->request);
$data = $this->customise(array( $data = $this->customise(array(
'SearchForm' => $form, 'SearchForm' => $form,
'Items' => $list 'Items' => $list
)); ));
return $data->index(); return $data->index();
} }
public function Items() { public function Items() {
$list = $this->getSearchList(); $list = $this->getSearchList();
$list = $list->subtract($this->grid->getList()); $list = $list->subtract($this->grid->getList());
$list = new PaginatedList($list, $this->request); $list = new PaginatedList($list, $this->request);
return $list; return $list;
} }
public function Link($action = null) { public function Link($action = null) {
return Controller::join_links($this->grid->Link(), 'add-existing-search', $action); return Controller::join_links($this->grid->Link(), 'add-existing-search', $action);
} }
/** /**
* @return DataList * @return DataList
*/ */
protected function getSearchList() { protected function getSearchList() {
return $this->button->getSearchList() ?: DataList::create($this->grid->getList()->dataClass()); return $this->button->getSearchList() ?: DataList::create($this->grid->getList()->dataClass());
} }
} }

View File

@ -10,7 +10,7 @@ class GridFieldAddNewMultiClass implements GridField_HTMLProvider, GridField_URL
private static $allowed_actions = array( private static $allowed_actions = array(
'handleAdd' 'handleAdd'
); );
// Should we add an empty string to the add class dropdown? // Should we add an empty string to the add class dropdown?
private static $showEmptyString = true; private static $showEmptyString = true;
@ -19,7 +19,7 @@ class GridFieldAddNewMultiClass implements GridField_HTMLProvider, GridField_URL
private $title; private $title;
private $classes; private $classes;
private $defaultClass; private $defaultClass;
/** /**
@ -128,7 +128,7 @@ class GridFieldAddNewMultiClass implements GridField_HTMLProvider, GridField_URL
*/ */
public function setDefaultClass($default) { public function setDefaultClass($default) {
$this->defaultClass = $default; $this->defaultClass = $default;
return $this; return $this;
} }
/** /**

View File

@ -1,403 +1,403 @@
<?php <?php
/** /**
* Allows grid field rows to be re-ordered via drag and drop. Both normal data * Allows grid field rows to be re-ordered via drag and drop. Both normal data
* lists and many many lists can be ordered. * lists and many many lists can be ordered.
* *
* If the grid field has not been sorted, this component will sort the data by * If the grid field has not been sorted, this component will sort the data by
* the sort field. * the sort field.
*/ */
class GridFieldOrderableRows extends RequestHandler implements class GridFieldOrderableRows extends RequestHandler implements
GridField_ColumnProvider, GridField_ColumnProvider,
GridField_DataManipulator, GridField_DataManipulator,
GridField_HTMLProvider, GridField_HTMLProvider,
GridField_URLHandler { GridField_URLHandler {
private static $allowed_actions = array( private static $allowed_actions = array(
'handleReorder', 'handleReorder',
'handleMoveToPage' 'handleMoveToPage'
); );
/** /**
* The database field which specifies the sort, defaults to "Sort". * The database field which specifies the sort, defaults to "Sort".
* *
* @see setSortField() * @see setSortField()
* @var string * @var string
*/ */
protected $sortField; protected $sortField;
/** /**
* Extra sort fields to apply before the sort field. * Extra sort fields to apply before the sort field.
* *
* @see setExtraSortFields() * @see setExtraSortFields()
* @var string|array * @var string|array
*/ */
protected $extraSortFields = null; protected $extraSortFields = null;
/** /**
* The number of the column containing the reorder handles * The number of the column containing the reorder handles
* *
* @see setReorderColumnNumber() * @see setReorderColumnNumber()
* @var integer * @var integer
*/ */
protected $reorderColumnNumber = 0; protected $reorderColumnNumber = 0;
/** /**
* @param string $sortField * @param string $sortField
*/ */
public function __construct($sortField = 'Sort') { public function __construct($sortField = 'Sort') {
$this->sortField = $sortField; $this->sortField = $sortField;
} }
/** /**
* @return string * @return string
*/ */
public function getSortField() { public function getSortField() {
return $this->sortField; return $this->sortField;
} }
/** /**
* Sets the field used to specify the sort. * Sets the field used to specify the sort.
* *
* @param string $sortField * @param string $sortField
* @return GridFieldOrderableRows $this * @return GridFieldOrderableRows $this
*/ */
public function setSortField($field) { public function setSortField($field) {
$this->sortField = $field; $this->sortField = $field;
return $this; return $this;
} }
/** /**
* @return string|array * @return string|array
*/ */
public function getExtraSortFields() { public function getExtraSortFields() {
return $this->extraSortFields; return $this->extraSortFields;
} }
/** /**
* Sets extra sort fields to apply before the sort field. * Sets extra sort fields to apply before the sort field.
* *
* @param string|array $fields * @param string|array $fields
* @return GridFieldOrderableRows $this * @return GridFieldOrderableRows $this
*/ */
public function setExtraSortFields($fields) { public function setExtraSortFields($fields) {
$this->extraSortFields = $fields; $this->extraSortFields = $fields;
return $this; return $this;
} }
/** /**
* @return integer * @return integer
*/ */
public function getReorderColumnNumber() { public function getReorderColumnNumber() {
return $this->reorderColumnNumber; return $this->reorderColumnNumber;
} }
/** /**
* Sets the number of the column containing the reorder handles. * Sets the number of the column containing the reorder handles.
* *
* @param integer $colno * @param integer $colno
* @return GridFieldOrderableRows $this * @return GridFieldOrderableRows $this
*/ */
public function setReorderColumnNumber($colno) { public function setReorderColumnNumber($colno) {
$this->reorderColumnNumber = $colno; $this->reorderColumnNumber = $colno;
return $this; return $this;
} }
/** /**
* Gets the table which contains the sort field. * Gets the table which contains the sort field.
* *
* @param DataList $list * @param DataList $list
* @return string * @return string
*/ */
public function getSortTable(DataList $list) { public function getSortTable(DataList $list) {
$field = $this->getSortField(); $field = $this->getSortField();
if($list instanceof ManyManyList) { if($list instanceof ManyManyList) {
$extra = $list->getExtraFields(); $extra = $list->getExtraFields();
$table = $list->getJoinTable(); $table = $list->getJoinTable();
if($extra && array_key_exists($field, $extra)) { if($extra && array_key_exists($field, $extra)) {
return $table; return $table;
} }
} }
$classes = ClassInfo::dataClassesFor($list->dataClass()); $classes = ClassInfo::dataClassesFor($list->dataClass());
foreach($classes as $class) { foreach($classes as $class) {
if(singleton($class)->hasOwnTableDatabaseField($field)) { if(singleton($class)->hasOwnTableDatabaseField($field)) {
return $class; return $class;
} }
} }
throw new Exception("Couldn't find the sort field '$field'"); throw new Exception("Couldn't find the sort field '$field'");
} }
public function getURLHandlers($grid) { public function getURLHandlers($grid) {
return array( return array(
'POST reorder' => 'handleReorder', 'POST reorder' => 'handleReorder',
'POST movetopage' => 'handleMoveToPage' 'POST movetopage' => 'handleMoveToPage'
); );
} }
/** /**
* @param GridField $field * @param GridField $field
*/ */
public function getHTMLFragments($field) { public function getHTMLFragments($field) {
GridFieldExtensions::include_requirements(); GridFieldExtensions::include_requirements();
$field->addExtraClass('ss-gridfield-orderable'); $field->addExtraClass('ss-gridfield-orderable');
$field->setAttribute('data-url-reorder', $field->Link('reorder')); $field->setAttribute('data-url-reorder', $field->Link('reorder'));
$field->setAttribute('data-url-movetopage', $field->Link('movetopage')); $field->setAttribute('data-url-movetopage', $field->Link('movetopage'));
} }
public function augmentColumns($grid, &$cols) { public function augmentColumns($grid, &$cols) {
if(!in_array('Reorder', $cols) && $grid->getState()->GridFieldOrderableRows->enabled) { if(!in_array('Reorder', $cols) && $grid->getState()->GridFieldOrderableRows->enabled) {
array_splice($cols, $this->reorderColumnNumber, 0, 'Reorder'); array_splice($cols, $this->reorderColumnNumber, 0, 'Reorder');
} }
} }
public function getColumnsHandled($grid) { public function getColumnsHandled($grid) {
return array('Reorder'); return array('Reorder');
} }
public function getColumnContent($grid, $record, $col) { public function getColumnContent($grid, $record, $col) {
return ViewableData::create()->renderWith('GridFieldOrderableRowsDragHandle'); return ViewableData::create()->renderWith('GridFieldOrderableRowsDragHandle');
} }
public function getColumnAttributes($grid, $record, $col) { public function getColumnAttributes($grid, $record, $col) {
return array('class' => 'col-reorder'); return array('class' => 'col-reorder');
} }
public function getColumnMetadata($grid, $col) { public function getColumnMetadata($grid, $col) {
return array('title' => ''); return array('title' => '');
} }
public function getManipulatedData(GridField $grid, SS_List $list) { public function getManipulatedData(GridField $grid, SS_List $list) {
$state = $grid->getState(); $state = $grid->getState();
$sorted = (bool) ((string) $state->GridFieldSortableHeader->SortColumn); $sorted = (bool) ((string) $state->GridFieldSortableHeader->SortColumn);
// If the data has not been sorted by the user, then sort it by the // If the data has not been sorted by the user, then sort it by the
// sort column, otherwise disable reordering. // sort column, otherwise disable reordering.
$state->GridFieldOrderableRows->enabled = !$sorted; $state->GridFieldOrderableRows->enabled = !$sorted;
if(!$sorted) { if(!$sorted) {
$sortterm = ''; $sortterm = '';
if ($this->extraSortFields) { if ($this->extraSortFields) {
if (is_array($this->extraSortFields)) { if (is_array($this->extraSortFields)) {
foreach($this->extraSortFields as $col => $dir) { foreach($this->extraSortFields as $col => $dir) {
$sortterm .= "$col $dir, "; $sortterm .= "$col $dir, ";
} }
} else { } else {
$sortterm = $this->extraSortFields.', '; $sortterm = $this->extraSortFields.', ';
} }
} }
$sortterm .= '"'.$this->getSortTable($list).'"."'.$this->getSortField().'"'; $sortterm .= '"'.$this->getSortTable($list).'"."'.$this->getSortField().'"';
return $list->sort($sortterm); return $list->sort($sortterm);
} else { } else {
return $list; return $list;
} }
} }
/** /**
* Handles requests to reorder a set of IDs in a specific order. * Handles requests to reorder a set of IDs in a specific order.
* *
* @param GridField $grid * @param GridField $grid
* @param SS_HTTPRequest $request * @param SS_HTTPRequest $request
* @return SS_HTTPResponse * @return SS_HTTPResponse
*/ */
public function handleReorder($grid, $request) { public function handleReorder($grid, $request) {
$list = $grid->getList(); $list = $grid->getList();
$modelClass = $grid->getModelClass(); $modelClass = $grid->getModelClass();
if ($list instanceof ManyManyList && !singleton($modelClass)->canView()) { if ($list instanceof ManyManyList && !singleton($modelClass)->canView()) {
$this->httpError(403); $this->httpError(403);
} else if(!($list instanceof ManyManyList) && !singleton($modelClass)->canEdit()) { } else if(!($list instanceof ManyManyList) && !singleton($modelClass)->canEdit()) {
$this->httpError(403); $this->httpError(403);
} }
$ids = $request->postVar('order'); $ids = $request->postVar('order');
$field = $this->getSortField(); $field = $this->getSortField();
if(!is_array($ids)) { if(!is_array($ids)) {
$this->httpError(400); $this->httpError(400);
} }
$sortterm = ''; $sortterm = '';
if ($this->extraSortFields) { if ($this->extraSortFields) {
if (is_array($this->extraSortFields)) { if (is_array($this->extraSortFields)) {
foreach($this->extraSortFields as $col => $dir) { foreach($this->extraSortFields as $col => $dir) {
$sortterm .= "$col $dir, "; $sortterm .= "$col $dir, ";
} }
} else { } else {
$sortterm = $this->extraSortFields.', '; $sortterm = $this->extraSortFields.', ';
} }
} }
$sortterm .= '"'.$this->getSortTable($list).'"."'.$field.'"'; $sortterm .= '"'.$this->getSortTable($list).'"."'.$field.'"';
$items = $list->filter('ID', $ids)->sort($sortterm); $items = $list->filter('ID', $ids)->sort($sortterm);
// Ensure that each provided ID corresponded to an actual object. // Ensure that each provided ID corresponded to an actual object.
if(count($items) != count($ids)) { if(count($items) != count($ids)) {
$this->httpError(404); $this->httpError(404);
} }
// Save any un-comitted changes to the gridfield // Save any un-comitted changes to the gridfield
if(($form = $grid->getForm()) && ($record = $form->getRecord()) ) { if(($form = $grid->getForm()) && ($record = $form->getRecord()) ) {
$form->loadDataFrom($request->requestVars(), true); $form->loadDataFrom($request->requestVars(), true);
$grid->saveInto($record); $grid->saveInto($record);
} }
// Populate each object we are sorting with a sort value. // Populate each object we are sorting with a sort value.
$this->populateSortValues($items); $this->populateSortValues($items);
// Generate the current sort values. // Generate the current sort values.
if ($items instanceof ManyManyList) if ($items instanceof ManyManyList)
{ {
$current = array(); $current = array();
foreach ($items->toArray() as $record) foreach ($items->toArray() as $record)
{ {
// NOTE: _SortColumn0 is the first ->sort() field // NOTE: _SortColumn0 is the first ->sort() field
// used by SS when functions are detected in a SELECT // used by SS when functions are detected in a SELECT
// or CASE WHEN. // or CASE WHEN.
if (isset($record->_SortColumn0)) { if (isset($record->_SortColumn0)) {
$current[$record->ID] = $record->_SortColumn0; $current[$record->ID] = $record->_SortColumn0;
} else { } else {
$current[$record->ID] = $record->$field; $current[$record->ID] = $record->$field;
} }
} }
} }
else else
{ {
$current = $items->map('ID', $field)->toArray(); $current = $items->map('ID', $field)->toArray();
} }
// Perform the actual re-ordering. // Perform the actual re-ordering.
$this->reorderItems($list, $current, $ids); $this->reorderItems($list, $current, $ids);
return $grid->FieldHolder(); return $grid->FieldHolder();
} }
/** /**
* Handles requests to move an item to the previous or next page. * Handles requests to move an item to the previous or next page.
*/ */
public function handleMoveToPage(GridField $grid, $request) { public function handleMoveToPage(GridField $grid, $request) {
if(!$paginator = $grid->getConfig()->getComponentByType('GridFieldPaginator')) { if(!$paginator = $grid->getConfig()->getComponentByType('GridFieldPaginator')) {
$this->httpError(404, 'Paginator component not found'); $this->httpError(404, 'Paginator component not found');
} }
$move = $request->postVar('move'); $move = $request->postVar('move');
$field = $this->getSortField(); $field = $this->getSortField();
$list = $grid->getList(); $list = $grid->getList();
$manip = $grid->getManipulatedList(); $manip = $grid->getManipulatedList();
$existing = $manip->map('ID', $field)->toArray(); $existing = $manip->map('ID', $field)->toArray();
$values = $existing; $values = $existing;
$order = array(); $order = array();
$id = isset($move['id']) ? (int) $move['id'] : null; $id = isset($move['id']) ? (int) $move['id'] : null;
$to = isset($move['page']) ? $move['page'] : null; $to = isset($move['page']) ? $move['page'] : null;
if(!isset($values[$id])) { if(!isset($values[$id])) {
$this->httpError(400, 'Invalid item ID'); $this->httpError(400, 'Invalid item ID');
} }
$this->populateSortValues($list); $this->populateSortValues($list);
$page = ((int) $grid->getState()->GridFieldPaginator->currentPage) ?: 1; $page = ((int) $grid->getState()->GridFieldPaginator->currentPage) ?: 1;
$per = $paginator->getItemsPerPage(); $per = $paginator->getItemsPerPage();
if($to == 'prev') { if($to == 'prev') {
$swap = $list->limit(1, ($page - 1) * $per - 1)->first(); $swap = $list->limit(1, ($page - 1) * $per - 1)->first();
$values[$swap->ID] = $swap->$field; $values[$swap->ID] = $swap->$field;
$order[] = $id; $order[] = $id;
$order[] = $swap->ID; $order[] = $swap->ID;
foreach($existing as $_id => $sort) { foreach($existing as $_id => $sort) {
if($id != $_id) $order[] = $_id; if($id != $_id) $order[] = $_id;
} }
} elseif($to == 'next') { } elseif($to == 'next') {
$swap = $list->limit(1, $page * $per)->first(); $swap = $list->limit(1, $page * $per)->first();
$values[$swap->ID] = $swap->$field; $values[$swap->ID] = $swap->$field;
foreach($existing as $_id => $sort) { foreach($existing as $_id => $sort) {
if($id != $_id) $order[] = $_id; if($id != $_id) $order[] = $_id;
} }
$order[] = $swap->ID; $order[] = $swap->ID;
$order[] = $id; $order[] = $id;
} else { } else {
$this->httpError(400, 'Invalid page target'); $this->httpError(400, 'Invalid page target');
} }
$this->reorderItems($list, $values, $order); $this->reorderItems($list, $values, $order);
return $grid->FieldHolder(); return $grid->FieldHolder();
} }
protected function reorderItems($list, array $values, array $order) { protected function reorderItems($list, array $values, array $order) {
// Get a list of sort values that can be used. // Get a list of sort values that can be used.
$pool = array_values($values); $pool = array_values($values);
sort($pool); sort($pool);
// Loop through each item, and update the sort values which do not // Loop through each item, and update the sort values which do not
// match to order the objects. // match to order the objects.
foreach(array_values($order) as $pos => $id) { foreach(array_values($order) as $pos => $id) {
if($values[$id] != $pool[$pos]) { if($values[$id] != $pool[$pos]) {
DB::query(sprintf( DB::query(sprintf(
'UPDATE "%s" SET "%s" = %d WHERE %s', 'UPDATE "%s" SET "%s" = %d WHERE %s',
$this->getSortTable($list), $this->getSortTable($list),
$this->getSortField(), $this->getSortField(),
$pool[$pos], $pool[$pos],
$this->getSortTableClauseForIds($list, $id) $this->getSortTableClauseForIds($list, $id)
)); ));
} }
} }
} }
protected function populateSortValues(DataList $list) { protected function populateSortValues(DataList $list) {
$list = clone $list; $list = clone $list;
$field = $this->getSortField(); $field = $this->getSortField();
$table = $this->getSortTable($list); $table = $this->getSortTable($list);
$clause = sprintf('"%s"."%s" = 0', $table, $this->getSortField()); $clause = sprintf('"%s"."%s" = 0', $table, $this->getSortField());
foreach($list->where($clause)->column('ID') as $id) { foreach($list->where($clause)->column('ID') as $id) {
$max = DB::query(sprintf('SELECT MAX("%s") + 1 FROM "%s"', $field, $table)); $max = DB::query(sprintf('SELECT MAX("%s") + 1 FROM "%s"', $field, $table));
$max = $max->value(); $max = $max->value();
DB::query(sprintf( DB::query(sprintf(
'UPDATE "%s" SET "%s" = %d WHERE %s', 'UPDATE "%s" SET "%s" = %d WHERE %s',
$table, $table,
$field, $field,
$max, $max,
$this->getSortTableClauseForIds($list, $id) $this->getSortTableClauseForIds($list, $id)
)); ));
} }
} }
protected function getSortTableClauseForIds(DataList $list, $ids) { protected function getSortTableClauseForIds(DataList $list, $ids) {
if(is_array($ids)) { if(is_array($ids)) {
$value = 'IN (' . implode(', ', array_map('intval', $ids)) . ')'; $value = 'IN (' . implode(', ', array_map('intval', $ids)) . ')';
} else { } else {
$value = '= ' . (int) $ids; $value = '= ' . (int) $ids;
} }
if($list instanceof ManyManyList) { if($list instanceof ManyManyList) {
$extra = $list->getExtraFields(); $extra = $list->getExtraFields();
$key = $list->getLocalKey(); $key = $list->getLocalKey();
$foreignKey = $list->getForeignKey(); $foreignKey = $list->getForeignKey();
$foreignID = (int) $list->getForeignID(); $foreignID = (int) $list->getForeignID();
if($extra && array_key_exists($this->getSortField(), $extra)) { if($extra && array_key_exists($this->getSortField(), $extra)) {
return sprintf( return sprintf(
'"%s" %s AND "%s" = %d', '"%s" %s AND "%s" = %d',
$key, $key,
$value, $value,
$foreignKey, $foreignKey,
$foreignID $foreignID
); );
} }
} }
return "\"ID\" $value"; return "\"ID\" $value";
} }
} }