【问题标题】:how to include public resources to typo3 extbase extension如何将公共资源包含到typo3 extbase 扩展中
【发布时间】:2014-01-10 12:59:46
【问题描述】:

我正在构建一个扩展,它创建一个后端模块,使 be_users 能够调整图像大小。 我正在尝试使用 pageRenderer 添加/包含 css 和 javascript 文件,但这些文件从未包含在内我只能应用 css 如果使用样式标记将其直接添加到流体模板中并包含带有脚本标记的 javascript 文件。

我在控制器中尝试过这样的事情

protected $pageRenderer;

....

    $this->pageRenderer = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Core\\Page\\PageRenderer');
    $this->pageRenderer->addCssFile('/typo3conf/ext/extKey/Resources/Public/css/styles.css');
    $this->pageRenderer->loadJquery();

也尝试了 viewHelper

namespace Vendor\ExtKey\ViewHelpers;

class AddJsFileViewHelper extends \TYPO3\CMS\Fluid\ViewHelpers\Be\AbstractBackendViewHelper {

    public function render() {
        $doc = $this->getDocInstance();
        $pageRenderer = $doc->getPageRenderer();
        $pageRenderer->loadJquery();
    }
}

在我的生活中

{namespace pager=Vendor\ExtKey\ViewHelpers}
<f:layout name="Default" />

<f:section name="main">
    <pager:addJsFile />

...

什么都没有

【问题讨论】:

    标签: php typo3 fluid extbase


    【解决方案1】:

    我不确定您是如何为后端定义模板的,但似乎这通常使用后端容器视图助手发生,该助手已经具有相应的功能:

    <f:be.container
      addCssFile="{f:uri.resource(path:'css/style.css')}"
      addJsFile="{f:uri.resource(path:'js/scripts.js')}">
    
      [your templates content]
    
    </f:be.container>
    

    【讨论】:

    • 这种方法也行得通。但是如果您想包含多个文件,会发生这种情况?
    • 这种方法是不可能的。有人可能还会争辩说,不应该为了简单起见而这样做,但我意识到,至少对于 JS,如果你想用你自己的代码使用库,那是有点困难的。应该注意的是,已经有一些库可以通过额外的选项使用,即:leadExtJs、loadPrototype 和 loadScriptaculous。有关更多信息,请查看 sysext/fluid/Classes/ViewHelpers/Be/ContainerViewHelper.php
    • 我认为在每个模板中加载库不是一个好主意,但在这种情况下,只有一个模板,并且我感兴趣的库无法通过 Pagerender::loadJquery() 加载
    • 你可以包含更多,因为它得到一个数组typo3.org/api/typo3cms/…
    • 也可以使用 TYPO3 v7 来加载模块 scripting-base.de/blog/requirejs-backend-1.html
    【解决方案2】:

    在 TYPO3 7.6.X 中,必须如下所示

    <f:be.container
         includeCssFiles="{style:'{f:uri.resource(path:\'css/style.css\')}'}"
         includeJsFiles="{script:'{f:uri.resource(path:\'js/script.js\')}'}"
        >
    <!-- Template Code -->
    </f:be.container>
    

    由于 includeCssFilesincludeJsFiles 需要传递数组,我们 可以包含任意数量的js和css。

    【讨论】:

      【解决方案3】:

      我认为问题在于我的 ViewHelper 需要 renderChilden 和开始/结束页面

      目前的实现是这样的

      ViewHelper

      namespace Vendor\ExtKey\ViewHelpers;
      
      class AddPublicResourcesViewHelper extends  \TYPO3\CMS\Fluid\ViewHelpers\Be\AbstractBackendViewHelper {
      
          public function render() {
              $doc = $this->getDocInstance();
              $pageRenderer = $doc->getPageRenderer();
              $extRelPath = \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extRelPath("ext_key");
      
              $pageRenderer->addCssFile($extRelPath . "Resources/Public/css/styles.css");
      
              $pageRenderer->loadJquery();
              $pageRenderer->addJsFile($extRelPath . "Resources/Public/js/app.js");
      
              $output = $this->renderChildren();
              $output = $doc->startPage("title") . $output;
              $output .= $doc->endPage();
      
              return $output;
          }
      }
      

      模板

      {namespace pager=Vendor\ExtKey\ViewHelpers}
      <f:layout name="Default" />
      
      <f:section name="main">
      <pager:addPublicResources />
      

      Pagerender::loadJjquery 可以像这样工作和访问

      TYPO3.jQuery(function($) {
      
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-23
        • 1970-01-01
        • 2013-11-22
        • 1970-01-01
        • 2014-01-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多