Как стать автором
Обновить

Комментарии 20

У меня только один вопрос — чем не угодил стандартный datetimepicker?
Спасибо за ссылку. Я его не нашел в документации
Можете в начале статьи указать на существующее решение, чтобы ищущий знал, о том, что нет необходимости писать что-то свое
добавил ссылку
Однако для выбора времени поле в существующем виде не подходит
выбор времени
$formMapper->add('duration', 'sonata_type_datetime_picker', [
    'label' => 'Продолжительность',
    'required' => false,
    'format' => 'HH:mm:ss',
    'date_format' => 'HH:mm:ss'
])

image
В том то и дело что нет. В приведенном мною примере указывается формат HH:mm:ss, что говорит о том что дата выводится не должна и если создавать поля как в статье или как документации Bootstrap Datepicker, то оно так и работает. Однако, при использовании sonata_type_datetime_picker это не срабатывает. Очень похоже на то что sonata под капотом выполняет какие-то свои манипуляции с датой.
Сейчас попробовал использовать поле time из статьи совместно с sonata_type_datetime_picker и получил такой же результат как в моем комментарии.
И это не смотря на то что код JavaScript имеет вид
 $('.form-field-time').each(function () {
        var el = $(this),
            options = {locale: 'ru'};
        if (el.data('with-seconds') == 1) {
            options.format = 'HH:mm:ss';
        } else {
            options.format = 'HH:mm';
        }
        el.datetimepicker(options);
});


Завтра попробую подробней разобраться в проблеме.
Проблема в том что в sonata используется устаревшая версия 3.1.3 от 16 августа 2014. В актуальной версии 4.17.37 от 10 сентября 2015 эту проблему исправили, но если просто перейти на версию 4.17.37 мы получим ошибку:
Uncaught TypeError: option pickTime is not recognized!

Генерируемый JavaScript код
$('#dtp_s5666a539ecb69_duration').datetimepicker({
    "pickTime":true,
    "useCurrent":true,
    "minDate":"1\/1\/1900",
    "maxDate":null,
    "showToday":true,
    "language":"ru",
    "defaultDate":"",
    "disabledDates":[],
    "enabledDates":[],
    "icons":{
        "time":"fa fa-clock-o",
        "date":"fa fa-calendar",
        "up":"fa fa-chevron-up",
        "down":"fa fa-chevron-down"
    },
    "useStrict":false,
    "sideBySide":false,
    "daysOfWeekDisabled":[],
    "useMinutes":true,
    "useSeconds":true,
    "minuteStepping":1
});


Соответственно необходимо переопределять поведение DateTimePickerType что бы поменять опции передаваемые datetimepicker-у или переопределять шаблон SonataCoreBundle:Form:datepicker.html.twig и писать в нем большой if-else.
НЛО прилетело и опубликовало эту надпись здесь
тогда уж лучше локаль определять в конфиге проекта и передавать аргументом сервису поля, хотя большой необходимости в этом нет ибо bootstrap datepicker сам определяет локаль.
Из любопытства, чем вы сейчас пользуетесь в качестве админки?
НЛО прилетело и опубликовало эту надпись здесь
Статья в целом хорошая, но есть грубая ошибка с DataTransformer'ами. Они просто напросто у вас не правильно используются. Тот кусок кода, что у вас в buildView() должен быть в методе ->transform().

Метод ->transform() должен выглядеть так:

public function transform($value)
{
    if ($value === null) {
        return null;
    }

    return $value->format($this->options['with_seconds'] ? 'H:i:s' : 'H:i');
}

А метод ->reverseTransform() должен выглядеть так:

public function reverseTransform($value)
{
    if ($value === null) {
        return null;
    }

    try {
        $value = new \DateTime($value);
    } catch (\Exception $e) {
        throw new TransformationFailedException($e->getMessage());
    }

    return $value;
}

И еще, т.к. у нас DataTransformer начинает быть зависимым от $options его надо вынести в отдеьный класс, чтобы передавать опции через конструктор.

Ссылки:
Сейчас заметил, что вы используете ModelTransformer. Тогда это все объясняет. Но если переделать на ViewTransformer кода станет меньше и в общем случае процесс будет более наглядный. Т.к. сейчас получается у вас buildView() по факту забрал логику работы DataTransformer'а и полезность ModelTranformer'а стремится к нулю.
у меня не работало форматирование даты в transform(), а после вашего комментария я понял почему. спасибо
Матерь божья, это столько кода надо, что бы подключить datepicker?
А что вас пугает? Это много?
Уберите все комментарии и отступы — и размер в 3 раза меньше станет. Автор постарался оформить это нормально, с тем, чтобы другим людям было проще встроить это в свои проекты, если нужно.

Я не знаком с Symfony и перешел с PHP в Python уже достаточно много лет назад, но вполне могу угадать стандартные для многих фреймворков вещи. Классы, заголовки функций — все это игнорируется при прочтении кода, а функционального кода как такового — не очень много.
а если сделать как советует korotovsky и вынести DataTransformer в отдельный класс то кода станет еще меньше
Конечно много, это же просто datepicker, сколько времени и кода заняло его добавление, хотя это просто свистелка. А что если rich editor какой добавить надо?
А на чем таком вы обычно пишете что добавление контрола занимает две строчки?
Если вам так интересно, то на рельсах.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.