是的,您可以在那里添加带有静态页面列表的下拉列表。
要在下拉列表中显示页面列表,您需要扩展页面并向其添加动态方法,因此当转发器添加下拉列表时,它将从该方法获取其值/选项。
您需要在任何插件内的boot方法中添加代码,它将扩展可以进一步处理ajax请求的页面类。
\RainLab\Pages\Classes\Page::extend(function($model) {
$model->addDynamicMethod('getPageOptions', function() {
$theme = \Cms\Classes\Theme::getEditTheme();
$pageList = new \RainLab\Pages\Classes\PageList($theme);
$pages = [];
foreach ($pageList->listPages() as $name => $pageObject) {
$pages[$pageObject->url] = $pageObject->title . ' (' . $pageObject->url . ')';
}
return $pages;
});
});
您可以在中继器中添加下拉菜单
{repeater name="slideshow" prompt="Add another slide" tab="Slideshow"}
{variable name="image" label="Image" type="mediafinder" mode="image"}{/variable}
{variable name="caption" type="text" label="Caption"}Caption{/variable}
{variable name="body" type="textarea" label="Body"}Body{/variable}
{variable name="page" type="dropdown" label="Page"}{/variable}
{/repeater}
所以你可以看到我们添加了动态方法 getPageOptions 它包括三个部分 1:get 第二部分:fieldname 第三部分:选项
所以我们的方法名称将是 get + Page + Options => getPageOptions
在该页面中,我们将数组作为值返回 => 您可以根据需要在其中自定义标签对。
所以当下拉菜单创建时它会搜索这个方法并使用它的返回值作为选项。
如果您发现任何进一步的困难,请发表评论。
更新
好的,现在我们终于可以添加条件下拉菜单了
到目前为止它不是 ajax 可更新的,但是我们可以根据条件隐藏和显示它。
您可以在布局中添加此标记。
{repeater name="slideshow" prompt="Add another slide" tab="Slideshow"}
{variable name="type" type="dropdown" label="Link Type"}{/variable}
{variable name="cms-page" type="dropdown" label="Cms Page" trigger="action:show|field:type|condition:value[cms-page]" }{/variable}
{variable name="static-page" type="dropdown" label="Static Page" trigger="action:show|field:type|condition:value[static-page]"}{/variable}
{variable name="blog-post" type="dropdown" label="Post" trigger="action:show|field:type|condition:value[blog-post]"}{/variable}
{/repeater}
那么在插件内部你需要添加一些额外的方法。
您的 plugin.php 的启动方法如下所示
public function boot()
{
$pluginSelf = $this;
\RainLab\Pages\Classes\Page::extend(function($model) {
$model->addDynamicMethod('getTypeOptions', function() {
return [
'' => 'Select Type',
'cms-page' => 'CMS page',
'static-page' => 'Static Page',
'blog-post' => 'Blog post'
];
});
});
\RainLab\Pages\Classes\Page::extend(function($model) use ($pluginSelf) {
$model->addDynamicMethod('getStaticPageOptions', function() use ($pluginSelf) {
$result = $pluginSelf::getTypeInfo('static-page');
return $result['references'];
});
});
\RainLab\Pages\Classes\Page::extend(function($model) use ($pluginSelf) {
$model->addDynamicMethod('getCmsPageOptions', function() use ($pluginSelf) {
$result = $pluginSelf::getTypeInfo('cms-page');
return $result['references'];
});
});
\RainLab\Pages\Classes\Page::extend(function($model) use ($pluginSelf) {
$model->addDynamicMethod('getBlogPostOptions', function() use ($pluginSelf) {
$result = $pluginSelf::getTypeInfo('blog-post');
return $result['references'];
});
});
}
和一个额外的方法你需要添加到plugin.php
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;
}
因此,您可以在第一个下拉菜单中看到我们可以有“cms-page”、“static-page”和“Blog post”选项,基于此我们可以显示其他下拉菜单。
在显示或使用结果期间,您首先需要根据该字段值检查 type 字段的值,您可以进一步选择需要使用的下拉列表值,例如 type=cms- page 那么你需要寻找 cms-page 字段。
注意:不确定是否在变量中使用 -(破折号),因此如果没有输出值,如果需要不确定这些东西,您可以转换 cmsPage 骆驼大小写的变量
您需要添加此更改作为更改核心文件的要求的其他更改,我还为它创建了拉取请求,因此它们还包括下一个版本中的更改,这意味着我们需要手动执行此操作。 它需要才能工作
请参考此 PR 请求:https://github.com/octobercms/library/pull/292/files