mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
ddcfcf7bed
Cleanup of framework's use of @package and @subpackage labels and additional of labels for classes missing packages. Moved all GridField related components to the one name. Countless spelling fixes, grammar for other comments. Link ClassName references in file headers.
57 lines
1.5 KiB
PHP
57 lines
1.5 KiB
PHP
<?php
|
|
|
|
/**
|
|
* A DataList that represents a relation.
|
|
*
|
|
* Adds the notion of a foreign ID that can be optionally set.
|
|
*
|
|
* @package framework
|
|
* @subpackage model
|
|
*/
|
|
abstract class RelationList extends DataList {
|
|
|
|
public function getForeignID() {
|
|
return $this->dataQuery->getQueryParam('Foreign.ID');
|
|
}
|
|
|
|
/**
|
|
* Returns a copy of this list with the ManyMany relationship linked to
|
|
* the given foreign ID.
|
|
*
|
|
* @param int|array $id An ID or an array of IDs.
|
|
*/
|
|
public function forForeignID($id) {
|
|
// Turn a 1-element array into a simple value
|
|
if(is_array($id) && sizeof($id) == 1) $id = reset($id);
|
|
|
|
// Calculate the new filter
|
|
$filter = $this->foreignIDFilter($id);
|
|
|
|
$list = $this->alterDataQuery(function($query, $list) use ($id, $filter){
|
|
// Check if there is an existing filter, remove if there is
|
|
$currentFilter = $query->getQueryParam('Foreign.Filter');
|
|
if($currentFilter) {
|
|
try {
|
|
$query->removeFilterOn($currentFilter);
|
|
}
|
|
catch (Exception $e) { /* NOP */ }
|
|
}
|
|
|
|
// Add the new filter
|
|
$query->setQueryParam('Foreign.ID', $id);
|
|
$query->setQueryParam('Foreign.Filter', $filter);
|
|
$query->where($filter);
|
|
});
|
|
|
|
return $list;
|
|
}
|
|
|
|
/**
|
|
* Returns a where clause that filters the members of this relationship to
|
|
* just the related items.
|
|
*
|
|
* @param $id (optional) An ID or an array of IDs - if not provided, will use the current ids as per getForeignID
|
|
*/
|
|
abstract protected function foreignIDFilter($id = null);
|
|
}
|