form api #type' => 'number'

Главные вкладки

Аватар пользователя voviko voviko 30 сентября 2019 в 16:09

form api #type' => 'number'
Подскажите, как заставить не ругаться на десятичные знаки "." и ","
Вообще задача дать возможность писать пользователям в ajax форме оба разделителя, но ругается валидация.

Комментарии

Аватар пользователя Mnilionic Mnilionic 1 октября 2019 в 18:38

Автор прав в своем желании дать возможность писать оба варианта.
Точки они тут только у программистов. У всех Российских обычных людей в школьной программе десятичным знаком была запятая, в калькуляторах - запятая, в икселе - запятая, в градусниках - запятая.
То что друпал ругается на запятую - это проблема вашей "дурацкой программы". И нужно не клиента учить, а самим научиться подстраиваться под клиента - это и есть "юзер френдли".
Если реплейсить по кейапу, то клиент, печатая запятую, будет видеть точку. Уверен он подумает, что ошибся, сотрёт её и попробует снова. Или, о боже, решит что у него раскладка включена латинская и начнёт переключать её. И квест продолжится...
Пользователь должен видеть то, что он ожидает увидеть. Если нужно что-то зареплейсить, то это лучше делать прямо на сервере либо непосредственно перед отправкой.
"дебильный" '#type' => 'number' делает правильно, что использует запятую.

Аватар пользователя bumble bumble 1 октября 2019 в 19:19

Аргумент более на скупую претензию к моему вопросу похож. Может из-за всех этих ваших оценочек, вроде "дурацкий" и "дебильный".

Сабмит так сабмит, я не против.

Аватар пользователя Mnilionic Mnilionic 1 октября 2019 в 20:03

Искренне прошу меня извинить, bumble, если это прозвучало как претензия. "дурацкий" я использовал от лица пользователя для театральной наглядности в целом к айти, а "дебильный" это цитата из сообщений ниже. Согласен, аргументацию нужно было подсушить.

Аватар пользователя voviko voviko 30 сентября 2019 в 16:51

str_replace при расчетах не помогает, потому как ошибка раньше. Вроде и считает, но как то непонятно, то есть результат то нет.

PS. Ну да, реплесить надо было раньше, в validate, а не в калбеке

<?php
    
public function validateForm(array &$formFormStateInterface $form_state) {
        
$max $form_state->getValue('max');
        
$max str_replace(',''.'$max);
        
$form_state->setValue('max'$max);
    }
?>
Аватар пользователя adano adano 30 сентября 2019 в 16:54

Выкинуть нафиг это дебильный html5 - type="number"... Не мучайтесь, он ни в одном браузере не стандартизирован.
И сделать как bumble говорит, только на textfield.

Аватар пользователя adano adano 30 сентября 2019 в 17:04

Типа того:

$('.form-number-decimal', context).keyup(function() {
  this.value = this.value.replace(/[^0-9\b.,]/g, '');
  this.value = this.value.replace(/,/g, '.');
});
Аватар пользователя voviko voviko 1 октября 2019 в 10:25

adano wrote:
Типа того:

$('.form-number-decimal', context).keyup(function() {
  this.value = this.value.replace(/[^0-9\b.,]/g, '');
  this.value = this.value.replace(/,/g, '.');
});

Получается что вот это самый верный вариант.

Аватар пользователя Mnilionic Mnilionic 1 октября 2019 в 16:53

Я к тому, что раз уж всё равно на фронте делаете проверку поля, то почему бы её не сделать чуть лучше? Посчитать кол-во точек ведь не сложно )

Аватар пользователя adano adano 1 октября 2019 в 17:28

ИМХО, не надо делать никаких проверок на фронте. Сугубо косметический (юзерфрендли) характер и не более. Все проверки должны быть на бэкенде.
Если все же хочется жесткие условия в jquery, то проще готовые скрипты подцепить (разновидности mask и т.д.). В любом случае вы их будете валидировать/реплейсить на бэкенде.

В форму можно очень просто передать любые значения, игнорируя скрипты. Полагаться на фронт - это недальновидность (имхо).

Аватар пользователя Mnilionic Mnilionic 1 октября 2019 в 17:40

Недальновидность - предполагать, что кто-то отказывается от валидации на бэкенде.
И мы ведём речь, сугубо, о косметическом характере, ведь заменить запятые на точки можно и в бэкенде, не так ли?

Аватар пользователя Mnilionic Mnilionic 30 сентября 2019 в 18:17

Знак, скорее всего, зависит от локали. Допускаю, что если добавить атрибут lang="en" в input элемент, будет форсироваться точка. Как это влияет на то, в каком виде отправляется на сервер - хрен его знает. Как оно себя ведёт в разных браузерах - надо пробовать.
Оптимальней использовать обычный text и добавить свою валидацию.

Аватар пользователя gun_dose gun_dose 1 октября 2019 в 20:58

Я давеча на реакте форму какую-то делал и очень удивился, что type="number" принимал и точку, и запятую, и корректно это дело сохранял. Я уже не помню, в чём там был подвох, но я был удивлён.

Что касается возможной замены на обычный текстовый инпут, нужно учитывать, что трафик с мобильных устройств на многих сайтах уже перевалил за половину, а тип инпута определяет, какая клавиатура появится при фокусировке. Согласитесь, что с мобилы набирать цифры на цифровой клавиатуре значительно удобнее. И ещё нужно учитывать, что типы email и tel тоже имеют свою специфическую клавиатуру.

Поэтому оптимальным решением будет ловить ввод через js и заменять разделитель на правильный.

Аватар пользователя adano adano 1 октября 2019 в 21:46

Я уже не помню, в чём там был подвох, но я был удивлён.

Да в браузерах всегда подвох.

Солидарен с email и tel. Они вполне юзабельны в html5.

Поэтому оптимальным решением будет ловить ввод через js и заменять разделитель на правильный.

Все же оптимальным будет отталкиваться от того, как данные хранятся в бд. Особенно по телефону, суммы транзакций и т.д. Или это только про точку речь?

P.S. Единственное, что хорошо в number - это реализация "штучного" поля. Атрибуты min, max, step - тут полезны.
Да и то, в лисе внешний вид этого поля убогий (имхо).

Аватар пользователя gun_dose gun_dose 1 октября 2019 в 22:54

Нет смысла отталкиваться от того, как данные хранятся в базе, т.к. на элементе уже есть валидация, которая всё преобразует в числовой формат, поэтому нужно только поменять разделитель на вводе, чтобы юзер не забивал себе голову.

Что касается разного вида в разных браузерах, то эти стрелочки можно выпилить в цсс.

Аватар пользователя adano adano 1 октября 2019 в 23:37

поэтому нужно только поменять разделитель на вводе, чтобы юзер не забивал себе голову.

Давай так:
Какая валидация отработает раньше: браузерная или джимкери с точкой?

А если нужно оставить стрелочки, но не страхожопные (с примером желательно)? Иначе в чем тогда смысл number?

Аватар пользователя gun_dose gun_dose 1 октября 2019 в 23:50

Естественно, js. Жквери должен срабатывать на изменение данных в инпуте, а браузерная валидация работает только на сабмите формы. Кстати, на друпаловских аякс-формах браузерная валидация не срабатывает, т.к. событие submit блокируется.

В чём смысл поля number - я уже писал выше.

Аватар пользователя adano adano 2 октября 2019 в 0:11

Ну да, не прав, жквери раньше. У меня pattern стоял, который на-лету ругается на значение (хром). Без паттерна норм все.