- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个模型,其中一个字段是日期。我想显示该模型中的元素,按年和月分组,如下所示:
== 2013 ==
=== April ===
* Element 1
* Element 2
=== March ===
* Element 3
...
== 2012 ==
...
实现该目标的最佳方法是什么?我应该直接在 Controller 中构建一个嵌套数组吗?或者有没有办法只使用 Fluid 模板显示年和月标题?或者我应该编写自定义 ViewHelper 来提取和显示年和月标题吗?
最佳答案
最后,我通过使用派生自 GroupedBy ViewHelper 的自定义 ViewHelper 解决了这个问题,灵感来自 https://gist.github.com/daKmoR/1287203 , 并适用于 extbase。
这是 ViewHelper 的完整代码,位于 MyExt/Classes/ViewHelpers/GropuedForDateTimeViewHelper.php
<?php
namespace vendor\MyExt\ViewHelpers;
/* *
* This script belongs to the FLOW3 package "Fluid". *
* *
* It is free software; you can redistribute it and/or modify it under *
* the terms of the GNU Lesser General Public License as published by the *
* Free Software Foundation, either version 3 of the License, or (at your *
* option) any later version. *
* *
* This script is distributed in the hope that it will be useful, but *
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN- *
* TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser *
* General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public *
* License along with the script. *
* If not, see http://www.gnu.org/licenses/lgpl.html *
* *
* The TYPO3 project - inspiring people to share! *
* */
/**
* Grouped loop view helper for Datetime values.
* Loops through the specified values
*
* = Examples =
*
* <code title="Simple">
* // $items = array(
* // array('name' => 'apple', 'start' => DateTimeObject[2011-10-13 00:15:00]),
* // array('name' => 'orange', 'start' => DateTimeObject[2011-12-01 00:10:00]),
* // array('name' => 'banana', 'start' => DateTimeObject[2008-05-24 00:40:00])
* // );
* <a:groupedForDateTime each="{items}" as="itemsByYear" groupBy="start" format="Y" groupKey="year">
* {year -> f:format.date(format: 'Y')}
* <f:for each="{itemsByYear}" as="item">
* {item.name}
* </f:for>
* </a:groupedForDateTime>
* </code>
*
* Output:
* 2011
* apple
* orange
* 2010
* banana
*
* @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
* @api
*/
class GroupedForDateTimeViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper {
/**
* Iterates through elements of $each and renders child nodes
*
* @param array $each The array or Tx_Extbase_Persistence_ObjectStorage to iterated over
* @param string $as The name of the iteration variable
* @param string $groupBy Group by this property
* @param string $groupKey The name of the variable to store the current group
* @param string $format The format for the datetime
* @param string $dateTimeKey The name of the variable to store the current datetime
* @throws \TYPO3\CMS\Fluid\Core\ViewHelper\Exception
* @return string Rendered string
* @author Bastian Waidelich <bastian@typo3.org>
* @author Thomas Allmer <at@delusionworld.com>
* @api
*/
public function render($each, $as, $groupBy, $groupKey = 'groupKey', $format = '', $dateTimeKey = 'dateTimeKey') {
$output = '';
if ($each === NULL) {
return '';
}
if (is_object($each)) {
if (!$each instanceof \Traversable) {
throw new \TYPO3\CMS\Fluid\Core\ViewHelper\Exception('GroupedForViewHelper only supports arrays and objects implementing Traversable interface' , 1253108907);
}
$each = iterator_to_array($each);
}
$groups = $this->groupElements($each, $groupBy, $format);
foreach ($groups['values'] as $currentGroupIndex => $group) {
$this->templateVariableContainer->add($groupKey, $groups['keys'][$currentGroupIndex]);
$this->templateVariableContainer->add($dateTimeKey, $groups['dateTimeKeys'][$currentGroupIndex]);
$this->templateVariableContainer->add($as, $group);
$output .= $this->renderChildren();
$this->templateVariableContainer->remove($groupKey);
$this->templateVariableContainer->remove($dateTimeKey);
$this->templateVariableContainer->remove($as);
}
return $output;
}
/**
* Groups the given array by the specified groupBy property and format for the datetime.
*
* @param array $elements The array / traversable object to be grouped
* @param string $groupBy Group by this property
* @param string $format The format for the datetime
* @throws \TYPO3\CMS\Fluid\Core\ViewHelper\Exception
* @return array The grouped array in the form array('keys' => array('key1' => [key1value], 'key2' => [key2value], ...), 'values' => array('key1' => array([key1value] => [element1]), ...), ...)
* @author Bastian Waidelich <bastian@typo3.org>
*/
protected function groupElements(array $elements, $groupBy, $format) {
$groups = array('keys' => array(), 'values' => array());
foreach ($elements as $key => $value) {
if (is_array($value)) {
$currentGroupIndex = isset($value[$groupBy]) ? $value[$groupBy] : NULL;
} elseif (is_object($value)) {
$currentGroupIndex = \TYPO3\CMS\Extbase\Reflection\ObjectAccess::getPropertyPath($value, $groupBy);
} else {
throw new \TYPO3\CMS\Fluid\Core\ViewHelper\Exception('GroupedForViewHelper only supports multi-dimensional arrays and objects' , 1253120365);
}
if (strpos($format, '%') !== FALSE) {
$formatedDatetime = strftime($format, $currentGroupIndex->format('U'));
} else {
$formatedDatetime = $currentGroupIndex->format($format);
}
$groups['dateTimeKeys'][$formatedDatetime] = $currentGroupIndex;
if (strpos($format, '%') !== FALSE) {
$currentGroupIndex = strftime($format, $currentGroupIndex->format('U'));
} else {
$currentGroupIndex = $currentGroupIndex->format($format);
}
$currentGroupKeyValue = $currentGroupIndex;
if (is_object($currentGroupIndex)) {
$currentGroupIndex = spl_object_hash($currentGroupIndex);
}
$groups['keys'][$currentGroupIndex] = $currentGroupKeyValue;
$groups['values'][$currentGroupIndex][$key] = $value;
}
return $groups;
}
}
?>
下面是一个使用它的模板示例:
{namespace m=vendor\MyExt\ViewHelpers}
<f:layout name="Default" />
<f:section name="main">
<m:groupedForDateTime each="{myitems}" as="myitemsyear" groupBy="date" format="%Y" groupKey="year" dateTimeKey="yearKey">
<h2>{year}</h2>
<m:groupedForDateTime each="{myitemsyear}" as="myitemsmonth" groupBy="date" format="%B" groupKey="month" dateTimeKey="monthKey">
<h3>{month}</h3>
<ul>
<f:for each="{myitemsmonth}" as="myitem">
<li>{myitem}</li>
</f:for>
</ul>
</m:groupedForDateTime>
</m:groupedForDateTime>
</f:section>
关于php - 在 TYPO3 Fluid 中显示按年和按月分组的元素列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15870481/
我想使用循环 (f:for) 使用内联符号填充 TYPO3 Fluid 模板中的属性值: [...] 有人知道怎么做吗? 最佳答案 与此同时,我找到了解决问题的方法。要打印数组的所有项目,您可以执行类
我正在尝试制作一种三列设计,其中包含两个流动的侧边栏和一个固定的中心。当浏览器宽度改变时,我希望中心保持不变,侧边栏的宽度减小。谢谢 最佳答案 此示例特定于您的要求:http://www.dynami
我看过三列的例子(fixed fluid fixed)。但是,我需要一个四列解决方案的示例。 两个外部列是固定的。两个内柱是流动的。 固定 |流体 |流体 |固定 最佳答案 您可以使用 calc .
On my website (click) ,我使用过 twitter-bootstrap v2.3.2 的其中一个,出于某种原因 row-fluid:before, row-fluid:after,
我们如何创建一个 3 列布局,Fluid - Fixed - Fluid,如下图所示。有不止一种选择吗?如果是这样,各自的优缺点是什么? 注意:如果答案与我已经发布的三个不同,请随时添加更多答案。另外
我无法确定 Fluid 和 Fluid Grid 设计之间的区别。可以说,流体布局中的任何元素都将共享一个最小公分母,因此任何布局肯定都是基于 LCD 的网格。 最佳答案 基于网格的布局基于使用预定义
我在创建具有 3 个 div 的 3 列布局时遇到困难。左边的 div 需要固定宽度。中间和右边的 div 需要有流动的宽度。当浏览器水平调整大小时,中间和右边的 div 需要按比例调整。 我见过一些
在我的网站中,它生成动态 html,如下所示 some html here .. some html here
这让我抓狂!我正在尝试做一个液体布局,它有一个左边的固定宽度(130px),一个中间的流体列和一个右边的流体列,它们都有 20px 的边距。 因为我只希望右侧列在内容溢出时滚动,所以我将 left 和
我已经搜索过了,但没有适合我的解决方案。我正在尝试制作两列: Left fluid + Right fluid. 左列包含 100% width 的输入框,左列 width 取决于右列 width。
我正在尝试制作 FLuID 循环,它将显示包含 4 张图片的 block 。我想实现这样的目标:
我试图在 CSS 中实现一些非常棘手但也非常“简单”的东西: 说明: 一些内部有文本的元素(未知宽度),每边有 2 个元素,都占据了剩余的空间。 我想为容器使用 display:table 并且为 3
我在这里找不到与我的问题相关的任何内容。我想知道如何让这些容器感觉“流畅”。我不知道我需要做什么才能使这些容器之间的距离相同。 What it currently looks like What I
首先我想说我是 StackOverflow 和 Modelica 的新手。 我的目标是模拟旋转爆震发动机的喷油器系统。从本质上讲,这是一个从油箱到火箭发动机的管道系统。这个系统会根据实验设置而改变,所
是否可以在 TYPO3 Fluid 模板中获取当前语言 key (或代码)? 与此同时,我找到了另一个使用 View 助手的解决方案 here : config['config']['language
我有一个 多语种网站建于 TYPO3 V7.6.18 .它使用的口号应该保持可编辑,但对于三种语言是不同的。这是在流体模板中硬编码的变量。 对于此类变量,我使用文件 Configuration/Typ
我在用户脚本中看到一个模板指向 console.log('foobar');作为控制台日志的示例文件名。 我在哪里可以找到这个控制台日志?我尝试查看 ~/library/application sup
如果条件处于流体状态,我正在尝试编写以下内容,但它没有像我希望的那样工作。 条件 作为 for 循环的一部分,我想检查该项目是第一个还是第 4 个、第 8 个等 我原以为以下内容会起作用,但它会显示每
我目前正在开发一个 TYPO3 扩展,其中使用两个单独的数组:一个包含有关产品的文本信息 (bikes),第二个包含相应的图像 (bikesimages) >)。在前端模板中,我使用 for 循环迭代
是否可以使用 Fluid 呈现页面内容(大概是多篇图片+文本文章)?我想对 html 有更多的控制权(这是正当理由吗?)。我试图通过 TypoScript 获取一些我认为可能是某些对象(行)数组的东西
我是一名优秀的程序员,十分优秀!