WedX - журнал о программировании и компьютерных науках

Как я могу создать в TypoScript условие для загрузки разных файлов JavaScript в разные внутренние макеты? (TYPO3)

После "долгого пути" с Google, Searching и многими попытками:

Я создал lib.variable для текущей страницы:

lib.currentPage = TEXT
lib.currentPage.data = page:uid

Если я отлажу его в своем FluidTemplate во внешнем интерфейсе с помощью:

Testing currentPage: <f:cObject typoscriptObjectPath="lib.currentPage" />

Я получил правильное значение.


Теперь я хочу использовать эту переменную в условии в моем pageSetup.ts, как показано ниже:

[DB:pages:lib.currentPage:backend_layout = pagets__pagelayout_logoclaim_subpage]
    page.includeJSFooter.belayoutlogoclaim = EXT:rm_base/Resources/Public/JS/be_logoclaim.js
[end]

Я тестировал это с некоторыми другими условиями, но ничего не работает так, как ожидалось.

Испытанные условия:

  • [страница | backend_layout = pagelayout_logoclaim_subpage]
  • [globalVar = TSFE: page | backend_layout = pagelayout_logoclaim_subpage]

Я также протестировал условие в обозревателе объектов TypoScript, и здесь он выглядит хорошо работающим:

Браузер объектов TypoScript - если я активирую условие

Браузер объектов TypoScript

SourceCode в интерфейсе на сайте с правильным PageLayout

SourceCode с правильным PageLayout

Мне это нужно, потому что у меня два разных меню, и им нужны разные сценарии Java, чтобы избежать неправильного поведения во Frontend.


Обновление: я вставил pageLayouts вот так:

page = PAGE
page {

    10 = FLUIDTEMPLATE
    10 {
        partialRootPath = EXT:rm_base/Resources/Private/Templates/Fluid/Partials/
        layoutRootPath = EXT:rm_base/Resources/Private/Templates/Fluid/Layouts/

        file.stdWrap.cObject = CASE
        file.stdWrap.cObject {
            key.data = pagelayout

            // Default-Template is LogoFull_Subpage (No Navigation Dependence)
            default = TEXT
            default.value = EXT:rm_base/Resources/Private/Templates/Fluid/LogoFull_Subpage.html

            // LogoClaim - Subpage
            pagets__pagelayout_logoclaim_subpage = TEXT
            pagets__pagelayout_logoclaim_subpage.value = EXT:rm_base/Resources/Private/Templates/Fluid/LogoClaim_Subpage.html
        }
    }

Вы видите: Backendlayouts находятся в файлах моего расширения, а не в таблице базы данных: backend_layouts.

Обновление 2:

Я бы предпочел TypoScript-Way, если кто-то знает как - с внешними BE-макетами. Спасибо.


  • Вы связали свой внутренний макет с шаблоном внешнего интерфейса Fluid? 06.04.2018
  • Поскольку я видел префикс pagets__, я предполагаю, что проблема здесь в том, что backend_layouts не хранятся в базе данных. Если для каждого макета серверной части существует свой файл шаблона html, одним из решений может быть использование раздела <f:section name="FooterAssets"> (docs.typo3.org/typo3cms/extensions/core/Changelog/8.6/) 06.04.2018
  • @MathiasBrodala Я обновил свой вопрос ... У меня все BE-макеты в одном объекте CASE. @ RiccardoDeContardi У меня есть BE-макеты внутри файла, да - не в базе данных. Мне непонятно содержание вашей ссылки, но я пытаюсь узнать и выяснить;). Спасибо 06.04.2018
  • @RiccardoDeContardi .. Теперь я понимаю, как вы мне показываете ... спасибо .. если вы хотите написать ответ, я могу проголосовать и принять его. | но если вы знаете решение для опечаток, оно было бы лучше и чище ... Разве это не неприятный запах кода, если мы поместим в один и тот же файл вызовы текучей среды и javascript-вызовы? 06.04.2018

Ответы:


1

Поскольку я видел префикс pagets__, я предполагаю, что проблема здесь в том, что backend_layouts не хранятся в базе данных, поэтому я думаю, что условие об этом не сработает.

Если вы используете разные шаблоны html для каждого макета серверной части и используете TYPO3 8.7.x есть другой способ решить эту проблему: добавьте в файл шаблона новый раздел с названием:

<f:section name="FooterAssets">
<!--your code here-->
</f:section>

Этот раздел будет загружен непосредственно перед закрытием </body>. Насколько я помню, вам даже не нужно вызывать этот раздел в вашем файле макета.

06.04.2018
  • Да, я пробовал его вызвать, и дважды получил его содержание;). Спасибо. 06.04.2018

  • 2

    Я бы предпочел использовать расширение VHS, которое предоставляет помощник по просмотру ресурсов.

    Затем вы включаете помощник по просмотру ресурсов в шаблон внешнего интерфейса, который вы визуализируете. и он заботится о размещении javascript в верхнем / нижнем колонтитуле, он также позволяет определять зависимости и загружает сценарий в правильном порядке. также поддерживает объединение / минификацию ...

    пример включения может выглядеть так:

    <v:asset.script path="EXT:your_ext/Resources/Public/JavaScript/menu_a.js" dependencies="jquery" />
    

    для этого необходимо, чтобы вы указали "jquery" через typoscript (или другой помощник по просмотру заданий)

    пример опечатки:

    plugin.tx_vhs.settings.asset.jquery {
      path = EXT:your_ext/Resources/Public/JavaScript/jquery.js
      type = js
    }
    
    06.04.2018
  • Спасибо, но я не хочу использовать для этого сторонние расширения. 06.04.2018
  • хорошо, поймите свою точку зрения. вы все равно можете включить свой простой javascript в шаблон внешнего интерфейса с помощью тега ‹script›. 06.04.2018
  • это немного грязно, но если это единственный способ, да, я так и сделаю ... Если кто-то знает опцию условия TypoScript, которая работает с BE-Layouts в файлах, я предпочитаю использовать это решение. 06.04.2018

  • 3

    Я нашел другое решение, в котором используется пользовательское условие TypoScript:

    Сначала я создаю BackendlayoutCondition.php в своем расширении здесь:

    /Classes/TypoScript/BackendlayoutCondition.php
    

    Его содержание следующее (см. Комментарии для более подробной информации):

    <?php
    namespace RM\RmBase\TypoScript;
    
    use \TYPO3\CMS\Core\Configuration\TypoScript\ConditionMatching\AbstractCondition;
    
    use TYPO3\CMS\Core\Database\ConnectionPool;
    use TYPO3\CMS\Core\Utility\GeneralUtility;
    use TYPO3\CMS\Extbase\Object\ObjectManager;;
    
    class BackendlayoutCondition extends AbstractCondition
    {
        /**
         * Evaluate condition
         *
         * @param array $conditionParameters
         * @return bool
         */
        public function matchCondition(array $conditionParameters)
        {
            \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($conditionParameters,'cond Params');
    
            # Return false if in Backend (Condition for Frontend only)
            if (!$GLOBALS['TSFE']) return false;
    
            # QueryBuilder for Table: pages
            $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages');
    
            # Check if current BackendLayout is inside the $conditionParameters
            if (!empty($conditionParameters) && substr($conditionParameters[0], 0, 1) === '=') {
                # Trim the Parameter to get the correct Value of the Parameter (behind '=')
                $conditionParameters[0] = trim(substr($conditionParameters[0], 1));
    
                    # Get Backendlayout on this Page
                    $backendLayoutOnThisPage = $queryBuilder
                        ->select('backend_layout')
                        ->from('pages')
                        ->where(
                            $queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter(intval($GLOBALS['TSFE']->id), \PDO::PARAM_INT))
                        )
                        ->execute();
    
                # Store Backendlayout Value of the current Page in $backendLayoutOnThisPage
                $backendLayoutOnThisPage = $backendLayoutOnThisPage->fetch()['backend_layout'];
            } else {
                # If no ConditionParameter was set return false
                return false;
            }
    
            # Check if parent BackendLayout_NextLevel is inside the $conditionParameters
            if ($backendLayoutOnThisPage == '') {
                # Get pageRepository
                $objectManager = GeneralUtility::makeInstance(ObjectManager::class);
                $pageRepository = $objectManager->get('TYPO3\\CMS\\Frontend\\Page\\PageRepository');
    
                # Get Rootline of the current Page
                $pageRootline = $pageRepository->getRootLine(intval($GLOBALS['TSFE']->id));
    
                # Set rootlineIndex to the Parent Page Index
                $rootlineIndex = count($pageRootline)-2;
    
                # Check Parent Page Backendlayout_NextLevel till 0 or Backendlayout found
                while ($rootlineIndex > 0) {
                    if ($pageRootline[$rootlineIndex]['backend_layout_next_level'] == $conditionParameters[0]) {
                        return true;
                    } else {
                        $rootlineIndex--;
                    }
                }
    
                # No BackendLayout_NextLevel found till 0
                return false;
            } else {
                # If Condition Backendlayout found return true, otherwise return false
                if ($backendLayoutOnThisPage == $conditionParameters[0]) {
                    return true;
                } else {
                    return false;
                }
            }
        }
    }
    

    (Отредактировано 2)

    Тогда мне просто нужно использовать следующее условие в моем pageSetup.ts:

    [RM\RmBase\TypoScript\BackendlayoutCondition = pagelayout_logoclaim_subpage]
        page.includeJSFooter.belayoutlogoclaim = EXT:rm_base/Resources/Public/JS/be_logoclaim.js
    [global]
    

    Теперь у меня есть этот исходный код во фронтенде:

    <script src="/typo3conf/ext/rm_base/Resources/Public/JS/be_logoclaim.js?1523005944" type="text/javascript"></script>
    

    не то:

    <script src="/typo3conf/ext/rm_base/Resources/Public/JS/be_logoclaim.js" type="text/javascript"></script>
    

    если я использую метод FooterAssets:

    <f:section name="FooterAssets">
        <script src="/typo3conf/ext/rm_base/Resources/Public/JS/be_logoclaim.js" type="text/javascript"></script>
    </f:section>
    

    Изменить: в своем ответе я обнаружил ошибки, исправляю их и редактирую ответ.

    Edit2: теперь условие проверяет Backendlayouts и Backendlayouts_Nextlevel поля для Backendlayouts, чтобы получить все возможные BE-макеты, включая унаследованные.

    06.04.2018

    4

    Проблема с полем backend_layout в том, что есть поле backend_layout_next_level, которое влияет на подстраницы. поэтому вы не можете построить простое условие.

    Либо вы используете stdWrap.if, где вы можете вычислить текущее значение для backend_layout наложения значения, унаследованного от backend_layout_next_level.
    Либо вы определяете функцию пользователя, где вы оцениваете ее самостоятельно, в PHP.

    Имейте в виду, что макеты, определенные в записях, имеют другой префикс, чем макеты, определенные в pagesTS.


    изменить: Пример

    temp.layout = CASE
    temp.layout {
        key.data = levelfield:-1, backend_layout_next_level, slide
        key.override.field = backend_layout
    
        default = TEXT
        default.value = default-layout
    
        1 = TEXT
        1.value = layoutdefinition_from_record
    
        pagets__layout2 = TEXT
        pagets__layout2.value = layoutdefinition_from_pageTSconfig
    
        sitepackage__layout3 = TEXT
        sitepackage__layout3.value = layoutdefinition_from_sitepackage 
    

    }

    Теперь вы можете использовать temp.layout для принятия дальнейших решений:

    10 = TEXT
    10.field = bodytext
    10.wrap = <div class="demo">|</div>
    10.wrap.if {
        equals.cObject < temp.layout
        value = default-layout
    }
    
    06.04.2018
  • Как использовать это для моей проблемы с вариантом stdWrap.if? (Включая BE-Layouts и BE-Nextlevel-Layouts) 09.04.2018
  • Я добавил пример опечатки. 09.04.2018
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]