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

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

$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 ...>';

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


person nbar    schedule 18.12.2013    source источник
comment
Почему вы включаете CSS в контроллер? Ты не можешь использовать TypoScript?   -  person lorenz    schedule 18.12.2013
comment
При желании добавьте какой-нибудь флажок в свою гибкую форму (чтобы вы могли добавлять заголовки, если он отмечен) и убедитесь, что он отмечен только для одного экземпляра плагина на странице.   -  person biesior    schedule 18.12.2013
comment
@lorenz: Различные действия могут включать разные CSS (и JS), поэтому просто page.headerData.100.value = <link ...> в setup.txt будет включать файлы также на тех сторонах, которые мне не нужны. Любая другая идея с typoscript?   -  person nbar    schedule 18.12.2013
comment
@biesior это был бы вариант, но это не очень удачное решение.   -  person nbar    schedule 18.12.2013
comment
@nbar: если вы действительно хотите автоматического добавления (без флажка), просто проверьте с помощью простого SQL-запроса, вставила ли страница tt_content с тем же типом tt_content и sorting меньше, чем текущая запись.   -  person biesior    schedule 18.12.2013
comment
Возможно, вам также следует переосмыслить свой подход во времена слияния CSS, LESS и т. д.   -  person lorenz    schedule 18.12.2013
comment
Пока буду пользоваться старым способом. У @lorenz есть хорошая ссылка на слияние CSS во время выполнения? Я не хочу помещать все файлы CSS в 1 файл. (И то же самое с файлами JS)   -  person nbar    schedule 18.12.2013
comment
@nbar: typo3.org/extension-manuals/ws_less/current меньше компилятор (одно из многих расширений Less для TYPO3). Конечно, вы также можете просто использовать конкатенацию CSS (но начиная с TYPO3 4.6): docs.typo3.org/typo3cms/TyposcriptReference/latest/Setup/Config/   -  person lorenz    schedule 18.12.2013


Ответы (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 уникален, поэтому, если у вас есть другое включение с тем же именем, оно перезапишет старое включение.

person nbar    schedule 13.07.2016

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

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

page.includeCSS.myExtCss = EXT:myext/Resources/Public/css/mystyle.css
page.includeCSS.myExtCss.excludeFromConcatenation = 1
person ch. vonrohr    schedule 27.12.2013

Решил это старым способом:

$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.

person nbar    schedule 18.12.2013
comment
Я решил это на данный момент, но я оставлю вопрос открытым на некоторое время, чтобы найти хороший способ, не используя старый способ. - person nbar; 18.12.2013

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

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

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;
}
person Jay Dinse    schedule 25.12.2013

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

Здесь нужно изменить подход. Если у вас есть несколько экземпляров одного и того же плагина на одной странице, которые должны вести себя по-разному, вам просто нужно использовать 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'];
person biesior    schedule 11.07.2016
comment
Сейчас я использую vhs:asset для добавления js/css. Думаю, это самый чистый способ сделать это в сочетании с жидкостью. НО спасибо за ответ на такой старый вопрос :) - person nbar; 13.07.2016
comment
Интересно, почему минусуют, меня не волнуют баллы, скорее я хотел бы знать, какова мотивация;) - person biesior; 13.07.2016
comment
Не могу сказать, потому что это был не мой отрицательный голос. Я проголосовал за то, чтобы сбалансировать это, потому что ваш ответ не является неправильным (но мне не нравится, что редактору нужна ручная работа, чтобы это сработало) - person nbar; 13.07.2016