• Как сделать реинициализацию плагина?

    @flammerman Автор вопроса
    Да там так и есть, метод setActions вызывается при добавлении нового итема в контейнер и навешивает все необходимые приблуды на кнопки. И при инициализации также вызывается и навешивает все тоже самое на текущие итемы, добавленные ранее. Только кода конечно раз в 5 меньше.

    return item.append([inputFile, inputText, preview, buttonRemove]); - поправил как вы сказали в один вызов ааппенда
  • Как сделать реинициализацию плагина?

    @flammerman Автор вопроса
    Плагин привязался к контейнеру. Внутри контейнера могут быть сгенерированы серверным кодом уже готовые элементы. Плагин при инициализации через метод init добавил в контейнер кнопку "добавить новый элемент". Также добавил и сам элемент. Далее при нажитии на кнопку добавляются новые элементы. Внутри каждого элемента есть еще обьекты (кнопки, поля). На каждый такой обьект добавляются разные события (click, change).
    В кратце, не получается без реинициализации вручную плагина, в условиях динамичного DOM внутри контейнера, вешать события(click, change) на элементы которые были добавлены позже. Плагин после load документа видит только те элементы дом которые были добавлены ранее. В общем что я наваял уже позже, пока работает.
    (function($){
    	
    	$.fn.appInputImage = function(options) {
    	  	
    		var settings = $.extend({
    
    	    	container: $('.preview'),
    	    	before: function(){},
    	    	success: function(){}
    
    	    }, options);
    
    	  	this.on('change', function() {
    			if (this.files) {
    				
    	            for (i = 0; i < this.files.length; i++) {
    	            	var file = this.files[i];
    	                var reader = new FileReader();
    	                reader.onload = function(e) {
    	                    var image = '<img src="'+e.target.result+'" data-name="'+file.name+'" alt=""/>';
    	                    settings.container.html(image);  
    	                }
    	                reader.readAsDataURL(file);
    	            }
    
    		    }
    	    })
    
    	};
    	
    	$.app.appProductGallery = {
    		init: function(options){ 
    			
    			return this.each(function(){
    				
    				var _this = $.app.appProductGallery;
    				var element = $(this);
    				var id = 0;
    
    				_this.setActions($(this).find('.apg-item'));	
    				
    				_this.buttonAdd().on('click', function(){
    					var item = _this.makeItem(id).appendTo(element);
    					_this.setActions(item);
    					id = _this.setNext(id);
    				}).prependTo(element);
    	
    			})
    
    		},
    		makeItem: function(id){
    			var num = $('<div/>', {class: 'apg-num'}).text(id);
    			var item = $('<div/>', {class: 'apg-item', 'data-id': id});
    			var inputFile = $('<input/>', {class: 'form-control app-input__file', type: 'file', name: 'images['+id+'][image]'});
    			var inputText = $('<input/>', {class: 'form-control app-input__text', type: 'text', name: 'images['+id+'][title]'});
    			var preview = $('<div/>', {class: 'item-preview'});
    			var buttonRemove = $('<button/>', {class: 'btn btn-danger button-remove', type: 'button'}).text('remove');
    			item.append(inputFile).append(inputText).append(preview).append(buttonRemove).append(num);
    			return item;
    		},
    		setActions: function(item){
    			item.find('input[type="file"]').appInputImage({
    				container: item.find('.item-preview')
    			});
    			item.find('.button-remove').on('click',function(){
    				item.remove();	
    			});
    			return item;
    		},
    		setNext: function(id){ 
    			return id + 1;
    		},
    		buttonAdd: function(id){ 
    			return $('<button/>', {class: 'btn btn-default api-button-add', type: 'button'}).text('add');
    		},
    	};
    
    	$.fn.appProductGallery = function(method) {
    		if ($.app.appProductGallery[method]) {
    			return $.app.appProductGallery[method].apply(this, Array.prototype.slice.call(arguments, 1));
    		} else if (typeof method === 'object' || !method) {
    			return $.app.appProductGallery.init.apply(this, arguments);
    		} else {
    			$.error('Метод ' +  method + ' в jQuery.appProductGallery не существует');
    		}   
    	};
    
    })(jQuery);


    5b3dd9c6b96c2405366806.jpeg
  • Как сделать реинициализацию плагина?

    @flammerman Автор вопроса
    Очень приятный, развернутый пример. Спасибо. В общем я понял, надеюсь, правильно, что надо каждый раз вызывать инит плагина, при каждом изменении внутреннего DOM
  • Возможно ли на laravel сделать фильтр товаров такого типа?

    @flammerman Автор вопроса
    Спасибо за наводку, это уже "кое что". =) Я знаю что у ларавелки огромный функционал, но просто не всегда догадаешься что он есть для той или иной задачи.
  • Возможно ли на laravel сделать фильтр товаров такого типа?

    @flammerman Автор вопроса
    Это понятно. Обычные фильтры я сам делал много раз, там просто отправляется форма фильтра гетом с выбранными данными на туже самую страничку, или куда-то в ... /filter/ где их принимают, форма выставляет какие пункты стали активные в зависимости от выбора. Но. Реквест то приходит стандартный и его не надо парсить, все понятно, есть обычный $request где все в обычном массиве.

    Я 1 раз сталкиваюсь с такой задачей, думаю может это будет как-то так. Отправляем поля формы в контроллер, делаем выборку по ним, ура, есть массив с товарами, передаем их во вьюху, все как обычно, вместе с атрибутами для формы, а далее неизвестность, по стандарту сформируется то же запрос гет какой и был в начале. Там надо делать редирект 301 на новый урл или как. Вот в чем вопрос. Кажется ответ близко, но постоянно ускользает =)
  • Возможно ли на laravel сделать фильтр товаров такого типа?

    @flammerman Автор вопроса
    Ну в общем то я и сам заметил, что это не прямой запрос к БД =) Это на выходе обычный slug, правда разделенный слешами, что ларавел на сколько я знаю по умолчанию пытается распарсить на action контроллера. Видимо нету тут ни у кого опыта создания таких штук ... Все как-то больше смеются над этой задачей, а возможные специалисты отвечаются просто "да, можно". =)
  • Что случилось с laravelcollective после обновления?

    @flammerman Автор вопроса
    А смысл использовать две одинаковые формы, по факту разница между update and create в текущих данных. update они есть, create их нет. Всегда думал что код надо максимально использовать повторно. Но конечно опыта работы с ларавел маловато пока и оптимизировать все очень сложно. Например у laravelcollective есть классные мутаторы для форм https://laravelcollective.com/docs/5.4/html#form-m...
    use FormAccessible;
     /**
         * Get the user's date of birth for forms.
         *
         * @param  string  $value
         * @return string
         */
        public function formDateOfBirthAttribute($value)
        {
            return Carbon::parse($value)->format('Y-m-d');
        }


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

    public function formFeaturesAttribute()
        {
            return $this->values->where('feature_id', 3)->first()->value; // Условно что-то там получаем через реляцию "values" и выводим в форму
        }
    {{ Form::text('features') }}


    Но как сделать
    {{ Form::text('features[feature_id][20]') }}

    Где 20 идентификатор значения в таблице features (id, value) Просто чтоб мутатор "formFeaturesAttribute" понимал что-то из названия кроме одного слова =) и смог вывести значения в форму самостоятельно. Да вообще перед выводом значения/ий поля в форме была бы возможность указать каак-то зацепки откуда данные брать. У меня например все атрибуты в форме лежать в массиве features, помимо этого есть еще несколько массивов с полями, например product или sku.

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

    @flammerman Автор вопроса
    Если честно, использование одной формы для create и update просто ужасно неудобное, если форма чуть крупнее бложика. Вообще думаю перейти на ручное написание форм, всеравно приходится так или иначе передавать во вьюху миллион параметров вместо одного обьекта с кучей реляций. Очень слабый пакет, хорошо что они оставили возможность передачи данных через принудительное указание. Иначе там вообще функционала не остается =)
  • Что случилось с laravelcollective после обновления?

    @flammerman Автор вопроса
    Спасибо, выручили. 3-й час голову ломаю что я натворил с системой, пока не откатил на предыдущую версию до обновления и понял что там работает все отлично =)

    Почему такая система не удобна... В моем случае отстуствие этой системы заставляет описать много лишнего кода для обработки и передачи текущих значений.
  • Как поставить значение по умолчанию атрибута модели в процессе update с fillable полями?

    @flammerman Автор вопроса
    lavren, В плане пользователей все ситуативно, я делю на 2 группы таблиц для простых пользователей и администраторов =). Админов никто не может никак зарегать, кроме root админа. Для проверки полей вроде как есть валидаторы и мидлвейры, мидлвейр может не дать пользователю сделать себя админом без каких-либо прав заранее обозначенных

    $request->has('published') ? 1 : 0;

    Это поприятнее чем переопределение метода update. Надо будет потестить потом

    В ларавел тысячи методов, но блин, хреново когда их не знаешь или не догадаешься что они есть =)
  • Как поставить значение по умолчанию атрибута модели в процессе update с fillable полями?

    @flammerman Автор вопроса
    1. Попробую ради эксперимента $request->only(['необходимые', 'поля', 'published']) - хоть это и не совсем удобно, что надо в упор, каждый раз, показывать реквесту поля =)
    3.
    Не отрабатывает, точнее отрабатывает только при create. При update если в request поля published нет, ларавел его пропускает вообще, при этом мутатор запускается, но не видит совсем получаемое $value (ни isset($value) ни is_null($value) - не помогают). Соотвественно остается значение, которое было записано в базу ранее. Что, собственно, вполне логично, если пользователь не использует в форме поле - значит не надо его трогать
  • Laravel Eloquent как правильно организовать форму добавления товара со множеством атрибутов и опций?

    @flammerman Автор вопроса
    Да так упрощенно и получается, только добавляя доп. логику, например группа характеристик, опции, изображения, СЕО итд, все в 1 форму =)

    То есть, будет нормально какой-нить лапшевидный код только в 1 Action controller'a для сохранения данних из формы 4-6 моделей? Не сарказм, просто спрашиваю. Ведь по факту вся эта форма очень большая, из многих вкладок, загружается в одном методе контроллера.

    Нет примера кода солидного проекта ? +) просто посмотреть как там все устроено, как лучше организовать код для получения или сохранения данных в одном методе контроллера, может использовать для этого какие-либо dataProvider Как в Yii или Интерфейсы, например ProductEditInterface, где будет тучка методов работающих с данными из нескольких моделей. Или нужно абсолютно всю логику реализовать только в модели сущности которую редактируем.
  • Как поставить значение по умолчанию атрибута модели в процессе update с fillable полями?

    @flammerman Автор вопроса
    Да, в процессе посмотрим, может и на клиент переложить эту функцию. Как не догадался с переопределением метода, главное до laravel работал с yii там постоянно это делать надо было =)

    public function update(array $attributes = [], array $options = [])
        {
            $attributes['published'] = isset($attributes['published']) ? $attributes['published'] : 0;
    
            parent::update($attributes,$options);
        }


    Надеюсь все правильно
  • Что нужно сделать в Laravel 5.6, чтобы фреймворк понимал эту конструкцию?

    @flammerman Автор вопроса
    iljaGolubev, я пакет удалил, решил сделать по аналогии некоторые вещи что в пакете. + перенес роуты админки в корневую папку routes. так феншуйнее
  • Как можно спроектировать базу данных интернет магазина с вариантами товаров?

    @flammerman Автор вопроса
    Антон Шаманов, да, сейчас уже настроен роутер на поле slug ибо после переноса терять трафик поисковый благодаря новым урлам - совсем не камильфо =) Хотя да в новом шопе можно и по ИД и т.д. Но там схема простая по типу моей, такую сделать легко, без заморочек
  • Как можно спроектировать базу данных интернет магазина с вариантами товаров?

    @flammerman Автор вопроса
    Антон Шаманов, На схеме можно левые поля не добавлять =) добавить их потом. К тому же SKU добавить что угодно, даты, активен/неактивен, и прочее по вкусу
  • Как можно спроектировать базу данных интернет магазина с вариантами товаров?

    @flammerman Автор вопроса
    Антон Шаманов, посмотрел на велосипед =) Только не понял как там реализованы варианты, например размеров/цен. Помоему там не хватает еще 1 таблички - сущности товара, которая будет содержать хотябы УРЛ =)
  • Как можно спроектировать базу данных интернет магазина с вариантами товаров?

    @flammerman Автор вопроса
    Антон Шаманов, Да система там не похожа вообще помоему ни на одну ЦМС, они даже модикс обозвали CMF - от слова фреймворк. И отчасти правда, очень чистая дефолтная система, косяки есть, как и везде по типу view в базе, хотя, сомнительно, у меня некотррые клиенты спокойно редактируют шаблоны не парязь про фтп, IDE. 2 кнопки нажав. Очень слабая поддержка к сожалению именно версии MODX EVO - старой ветки развития
  • Как можно спроектировать базу данных интернет магазина с вариантами товаров?

    @flammerman Автор вопроса
    Антон Шаманов, Она просто вспомогательная, убрал ее. Чтоб не мозолила глаза =) www.laravelsd.com/share/ZjzprC Полностью вам верю может и х...ня =) Но

    Модель из трех оставшихся таблиц работает, Через реляцию (в ларавеле PIVOT table) легко выводит продукт + набор значений + название характеристик, но это примитив конечно, такая система сейчас стоит, да работает, но не то =) не серьезно. и кстати не поддерживает наборы опций заранее предустановленных (но это потому что просто нету дополнительного поля в таблице с типами характеристик - "options") это модиксовская схема, там В options можно вывести что угодно с разделителями и тип поля указать select, тогда система спарсит и выведет в виде html->select поля