Есть ли способ динамически добавить таблицу стилей или файл javascript на страницу TYPO3, содержащую плагин?

Иногда мне нужно добавить несколько js или css или и то, и другое для конкретного плагина TYPO3. До сих пор я включал это через расширение setup.txt, как показано ниже:

page.includeJSFooter.js = {$plugin.tx_fox_p1.settings.js}
page.includeCSS.css = {$plugin.tx_fox_p1.settings.css}

Но если я добавлю этот типографский текст статического расширения в корневой шаблон, он будет включать js и css на каждой странице, неважно, нужен он или нет. Чтобы избежать этого, я мог бы создать шаблон расширения для каждой страницы, на которой размещен плагин, но когда плагин, представляющий, например, инструмент боковой панели, и сайт содержит много страниц, которые используют этот инструмент, это будет не так хорошо, чтобы установить шаблон расширения для всех этих страниц.

Может быть, есть способ добавить плагин на определенную страницу и не заботиться о включении css и js, потому что он будет включать его динамически и только на страницах, где размещен плагин?

Может быть, это условие опечатки?


person Fox    schedule 18.02.2016    source источник


Ответы (3)


В действие вашего контроллера вы можете включить части заголовка как минимум двумя способами:

public function yourAction() {
    // This will append each to the header
    $this->response->addAdditionalHeaderData('<script src="/foo/bar/one.js"></script>');
    $this->response->addAdditionalHeaderData('<script src="/foo/bar/two.js"></script>');

    // This will override headers with the same key, so make sure if it's absolutely unique
    // (usualy  some prefix + ext_key creates unique keys...
    $GLOBALS['TSFE']->additionalHeaderData['absolutely_unique_key'] = '<script src="/foo/bar/unique.js"></script>';
    $GLOBALS['TSFE']->additionalHeaderData['absolutely_unique_key'] = '<script src="/foo/bar/override.js"></script>';

    // your other code...

}
person biesior    schedule 18.02.2016
comment
Хорошо, но нет возможности добавить файлы до конца тега body? - person Fox; 19.02.2016
comment
Хорошо, это будет работать: $ GLOBALS ['TSFE'] - ›getPageRenderer () -› addJsFooterFile ('/ foo / bar / one.js'); для добавления файлов js перед конечным тегом тела - person Fox; 19.02.2016
comment
@Fox, да, это еще один вариант, в любом случае каждый раз, когда мне нужно включить какой-нибудь JS, который должен взаимодействовать с разметкой HTML моего плагина, я просто помещаю его в представление в конце. Т.е. используя f:uri.resource VH;). Конечно, ваш подход будет лучше, если JS нужно будет взаимодействовать с другими частями, которые генерируются другими вещами, но уже после того, как ваш плагин заработает. - person biesior; 19.02.2016

Я использую этот код для динамической загрузки JS в контроллере Extbase:

class ShopController extends \Vendor\Shop\Controller\AbstractController {

    /**
     * Init
     *
     * @return void
     */
    public function initializeAction() {

        $ajax = ExtensionManagementUtility::siteRelPath($this->request->getControllerExtensionKey()).'Resources/Public/JavaScripts/Ajax.js';
        $GLOBALS['TSFE']->getPageRenderer()->addJsFooterFile($ajax, 'text/javascript', FALSE, FALSE, '');

        parent::initializeAction();
    }
}
person Robert G.    schedule 19.02.2016

В самом деле, вы можете заключить свои Includes в условие TypoScript:

[globalVar = TSFE:id = 10|12|15]
page.includeJSFooter.js = {$plugin.tx_fox_p1.settings.js}
page.includeCSS.css = {$plugin.tx_fox_p1.settings.css}
[END]

С указанным выше TS ваши CSS и JS будут включены только на страницах 10, 12 и 15. Существует больше возможностей с условиями TS, как описано в здесь.

person Daniel    schedule 18.02.2016
comment
Да, это так. но в настоящее время нет условия, которое соответствовало бы размещению плагина на определенном сайте, или я ошибаюсь? Например, у вас есть много страниц, таких как 200 сотен страниц, а не только 3–3 страницы, на которых должен быть размещен плагин. Тогда ваше состояние будет не таким уж большим, потому что вам нужно добавить 200 идентификаторов страниц к этому условию. Но в настоящее время нет условий, подобных следующему псевдокоду: [globalVar = TSFE: page | plugin = tx_fox_p1] ... [global], что было бы неплохо. - person Fox; 19.02.2016