Показать сообщение отдельно
  #11 (permalink)  
Старый 16.03.2017, 06:06
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

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

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

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

Самое простое, это автоматическое формирование уникального ID непосредственно базой данных, начиная от 1.

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

Пусть в базе имеется две пиццы под идентификаторами 23 и 17. Для того чтобы получить на сервере что выбрал клиент, нужно всего лишь связать по этим идентификаторам радио кнопки и их формы. Все, кучи абстрактных циферок втыкаемых везде по всей странице совсем не нужно.

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script> 
$(function() {
    $('button.order').click(function() {
        $('<form id=' + 
        $(this).data('form') + '><input value="' + 
        $(this).parent().find('h4').text() + '"><button>Заказать</button></form>').appendTo('body').submit(function(e) {
            e.preventDefault();
            alert(JSON.stringify($(this).serializeArray()))
            $(this).remove()
        })
    })
});
</script> 
</head>
<body>
<div>
    <h4>Пицца с сыром</h4>
    <label><input form="23" type="radio" name="size[23]" value="1" checked="" /> 23 см</label> 
    <label><input form="23" type="radio" name="size[23]" value="2" /> 30 см</label>
    <label><input form="23" type="radio" name="size[23]" value="3" /> 36 см</label>
    <button class="order" data-form="23">Заказать</button>
</div>

<div>
    <h4>Пицца без сыра</h4>
    <label><input form="17" type="radio" name="size[17]" value="1" checked="" /> 23 см</label> 
    <label><input form="17" type="radio" name="size[17]" value="2" /> 30 см</label>
    <label><input form="17" type="radio" name="size[17]" value="3" /> 36 см</label>
    <button class="order" data-form="17">Заказать</button>
</div>
</body>
</html>


Как видим наличия скрытых полей в форме для передачи выбора совсем не требуется, вся информация нужная серверу передается самими кнопками. Сервер получит массив size, в котором ключ будет идентификатором товара, по которому легко проверить действительно ли это товар, а значением его характеристика, которую также легко проверить. Если запрос в базу по этим параметрам вернул и название пиццы, и ее размер, значит заказ не фейковый, по крайней мере на 20%.

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

Последний раз редактировалось laimas, 16.03.2017 в 06:16.
Ответить с цитированием