Extbase addAdditionalHeaderData(...) в actioncontroller, включает один и тот же CSS дважды

Для моего расширения extbase мне нужен CSS, который я включаю во все actioncontrollers с:

$this->response->addAdditionalHeaderData('<link rel="stylesheet" type="text/css" href="' . t3lib_extMgm::siteRelPath($this->request->getControllerExtensionKey()) . 'Resources/Public/css/mystyle.css" />');  

Если у меня теперь есть страница, на которой включены многокомпонентные плагины моих расширений, у меня есть многокомпонентный CSS:

<link rel="stylesheet" type="text/css" href="typo3conf/ext/myext/Resources/Public/css/mystyle.css">
<link rel="stylesheet" type="text/css" href="typo3conf/ext/myext/Resources/Public/css/mystyle.css">

редактировать

Я также мог бы сделать следующее:

$GLOBALS['TSFE']->additionalHeaderData[100] = '<link ...>';

Но насколько я знаю, это просто по-старому.

5 ответов

Решение

После многих лет я использую vhs:asset Теперь, чтобы добавить CSS/JS в расширения:

<v:asset.script path="EXT:my_extension/Resources/Public/js/javascript.js" name="collectionjs" standalone="1" />
<v:asset.style path="EXT:my_extension/Resources/Public/css/style.css" name="collectioncss" standalone="1" />

name Атрибут является уникальным, поэтому, если у вас есть другое включение с тем же именем, оно перезапишет старое включение.

Я обычно предпочитаю включать CSS и JS со статическим TypoScript, так как он легче настраивается, если кто-то хочет иметь свой собственный CSS. Вы должны исключить его из CSS-слияния TYPO3, если вы включаете этот TS только на странице расширения.

Просто используйте следующий TypoScript

page.includeCSS.myExtCss = EXT:myext/Resources/Public/css/mystyle.css
page.includeCSS.myExtCss.excludeFromConcatenation = 1

Использование может использовать переменную класса, чтобы отметить, что вы уже включили свою таблицу стилей. Значение этой переменной должно быть живым весь запрос.

В вашем классе контроллера определите переменную класса / статическое свойство:

public static $includedMyStyle;

в действии вашего контроллера:

if (!self::$includedMyStyle) {
  $this->response->addAdditionalHeaderData('<link rel="stylesheet" type="text/css" href="' . t3lib_extMgm::siteRelPath($this->request->getControllerExtensionKey()) . 'Resources/Public/css/mystyle.css" />');
  self::$includedMyStyle = true;
}

Старый вопрос, но стоит упомянуть...

Вам нужно изменить подход здесь. Если у вас есть несколько экземпляров одного и того же плагина на одной странице, которые должны вести себя по-разному, вам просто нужно использовать FlexForm для добавления параметров для каждого экземпляра, они должны начинаться с settings и каждая часть, разделенная точкой, является следующим уровнем ассоциативного массива, например:

<settings.includeHeaderData>
    <TCEforms>
        <exclude>0</exclude>
        <label>Include header data...</label>
        <config>
            <type>check</type>
            <default>0</default>
        </config>
    </TCEforms>
</settings.includeHeaderData>

так что в своих действиях вы можете использовать его так:

if (intval($this->settings['includeHeaderData']) > 0){
    $this->response->addAdditionalHeaderData('<link ...>');
}

или если узел где:

<settings.foo.bar.baz.something>
    ...
</settings.foo.bar.baz.something>

Вы можете получить к нему доступ в контроллере, как:

$mySetting = $this->settings['foo']['bar']['baz']['something'];

Решил это с помощью старого способа:

$GLOBALS['TSFE']->additionalHeaderData[$this->request->getControllerExtensionKey()."CSS1"] = '<link rel="stylesheet" type="text/css" href="' . t3lib_extMgm::siteRelPath($this->request->getControllerExtensionKey()) . 'Resources/Public/css/mystyle.css" />';  

Для каждого CSS или JS, который я включаю, я использую другой суффикс: CSS2, CSS3, JS1, JS2 и так далее. Таким образом, если другой контроллер будет включать тот же файл, он просто перезапишет старую запись в массиве AdditionalHeaderData.

Другие вопросы по тегам