Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 19.09.2016, 14:03
Профессор
Отправить личное сообщение для warren buffet Посмотреть профиль Найти все сообщения от warren buffet
 
Регистрация: 08.07.2016
Сообщений: 1,332

Amnesia, не нужны никакие формы в таблице вообще. Она же никуда не отгружается, эта форма. У тебя же заказа уже в куках. На сервер поступает команда - сделай чек. Сервер берет куки и делает чек. Форма тут лишняя сущность и тавтология. Или у тебя военный сайт с корзиной в адресной строке, чтобы все работало и во время атомной бомбардировки без печенек?

На таблицу вешай листенер на клик и кейап, чтобы отслеживать нажатие кнопок в input type="num" и ручной ввод. Вот смотри как может быть устроен такой роутер

route=function(e){
	
		var	el=e.target,
			c=el.getAttribute('c'),
			r=el.closest('tr');
		
		if(!c || !r) return;
		
		var id=r.getAttribute('pd');
		
		switch(c) {
		
			case 'i': image_zoom(el); break;
			case 'v': if(el.value<=0) el.value=1; shCart.update(id,el.value,false); break;
			case 'd': remove_item(id,r); break;
			case 'r': Confirm('Список заказов будет очищен.',remove_all);
			return false;
		}

	},


Для сегрегации полей без беготни к заголовкам в 100500 раз проще отрендерить призаки в каждой строке и, чтобы вот так чпок - c=el.getAttribute('c') - и роуть.
Ответить с цитированием
  #22 (permalink)  
Старый 19.09.2016, 15:19
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от Amnesia
при добавлении форм
Зачем добавлять на страницу несколько форм?

Сообщение от Amnesia
указать id_form-0-buy_tabako_brand, чтобы скрипт автоматический отслеживал инкремент первого поля селекта, и подгружал второй селект необходимой формы
Зачем следить за инкрементом чего-то, если: а) связать элементы можно даже и по их индексам в наборе; б) форме как и серверу важны не id, а именование полей?
Ответить с цитированием
  #23 (permalink)  
Старый 19.09.2016, 15:55
Новичок на форуме
Отправить личное сообщение для Amnesia Посмотреть профиль Найти все сообщения от Amnesia
 
Регистрация: 19.09.2016
Сообщений: 3

Ребят, спасибо за первые ответы. Постараюсь понять о чем вы =))
Как и написал выше, изначально изучаю вообще Питон с Джанго. Просто понял, что его средствами это не сделать, начал искать готовые решения по добавлению и т.п. Понял, что нужен Jquery и т.п. Который подгружает список(Говорят, грузить весь список сразу это не по фен шую, чтобы боты не парсили, учимся сразу делать хорошо)..
Повторюсь, так какя понял, смысл всего этого слегка не понятен вам.. Это не магазин, как таковой. А мини СРМ система, вместо XLS.
Я к примеру закупаю товар -> захожу добавить покупку.
Открывается страничка. В ней сразу сформирован номер(ид корзины) будущей в названии и заголовке страницы.
И пустая таблица, чтобы ее наполнить - > создал форму одну, в ней как и говорил, выбирается Бренд(руками), далее подгружается(на данный момент работает) список моделей этого бренда и другая информация(всего 5 полей) и есть кнопка Сохранить, которая добавляет значение в базу и обновляет страницу. Все работает.


Но представим ситуацию, что у меня 20 купленных вещей и мне надо их внести в таблицу.
Я нашел готовый скрипт:
$(document).ready(function() {
    function updateElementIndex(el, prefix, ndx) {
        var id_regex = new RegExp('(' + prefix + '-\\d+-)');
        var replacement = prefix + '-' + ndx + '-';
        if ($(el).attr("for")) $(el).attr("for", $(el).attr("for").replace(id_regex,
            replacement));
        if (el.id) el.id = el.id.replace(id_regex, replacement);
        if (el.name) el.name = el.name.replace(id_regex, replacement);
    }
    function deleteForm(btn, prefix) {
        var formCount = parseInt($('#id_' + prefix + '-TOTAL_FORMS').val());
        if (formCount > 1) {
            // Delete the item/form
            $(btn).parents('.item').remove();
            var forms = $('.item'); // Get all the forms
            // Update the total number of forms (1 less than before)
            $('#id_' + prefix + '-TOTAL_FORMS').val(forms.length);
            var i = 0;
            // Go through the forms and set their indices, names and IDs
            for (formCount = forms.length; i < formCount; i++) {
                $(forms.get(i)).children().children().each(function() {
                    updateElementIndex(this, prefix, i);
                });
            }
        } // End if
        else {
            alert("Вы не можете удалить единственную форму");
        }
        return false;
    }
    function addForm(btn, prefix) {
        var formCount = parseInt($('#id_' + prefix + '-TOTAL_FORMS').val());
        // You can only submit a maximum of 10 todo items
        if (formCount < 10) {
            // Clone a form (without event handlers) from the first form
            var row = $(".item:first").clone(false).get(0);
            // Insert it after the last form
            $(row).removeAttr('id').hide().insertAfter(".item:last").slideDown(300);

            // Remove the bits we don't want in the new row/form
            // e.g. error messages
            $(".errorlist", row).remove();
            $(row).children().removeClass('error');

            // Relabel/rename all the relevant bits
            $(row).children().children().each(function() {
                updateElementIndex(this, prefix, formCount);
                if ( $(this).attr('type') == 'text' )
                    $(this).val('');
            });

            // Add an event handler for the delete item/form link
            $(row).find('.delete').click(function() {
                return deleteForm(this, prefix);
            });
            // Update the total form count
            $('#id_' + prefix + '-TOTAL_FORMS').val(formCount + 1);
        } // End if
        else {
            alert("Sorry, you can only enter a maximum of ten items.");
        }
        return false;
    }
    // Register the click event handlers
    $("#add").click(function() {
        return addForm(this, 'form');
    });

    $(".delete").click(function() {
        return deleteForm(this, 'form');
    });
});

Который добавляет(пока максимум до 10) формы, по кнопке Добавить. И все этого естественно так же сохраняется по кнопке Сохранить.

Теперь осталось единственное, чтобы вот этого скрипт,
$(document).ready(function() {
    $("#id_form-0-buy_tabako_brand").on('change', function title() {
        var id = $(this).val();
        $.ajax({
            data: {'id': id},
            url: '/tabako/add_cart/brand/',
            type: 'get',
            success: function (data) {
                var html = ""
                for (var i = 0; i < data.length; i++) {
                    html += '<option value="'+i+'">' + data[i].fields.tabako_titles_title + '</option>'
                }
                $('#title').html(html);
            }
        });
    });
})
который работает с с первой формой, а именно отслеживает изменение поле Бренд(id_form-0-buy_tabako_brand). И при выборе другого подгружает другие модели в этой же форме.

Как сделать так, чтобы в других формах, скрипт видел ID"id_form-Инкремент-buy_tabako_brand" или Имя поле"id_form-инкремент-buy_tabako_brand" и менял значение модели соответствующего поля. Эти имена задает скрипт, который я указал первый в этом сообщении.

Как сделать по другому через куки(как вы говорите), если здесь вроде бы все должно строго соответствовать??

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

Сообщение от Amnesia
Постараюсь понять о чем вы
Постараюсь пояснить, и речь не обязательно о марках и брендах. Главным должна быть цель, назначение.

Есть в базе N записей, при этом по первичному ключу она может принять еще всего лишь с десяток. Дабы предотвратить "переполнение" на клиенте можно организовать нумерацию добавляемых элементов, значения которых будут переданы серверу для записи. То есть добавлять сверх Nmax не разрешено, а связывать по этому номеру или нет, это уже вопрос вторичный.

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

Добавление новой формы в вашем случае есть дублирование каждой из форм, а значит нужно добавлять не формы с полями, а добавлять новый набор элементов в одну форму, именование которых есть вложенные массивы - name="field_name[]" и никаких номеров за которыми надо следить не требуется. А добавление элементов и обращение к ним, так если таблица, то помещается в TD, какие тут могут быть проблемы.
Ответить с цитированием
  #25 (permalink)  
Старый 19.09.2016, 17:27
Новичок на форуме
Отправить личное сообщение для Amnesia Посмотреть профиль Найти все сообщения от Amnesia
 
Регистрация: 19.09.2016
Сообщений: 3

Я понял о чем вы говорите, ну вот в Джанго есть такое понятие как FormSet, группа форм. Я его и использую, а внутри него каждое поле(у которого несколько значений), имеется свой ID.
При продумывании данного добавления, была возможность реализовать появление сразу таблицы с 10 рядами по 5 полей, но мне показалось это не красиво и не всегда нужно. Если к примеру нужно лишь добавить 1-2 элемента..

Так вот возвращаясь к вопросу:
<div class="item row">
                <div class="large-2 columns">
                    <label>Бренд</label>
                    <select id="id_form-2-buy_tabako_brand" name="form-2-buy_tabako_brand">
<option value="" selected="selected">---------</option>
<option value="1">Alfakher</option>
<option value="2">Habibi</option>
</select>
                </div>
                <div class="large-2 columns">
                    <label>Тип</label>
                    <select id="title">
                        <option value="" selected="selected">---------</option>
                    </select>
                </div>
                <div class="large-2 columns">
                    Фасовка:<select id="id_form-2-buy_tabako_type" name="form-2-buy_tabako_type">
<option value="50" selected="selected">50 грамм</option>
<option value="250">250 грамм</option>
<option value="500">500 грамм</option>
<option value="1000">1 килограмм</option>
</select>
                </div>
                <div class="large-2 columns">
                    Количество:<input id="id_form-2-buy_tabako_quantity" name="form-2-buy_tabako_quantity" type="number">
                </div>
                <div class="large-2 columns">
                    Цена:<input id="id_form-2-buy_tabako_price" name="form-2-buy_tabako_price" type="number">
                </div>
            </div>


Что нужно добавить,
<select id="title">
<option value="" selected="selected">---------</option>
</select>
В селект, какой-нибудь может тоже инкрементный ключ, чтобы например меняя первое поле

<div class="large-2 columns">
<label>Бренд</label>
<select id="id_form-2-buy_tabako_brand" name="form-2-buy_tabako_brand">
<option value="" selected="selected">---------</option>
</div>
, менялось и второе.
Неужели нет какого-то простого решения?
Ответить с цитированием
  #26 (permalink)  
Старый 19.09.2016, 17:42
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

name="form-2-buy_tabako_brand" - то есть вот такую абракадабру серверу обрабатывать само то?

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

В вашем же случае все зависит от удобства пользователю - либо пары списков, либо первичный один, но перемещаемый.

И если "чтобы например меняя первое поле, менялось и второе", это выбор в первичном списке и получение зависимого списка, то нумерация, это худшее что может быть, ибо обработчик в данном случае будет один, а он ну никак не может оперировать запросом к серверу вот таким бредом form-2-buy_tabako_brand , а если оперирует, то стоит только пожалеть сервер и базу данных, в которой не понять каким образом содержаться зависимые записи.
Ответить с цитированием
  #27 (permalink)  
Старый 20.09.2016, 07:43
Интересующийся
Отправить личное сообщение для Shurik Посмотреть профиль Найти все сообщения от Shurik
 
Регистрация: 17.01.2013
Сообщений: 25

Сообщение от warren buffet Посмотреть сообщение

На огромном числе сайтов фильтры товарных характеристик устроены именно так, или в основе своей так, но Шурик не таков. Чтобы не маяться с хтмлем, он нахерачит 24 одинаковых селекта и будет мараковать как обмануть природу.
Я не знал как правильно делается, поэтому и спросил, мне нормальный человек (не ты), объяснил как делать. Ты, видимо, родился со знанием как правильно сайты делать и никогда не допускал ошибок.
Ответить с цитированием
  #28 (permalink)  
Старый 20.09.2016, 11:05
Профессор
Отправить личное сообщение для warren buffet Посмотреть профиль Найти все сообщения от warren buffet
 
Регистрация: 08.07.2016
Сообщений: 1,332

Shurik, типа у тебя нет инета чтобы посмотреть как сайты делают, а как ты тогда без инета сюда пришел? Ладно, крутись на пупе дальше.
Ответить с цитированием
  #29 (permalink)  
Старый 20.09.2016, 11:11
Профессор
Отправить личное сообщение для warren buffet Посмотреть профиль Найти все сообщения от warren buffet
 
Регистрация: 08.07.2016
Сообщений: 1,332

Сообщение от Amnesia
ну вот в Джанго
При чем тут жанго-манго и питон-шмитон, если у тебя нет технического задания и даже нет моделей.

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

Если бы у тебя была модель, у тебя было бы ТЗ, а по ТЗ любой дурак на любом языке все напишет и даже сами компы уже давно умеют писать коды программ по документации.

Ты никогда не решишь свою проблему, потому что у тебя нет проблемы. А затыки с жангами - это другая проблема.
Ответить с цитированием
  #30 (permalink)  
Старый 20.09.2016, 11:23
Профессор
Отправить личное сообщение для warren buffet Посмотреть профиль Найти все сообщения от warren buffet
 
Регистрация: 08.07.2016
Сообщений: 1,332

Сообщение от Amnesia
Так вот возвращаясь к вопросу:
Это веб? Значит хтмл, цсс, жс. Все остальное нахер.

Так вот веб-страница динамического сайта - это интерфейс базы данных.

В зависимости от запроса ты получаешь выборку в виде списка токенов - рекордсета, или один токен - запись.

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

Так вот твоя "страница" где выбираешь бренд-шменд - это листинг. То есть результат выборки из БД из которой в свою очередь можно выбрать токен. И только выбрав токен ты можешь его "купить" или запомнить где-то.

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

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

Когда сумеешь в своей голове разделять получение данных и вывод данных, тогда сам увидишь какую ты нес ахинею.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Одним SELECT перезагрузить два фрейма. aggressive Элементы интерфейса 3 29.05.2016 18:37
сложить два SELECT ju39ks Общие вопросы Javascript 0 25.06.2014 17:18
Не могу связать два события для разных элементов. nono Элементы интерфейса 8 07.03.2013 19:36
Два взаимосвязанных select, + добавление произвольных в форму winter Общие вопросы Javascript 17 27.07.2012 18:31
Связать воедино два скрипта - возможно ли? Ransend Javascript под браузер 0 22.03.2011 23:07