• Какие можно реализовать мини-проекты на PHP?

    @posters
    На мой взгляд, беда большинства программистов в том, что они зациклены на it сфере. В ней уже многое реализовано. Гитхаб заполонен никому не нужными велосипедами. Придумать и реализовать что-то уникальное в этой сфере уже довольно сложно. А чтобы улучшать уже имеющееся и востребованное может пока еще не хватать компетентности.

    Попробуйте выйти за рамки IT. Наверняка у вас есть друзья/родственники, работающие в сферах далеких от IT. Разузнайте больше о их деятельности, попробуйте вникнуть в рабочий процесс, мысленно представить себя на их месте. Подумайте, что бы вы могли сделать, чтобы как-то облегчить их труд, какая программа могла бы стать потенциально полезной. Обсудите идею с этим человеком и если он согласился, что программа может облегчить ему жизнь, ПРИСТУПАЙТЕ. Вот вам мотивация и почти настоящий проект.

    Если ну совсем никак, обратите внимание на отрасли науки. Вот, к примеру, об исторической информатике не думали? Научитесь работать с данными. Возьмите, например, информацию Международного мемориала ( https://www.memo.ru/ru-ru/projects/memoid и https://www.memo.ru/ru-ru/projects/hackathon ) и попробуйте на ее основе сделать какой-нибудь информационный сайт, который в перспективе будет интересен не только вам. Поработайте со статистикой, попробуйте выявить какие-нибудь закономерности.

    Все это разумеется совсем нетривиальные задачи. Пошаговые гайдики на ютубчике на них не найти. Но тем и интересней, разве нет? Если вы способный, обучаемый программист, то должны справиться.
    Ответ написан
  • $(...).attr('checked', 'checked') не работает?

    Mithgol
    @Mithgol
    Используйте $(…).prop("checked", true) и тем невозбранно достигнете желаемого.
    Ответ написан
  • Как упростить скрипт отправки формы с файлом на jQuery + Ajax?

    @Eugeny1987
    Работаю с HostCMS
    $(function() {
    	$('#form-data').on('submit', function(e){
    		e.preventDefault();
    		var form = $(this);            
    		formData = new FormData(form.get(0));
    
    		var url = 'upload.php';
    
    		$.ajax({
    			url: url,
    			type: 'POST',
    			data: formData,
    			contentType: false,
    			cache: false,
    			processData:false,
    			success: function(response) {
    				console.log(response)
    			}
    		});
    	})
    });
    Ответ написан
  • Как определить нажатую кнопку по событию submit?

    @eskanderdon
    Знаю, знаю.. сто лет в обед.. но может быть какой-нибудь сёрфер оценит (не знаю)...

    <script type="text/javascript">
    $(function () {
       var target = null;
        $(':input').focus(function() {
          target = $(this).val();
        });
        // НЕ ПЕРЕНОСИТЕ ЭТОТ ФРАГМЕНТ В SUBMIT
     
      $('form').submit( function () {
        
        if ( target == 'save' ) {
          alert('[Save] is pressed')
        } else if ( target == 'delete' ){
          alert('[Delete] is pressed')
        } else {
          alert('{unknown button is pressed}')
        }
         return false;
      });
    });
    </script>
    
    <form action="" method="post">
      <button type="submit" value="save" name="action">Сохранить</button>
      <button type="submit" value="delete" name="action">Удалить</button>
    </form>
    Ответ написан
  • Как обрезать фото под определенным углом?

    Я делаю данное срезы с помощью наложения слоев. Создаю вигуру под фотографией и наклоняю ее так, как мне нужно. После с помощью наложения делаю фото той форма, какая мне нужна. Я думаю из скринов ниже вы поймете, что я имею ввиду:
    1.
    5df517186cb6f601150175.png

    2.
    5df51724ea62b896562178.png

    Я думаю, что вам поможет этот материал Как обрезать изображение в фотошопе
    Ответ написан
  • Как сделать движение при прокрутке?

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

    Примерно так, на jquery:
    Ответ написан
  • Как обновить кэш картинки без перезагрузки страницы?

    @PerfectLab
    Как вариант, если это просто изображения, можно добавлять timestamp к src изображения:
    image.src = "http://localhost/image.jpg?" + new Date().getTime();
    Ответ написан
  • Как установить composer и как им пользоваться под windows?

    K-2
    @K-2 Автор вопроса
    Постараюсь подвести первые итоги.

    Composer можно пользоваться в 2х вариантах.
    Глобально(установив программу) и Локально(ничего не устонавливая)
    И тот и тот способы работают только из командной строки. (Пуск->Стандартные->Командная строка)
    Для того чтобы что-то скопировать в командную строку ctrl+v не работает! Пользуемся правой кнопкой мышки->вставить

    ЛОКАЛЬНО пошагово
    1. Создаем папку, в которой будет проект на компьютере.
    2. В Командной строке пишем команду cd и путь к папке с проектом:
    cd C:\xampp\htdocs\test_composer
    3. Т.к. программа не установлена, нужен загрузочный файл(мини-программа composer), для его загрузки в Командной строке пишем команду:
    php -r "readfile('https://getcomposer.org/installer');" | php
    теперь в директории появился загрузочный файл
    4. Запускаем команду загрузки фреймворка(у каждого свой), в Командной строке пишем:
    php composer.phar require silex/silex ~1.1 (для фреймворка silex)

    В Командной строке, команды запускаются по разному при локальной и глобальной загрузках:
    Локально: php composer.phar require silex/silex ~1.1
    Глобально: composer require silex/silex ~1.1
    php composer.phar меняется на composer
    Еще при локальной загрузке нужно каждый раз закачивать установочный файл(это не сложно и описано в шаге 3):php -r "readfile('https://getcomposer.org/installer');" | php
    При глобальной загрузке этот файл не нужен.

    ГЛОБАЛЬНО пошагово
    1. Скачиваем программу composer https://getcomposer.org/Composer-Setup.exe
    2. Запускаем. При запросе файла php указываем путь к локальному хостингу -> папку php
    3. Теперь делаем все тоже самое что и при локальной загрузке, но пропускаем шаг 3, и изменяем запросы из Командной строки(вместо php composer.phar пишем composer). Пример:
    было так: php composer.phar require silex/silex ~1.1
    стало так: composer require silex/silex ~1.1

    О других отличиях между глобальной и локальной загрузками пока-что тут ничего не ответили!
    Ответ написан
  • Как правильно работать с исключениями?

    Stalker_RED
    @Stalker_RED
    На самом верхнем уровне вашего приложения должен быть какой-то Глобальный И Великий Обработчик Исключений Общего Назначения. Задачи у него очень простые - записать в лог что и где сломалось, показать пользователю табличку "ой, все пропало", и опционально пнуть мониторинг, отправить смс админу или письмо деду морозу.

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

    Рассмотрим пару примеров:
    1. Представим, что модуль "генератор превьюшек для фоточек", который верой и правдой трудился многие месяцы, однажды наталкивается на непреодолимую для него преграду и бросает исключение - "капец, место на диске кончилось, я так больше не работаю!"

    Если ваш код не может ничего с этим поделать - вы пропускаете это исключение выше, пускай Глобальный И Великий Обработчик показывает юзеру красивую табличку "извините, у нас перерыв обед", и шлет письма админу в три часа ночи. А если у вас облачный хостинг, например, и вы можете на лету подключить больше дискового пространства, или может снести какой-то ненужный кэш освободив место, то можно перехватить это исключение, показать юзеру "извините, за задержку, ваши фоточки будут обработаны через пару минут", а админу прислать не красный алерт, а желтый.

    2. Виджет, который показывает самых рейтинговых котиков с ютуба не смог подгрузить очередную порцию котиков, т.к. ютуб забанен роскомнадзором. Если ваш код ничего не может с этим поделать - Глобальный И Великий Обработчик Исключений покажет пользователю "ой все". Или вы перехватите это событие на более низком уровне и покажете табличку "свежих котиков нет, но вот есть рейтинг за прошлую пятницу". Или, если котики должны быть обязательно свежие, то можете предусмотреть экстренное подключение через vpn или tor, или может возьмете котиков с vimeo вместо ютуба, например.

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

    Важно в этом не переусердствовать, и не основывать бизнес-логику на исключениях. Этот механизм для редких, исключительных ситуаций, которые не получается обработать другим способом. Если модуль ресайза фоточек написан индусами, и его, внезапно, нечем заменить. Но если есть возможность (и необходимость) перевести эту проблему из разряда исключительной в обычную рабочую ситуацию - лучше так и сделать. Если у вас место кончается два раза в неделю - лучше настроить какой-то мониторинг, который будет следить за этим показателем и заранее разруливать такие ситуации. В случае с недоступностью сервера можно на уровне бизнес логики проверять доступность и подключать резервные каналы или источники данных, вместо того, чтобы падать с ошибкой "ой 500!".
    Ответ написан
  • Почему Inputmask is not defined?

    ssenj
    @ssenj
    HTML, CSS, PHP, WordPress, Bitrix
    Почему-то у меня тож не получилось подключить InputMask (в силу своего незнания).
    Но зато получилось подключить MaskedInput:
    https://github.com/digitalBush/jquery.maskedinput
    Для телефона вставил только:
    jQuery(function($){
       $("#phone").mask("+7 (999) 999-9999");
    });
    Ответ написан
  • Паттерны проектирования?

    @vkdv
    Паттерны - это реальные инструменты, позволяющие добиться реализации концепции объектно-ориентированного проектирования и принципов SOLID

    Ссылка на SOLID

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

    Один из наиболее часто встречающихся мне примеров, это пример принципа "Принцип открытости/закрытости" , когда класс - описывающий некую сущность(например модель комментария) , описывает только свои базовые назначения( создание, удаление, редактирование), при этом такие механизмы, как модерация, прикрепление файлов, лайки , реализуется другими классами и "прикручиваются" к классу моделей через интерфейсы и наследование/ трейты / примеси

    При этом :
    1) Никак не изменяется код класса "Комментарий" (кроме подключения интерфейса) и в будущем мы добавляем поведения без изменения класса + стабильность системы, гибкость
    2) Каждый класс имеет свое четкое назначение + легкость модификации, порядок
    3) Комментарии наследуют некоторое поведение, путем подключения поведения, но также могут поступать любые другие классы - сущности (посты, блоги итп) , то есть интерфейс и реализация лайков универсальна, и весь функционал работы лайков находится только (строго!!!) в одном месте + легкость модификации, Универсальность, стабильность, интуитивная понятность

    Из википедии :

    Признаки плохого проекта
    Закрепощённость: система с трудом поддается изменениям, поскольку любое минимальное изменение вызывает эффект "снежного кома", затрагивающего другие компоненты системы.
    Неустойчивость: в результате осуществляемых изменений система разрушается в тех местах, которые не имеют прямого отношения к непосредственно изменяемому компоненту.
    Неподвижность: достаточно трудно разделить систему на компоненты, которые могли бы повторно использоваться в других системах.
    Вязкость: сделать что-то правильно намного сложнее, чем выполнить какие-либо некорректные действия.
    Неоправданная сложность: проект включает инфраструктуру, применение которой не влечёт непосредственной выгоды.
    Неопределенность: проект трудно читать и понимать. Недостаточно четко выражено содержимое проекта.

    Оттуда же про SOLID

    Избавиться от "признаков плохого проекта"[4] помогают следующие пять принципов SOLID:

    Принцип единственной ответственности (The Single Responsibility Principle)
    Существует лишь одна причина, приводящая к появлению класса.

    Принцип открытости/закрытости (The Open Closed Principle)
    «программные сущности … должны быть открыты для расширения, но закрыты для модификации.»

    Принцип подстановки Барбары Лисков (The Liskov Substitution Principle)
    «объекты в программе должны быть заменяемыми на экземпляры их подтипов без изменения правильности выполнения программы.»

    Принцип разделения интерфейса (The Interface Segregation Principle)
    «много интерфейсов, специально предназначенных для клиентов, лучше, чем один интерфейс общего назначения.»

    Принцип инверсии зависимостей (The Dependency Inversion Principle)
    «Зависимость на Абстракциях. Нет зависимости на что-то конкретное.»
    Ответ написан
  • Почему люди не используют готовые cms, но ищут тех, кто будет писать с нуля?

    @mletov
    Чистый php, фреймворк и cms - это 3 уровня абстракции.

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

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

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

    Чем ниже уровень абстракции, тем выше квалификация специалиста.

    PS Как и любая аналогия, эта весьма условна и предполагает, что домохозяйка во всех 3 случаях работает на совесть и является профессионалом. В реальной жизни часто бывает, что на чистом php делают гораздо больший хардкор, чем собирают на CMS.

    По итогу: в зависимости от сложности задачи и уникальности фукционала, специалист должен выбирать, какой уровень из этих 3 уровней абстракции ему использовать. Хоть они и пересекаются, но не очень сильно, и конкуренции друг для друга почти не представляют. Далеко не факт, что ваш знакомый, который "изучил 10 cms", сможет эффективно решать те задачи, которые ставят работодатели, нанимающие "много программистов что бы они копались в коде"
    Ответ написан
  • Как узнать свой уровень в кодинге?

    @evgeniy_lm
    >> Как узнать свой уровень в кодинге?
    Очень просто - заглянуть в свой кошелек
    Ответ написан
  • Как обрезать фото под определенным углом?

    @ehs
    Architect / 3d designer
    1. Создаем выделение, например вертикальный прямоугольник с запасом по размеру.
    2. Меню Selection->Transform Selection и вводим нужный угол поворота.
    Ответ написан
  • В каких технологиях должен разбираться веб-разраб-универсал?

    @dmitryKovalskiy
    программист средней руки
    Универсал в сегодняшних реалиях - понятие растяжимое. Если брать максимум то это :
    1) Работа с источниками данных (SQL,XML,JSON и т.д.)
    2) Серверная логика (ворох языков и платформ по вкусу)
    3) Клиентская логика (Javascript и его фреймворки)
    4) Верстка на HTML5 ,CSS3
    Далее более экзотичное
    5) Веб-службы,RestfulAPI и прочие технологии по общению со сторонними сервисами
    6) Различные методы авторизации (доменная или через SSL-сертификаты для внутренних приложений и безопасное хранение личных данных и паролей для общедоступных приложений)
    Все это было бы неплохо сверху приправить пониманием архитектуры нагруженных приложений, знанием актуальных методов шифрования. Ну и я думаю вишенкой на торте всего этого было бы - понимание построения графических интерфейсов.
    Ответ написан
  • Почему ScrollTop не работает в Firefox?

    iiil
    @iiil
    Инженер и вэб-дизайнер, рисую.
    $('#start').click(function(e){
          e.preventDefault();
          $('html, body').animate({scrollTop:500}, 5000);
          });
         });
    Ответ написан