首页 文章

静态页面插件 - 列出所有页面url作为自定义页面字段

提问于
浏览
1

我正在使用静态页面插件 . 我需要一种从自定义字段获取octobercms的所有页面的方法 . 我不在乎这将如何完成(官方页面网址选择器 - 下拉列表...),我只想要用户友好,所以可以从客户端使用 .

There is a workaround但它只适用于转发器 . 如果我在另一个字段中使用它 {variable name="page" label="Page" type="dropdown"}{/variable} 我收到了一个错误:

get_class() expects parameter 1 to be object, array given

1 回答

  • 2

    哇!这个问题真的收紧了我大脑的螺母和螺栓,

    感谢您提出的问题,我真的非常乐意解决这个问题 .

    好像我们在转发器10之外使用正常变量,字段解析会将其视为名称 viewBag[page] ,并且它不能与 fieldParserfieldOptions getter方法一起使用 . (它的技术性很小,所以我想跳过这个并跳到真正的解决方案)

    最后我发现了一些黑客/类型的扩展/功能(十月Cms的广泛性)并使用它

    你需要任何插件,所以你可以在 boot 方法中编写扩展代码 .

    public function boot() {
        $alias = \Illuminate\Foundation\AliasLoader::getInstance()
                  ->alias('MyPluginOptionAlias','October\\Demo\\plugin');
    }
    

    在这里你可以更正 alis-namenamespace 我们正在使用 alias (MyPluginOptionAlias) 使我们的插件对象全局可用

    plugin.php 里面我们添加了两个 static 方法,以便我们以后可以访问它们,这只是 logic 获取 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}
    

    你定义 options exactly 喜欢这个 MyPluginOptionAlias|getPageOptions

    这里的逻辑是现在它将从 MyPluginOptionAlias 实例的 method: getPageOptions 获取选项列表

    从中返回的数组将被列为此下拉列表的选项 .

    请评论如果它产生任何问题,我们将予以纠正 .

相关问题