Source of file MetadataRelationField.php
Size: 4,001 Bytes - Last Modified: 2021-12-23T10:25:41+00:00
/var/www/docs.ssmods.com/process/src/code/dataobjects/fields/MetadataRelationField.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 | <?php /** * @package silverstripe-metadata */ class MetadataRelationField extends MetadataField { const EVERYTHING_LIMIT = 100; private static $db = array( 'SubjectClass' => 'Varchar(100)', 'SelectAny' => 'Boolean', 'ReturnValue' => "Enum('Link,Title,Default','Default')" ); public function getFieldTitle() { return 'Related Object Field'; } /** * @return DropdownField */ public function getFormField($record = null) { $class = $this->SubjectClass; if (!$class) { return LiteralField::create($this->getFormFieldName() . '_note', '<strong>Relation field not configured correctly</strong>'); } $title = singleton($class)->hasField('Title') ? 'Title' : 'Name'; $objects = null; if (!$this->SelectAny && $record) { $objects = ArrayList::create(); if ($hasOnes = $record->has_one()) { foreach ($hasOnes as $name => $type) { if (is_a($type, $class, true)) { $item = $record->$name(); if ($item && $item->ID && $item->canView()) { $objects->push($item); } } } } if ($manies = $record->many_many()) { foreach ($manies as $name => $type) { if (is_a($type, $class, true)) { foreach ($record->$name() as $item) { if ($item->ID && $item->canView()) { $objects->push($item); } } } } } } if ($this->SelectAny || !$objects || $objects->count() === 0) { // objects artificially limited to prevent insanity $objects = DataObject::get($class)->limit(self::EVERYTHING_LIMIT); } $map = $objects ? $objects->map('ID', $title) : array(); $emptyString = count($map) ? "Select $class" : "No $class objects found"; return DropdownField::create( $this->getFormFieldName(), $this->Title, $map, null, null)->setEmptyString($emptyString); } /** * @return DataObject */ public function process($value, $record) { if (ctype_digit($value)) { $object = DataObject::get_by_id($this->SubjectClass, $value); switch ($this->ReturnValue) { case 'Link': { return $object instanceof File ? $object->getAbsoluteURL() : (method_exists($object, 'AbsoluteLink') ? $object->AbsoluteLink() : ''); } case 'Title': { return $object->getTitle(); break; } case 'Default': { return $object; } } return $object; } } public function getCMSFields() { $fields = parent::getCMSFields(); $fields->removeByName('Subject'); $fields->removeByName('Default'); $classes = ClassInfo::subclassesFor('DataObject'); $subjects = array(); array_shift($classes); sort($classes); foreach ($classes as $class) { $subjects[$class] = singleton($class)->singular_name() . " ($class)"; } $subject = DropdownField::create('SubjectClass', 'Relationship subject class', $subjects, null, null)->setHasEmptyDefault(true); $fields->addFieldToTab('Root.Main', $subject, 'Required'); $fields->dataFieldByName('SelectAny')->setRightTitle('Select any item of this type'); return $fields; } public function getValidator() { return new RequiredFields('Name', 'Title', 'SubjectClass'); } } |