Comments 20
У меня только один вопрос — чем не угодил стандартный datetimepicker?
+2
Спасибо за ссылку. Я его не нашел в документации
0
Можете в начале статьи указать на существующее решение, чтобы ищущий знал, о том, что нет необходимости писать что-то свое
+1
добавил ссылку
0
Однако для выбора времени поле в существующем виде не подходит
выбор времени
$formMapper->add('duration', 'sonata_type_datetime_picker', [
'label' => 'Продолжительность',
'required' => false,
'format' => 'HH:mm:ss',
'date_format' => 'HH:mm:ss'
])
0
Опять поторопились. Смотрите документацию (Custom Formats), там поразному виджет можно сконфигурировать
0
В том то и дело что нет. В приведенном мною примере указывается формат HH:mm:ss, что говорит о том что дата выводится не должна и если создавать поля как в статье или как документации Bootstrap Datepicker, то оно так и работает. Однако, при использовании sonata_type_datetime_picker это не срабатывает. Очень похоже на то что sonata под капотом выполняет какие-то свои манипуляции с датой.
Сейчас попробовал использовать поле time из статьи совместно с sonata_type_datetime_picker и получил такой же результат как в моем комментарии.
Завтра попробую подробней разобраться в проблеме.
Сейчас попробовал использовать поле 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);
});
Завтра попробую подробней разобраться в проблеме.
0
Проблема в том что в sonata используется устаревшая версия 3.1.3 от 16 августа 2014. В актуальной версии 4.17.37 от 10 сентября 2015 эту проблему исправили, но если просто перейти на версию 4.17.37 мы получим ошибку:
Соответственно необходимо переопределять поведение DateTimePickerType что бы поменять опции передаваемые datetimepicker-у или переопределять шаблон SonataCoreBundle:Form:datepicker.html.twig и писать в нем большой if-else.
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.
0
UFO just landed and posted this here
Статья в целом хорошая, но есть грубая ошибка с DataTransformer'ами. Они просто напросто у вас не правильно используются. Тот кусок кода, что у вас в buildView() должен быть в методе ->transform().
Метод ->transform() должен выглядеть так:
А метод ->reverseTransform() должен выглядеть так:
И еще, т.к. у нас DataTransformer начинает быть зависимым от $options его надо вынести в отдеьный класс, чтобы передавать опции через конструктор.
Ссылки:
Метод ->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 его надо вынести в отдеьный класс, чтобы передавать опции через конструктор.
Ссылки:
0
Сейчас заметил, что вы используете ModelTransformer. Тогда это все объясняет. Но если переделать на ViewTransformer кода станет меньше и в общем случае процесс будет более наглядный. Т.к. сейчас получается у вас buildView() по факту забрал логику работы DataTransformer'а и полезность ModelTranformer'а стремится к нулю.
0
Матерь божья, это столько кода надо, что бы подключить datepicker?
+1
А что вас пугает? Это много?
Уберите все комментарии и отступы — и размер в 3 раза меньше станет. Автор постарался оформить это нормально, с тем, чтобы другим людям было проще встроить это в свои проекты, если нужно.
Я не знаком с Symfony и перешел с PHP в Python уже достаточно много лет назад, но вполне могу угадать стандартные для многих фреймворков вещи. Классы, заголовки функций — все это игнорируется при прочтении кода, а функционального кода как такового — не очень много.
Уберите все комментарии и отступы — и размер в 3 раза меньше станет. Автор постарался оформить это нормально, с тем, чтобы другим людям было проще встроить это в свои проекты, если нужно.
Я не знаком с Symfony и перешел с PHP в Python уже достаточно много лет назад, но вполне могу угадать стандартные для многих фреймворков вещи. Классы, заголовки функций — все это игнорируется при прочтении кода, а функционального кода как такового — не очень много.
0
а если сделать как советует korotovsky и вынести DataTransformer в отдельный класс то кода станет еще меньше
0
Конечно много, это же просто datepicker, сколько времени и кода заняло его добавление, хотя это просто свистелка. А что если rich editor какой добавить надо?
+1
Sign up to leave a comment.
Внедряем Bootstrap 3 Datepicker в SonataAdminBundle