我正在使用静态页面插件。我需要一种从自定义字段获取octobercms的所有页面的方法。我不在乎这将如何完成(官方页面网址选择器 - 下拉列表...),我只想要用户友好,所以可以从客户端使用。
There is a workaround但它仅适用于转发器。如果我将其与另一个字段{variable name="page" label="Page" type="dropdown"}{/variable}
一起使用,则会出现错误:
get_class() expects parameter 1 to be object, array given
答案 0 :(得分:2)
哇!这个问题确实收紧了我大脑的螺母和螺栓,
感谢您提出问题,我真的非常乐意解决这个问题。
好像我们在转发器之外使用正常变量10月字段解析会将其视为名称viewBag[page]
,并且不能使用fieldParser
和fieldOptions
getter方法。 (它的技术性很小,所以我想跳过这个并跳到真正的解决方案)
最后我发现了一些黑客/类型的扩展/功能(10月Cms的广泛性)并使用它
您需要任何插件,以便在boot
方法中编写扩展代码。
public function boot() {
$alias = \Illuminate\Foundation\AliasLoader::getInstance()
->alias('MyPluginOptionAlias','October\\Demo\\plugin');
}
在这里,您可以更正alis-name
和namespace
我们使用此alias
(MyPluginOptionAlias)
和plugin.php
内部我们添加了两个static
方法,以便我们稍后可以访问它们,这只是获取logic
的{{1}}并将其作为数组返回。< / p>
page-list
现在主要的是
public static function getPageOptions() {
// different lists // or even you can merge them
$result = self::getTypeInfo('cms-page');
// $result = self::getTypeInfo('static-page');
// $result = self::getTypeInfo('blog-post');
return $result['references'];
}
public static function getTypeInfo($type)
{
$result = [];
$apiResult = \Event::fire('pages.menuitem.getTypeInfo', [$type]);
if (is_array($apiResult)) {
foreach ($apiResult as $typeInfo) {
if (!is_array($typeInfo)) {
continue;
}
foreach ($typeInfo as $name => $value) {
if ($name == 'cmsPages') {
$cmsPages = [];
foreach ($value as $page) {
$baseName = $page->getBaseFileName();
$pos = strrpos($baseName, '/');
$dir = $pos !== false ? substr($baseName, 0, $pos).' / ' : null;
$cmsPages[$baseName] = strlen($page->title)
? $dir.$page->title
: $baseName;
}
$value = $cmsPages;
}
$result[$name] = $value;
}
}
}
return $result;
}
您可以像 {variable name="page" label="Page" type="dropdown" options="MyPluginOptionAlias|getPageOptions" tab="link"}{/variable}
exactly
这里的逻辑是现在它将从我们的MyPluginOptionAlias|getPageOptions
实例 MyPluginOptionAlias
您从中返回的
method: getPageOptions
将被列为此下拉列表的选项。
如果它产生任何问题,请发表评论,我们会更正。