Source of file OrmTagGenerator.php
Size: 5,645 Bytes - Last Modified: 2021-12-23T10:24:49+00:00
/var/www/docs.ssmods.com/process/src/src/Generators/OrmTagGenerator.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 | <?php namespace SilverLeague\IDEAnnotator\Generators; use SilverStripe\Core\Injector\Injector; use SilverStripe\ORM\DataList; use SilverStripe\ORM\DataObject; use SilverStripe\ORM\FieldType\DBBoolean; use SilverStripe\ORM\FieldType\DBDecimal; use SilverStripe\ORM\FieldType\DBFloat; use SilverStripe\ORM\FieldType\DBInt; use SilverStripe\ORM\ManyManyList; /** * OrmTagGenerator * This class generates DocBlock Tags for the ORM properties of a Dataobject of DataExtension * and adds $owner Tags for added DataExtensions * * @package IDEAnnotator/Generators */ class OrmTagGenerator extends AbstractTagGenerator { /** * @var array * Available properties to generate docblocks for. */ protected static $propertyTypes = [ 'Owner', 'DB', 'HasOne', 'BelongsTo', 'HasMany', 'ManyMany', 'BelongsManyMany', 'Extensions', ]; /** * Default tagname is will be @string . * All exceptions for @see DBField types are listed here * * @see generateDBTags(); * @var array */ protected static $dbfield_tagnames = [ DBInt::class => 'int', DBBoolean::class => 'boolean', DBFloat::class => 'float', DBDecimal::class => 'float', ]; /** * Generates all ORM Tags */ protected function generateTags() { foreach (self::$propertyTypes as $type) { $function = 'generate' . $type . 'Tags'; $this->{$function}(); } } /** * Generate the $db property values. */ protected function generateDBTags() { if ($fields = (array)$this->getClassConfig('db')) { foreach ($fields as $fieldName => $dbFieldType) { $this->pushPropertyTag($this->getTagNameForDBField($dbFieldType) . " \$$fieldName"); } } } /** * @param string $dbFieldType * @return string */ public function getTagNameForDBField($dbFieldType) { // some fields in 3rd-party modules require a name... $fieldObj = Injector::inst()->create($dbFieldType, 'DummyName'); foreach (self::$dbfield_tagnames as $dbClass => $tagName) { if (class_exists($dbClass)) { $obj = Injector::inst()->create($dbClass); if ($fieldObj instanceof $obj) { return $tagName; } } } return 'string'; } /** * Generate the $belongs_to property values. */ protected function generateBelongsToTags() { if ($fields = (array)$this->getClassConfig('belongs_to')) { foreach ($fields as $fieldName => $dataObjectName) { $dataObjectName = $this->resolveDotNotation($dataObjectName); $dataObjectName = $this->getAnnotationClassName($dataObjectName); $tagString = "{$dataObjectName} {$fieldName}()"; $this->pushMethodTag($fieldName, $tagString); } } } /** * @param $dataObjectName * @return mixed */ protected function resolveDotNotation($dataObjectName) { list($dataObjectName) = explode('.', $dataObjectName, 2); return $dataObjectName; } /** * Generate the $has_one property and method values. */ protected function generateHasOneTags() { if ($fields = (array)$this->getClassConfig('has_one')) { foreach ($fields as $fieldName => $dataObjectName) { $this->pushPropertyTag("int \${$fieldName}ID"); if ($dataObjectName === DataObject::class) { $this->pushPropertyTag("string \${$fieldName}Class"); } $dataObjectName = $this->getAnnotationClassName($dataObjectName); $tagString = "{$dataObjectName} {$fieldName}()"; $this->pushMethodTag($fieldName, $tagString); } } } /** * Generate the $has_many method values. */ protected function generateHasManyTags() { $this->generateTagsForDataLists($this->getClassConfig('has_many'), DataList::class); } /** * @param array $fields * @param string $listType */ protected function generateTagsForDataLists($fields, $listType = DataList::class) { if (!empty($fields)) { foreach ((array)$fields as $fieldName => $dataObjectName) { $fieldName = trim($fieldName); // A many_many with a relation through another DataObject if (is_array($dataObjectName)) { $dataObjectName = $dataObjectName['through']; } $dataObjectName = $this->resolveDotNotation($dataObjectName); $listName = $this->getAnnotationClassName($listType); $dataObjectName = $this->getAnnotationClassName($dataObjectName); $tagString = "{$listName}|{$dataObjectName}[] {$fieldName}()"; $this->pushMethodTag($fieldName, $tagString); } } } /** * Generate the $many_many method values. */ protected function generateManyManyTags() { $this->generateTagsForDataLists($this->getClassConfig('many_many'), ManyManyList::class); } /** * Generate the $belongs_many_many method values. */ protected function generateBelongsManyManyTags() { $this->generateTagsForDataLists($this->getClassConfig('belongs_many_many'), ManyManyList::class); } } |