taitava / silverstripe-cmseditlink
在CMS中编辑任何DataObjects的链接生成方式。
Requires
- silverstripe/framework: ~4.0
This package is auto-updated.
Last update: 2024-09-19 21:05:35 UTC
README
在最简单的形式中,此模块通过一个Extension
提供了一个->CMSEditLink()
方法,可以应用于任何你想要的DataObject
类。此方法返回一个CMSEditLink
实例,可以转换为表示编辑器页面的URL的字符串,在此页面中可以编辑所需的DataObject
。
为了增加复杂性,你还可以创建链式链接,将编辑器路由到通过另一个DataObject
编辑DataObject
,甚至通过多个DataObject
。
此模块目前处于开发阶段。在发布稳定版本之前需要更多测试。此外,某些方法名称可能仍然会改变。此模块不大,所以我确实认为它可以用于生产项目 - 只是要确保对其进行充分的测试 :)。 注意,目前无法为Member
对象创建编辑链接。这是因为Members
是通过SecurityAdmin
管理的,而SecurityAdmin
不是ModelAdmin
的子类。此模块目前需要一个ModelAdmin
来生成链接。
此外,目前的文档也不是最佳。
要求
- SilverStripe 4.x
安装
composer require taitava/silverstripe-cmseditlink:*
简单用法
首先,你需要将此扩展模块应用于你想要的所有DataObject
类。以下示例配置代码将应用于所有DataObject
类。将此放入一个名为app_config\cmseditlink.yml的新文件中
SilverStripe\ORM\DataObject: extensions: - Taitava\CMSEditLink\DataObjectExtension
现在你可以创建这样的简单链接
$book = Book::get()->byID(1); $link = $book->CMSEditLink();
返回的链接不是一个字符串,而是一个CMSEditLink
实例。然而,很容易将此实例转换为格式化的URL字符串:$link_url = (string) $book->CMSEditLink();
或$link_url = $book->CMSEditLink()->URL();
。
或者另一种创建链接的方式
$book = Book::get()->byID(1); $link = Taitava\CMSEditLink\CMSEditLink::LinkFor($book);
如果你使用的是->CMSEditLink()
方法,你需要确保为所有你想要使用此方法的数据对象启用Taitava\CMSEditLink\DataObjectExtension
扩展。例如,将以下内容放入你的app/_config/cmseditlink.yml文件中
SilverStripe\ORM\DataObject: extensions: - Taitava\CMSEditLink\DataObjectExtension
另一方面,你可以使用Taitava\CMSEditLink\CMSEditLink::LinkFor($any_data_object)
为任何DataObjects
创建链接 - 即使对于没有启用上述扩展的DataObjects
也可以。
关于ModelAdmin的说明
DataObjects
的唯一要求是在你的项目中必须存在一个定义了DataObject
类名称的ModelAdmin
类,它位于其$managed_models
配置数组中。如果没有此类ModelAdmin
,你需要自己创建一个或可以使用上面描述的“链式”功能首先为具有可用ModelAdmin
的另一个DataObject
类生成链接,然后将链接链到目标对象。这需要两个DataObject
类之间的ORM关系(实际上:任何在$has_one
、$has_many
、$many_many
或$belongs_to
中定义的关系都适用)。
该模块试图自动找到一个能够管理所需 DataObject
的 ModelAdmin
类。通常它会选择一个合适的类,但在某些情况下,如果有多个 ModelAdmin
类在它们的 $managed_models
配置数组中列出了 DataObject
的类,那么模块会选择它遇到的第一个。如果您愿意,可以通过在您的 DataObject
子类中定义一个 getModelAdminForCMSEditLink()
方法来覆盖 ModelAdmin
的自动选择。
class Book extends DataObject { public function getModelAdminForCMSEditLink() { return BookAdminWhichHandlesBooksWithSoftGloves::class; // Or: return BookAdminWhichHandlesBooksWithSoftGloves::create(); } } class BookAdminWhichTearsPagesAndBurnsThemToAshes { $managed_models = [ Book::class, ]; } class BookAdminWhichHandlesBooksWithSoftGloves extends ModelAdmin { $managed_models = [ Book::class, ]; }
链接链和“面包屑”
链接可以无限级联以创建指向实际编辑页面的“面包屑”。例如,如果您有一个 Book
对象,并且您想提供一个表示 Library
对象的 CMS 编辑链接,您可以创建链接如下
$book = Book::get()->byID(1); $book->CMSEditLink()->via($book->Library(), 'Books');
或者以另一种方式创建相同的链接
$library = Library::get()->byID(1); $library->CMSEditLink()->hereon($library->Books()->first(), 'Books');
自定义操作
默认情况下,所有创建的链接都将使用 CMS 中的 'edit' 动作。如果您在 CMS 中定义了自定义操作,您可以在链接中使用它们,就像这样
$book = Book::get()->byID(1); $link = $book->CMSEditLink()->action('customAction');
或者使其更短
$book = Book::get()->byID(1); $link = $book->CMSEditLink('customAction');
自定义 ->CMSEditLink()
将返回的链接
除了在从 ->CMSEditLink()
收到链接后对其进行修改之外,您还可以在 DataObject
层面上进行一些默认的修改
class Book extends DataObject { private static $has_one = [ 'Library' => Library::class, ]; public function ProvideCMSEditLink($action) { if ($action == 'edit') $action = 'tagAuthors'; // Switch the default 'edit' action to an author tagging action, or whatever. $link = CMSEditLink::LinkFor($this,$action); $link->via($this->Library(), 'Books'); // Scaffold the link via the book's holder Library return $link; // The alterations made in this function ... } } class Library extends DataObject { private static $has_many = [ 'Books' => Book::class, ]; } $book = Book::get()->byID(1); $link = $book->CMSEditLink(); // ... will be in place here.
未来
请查看 GitHub 问题跟踪器以获取任何当前的开发计划和建议。如果您有开发想法、错误报告或任何实现/使用相关的问题,可以创建新问题。
也欢迎提交拉取请求!
作者
Jarkko Linnanvirta。许可:MIT。
还要感谢 PsychoMo 在一个相关的 SilverStripe 论坛主题中帮助我:[https://forum.silverstripe.org/t/modeladmin-how-to-get-a-cms-edit-link-url-for-a-specific-dataobject/1958/5](https://forum.silverstripe.org/t/modeladmin-how-to-get-a-cms-edit-link-url-for-a-specific-dataobject/1958/5)