/** * @param string $name * @param string $title * @param DataObjectInterface $object * @param string $sort * @param SS_List $source * @param string $titleField */ public function __construct($name, $title, DataObjectInterface $object, $sort = false, SS_List $source = null, $titleField = 'Title') { $this->setSort($sort); if ($object->many_many($name)) { $dataSource = $object->{$name}(); // Check if we're dealing with an UnsavedRelationList $unsaved = $dataSource instanceof UnsavedRelationList; // Store the relation's class name $class = $dataSource->dataClass(); $this->dataClass = $class; // Sort the items if ($this->getSort()) { $dataSource = $dataSource->sort($this->getSort()); } // If we're dealing with an UnsavedRelationList, it'll be empty, so we // can skip this and just use an array of all available items if ($unsaved) { $dataSource = $class::get()->map()->toArray(); } else { // If we've been given a list source, filter on those IDs only. if ($source) { $dataSource = $dataSource->filter('ID', $source->column('ID')); } // Start building the data source from scratch. Currently selected items first, // in the correct sort order $dataSource = $dataSource->map('ID', $titleField)->toArray(); // Get the other items $theRest = $class::get(); // Exclude items that we've already found if (!empty($dataSource)) { $theRest = $theRest->exclude('ID', array_keys($dataSource)); } // If we've been given a list source, filter on those IDs only if ($source) { $theRest = $theRest->filter('ID', $source->column('ID')); } $theRest = $theRest->map('ID', $titleField)->toArray(); // ... we then add the remaining items in whatever order they come $dataSource = $dataSource + $theRest; } } elseif ($source instanceof SS_List) { $dataSource = $source->map('ID', $titleField)->toArray(); } elseif (is_array($source) && ArrayLib::is_associative($source)) { $dataSource = $source; } else { user_error('MultiSelectField::__construct(): MultiSelectField only supports many-to-many relations'); } parent::__construct($name, $title, $dataSource, '', null, true); }
/** * Remove pages with empty attributes * * @param SS_List $list * @param string $type * @return SS_List */ private function removeEmptyAttributes(SS_List $list, $type) { $pageAttributes = $list->map('ID', $type)->toArray(); $emptyAttributess = array_map(function ($value) { return $value == ''; }, $pageAttributes); if (!count($emptyAttributess)) { return $list; } return $list->filter(array('ID:not' => array_keys(array_filter($emptyAttributess, function ($value) { return $value == 1; })))); }
public function map($index = 'ID', $titleField = 'Title', $emptyString = null, $sort = false) { return $this->list->map($index, $titleField, $emptyString, $sort); }