我需要显示在前端的事件中的选择天数:
在我的TCA我设定的领域是这样的:
'days' => [
'exclude' => true,
'label' => 'choose weekdays',
'config' => [
'type' => 'check',
'eval' => 'required,unique',
'items' => [
['monday',''],
['thuesday',''],
['wednesday',''],
['thursday',''],
['friday',''],
['saturday',''],
['sunday',''],
],
'cols' => 'inline',
],
],
存储在数据库中的一个整数,但现在我有在前端流体模板来显示所选择的日子。
这是在关于基准TYPO3文档,这也解释了,我应该检查位0值的...我搜索了很多,但无法找到除了这个东西的问题在这里堆栈溢出,我不能去工作。
我强烈建议不要使用的bitmasking功能check
现场。 这是很不值得的开销再次分开分裂的价值观,也是很多难于理解对于大多数开发人员。
相反,你可以使用一个select
字段,在这种情况下selectCheckBox
应该为你服务好。 鉴于静态列表items
,你会得到一个CSV字符串,这是一个更容易分裂选定的值,例如在Extbase域模型的getter方法。 如果这是有道理的,你甚至可以用一个关系,而不是记录是更清洁,但需要额外的工作。
如果你仍想继续使用位掩码这个答案可以帮助你。
解决方案1:使用的Mathias的溶液中的所述一个混合迪米特里L.
我想在这里把它作为一个完整的解决方案,这个特殊的问题,所以在领域模型中添加此:
/**
* @var int
*/
protected $days;
然后按照所有的日子:
/**
* Get day 1
*
* @return int
*/
public function getDay1()
{
return $this->days & 0b00000001 ? 1 : 0;
}
/**
* Set day 1
*
* @param int $day1
*/
public function setDay1($day1) {
if ($day1) {
$this->days |= 0b00000001;
} else {
$this->days &= ~0b00000001;
}
}
/**
* And so on for the other 7 days
*/
现在,您可以在extbase使用$object->getDay1()
或流体{object.day1}
由于马蒂亚斯说,它很快变得非常复杂,我更喜欢这种解决方案,因为我只使用它来显示天事件发生在一个星期,在一个日历,以便0或1的解决方案是就好了。
解决方案2:我结束了直接在视图助手使用来自数据库的小数位掩码值:(溶液adepted用于使用复选框的数量,在我的情况下,7个平日)
use \TYPO3\CMS\Extbase\Utility\LocalizationUtility;
/**
* News extension
*
* @package TYPO3
* @subpackage tx_news
*/
class CoursedaysViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractTagBasedViewHelper
{
/**
* @param string $days (bitmask)
* @return string checked weekdays seperated by /
*/
public function render($days)
{
// render binary, 7 digits, split into array and reverse
$days = decbin($days);
$days = sprintf('%07d', $days);
$days = str_split($days);
$days = array_reverse($days);
foreach($days as $day){
$key = 'days.' . ++$a;
if($day) $coursedays .= LocalizationUtility::translate($key, 'news_ext') . '/';
}
return substr($coursedays, 0, -1);
}
}