【问题标题】:How to read value from plugin flexform in TypoScript?如何从 TypoScript 中的插件 flexform 中读取值?
【发布时间】:2014-07-16 20:26:03
【问题描述】:

我有一个自定义内容元素的插件。该插件包含一个 flexform。我想在我的 TypoScript 设置中使用来自 flexform 的值。我该怎么做?

更具体地说,flexform被定义为:

 <T3DataStructure>
  <meta>
    <langDisable>1</langDisable>
  </meta>
  <sheets>
    <sDEF>
      <ROOT>
        <TCEforms>
          <sheetTitle>LLL:EXT:cb_foundation/Resources/Private/Language/locallang_db.xlf:magellan.sheetTitle</sheetTitle>
        </TCEforms>
        <type>array</type>
        <el>
          <settings.magellan.cols>
            <TCEforms>
              <label>LLL:EXT:cb_foundation/Resources/Private/Language/locallang_db.xlf:magellan.cols</label>
              <config>
                <type>input</type>
                <size>20</size>
                <eval>trim</eval>
              </config>
            </TCEforms>
          </settings.magellan.cols>
        </el>
      </ROOT>
    </sDEF>
  </sheets>
</T3DataStructure>

使用以下 TypoScript 将我的自定义元素添加到 tt_content

lib.cb_foundation.magellan = HMENU
lib.cb_foundation.magellan {
    1 = TMENU
    1 {
        sectionIndex = 1
        sectionIndex.type = header
        sectionIndex.useColPos = 0
        wrap = <div data-magellan-expedition="fixed"><dl class="sub-nav"> | </dl></div>
        NO {
            allWrap = <dd data-magellan-arrival="c{field:sectionIndex_uid}">|</dd>
            allWrap.insertData = 1
        }
    }
    special = list
    special.value.data = page:uid
}

tt_content.cbfoundation_magellan =< lib.cb_foundation.magellan

我想要做的是使用在 flexform 中找到的值设置tt_content.cbfoundation_magellan.1.sectionIndex.useColPos。我该怎么做?

【问题讨论】:

    标签: typo3 typoscript


    【解决方案1】:

    这是不可能的。不幸的是,Typoscript 不解析来自 flexform 的值。

    您需要一个 extbase 控制器或 pi1 来从 flexform 获取值并将它们分配给一个单独的模板,该模板呈现您的自定义内容元素。

    Extbase 示例:

    class ContentElementsController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {
    
        public function YourContentElementAction() {
            // Get the data object (contains the tt_content fields)
            $data = $this->configurationManager->getContentObject()->data;
    
            // Append flexform values
            $this->configurationManager->getContentObject()->readFlexformIntoConf($data['pi_flexform'], $data);
    
            // Assign to template
            $this->view->assign('data', $data);
        }
    
    }
    

    【讨论】:

    • 我认为你是对的,我不能这样做。但我认为你给出的理由不是正确的理由。主要问题是我无法从 HMENU 对象中获取内容对象,我只能获取页面对象。换句话说,并不是我无法从 TypoScript 读取 flexform,而是当我在 HMENU 对象中时,我无法从我的内容对象中获取数据。
    • 这可能也是正确的,但是如果您仍然有 tt_content 对象,则 flexform 字段不可访问,因为它们作为序列化数组存储在数据库中,而不是计算到其他字段。试试RECORDS
    • 是的,但是从tt_content 我可以读取pi_flexform 字段,并且使用用户函数,我可以解析该字段。
    【解决方案2】:

    我不知道,扩展 gridelements 或 TYPO3 6.2.26 是否带来了功能,但以下对我有用:

    dataWrap = {field:flexform_YOURFIELD}
    

    【讨论】:

      【解决方案3】:

      以下 StackOverflow 答案描述了如何使用小型 PHP 用户类从 TS Setup 访问 EXT News 的插件 flexform 设置:

      https://stackoverflow.com/a/40006158/430742

      应该很容易适应其他插件及其 flexform 设置。

      【讨论】:

        【解决方案4】:

        here 所述,现在 TYPO3 >= 8.4 中有一个解决方案。

        功能是 TYPO3 核心变更日志中的 documented

        【讨论】:

          猜你喜欢
          • 2017-03-30
          • 1970-01-01
          • 2015-09-30
          • 1970-01-01
          • 1970-01-01
          • 2017-06-24
          • 2011-12-31
          • 1970-01-01
          • 2018-03-15
          相关资源
          最近更新 更多