Октябрь CMS: частичное разделение между темами - PullRequest
0 голосов
/ 15 января 2019

Какой простой способ разделить частичные функции между темами. Активы возможны, но у меня проблема с целыми частями. У меня есть многотемный сайт, управляемый / активируемый политиками / логикой поддоменов.

РЕШЕНИЕ / ** * * Оказывает запрошенный частичный в контексте этого компонента, * см. Cms \ Classes \ Controller @ renderPartial для использования. * /

/**
 * @param $themeName
 * @param $partialName
 * @param $data
 * @return mixed
 * @throws \Cms\Classes\CmsException
 */
public function renderThemePartial($partialName, $themeName, $data)
{
    $theme = Theme::getActiveTheme();
    if($themeName) {
        $theme = Theme::load($themeName);
    }

    $controller = new Controller($theme);

    return $controller->renderPartial($partialName, $data);
}

/**
 *
 * Renders a requested content in context of this component,
 * see Cms\Classes\Controller@renderContent for usage.
 */

/**
 * @param $themeName
 * @param $contentName
 * @param $data
 * @return string
 * @throws \Cms\Classes\CmsException
 */
public function renderThemeContent($contentName, $themeName, $data)
{
    $theme = Theme::getActiveTheme();
    if($themeName) {
        $theme = Theme::load($themeName);
    }

    $controller = new Controller($theme);

    return $controller->renderContent($contentName, $data);
}


public function registerMarkupTags()
{
    return [
        'functions' => [
            'partial_from_theme' => [$this, 'themePartial'],
            'content_from_theme' => [$this, 'themeContent'],
        ],
        'filters' => [
            'theme_asset'   => [$this, 'themeUrl']
        ]
    ];
}

/**
 * @param $requested
 * @return string
 */
public function themeUrl($requested)
{
    $asset = $requested[0];
    $theme = $requested[1];
    $theme = Theme::load($theme);
    $themeDir = $theme->getDirName();
    if (is_array($asset)) {
        $_url = Url::to(CombineAssets::combine($asset, themes_path().'/'.$themeDir));
    }
    else {
        $_url = Config::get('cms.themesPath', '/themes').'/'.$themeDir;
        if ($asset !== null) {
            $_url .= '/'.$asset;
        }
        $_url = Url::asset($_url);
    }
    return $_url;
}

/**
 * @param $partialName
 * @param null $themeName
 * @param array $parameters
 * @return mixed
 * @throws \Cms\Classes\CmsException
 */
public function themePartial($partialName, $themeName = null, $parameters = [])
{
    return $this->renderThemePartial($partialName, $themeName, $parameters);
}

/**
 * @param $contentName
 * @param null $themeName
 * @param array $parameters
 * @return string
 * @throws \Cms\Classes\CmsException
 */
public function themeContent($contentName, $themeName = null, $parameters = [])
{
    return $this->renderThemeContent($contentName, $themeName, $parameters);
}

1 Ответ

0 голосов
/ 16 января 2019

Я думаю, вы можете использовать Plugin component здесь вы можете add component to page и use its partial.

Вам необходимо определить частичный [ you can add as many as you like ] в компоненте.

enter image description here

И просто используйте это partial, как показано ниже на странице, теперь this same thing you can do in other themes as well.

enter image description here

Когда вы change partial будете affect in all other themes похожи на shared across multiple themes.

Down side будет, что вы can not change its content from backend, вам нужно вручную изменить этот файл с FTP или другим способом.


Частично из другой темы

Хм

Вы можете добавить пользовательскую функцию ветки для этого может быть

В любой ваш плагин вы можете добавить этот код

public function registerMarkupTags()
{
    return [
        'functions' => [                
            'theme_partial' => [$this, 'themePartial'],
        ]
    ];
}

public function themePartial($partialName, $themeName = null, $vars = [])
{
    $theme = Theme::getActiveTheme();
    if($themeName) {
      $theme = Theme::load($themeName);
    }
    $template = call_user_func([Partial::class, 'load'], $theme, $partialName);
    $partialContent = $template->getTwigContent();
    $html = Twig::parse($partialContent, $vars);
    return $html;
}

Теперь внутри вашей темы, когда вы хотите использовать частичное, вы можете использовать

{{ theme_partial('call_from_other_theme', 'stemalo' ,{'name':'hardik'}) }}
                                           ^ Your theme name here.

themes/stemalo/partials/call_from_other_theme.htm содержание

description = "Shared Partial."

[viewBag]
==
<div id="shared_partial">
    <h1>Another Theme Partial : {{name}}</h1>
</div>

таким образом, вы можете использовать частичное из других тем.

you aksed for access to theme directory здесь может быть, вам просто нужно передать имя темы, и `ее динамически вы можете передать переменную в качестве имени темы, чтобы она могла выбрать любую вещь, которую вам нравится.

Если есть сомнения, прокомментируйте.

...