TYPO3: чтение значений TCA 'type' => 'check' (битовая маска) - PullRequest
0 голосов
/ 24 мая 2018

Мне нужно показать выбор дней в событии во внешнем интерфейсе:

в моем 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значения ... Я много искал, но не смог найти ничего, кроме этого вопроса здесь о переполнении стека, которое я не могу заставить работать.

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

РЕШЕНИЕ 1: с использованием раствора Матиаса , смешанного с раствором Dimitri 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: В итоге я использовал десятичное значение битовой маски из базы данных непосредственно в окне просмотра: (решение используется для числа флажковиспользовал, в моем случае 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);
    }
}
0 голосов
/ 24 мая 2018

Я настоятельно рекомендую не использовать функцию битовой маскировки поля check.Редко стоит тратить время на разделение значений, а также понять это для большинства разработчиков гораздо сложнее.

Вместо этого вы можете использовать поле select, в данном случае selectCheckBox должен служить вам хорошо.Имея статический список items, вы получите строку CSV с выбранными значениями, которую намного легче разделить, например, в методе получения модели домена Extbase.Если это имеет смысл, вы даже можете использовать вместо этого отношение к записям, которое даже чище, но требует дополнительной работы.

Если вы все еще хотите продолжить работу с битовыми масками , этот ответ может вам помочь.

...