Source of file DataObjectLists.php
Size: 13,073 Bytes - Last Modified: 2021-12-23T10:39:20+00:00
/var/www/docs.ssmods.com/process/src/src/Api/DataObjectLists.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467 | <?php namespace Sunnysideup\BuildDataObject\API; use SilverStripe\Admin\ModelAdmin; use SilverStripe\Assets\Image; use SilverStripe\CMS\Model\SiteTree; use SilverStripe\Core\ClassInfo; use SilverStripe\Core\Config\Configurable; use SilverStripe\Core\Extensible; use SilverStripe\Core\Injector\Injectable; use SilverStripe\Core\Injector\Injector; use SilverStripe\Dev\TestOnly; use SilverStripe\Forms\CompositeField; use SilverStripe\ORM\DataObject; use SilverStripe\ORM\FieldType\DBField; use SilverStripe\ORM\FieldType\DBForeignKey; use SilverStripe\ORM\FieldType\DBLocale; use SilverStripe\ORM\FieldType\DBPrimaryKey; use SilverStripe\ORM\FieldType\DBString; use SilverStripe\ORM\Filters\SearchFilter; use SilverStripe\Security\LoginAttempt; use SilverStripe\Security\MemberPassword; use SilverStripe\Security\Permission; use SilverStripe\Security\PermissionRoleCode; use SilverStripe\SiteConfig\SiteConfig; class DataObjectLists { use Extensible; use Injectable; use Configurable; protected $rootBaseClass = DataObject::class; protected $myBaseClass = ''; protected $_data; protected $_dbfieldCache; protected $_classesCache = []; protected $_filtersCache = []; protected $_modelAdmins = []; protected $_canOptions; private static $excluded_data_objects = [ PermissionRoleCode::class, LoginAttempt::class, MemberPassword::class, MemberPassword::class, SiteConfig::class, ]; private static $excluded_db_fields_types = [ DBField::class, DBLocale::class, DBString::class, CompositeField::class, DBPrimaryKey::class, DBForeignKey::class, ]; private static $additional_db_fields = [ 'ID', 'Created', 'LastEdited', 'ClassName', ]; private static $_my_singleton = []; public static function inst($myBaseClass = DataObject::class, $data) { if (! isset(self::$_my_singleton[$myBaseClass])) { self::$_my_singleton[$myBaseClass] = Injector::inst()->get(self::class); } self::$_my_singleton[$myBaseClass]->_data = $data; self::$_my_singleton[$myBaseClass]->setBaseClass($myBaseClass); return self::$_my_singleton[$myBaseClass]; } public function setBaseClass($myBaseClass) { $this->myBaseClass = $myBaseClass; } public function DbFields() { if (! $this->_dbfieldCache) { $newCache = $this->walkSubclasses(function ($type) { $key = $type->toDropdown(); $val = $type->toDropdown(); return [$key => $val]; }, DBField::class); // add missing field types $newCache['HTMLFragment'] = 'HTMLFragment'; $this->_dbfieldCache = $newCache; //echo '<!--'; print_r($this->_dbfieldCache); echo '-->'; } return $this->_dbfieldCache; } public function MyDbFields() { return $this->retrieveDBFields('db'); } public function MyDbFieldsWithDefaults() { $list = $this->retrieveDBFields('db'); $toAdd = $this->Config()->get('additional_db_fields'); $toAdd = array_combine($toAdd, $toAdd); return $toAdd + $list; } public function mydbfieldsfancywithbelongswithbasicfields() { return $this->MyDbFieldsFancyWithBelongs(); } public function MyDbFieldsFancyWithBelongs() { return $this->myDbFieldsFancyWithoutBelongs(true); } public function MyDbFieldsFancyWithoutBelongs($includeBelongs = false) { $ar = []; $list = $this->retrieveDBFields('db'); foreach ($list as $key => $value) { $ar[$key] = $key; $shortValue = explode('(', $value); $shortValue = $shortValue[0]; switch ($shortValue) { case 'DBVarchar': case 'DBHTMLTextField': case 'DBHTMLVarchar': case 'DBText': $ar[$key . '.LimitCharacters'] = $key . '.LimitCharacters'; break; default: $ar[$key . '.Nice'] = $key . '.Nice'; } } $list = []; if ($includeBelongs) { $list += $this->retrieveDBFields('belongs_to'); } $list += $this->retrieveDBFields('has_one'); foreach ($list as $key => $value) { if (Image::class === $value || is_subclass_of($value, Image::class)) { $ar[$key . '.CMSThumbnail'] = $key . '.CMSThumbnail'; } else { $ar[$key . '.Title'] = $key . '.Title'; } } $list = $this->retrieveDBFields('has_many') + $this->retrieveDBFields('many_many'); if ($includeBelongs) { $list += $this->retrieveDBFields('belongs_many_many'); } foreach (array_keys($list) as $key) { $ar[$key . '.Count'] = $key . '.Count'; } return $ar; } public function MyDbFieldsAndHasOnes() { return $this->retrieveDBFields('db') + $this->retrieveDBFields('has_one'); } public function MyDbFieldsAndHasOnesWithIDs() { $list = $this->retrieveDBFields('db'); $hasOnes = $this->retrieveDBFields('has_one'); foreach (array_keys($hasOnes) as $field) { $fieldWithID = $field . 'ID'; $list[$fieldWithID] = $fieldWithID; } return $list; } public function MyDbFieldsAndIndexes() { return $this->MyDbFieldsWithDefaults() + ['index1' => 'index1'] + ['index2' => 'index2'] + ['index3' => 'index3'] + ['index4' => 'index4'] + ['index5' => 'index5']; } public function MyAllFieldsWithBelongs() { return $this->myAllFieldsWithoutBelongs(true); } public function MyAllFieldsWithoutBelongs($includeBelongs = false) { $list = $this->MyDbFieldsWithDefaults(); if ($includeBelongs) { $list += $this->retrieveDBFields('belongs_to'); } $list += $this->retrieveDBFields('has_one') + $this->retrieveDBFields('has_many') + $this->retrieveDBFields('many_many'); if ($includeBelongs) { $list += $this->retrieveDBFields('belongs_many_many'); } return $list; } public function IndexOptions() { return [ 'true' => 'true', 'unique("<column-name>")' => 'unique', '[\'type\' => \'<type>\', \'value\' => \'"<column-name>"\']' => 'other', ]; } public function RequiredOptions() { return [ 'true' => 'true', 'unique' => 'unique', ]; } public function PossibleRelationsWithBaseClass($rootClass = '') { if ($rootClass) { } else { $rootClass = $this->rootBaseClass; } $list = [$rootClass => \Sunnysideup\BuildDataObject\Api\DBTypeConverter::fromClass($rootClass)->toDropdown()] + $this->possibleRelations(); asort($list); return $list; } /** * @return array */ public function possibleRelations(string $rootClass = '') { if ($rootClass) { } else { $rootClass = $this->rootBaseClass; } if (! isset($this->_classesCache[$rootClass])) { $newList = $this->walkSubclasses(function ($type) { $key = $type->toClass(); $val = $type->toDropdown(); $singular = Injector::inst()->get($key)->singular_name(); if ($singular !== $val) { $val .= ' (' . $singular . ')'; } return [$key => $val]; }, $rootClass); $this->_classesCache[$rootClass] = $newList; } return $this->_classesCache[$rootClass]; } public function PossibleSearchFilters() { if (0 === count($this->_filtersCache)) { $list = ClassInfo::subclassesFor(SearchFilter::class); $newList = []; foreach ($list as $class) { if (SearchFilter::class !== $class) { $newList[$class] = $class; } } $this->_filtersCache = $newList; } return $this->_filtersCache; } public function ModelAdminOptions() { if (0 === count($this->_modelAdmins)) { $list = ClassInfo::subclassesFor(ModelAdmin::class); $newList = []; foreach ($list as $class) { if ( ModelAdmin::class === $class || is_subclass_of($class, TestOnly::class) ) { //do nothing } else { $newList[$class] = $class; } } $newList['tba'] = 'tba'; $this->_modelAdmins = $newList; } return $this->_modelAdmins; } public function SortOptions() { return [ 'ASC' => 'ASC', 'DESC' => 'DESC', ]; } public function CanOptions() { if (! $this->_canOptions) { $ar = [ 'one' => 'only one (useful for can create)', 'true' => 'always', 'basedonmodeladmin' => 'mimic my Model Admin', 'false' => 'never', 'parent' => 'use parent class', ]; $permissions = Permission::get()->column('Code'); $ar += array_combine($permissions, $permissions); $this->_canOptions = $ar; } return $this->_canOptions; } public function SiteTreeList($rootClass = SiteTree::class): array { $list = ClassInfo::subclassesFor($rootClass); $newList = []; foreach ($list as $class) { if ( $class === $rootClass || is_subclass_of($class, TestOnly::class) || in_array($class, $this->Config()->get('excluded_data_objects'), true) ) { //do nothing } else { $newList[$class] = $class; $name = Injector::inst()->get($class)->singular_name(); if ($name !== $class) { $newList[$class] .= ' (' . $name . ')'; } } } return $newList; } /** * @param mixed $rootClass * * @return array */ public function AllowedChildrenOptions($rootClass = SiteTree::class) { return ['none' => 'none'] + $this->SiteTreeList($rootClass); } /** * @return array */ public function TrueOrFalseListWithIgnore() { return [ '' => '-- ignore --', ] + $this->TrueOrFalseList(); } /** * @return array */ public function TrueOrFalseList() { return [ 'true' => 'YES', 'false' => 'NO', ]; } public function MyCanMethodBuilder($type, $value) { if ('parent' === $value) { return null; } if ('one' === $value) { $str = 'DataObject::get_one($this->class) ? false : true;'; } elseif ('true' === $value) { $str = 'true;'; } elseif ('false' === $value) { $str = 'false;'; } else { $str = "Permission::check('" . $value . '\', \'any\', $member);'; } return DBField::create_field('Varchar', $str); } protected function retrieveDBFields($name) { $data = $this->_data; $ar = []; if (isset($data->{$name})) { foreach ($data->{$name} as $data) { if ($data->Key && $data->Value) { $ar[$data->Key] = $data->Key; } } } return $ar; } private function isExcludedClass($fqClass, $fqRootClass): bool { return $fqClass === $fqRootClass || is_subclass_of($fqClass, TestOnly::class) || in_array($fqClass, $this->Config()->get('excluded_db_fields_types'), true); } private function walkSubclasses(callable $callback, string $fqRootClass): array { $array = []; $fqChildren = ClassInfo::subclassesFor($fqRootClass); foreach ($fqChildren as $fqChildClass) { if ($this->isExcludedClass($fqChildClass, $fqRootClass)) { //do nothing } else { $type = \Sunnysideup\BuildDataObject\Api\DBTypeConverter::fromClass($fqChildClass); $result = call_user_func($callback, $type); if (is_array($result)) { $array += $result; } } } return $array; } } |