我有一个带幻灯片的模板。每张幻灯片包括:
对于前3个项目,我在模板中设置了以下内容:
{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}
{/repeater}
但是,我对用于按钮的字段类型有点担心,该按钮需要链接到站点内的静态页面。
我不想使用用户可以输入网址的文本框,因为这对用户来说太难以理解。我宁愿有一个下拉菜单,其工作方式与静态菜单插件相同(即:选择"静态页面"来自"类型"然后获取静态列表第二个下拉菜单中的页面)但它没有看到明显的方法。
答案 0 :(得分:2)
是的,你可以在那里添加带有静态页面列表的下拉列表。
显示下拉列表中的页面列表,您需要扩展页面并向其添加动态方法,以便在转发器添加下拉列表时,它将从该方法获取其值/选项。
您需要在任何插件中添加引导方法的代码,它将扩展可以进一步处理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部分:获取第二个:字段名第三个:选项
因此我们的方法名称将为获取+页面+选项 =>的 getPageOptions 强>
在该页面内,我们将数组返回为value =>标签对,您可以根据需要自定义。
因此,当创建下拉列表时,它将搜索此方法并使用其返回值作为选项。
如果您发现任何进一步的困难,请发表评论。
好的,现在我们终于可以添加条件下拉菜单了 到目前为止它不是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 = cms-页面然后您需要查找 cms-page 字段。
注意:不确定在变量中使用 - (破折号)所以如果值不在输出中你可以在 cmsPage 驼峰情况下转换变量,如果需要不确定这个东西
您需要添加此更改作为更改核心文件的所需的一个额外更改,我还为它创建了拉取请求,因此它们还包括下一版本中的更改,而我们需要手动执行此操作。 需要才能使其工作 请参阅此PR请求:https://github.com/octobercms/library/pull/292/files
答案 1 :(得分:0)
如果不需要链接到CMS页面,则可以使用staticpagepicker
小部件。
https://github.com/rainlab/pages-plugin#backend-forms
如果您需要从自己的后端表单中的静态页面列表中进行选择,则可以使用
staticpagepicker
小部件:fields: field_name: label: Static Page type: staticpagepicker
该字段的分配值将是静态页面的文件名,如上所述,该文件名可用于链接到页面。
在您的布局文件中:
{variable name="button_page" label="Button URL" type="staticpagepicker"}{/variable}
<a href="{{ button_page | staticPage }}">Button</a>
由于此小部件中未列出“ CMS页面”,因此您始终可以设置替代字段来为用户提供更大的灵活性。
{variable name="button_url" label="Button (URL)" type="text" span="left" comment="Leave empty if using Button (Page) instead" placeholder="http://"}{/variable}
{variable name="button_page" label="Button (Page)" type="staticpagepicker" span="right" comment="Used if Button (URL) is left empty"}{/variable}
<a href="{{ button_url ? button_url : (button_page | staticPage) }}">Button</a>
答案 2 :(得分:0)
我有和Panagiotis Koursaris一样的问题。我使用的模板变量没有中继器。我通过指定选项并在插件启动方法中添加别名来解决此问题。 例如:
{variable name="type" type="dropdown" options="StaticPage | getTypeOptions" label="Link Type" tab="Text Image Header (dark)"}{/variable}
\Illuminate\Foundation\AliasLoader::getInstance()->alias('StaticPage','RainLab\\Pages\\Classes\\Page');
但是触发器不起作用,显示了所有下拉列表。 有解决的主意吗?
下一个问题是,所有cms页面都显示如下:
项目[项目]
我在第二个循环中更改代码,如下所示:
if ($type == 'cms-page') {
$cmsPages = [];
if (!is_array($value)) {
continue;
}
foreach ($value as $url => $pageArray) {
$page = \Cms\Classes\Page::find($url);
if ($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;
}