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.