TYPO3:读取TCA“类型”的值=>“检查”(位掩码)(TYPO3: Reading the

2019-10-28 16:46发布

我需要显示在前端的事件中的选择天数:

在我的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值的...我搜索了很多,但无法找到除了这个东西的问题在这里堆栈溢出,我不能去工作。

Answer 1:

我强烈建议不要使用的bitmasking功能check现场。 这是很不值得的开销再次分开分裂的价值观,也是很多难于理解对于大多数开发人员。

相反,你可以使用一个select字段,在这种情况下selectCheckBox应该为你服务好。 鉴于静态列表items ,你会得到一个CSV字符串,这是一个更容易分裂选定的值,例如在Extbase域模型的getter方法。 如果这是有道理的,你甚至可以用一个关系,而不是记录是更清洁,但需要额外的工作。

如果你仍想继续使用位掩码这个答案可以帮助你。



Answer 2:

解决方案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);
    }
}


文章来源: TYPO3: Reading the values of a TCA 'type' => 'check' (bitmask)