3

对于我的 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 ...>';

但据我所知,这只是老办法。

4

5 回答 5

2

多年后,我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属性是唯一的,因此如果您有另一个具有相同名称的包含,它将覆盖旧的包含。

于 2016-07-13T11:40:45.880 回答
1

我通常更喜欢在静态 TypoScript 中包含 CSS 和 JS,因为如果有人想拥有自己的 CSS,它更容易调整。如果仅在扩展页面上包含此 TS,则应将其从 TYPO3 CSS-Merger 中排除。

只需使用以下 TypoScript

page.includeCSS.myExtCss = EXT:myext/Resources/Public/css/mystyle.css
page.includeCSS.myExtCss.excludeFromConcatenation = 1
于 2013-12-27T13:34:08.633 回答
0

使用可以使用类变量来标记您已经包含您的样式表。这个变量的值应该在整个请求中都是有效的。

在您的控制器类中,定义您的类变量/静态属性:

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;
}
于 2013-12-25T22:21:43.417 回答
0

使用旧方法解决了它:

$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 数组中的旧条目。

于 2013-12-18T10:34:52.677 回答
0

老问题,但值得一提...

你需要在这里改变方法。如果您在同一页面上有多个相同插件的实例,它们的行为应该不同,您只需要使用 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'];
于 2016-07-11T18:00:46.020 回答