arillo / silverstripe-links
为任何 DataObject 添加链接
1.0.4
2021-04-01 09:31 UTC
Requires
README
为任何 DataObject 添加链接。
要求
SilverStripe CMS ^4.0
安装
composer require arillo/silverstripe-links
使用
通过 config.yml
将 Arillo\Links\LinkExtension
附加到您的 DataObject
MyDataObject:
extensions:
- Arillo\Links\LinkExtension
use SilverStripe\ORM\DataObject; use Arillo\Links\Link; use Arillo\Links\LinkExtension; class MyDataObject extends DataObject { public function getCMSFields() { $this->beforeUpdateCMSFields(function($fields) { // in case you use Link::EDITMODE_PLAIN, you might need // to remove the link relation field generated by the scaffolder. $fields->removeByName(LinkExtension::FIELD . 'ID') $fields->addFieldsToTab( 'Root.Main', // add link fields directly to the belonging DataObject. Link::edit_fields( $this, [ 'mode' => Link::EDITMODE_PLAIN, 'showLinkTitle' => true, ] ) // or use default editing via HasOneButtonField Link::edit_fields($this) ); }); return parent::getCMSFields(); } }
检查 Arillo\Links\Link::DEFAULT_FIELDS_CONFIG
以获取所有可用的配置键。
链接可以在模板中这样渲染
<% if $LinkObject.Exists %>
<% with $LinkObject %>
<a href="$Href" $TargetAttr.RAW>$Title</a>
<% end_with %>
<% end_if %>
或使用模块的模板
<% include Link Link=$LinkObject, CssClass=btn btn-primary %>
扩展
自 1.x 版本以来,可扩展性应该变得更加容易。在这个例子中,我们增加了为 elements 创建锚点链接的能力
<?php namespace Arillo\Extensions; use SilverStripe\Forms\DropdownField; use Arillo\Elements\ElementBase; use SilverStripe\ORM\DataObject; use SilverStripe\Forms\FieldList; use SilverStripe\ORM\DataExtension; use Page; class LinkExtension extends DataExtension { private static $has_one = [ 'AnchorElement' => ElementBase::class, ]; // alter cms fields public function updateLinkCMSFields( FieldList $fields, DataObject $holderRecord, array $config = [] ) { $fieldsPrefix = $config['fieldsPrefix']; if ($this->owner->PageID) { $fields->push( DropdownField::create( "{$fieldsPrefix}AnchorElementID", 'Anker-Element', $this->owner ->Page() ->Elements() ->map() ->toArray() ) ->setEmptyString('[keins]') ->displayIf("{$fieldsPrefix}Type") ->isEqualTo('internal') ->end() ); } } // alter href public function updateLinkHref($href) { if ( $href && $this->owner->Type == 'internal' && $this->owner->AnchorElement()->exists() ) { $href .= "#{$this->owner->AnchorElement()->URLSegment}"; } return $href; } }
通过配置添加扩展
Arillo\Links\Link: extensions: - Arillo\Extensions\LinkExtension
变更日志
1.0.3
- 升级了
silvershop/silverstripe-hasonefield
1.0.0
- 提高了可扩展性