• Сколько сейчас может зарабатывать PHP программист-фрилансер на российском рынке?

    RicoX
    @RicoX
    Ушел на http://ru.stackoverflow.com/
    Как и в любой другой специальности, за сколько сможете себя продать, столько и будете зарабатывать, для фрилансера нет стабильного месячного оклада, его кормят ноги, будете хорошо бегать и находить заказы - будете вкусно кушать, все просто. Сможете продать себя за 20$ в час и загрузить 100 часов в месяц - получите 2000, сможете продать дороже или отработать больше - получите больше, не сможете - получите меньше или ничего.
    Ответ написан
    4 комментария
  • Как защитить от DDOS сайт на bitrix?

    Так проблема в том что вас DDOSят или в том что все тупит на битриксе?
    Это две разных проблемы и решать их надо по разному и в разных местах.
    Про DDOS вам уже ответили - фильтровать трафик. Пакеты не должны даже до сервера долетать, не говоря уже о bitrix'е.
    man iptables.

    По поводу битрикса - включите кэширование в компонентах - какая разница сколько у вас обращений будет к главной, если со включенным кэшем скажем на 10 часов, ваши тяжелые, неоптимизированные запросы будут выполнятся не чаще чем раз в 10 часов? Хоть задэдосься. Компонент один раз отработает и будет выплевывать код из файла кэша пока он не устареет.
    Ответ написан
    3 комментария
  • Как хранить app_secret API с oauth в web клиенте (javascript)?

    TrogWarZ
    @TrogWarZ
    web developer
    Здравствуйте, vermus. Нашли ли решение данного вопроса?
    Ответ написан
    2 комментария
  • Как собрать и минифицировать CSS и JS в Yii2?

    @ph4n70m
    Разобрался.
    Качаешь отсюда https://developers.google.com/closure/compiler/ jar и кидаешь в корень проекта

    npm i yuicompressor - и тащишь yuicompressor.jar тоже в корень

    Создаёшь файл через ./yii asset/template config/minify.php

    Убираешь комментарии с двух строк вверху (где константы) и внизу. А также "раскомменчиваешь"
    'bundles' => [
    'app\assets\AppAsset',
    'yii\web\YiiAsset',
    'yii\web\JqueryAsset',
    ],

    и всё. можешь запускать
    ./yii asset config/minify.php assets/app_min.php

    На выходе будет файл в assets/app_min.php который и подключаешь к проекту
    Ответ написан
    Комментировать
  • Какие дисциплины изучать программисту чтобы меньше зависеть от языков и технологий?

    vvpoloskin
    @vvpoloskin
    Инженер связи
    Идите в грузчики - нет никакой зависимости от языков программирования, практически не надо изучать ничего нового, если только на погрузчик сдавать.
    Ответ написан
    Комментировать
  • Табы на angularjs, как делать условие ?

    sensus
    @sensus Автор вопроса
    Обновил вопрос, решение предоставил =)
    Ответ написан
    Комментировать
  • Как правильно получать данные из БД в стиле MVC?

    anton_slim
    @anton_slim
    web разработчик
    По мне, лучше использовать отдельные модели независимые ни от ActiveRedord ни от mysql и чего-либо другого.
    Это позволит внедрить свой определенный формат запроса к модели независимо от того какая БД используется.

    К примеру решил ты перейти на другую базу, например redis, тогда тебе придется переписывать все контроллеры.
    А так тебе достаточно будет переделать модель usersModel под новую БД и вуаля все будет работать.
    Твои контроллеры не должны знать как и откуда модель получает данные, но контроллеры должны знать четко в каком формате передавать в модель параметры.
    Ответ написан
    Комментировать
  • Проектирование веб-программы, правильно ли я сделал?

    anton_slim
    @anton_slim
    web разработчик
    В абстрактном классе обязательно должен быть объявлен хотя бы один абстрактный метод и возможно какие то общие методы для всех потомков (любой области видимости public, protected, private). У интерфейса могут быть объявлены только публичные методы.
    Соответственно судя из вашей логики абстрактного класса, вам нужно все методы сделать
    abstract public function без тела и сам класс объявить как abstract class AbstractTasksManager

    Соответственно ваш код примет примерно такой вид:
    <?php
    
    interface TasksManagerInterface 
    {
    	public function find(TaskInterface $task);
    	public function create(TaskInterface $task);
    	public function update(TaskInterface $task);
    	public function delete(TaskInterface $task);
    }
    
    interface TaskInterface 
    {
        public function find(TaskInterface $task);
        public function create(TaskInterface $task);
        public function update(TaskInterface $task);
        public function delete(TaskInterface $task);
    }
    
    
    abstract class AbstractTask implements TaskInterface
    {
        protected function _commonTask() {
            // какой то общий метод для всех потомков AbstractTask
        }
    
        abstract public function find(TaskInterface $task);
    
        abstract public function create(TaskInterface $task);
    
        abstract public function update(TaskInterface $task);
    
        abstract public function delete(TaskInterface $task);
    }
    
    abstract class AbstractTasksManager implements TasksManagerInterface
    {
        protected function _commonTasksManager() {
            // какой то общий код для всех потомков AbstractTasksManager
        }
    
        abstract public function find(TaskInterface $task);
    
        abstract public function create(TaskInterface $task);
    
        abstract public function update(TaskInterface $task);
    
        abstract public function delete(TaskInterface $task);
    }
    
    
    
    class Task extends AbstractTask implements TaskInterface
    {
        public function find(TaskInterface $task)
        {
            /** Внедрить метод find в TasksManager правильно?
             * Или он должен быть в отдельном классе?
             * Метод find использует скоупы Yii2
             */
    
            // можно вызывать
            $this->_commonTask();
        }
    
        public function create(TaskInterface $task)
        {
            /** Содержимое метода */
        }
    
        public function update(TaskInterface $task)
        {
            /** Содержимое метода */
        }
    
        public function delete(TaskInterface $task)
        {
            /** Содержимое метода */
        }
    }
    
    class TasksManager extends AbstractTasksManager implements TasksManagerInterface
    {
        public function find(TaskInterface $task)
        {
            /** Внедрить метод find в TasksManager правильно?
             * Или он должен быть в отдельном классе?
             * Метод find использует скоупы Yii2
             */
    
            // можно вызывать
            $this->_commonTasksManager();
        }
    
        public function create(TaskInterface $task)
        {
            /** Содержимое метода */
        }
    
        public function update(TaskInterface $task)
        {
            /** Содержимое метода */
        }
    
        public function delete(TaskInterface $task)
        {
            /** Содержимое метода */
        }
    }
    $task = new Task();
    $taskManager = new TasksManager();
    Ответ написан
    3 комментария
  • Проектирование веб-программы, правильно ли я сделал?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    AbstractTask нужен только для DRY. В вашем случае он пока лишний, чуть что добавите позже. Даже больше, можно пока даже интерфейс отдельно не делать. Если в будущем нам понадобится добавить еще одну реализацию скажем... Task-а или TaskManager-а, выделение инетфейса класса вам сделает любая нормальная IDE. Назовете этот интерфейс TaskManager и будет у вас реализация оного ScheduledTaskManager и DBTaskManager... для примера. А клиентский код такие штуки не затронет вовсе.

    Советую вооружиться PhpSpec и таким образом проверять насколько удобно вы спроектировали API ваших сервисов.
    Ответ написан
    1 комментарий
  • Как "взорвать" изображение?

    IonDen
    @IonDen
    JavaScript developer. IonDen.com
    Этот плагин что угодно так взорвет, вставьте туда фоновое изображение и все сработает.
    Ответ написан
    Комментировать
  • Какой подход в изучении web-программирования (html+js+php) использовать?

    samoilenkoevgeniy
    @samoilenkoevgeniy
    Lead Full-Stack Web Developer
    Ставишь себе задачу - выполняешь её. Вот и весь ход. Задачи ставить надо не боятся и ставить их "на растяжку", т.е. чтобы в задаче присутствовал элемент, который еще не использовался.
    Мой путь таков:
    Первым делом я создал сайт с простой авторизацией пользователей.
    Вторым делом нашел простой макет сайта, и натянул эту авторизацию туда, сделал скрытые разделы и т.д.
    Третим делом Перенес все это дело из просто файла function.php в классы, посмотрел как что куда в классах работает, в общем, притерся с ООП.
    Четвертым шагом у меня был разбор MVC модели на движке интернет магазинов opencart, в нем, на мой взгляд, явно выражена модель mvc.
    Дальше - реальные задачи и в бой
    Ответ написан
    Комментировать
  • Как прикручиваются подобные админки к сайтам?

    opium
    @opium
    Просто люблю качественно работать
    Это просто хорошо сверстанный дизайн админки, по сути админка всегда проблема , так как на фронт всегда обычно покупают дизайн, а админку девелопер делает как уж получится , и тут проще купить какой нибудь дизайн админки и дать девелоперу чтобы он прикрутил его за пару часов, чтобы все было красиво.
    Хотите готовый код юзайте вордпресс есть куча кастомных админок под него
    Ответ написан
    Комментировать
  • Как прикручиваются подобные админки к сайтам?

    Фактически вам просто дают дизайн, а интегрируете вы его сами, php-файлы вы сами пишете. Т.е. ответ на ваш вопрос: они с сайтом никак не взаимодействуют, вы сами делаете это взаимодействие.
    Ответ написан
    Комментировать
  • Есть ли в Symfony 2 аналог скоупов Yii?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Ну начнем с того что Symfony не имеет никакого отношения к доктрине.

    Далее... какие проблемы решают скоупы? Уменьшение дублирования кода при построении запросов с использованием DbCriteria? Ну так в Doctrine в принципе нету таких проблем так как нету этой самой DbCriteria и все обычно в одном месте. Если вам нужны удобные методы для выборок, просто делаете методы в репозитории. Это эдакий бэст-практис, инкапсулировать всю логику по работе с базой в какой-то сервис.

    Если брать дефолтные скоупы (те что default и навешиваются на каждый запрос) то аналогом будут фильтры. doctrine-orm.readthedocs.org/en/latest/reference/f... Их можно отключать, так же как и в Yii можно делать resetScope.

    Почему именно default? да потому что для других случаев вообще не стоит делать подобные штуки а просто инкапсулировать всю логику по выборкам данных в репозиторий и вообще все что касается хранения сущностей в базе туда же выносить и регистрировать как сервис. А вот случаи когда мы хотим во всех запросах исключить выборку элементов с disabled=0 или что-то в этом духе фильтры подходят. Хотя стоит избегать вообще любых глобальных хендлеров, излишне использовать ивенты и т.д.

    Можно просто объявить репозиторий базовый с какими-то хелперами для построения запросов и наследовать свои репозитории от него, но обычно выборки настолько различаются что вы только сделаете себе больно.
    Ответ написан
    8 комментариев
  • Хочу научиться создавать плагины JQuery - с чего начать?

    Вот хорошая заготовка для написания плагина.

    /*
     *  jQuery Boilerplate - v3.3.4
     *  A jump-start for jQuery plugins development.
     *  http://jqueryboilerplate.com
     *
     *  Made by Zeno Rocha
     *  Under MIT License
     */
    // the semi-colon before function invocation is a safety net against concatenated
    // scripts and/or other plugins which may not be closed properly.
    ;(function ( $, window, document, undefined ) {
    
    		// undefined is used here as the undefined global variable in ECMAScript 3 is
    		// mutable (ie. it can be changed by someone else). undefined isn't really being
    		// passed in so we can ensure the value of it is truly undefined. In ES5, undefined
    		// can no longer be modified.
    
    		// window and document are passed through as local variable rather than global
    		// as this (slightly) quickens the resolution process and can be more efficiently
    		// minified (especially when both are regularly referenced in your plugin).
    
    		// Create the defaults once
    		var pluginName = "defaultPluginName",
    				defaults = {
    				propertyName: "value"
    		};
    
    		// The actual plugin constructor
    		function Plugin ( element, options ) {
    				this.element = element;
    				// jQuery has an extend method which merges the contents of two or
    				// more objects, storing the result in the first object. The first object
    				// is generally empty as we don't want to alter the default options for
    				// future instances of the plugin
    				this.settings = $.extend( {}, defaults, options );
    				this._defaults = defaults;
    				this._name = pluginName;
    				this.init();
    		}
    
    		// Avoid Plugin.prototype conflicts
    		$.extend(Plugin.prototype, {
    				init: function () {
    						// Place initialization logic here
    						// You already have access to the DOM element and
    						// the options via the instance, e.g. this.element
    						// and this.settings
    						// you can add more functions like the one below and
    						// call them like so: this.yourOtherFunction(this.element, this.settings).
    						console.log("xD");
    				},
    				yourOtherFunction: function () {
    						// some logic
    				}
    		});
    
    		// A really lightweight plugin wrapper around the constructor,
    		// preventing against multiple instantiations
    		$.fn[ pluginName ] = function ( options ) {
    				this.each(function() {
    						if ( !$.data( this, "plugin_" + pluginName ) ) {
    								$.data( this, "plugin_" + pluginName, new Plugin( this, options ) );
    						}
    				});
    
    				// chain jQuery functions
    				return this;
    		};
    
    })( jQuery, window, document );
    Ответ написан
    Комментировать
  • Возможна ли адаптивная верстка под любое разрешение экрана?

    sarhov
    @sarhov
    sarhov.com
    Сейчас так много устройств и такие разные размеры экранов, что надо сделать респонсив что бы везде смотрелось нормально, а адаптивный берет только популярные размеры. Это уже в прошлом, надо понимать что адаптивный и респонсив разные понятия.

    На разработку респонсива уходить 3-4 больше времени чем на адаптивный, за то результат впечетляющий, ты можешь быть уверен что твой сайт везде смотрится как надо, даже на часах

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

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

    Если бустрап твой выбор, то тогда не правилный выбор, надо было самому сделать все, иногда выкинуть из бустрапа все лишное занимает больше времени, чем самому быстро сделать все.
    Ответ написан
    1 комментарий
  • Какие существуют размеры экранов?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    пользуюсь чистым css

    лучше нечистые less/scss

    Намного проще не париться о разных девайсах. Девайсов много. Есть телефоны с экраном как у планшета и планшеты с экраном как у телефона. Есть любители повернуть монитор на 90%, есть умные часы с браузерами, есть микроволновки с браузерами...

    То есть берем браузер и ресайзим окно... и смотрим на каком разрешении все плохо а на каком хорошо. Перестраиваем элементы дойдя до какого-то порога. Размеры все же от дизайна и задачи задаются.
    Ответ написан
    Комментировать
  • Возможна ли адаптивная верстка под любое разрешение экрана?

    yulsonka
    @yulsonka
    Есть разница между респонсив и адаптивностью - habrahabr.ru/post/148224/.
    По хорошему же веб-разработка примерно с момента выпуска третьей версии бутстрапа стала отходить от оптимизации сайта под ряд устройств, опираясь на популярные значения ширины: 420, 768 и так далее, потому что сайт должен смотреться хорошо даже если взять, вывести его на телевизионную панель и медленно уменьшать окно браузера до 320 пикселей в ширину. Мораль в чем: примерно это при тестировании и делается, окно браузера постепенно уменьшаем или наоборот идем от малого к великому, если используем mobile-first подход и везде, где картинка "рушится" ставим breakpoint с помощью media-queries. А вот чтобы не писать кучу значений и иметь возможность ими гибко управлять - очень подойдет препроцессинг, где можно выносить переменную breakpointа, что очень упрощает кодинг хорошей адаптивности.

    А еще я не очень поняла как вы пишете медиа запросы - неужели просто @media (width: 600px)?
    В любом же случае прописывается диапазон типа: @media (min-width: 480px) and (max-width:567px) и тогда совсем уж месива быть, мягко говоря, не должно для устройств, лежащих в этом диапазоне ширины экрана. Возможно, это именно то, что хоть как-то исправит ваше "месиво".
    Ответ написан
    13 комментариев