OctoberCMS

时间:2017-12-10 12:16:56

标签: octobercms

我有一个带幻灯片的模板。每张幻灯片包括:

  • 图像
  • 标题
  • 一段文字
  • 按钮

对于前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}

但是,我对用于按钮的字段类型有点担心,该按钮需要链接到站点内的静态页面。

我不想使用用户可以输入网址的文本框,因为这对用户来说太难以理解。我宁愿有一个下拉菜单,其工作方式与静态菜单插件相同(即:选择"静态页面"来自"类型"然后获取静态列表第二个下拉菜单中的页面)但它没有看到明显的方法。

3 个答案:

答案 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;
          }