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

    BRAGA96
    @BRAGA96
    Здесь я постарался описать основные моменты, если что-то забыл, то спрашивайте.
    Сам код плагина:
    (function($, window, undefined) {
    	'use strict';
    
    	/* Общие настройки плагина */
    	var plugin = {
    		name: 'plugin',
    		version: '1.0.0',
    		data: {
    			setting: 'setting',
    			general: 'general'
    		}
    	};
    
    	/* Настройки инициализации по умолчанию */
    	var defaults = {
    		color: 'red',
    		background: 'black',
    		padding: '10px'
    	};
    
    	var methods = {};
    
    	methods.init = function($this, options, common) {
    		/**
    		 * Записываем настройки плагина в $.data элемента,
    		 * чтобы потом в любой момент достать настройки 
    		**/
    		var setting = function() {
    			var params = $.extend(true, {}, defaults, options);
    			$this.data(plugin.data.setting, params);
    			return params;
    		}();
    
    		/**
    		 * Создаем общий объект свойств, которыми будем пользоватся
    		 * в методе init. Общий объект заменяет глобальные переменные в методе init,
    		 * так удобней и чище, все в одном месте. Не нужно на этом уровне создавать
    		 * var flag = true; и использовать его по всему коду init и в функциях замыкания,
    		 * лучше объект
    		**/
    		var general = function() {
    			var params = $.extend(true, {}, {
    				time: Date.now(),
    				context: $this.get(0)
    			}, common);
    			$this.data(plugin.data.general, params);
    			return params;
    		}();
    
    		/* Начало инициализации плагина */
    		$this.css({
    			color: setting.color,
    			background: setting.background
    		});
    
    		setPadding();
    		/* Конец инициализации плагина */
    
    		/* Функции в замыкании для видимости: $this, setting, general */
    		function setPadding() {
    			general.context.style.padding = setting.padding;
    		}
    	};
    
    	/**
    	 * Метод SET. Логика его в том, чтобы взять текущие настройки
    	 * плагина из $.data элемента, присоеденить свои
    	 * и переинициализировать плагин уже с новыми настройками
    	**/
    	methods.set = function(key, value) {
    		var setting = $(this).data(plugin.data.setting);
    		switch (typeof key) {
    			case 'string':
    				if (key.includes('.')) {
    					nestedObjectPath(setting, key, value);
    				} else {
    					setting[key] = value;
    				}
    				break;
    			case 'object':
    				setting = $.extend(true, {}, setting, key);
    				break;
    		}
    		return methods.init($(this), setting, {
    			type: 'update',
    			method: 'set'
    		});
    	};
    
    	methods.get = function(category, key) {
    		var section = $(this).data(category);
    		if (key) {
    			if (key.includes('.')) {
    				return nestedObjectPath(section, key);
    			} else {
    				return Object.getOwnPropertyDescriptor(section, key).value;
    			}
    		}
    		return section;
    	};
    
    	methods.destroy = function() {
    		$(this).removeData(plugin.data.setting).fadeOut(200, function() {
    			$(this).empty().show();
    		});
    	};
    
    	methods.version = function() {
    		return plugin.version;
    	};
    
    	/* Все остальные общие функции, которым не нужна область видимости init метода */
    	/**
    	 * Получить/установить значение объекта передав путь строкой ('price.current.USD')
    	 * @param {object} object - объект
    	 * @param {string} key - путь к свойству
    	 * @param {any} value - значение
    	 * @returns {any} - значение свойства объекта
    	**/
    	function nestedObjectPath(object, key, value) {
    		var path = key.split('.');
    		var get = function(path, object) {
    			return path.reduce(function(previous, current) {
    				return previous[current];
    			}, object);
    		};
    		if (value) {
    			var way = path.pop();
    			get(path, object)[way] = value;
    			return object;
    		} else {
    			return get(path, object);
    		}
    	}
    	/* Конец объявления общих функций */
    
    	/* Инициализации плагина и запуск методов */
    	$.fn[plugin.name] = function(setting) {
    		if (typeof setting === 'object' || !setting) {
    			return $.each(this, function() {
    				methods.init($(this), setting, {
    					type: 'init',
    					method: 'init'
    				});
    			});
    		} else if (typeof setting === 'string') {
    			var params = Array.prototype.slice.call(arguments, 1);
    			var context = this.get(0);
    			switch(setting.toLowerCase()) {
    				case 'set':
    					return methods.set.apply(context, params);
    				case 'get':
    					return methods.get.apply(context, params);
    				case 'destroy':
    					return methods.destroy.call(context);
    				case 'version':
    					return methods.version();
    			}
    		}
    	};
    
    })(jQuery, window);


    Использование плагина, методы:
    /* Инициализация плагина с параметрами по умолчанию */
    $('div').plugin();
    
    /* Инициализация плагина с параметрами */
    $('div').plugin({
    	color: 'green',
    	background: 'white'
    });
    
    /* Изменим параметры плагина, например по клику кнопке */
    $('button').on('click', function() {
    	$('div').plugin('set', 'color', 'yellow');
    });
    
    /* Или передадим больше параметров для изменения */
    $('button').on('click', function() {
    	$('div').plugin('set', {
    		color: 'black',
    		background: 'white'
    	});
    });
    
    /**
     * Если у нас в настройках вложенные объекты
     * то для этого мы объявили функцию nestedObjectPath
     * и описали логику в методах set и get
     * У нас появилась возможность одной строкой 
     * имзенить/получить свойства вложеных объектов
    **/
    $('div').plugin('set', 'color.theme.light', 'white');
    
    /* Или передадим объектом */
    $('div').plugin('set', {
    	color: {
    		theme: {
    			light: 'white'
    		}
    	}
    });
    
    /* Получить настройки/параметры плагина */
    var color = $('div').plugin('get', 'setting', 'color');
    
    /* Или получим general объект */
    var time = $('div').plugin('get', 'general', 'time');
    
    /**
     * Отвяжем/разрушим плагин.
     * Этот метод индивидуальный для каждого плагина
     * и данный пример не является универсальным для всех плагинов
    **/
    $('div').pluign('destroy');
    
    /* Получить текущюю версию плагина */
    $().plugin('version');


    Поповоду ошибок в вашем плагине:
    Никогда так не делайте, вставка в DOM должна быть только одна:
    item.append(inputFile).append(inputText).append(preview);
    this.append(item);
    Ответ написан
    5 комментариев
  • Возможно ли на laravel сделать фильтр товаров такого типа?

    @Yan-s
    Конечно возможно, только laravel тут не причем.

    Если вы не знаете как в ларе прокинуть данные из урл в качестве параметра вместе со слешами, то вам стоит почитать доку.
    // Route
    Route::get('/some/{filter?}', 'SomeController@someMethod')->where('filter', '(.*)');
    
    // ----
    
    // Conroller
    public function someMethod($filter = null)
    {
        dd($filter);
    }
    Ответ написан
    1 комментарий
  • Что случилось с laravelcollective после обновления?

    v_decadence
    @v_decadence
    https://github.com/LaravelCollective/html/issues/531
    Я убрал это поведение по умолчанию, потому что оно не нравилось многим пользователям, теперь нужно включать через
    Form::considerRequest(true)

    Пакет поддерживается кое-как, поэтому они то забьют на репозиторий на год, потом скопом разгребают PR, то забывают перенести функционал из старых веток в новые.
    Ответ написан
    5 комментариев
  • Как можно спроектировать базу данных интернет магазина с вариантами товаров?

    SilenceOfWinter
    @SilenceOfWinter
    та еще зажигалка...
    грубо говоря:
    products (id, name) - товары
    features (id, name) - характеристики
    feature_values (id, feature_id, value) - значения характеристик
    product_skus (id, product_id, name, price, qty) - артикулы
    sku_features (sku_id, feature_id, feature_value_id) - характеристики артикула
    Ответ написан
  • Как сделать такие шикарные ЧПУ для фильтров в каталоге?

    @D3lphi
    Стесняюсь спросить, чего тут шикарного? То что находится после poe.trade/search/ это просто идентификатор поискового запроса, который где-то у них хранится. При изменений параметров поиска, создается запись, например, в БД в которой и хранятся все эти параметры. Передавать это все в виде GET-запроса не очень, так как очень много разных параметров для фильтрации. При переходе по ссылке из хранилища достается запись с полученным идентификатором из url'а и производится фильтрация.
    Ответ написан
  • Как сделать такие шикарные ЧПУ для фильтров в каталоге?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега Laravel
    Нужно просто в каком-то хранилище (БД или Redis, например) сопоставить параметры запроса с уникальной строкой. При получении запроса получаем параметры из хранилища, вместо request()->get('foo') и работаем с ними как обычно.
    Ответ написан
    3 комментария
  • Как разрабатываются такие сайты?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    300 баксов за такое? Не смешите. Чтобы сделать все точь в точь как на гифке, с хорошей браузерной поддержкой, идеальной плавностью, и самое главное, ОТЛИЧНОЙ ПРОИЗВОДИТЕЛЬНОСТЬЮ, вам понадобится несколько десятков человеко-часов приличного специалиста, рейт которого стартует с 30$/h наверное. Я естественно говорю не только о том что на гифке, но и об остальном контенте, который тоже будет соответствующего уровня.

    Большинство местных "спецов", которые тут пишут "да там все просто, бах бах пара трансформов", на деле мощно так обделаются когда их анимация полноэкранного транзишена картинки будет адово тормозить на fullHD+ экране, и при этом выглядеть она будет крайне паршиво на фоне отполированного оригинала.

    Тут даже дело не в каких-то магических и крайне специфичных навыках, тут дело в опыте работы именно с такими штуками. Полировка таких вот "утонченных" анимаций может с легкостью забирать часы, особенно когда начинаются проблемы с перформансом или специфичными багами браузеров, из-за проблем со слоями и прочей чехардой.
    Ответ написан
    1 комментарий
  • Можно ли в OpenCart настроить ЧПУ таким образом, чтобы урлы не имели категорий и подкатегорий?

    zoozag
    @zoozag
    Opencart
    В ocStore точно можно выбирать тип seo_url с категориями или без.
    В обычном Opencart работают все типы ссылок, придется чуть допилить, чтобы был правильный canonical
    Ответ написан
    Комментировать
  • Что происходит с функцией preg_match в данном случае, мистика php?

    @Arekusei
    Проверьте ещё кодировки.
    Если весь код запихнуть в кодировку отличную от юникода, то получите `00`
    Если всё запихнуть в юникод, то получите `11`.
    Вообще больше похоже именно на проблемы кодировок и регулярок.
    Ответ написан
    Комментировать
  • Не могу понять, как реализован прием платежей на моём портале. Как влиять на сумму?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Наверно...
    Ответ написан
    Комментировать
  • Как правильно позиционировать фон сайта, взятый из CSS спрайта?

    @devstudent
    frontend-developer
    уберите фон из спрайта в отдельный файл, спрайт используйте только для маленьких изображений.
    Ответ написан
    Комментировать
  • Сколько может стоить такого рода сайт, если видео, фото и остальной контент предоставляет пользователь?

    webirus
    @webirus
    Тыжверстальщик! Наверстай мне упущенное...
    В IT сфере, К СОЖАЛЕНИЮ, нет средних цен.
    Вот вам товарищи два написали: 120к и 10к.
    За цены 10к я бы лично на кол сажал, так как эти "умельцы" сильно сбивают рынок.
    Я считаю адекватной ценой за эту работу 80-100к. Как фрилансер.
    Как представитель студии назвал бы 200-300к.
    Думаю, что другие студии меня тоже на кол захотят посадить.
    Но это уже совсем другая история :)
    Все зависит от каждого конкретного исполнителя.
    PS: Исправил цены. Это не лендинг.
    Ответ написан
    Комментировать
  • Сколько может стоить такого рода сайт, если видео, фото и остальной контент предоставляет пользователь?

    речь идет о посадочной, я так понимаю?

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

    вообще я никогда не задумывался о разнице в цене от того, предоставляет заказчик что-либо или нет.
    не вижу разницы между гуглением нужных материалов и получением их у заказчика
    Ответ написан
    8 комментариев
  • Как заставить отработать скрипт заного при разрые соединения с сервером?

    crazy_str
    @crazy_str
    web-программист
    Проверяешь если к базе не было соединения то создаёшь файл с этой транзакцией к примеру
    transaction.ini или json с информацией которую нужно было занести в базу а потом кроном чекаешь каждые 5 минут обработчик который будет выполнять необходимые запросы из файла.
    Ответ написан
    6 комментариев
  • Yii. Как провести валидацию нескольких наборов полей в массиве MySQL и вывести ошибки в форму?

    kawabanga
    @kawabanga
    www.yiiframework.com/doc/guide/1.1/ru/form.table
    обработка табличного ввода.

    А создавать или обновлять, можно сделать примитивно. делаете hidden поле с id позицией. если id в post не приходит, то создавайте модель, иначе обновляйте.
    Ответ написан
    Комментировать
  • Стоит ли отказываться от JS в мобильных версиях сайта?

    svfat
    @svfat
    ☺Нужен VPS? Два месяца бесплатно. Смотри профиль☺
    Мобильная версия сайта - это какой-то пережиток прошлого. Мобильный интернет копейки стоит - пользователи на ютубе видюшки смотрят через 3G, а вы заботитесь о трафике с вашего сайта. Надо делать одну нормальную версию которая будет одинаково хорошо смотреться на любых устройствах.
    Ответ написан
    8 комментариев
  • Yii. Каким образом лучше сделать insert через одну форму сразу в несколько таблиц в БД?

    @olegf13
    Можно сделать отдельный экшн контроллера с примерно следующим:
    <?php
    $dbTransaction = $Yii::app()->db->getCurrentTransaction();
    if (!$dbTransaction) {
    	$dbTransaction = Yii::app()->db->beginTransaction();
    }
    
    $productModel = new Product;
    $productModel->attributes = $prodAttrs;
    if (!$productModel->save()) {
    	$dbTransaction->rollback();
    	throw new CException("some");
    }
    
    foreach ($productModes as $productModeAttrs) {
    	$productModeModel = new productMode;
    	$productModeModel->attributes = $productModeAttrs;
    	$productModeModel->product_id = $productModel->id;
    	if (!$productModeModel->save()) {
    		$dbTransaction->rollback();
    		throw new CException("some");
    	}
    }
    
    // похожее с фото товаров
    
    $dbTransaction->commit();
    
    // redirect/render/return метода контроллера
    Ответ написан
    Комментировать
  • Yii Relations. Как выбрать правильно уникальные значения из связанной таблицы?

    Так как связь variations используется не только в контексте size, нужно создать для этого отдельную связь где в параметрах указать выборку только уникальных значений size, либо перебирать массив
    Ответ написан
    Комментировать
  • Когда в PHP использовать интерфейсы, а когда абстрактные классы?

    try4tune
    @try4tune
    С точки зрения архитектуры:

    Интерфейс описывает свойства. Обратите внимание на классические названия интерфейсов: Throwable, Countable, Comparable, Iterable и т.д. Возьмем, к примеру, интерфейс Rollable (катящийся), и Foldable (складывающийся).

    Абстрактный класс же описывает сущность. Например, стол: Table_Abstract. Стол может быть деревянным, тогда будет Table_Wood extends Table_Abstract. Также стол может быть хирургическим: Table_Surgical extends Table_Abstract. В таком случае Table_Abstract объединяет общий свойства всех столов (скажем, площадь поверхности, наличие ножек и т.п.). А конкретный класс описывает сущность определенного типа столов.

    Связью же интерфейсов и классов Вы описываете свойства. Например, стол можно катить: Table_Abstract implements Rollable. Деревянный стол, например, можно сложить: Table_Wood implements Foldable.
    Ответ написан
    5 комментариев