Source of file ElementVirtual.php
Size: 4,884 Bytes - Last Modified: 2021-12-24T06:44:58+00:00
/var/www/docs.ssmods.com/process/src/src/Model/ElementVirtual.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 | <?php namespace DNADesign\ElementalVirtual\Model; use TractorCow\AutoComplete\AutoCompleteField; use SilverStripe\ElementalVirtual\Forms\ElementalGridFieldAddExistingAutocompleter; use DNADesign\Elemental\Models\BaseElement; use SilverStripe\Forms\FieldList; use SilverStripe\Forms\LiteralField; use SilverStripe\Forms\Tab; use SilverStripe\Forms\TabSet; use SilverStripe\ORM\FieldType\DBField; use SilverStripe\ORM\FieldType\DBHTMLText; /** * Virtual Linked Element. * * As elemental is based on a natural has_one relation to an object, * this allows the same element to be linked to multiple pages. * * {@see ElementalGridFieldAddExistingAutocompleter} */ class ElementVirtual extends BaseElement { private static $icon = 'font-icon-block-link'; private static $has_one = [ 'LinkedElement' => BaseElement::class ]; /** * @var string */ private static $description = 'Reused element'; private static $table_name = 'ElementVirtual'; private static $singular_name = 'virtual block'; private static $inline_editable = false; /** * @param BaseElement * @param boolean $isSingleton * @param DataModel $model */ public function __construct($record = null, $isSingleton = false, $model = null) { parent::__construct($record, $isSingleton, $model); $this->LinkedElement()->setVirtualOwner($this); } public function getCMSFields() { $invalid = $this->isInvalidPublishState(); $this->beforeUpdateCMSFields(function (FieldList $fields) use ($invalid) { $fields->removeByName('Title'); if ($invalid) { $warning = _t( __CLASS__ . '.InvalidPublishStateWarning', 'Error: The original element is not published. This element will not work on the live site until you click the link below and publish it.' ); $fields->addFieldToTab('Root.Main', LiteralField::create('WarningHeader', '<p class="message error">' . $warning . '</p>')); } $autocomplete = AutoCompleteField::create( 'LinkedElementID', _t(__CLASS__ . '.LinkedElement', 'Linked Element'), '', BaseElement::class, 'Title' ); $autocomplete->setLabelField('VirtualLinkedSummary'); $autocomplete->setDisplayField('VirtualLinkedSummary'); $autocomplete->setSourceFilter(['AvailableGlobally' => 1]); $fields->replaceField( 'LinkedElementID', $autocomplete ); if($this->LinkedElementID){ $message = sprintf( '<p>%s</p><p><a href="%2$s" target="_blank">Click here to edit the original</a></p>', _t(__CLASS__ . '.VirtualDescription', 'This is a virtual copy of an element.'), $this->LinkedElement()->getEditLink() ); $fields->addFieldToTab('Root.Main', LiteralField::create('Existing', $message)); } }); return parent::getCMSFields(); } /** * @return string */ public function getType() { return sprintf( _t(__CLASS__ . '.BlockType', 'Virtual Block') ); } /** * Detect when a user has published a linked element but has not published * the LinkedElement. * * @return boolean */ public function isInvalidPublishState() { $element = $this->LinkedElement(); return (!$element->isPublished() && $this->isPublished()); } /** * Get a unique anchor name. * * @return string */ public function getAnchor() { $linkedElement = $this->LinkedElement(); if ($linkedElement && $linkedElement->exists()) { return $linkedElement->getAnchor(); } return 'e' . $this->ID; } /** * @return string */ public function getSummary() { if ($linked = $this->LinkedElement()) { return $linked->getSummary(); } } /** * @return string */ public function getTitle() { if ($linked = $this->LinkedElement()) { return $linked->Title; } } /** * Override to render template based on LinkedElement * * @return string|null HTML */ public function forTemplate($holder = true) { if ($linked = $this->LinkedElement()) { return $linked->forTemplate($holder); } return null; } protected function provideBlockSchema() { $blockSchema = parent::provideBlockSchema(); $blockSchema['content'] = $this->getSummary(); return $blockSchema; } } |