• Как командно разрабатывать php проект?

    copist
    @copist
    Empower people to give
    Инфраструктура
    * Создайте репозиторий на Bitbucket или GitHub.
    * Создайте себе локально копию репозитория и локально поднимите базу данных с одинаковой структурой
    * Если в базе требуются изменения, создавайте "миграции", которые обновят структуру данных или сами данные.
    * Свои изменения по коду, так же как и миграции, отправляйте в репозиторий

    Ещё есть возможность создания виртуальных серверов для разработки или использование online IDE. Решает кучу проблем, если интернет быстрый.
    * https://compilr.com/ Полноценная среда разработки
    * https://koding.com/ Среда разработки с предустановленным веб-сервером и элементами социальной сети
    * online-php.com Online IDE
    * https://codeanywhere.com/ Среда разработки. Код можно хранить в облаке, а также в Dropbox, Google Drive, FTP, github.
    Другие тулзы для совместной работы в online

    Промежуточные версии
    Если вы географически недалеко друг от друга, то просто периодически показывайте, что у вас получается.
    Если нет, пользуйтесь Skype Shared Screen, Join.me и другие аналогичные продукты, чтобы вместе смотреть и обсуждать голосом. А лучше TeamViewer, чтобы можно было вместе и посмотреть, и поправить.

    Обновление сервера
    Изменения на сервер устанавливайте из того-же репозитория. Не забудьте про миграции. Озаботьтесь вопросами безопасности. Хотя бы так: скрыть файлы .git
    Ответ написан
    Комментировать
  • Как правильно реализовать masonry на чистом CSS?

    PretorDH
    @PretorDH
    HTML5, CSS3, PHP, JS - люблю в чистом виде.
    Попробуй так изменить разметку:
    ...
          /* Добавим data-header="M" к .masonry-item*/
         <div class="col-lg-3 col-md-3 col-sm-3 col-xl-12 masonry-item" data-header="M">
              /* <li class="header">M</li>  Убрать из разметки*/ 
              ...
         </div>
         ...

    В своем стиле сделать псевдо елемент :before :
    .masonry-item[data-header]:before {
                   content: attr(data-header);
                   display: block;
                   font-weight:bold;
              }

    Как вариант можно скинуть data-header в первый li (не в li c класом header - его быть не должно), и поменять селектор на .masonry-item li[data-header]:before

    P.S. В вопросе ставь код, а не скриншоты. Набирать наново лениво.
    Ответ написан
    2 комментария
  • Web-разработка. Уровень погружения в язык программирования: PHP vs JavaScript. Где "глубже"?

    @iliyaisd
    Очень зависит от того, разработка чего ведётся. Сегмент (b2b/b2c), не-/нагруженное, сайтик/веб-приложение/интернет-магазины/большой портал... И так далее. Из общего можно выделить:

    - sql, как вы сказали - напрямую к РНР не относится, но знать его и СУБД точно придётся (в основном, MySQL, PostgreSQL, иногда Oracle, MSSQL).
    - фреймворки - для любой более-менее серьёзной разработки. Наиболее распространённый зоопарк: Yii/Yii2, Symfony2, Zend, сейчас нашумел Laravel (не пробовал), иногда CakePHP.
    - разные CMSки для сайтов и особенно для интернет-магазинов. Если сегмент требует, изучайте.
    - для нагруженных проектов - memcached, APC, RabbitMQ, всевозможные NoSQL (Mongo, Redis). Понимание тонкостей Apache и Nginx.
    - cron
    - контроль версий - в основном сейчас git, используется также svn.

    Из книжек никогда ничего не читал, кроме php.net (это прям "настольная") и гугла. Наверное, это неправильно. Но я очень не люблю учить программирование по книжкам - у меня как-то всё сразу забывается. Поэтому я по ходу необходимости почитываю разные статейки / ответы на вопросы.
    Ответ написан
    Комментировать
  • AngularJS vs автозаполнение форм бразузера?

    itspers
    @itspers
    Это открытый тикет - https://github.com/angular/angular.js/issues/1460

    В общем виде все решения сводятся к директиве, которая таймаутом проверяет значение инпута и обновляет модель. Там посмотрите по тикету - куча реализаций, например:

    app.directive("watchAutofill", [
             '$timeout',
    function ($timeout) {
        var INTERVAL_MS = 500;
    
        return {
            require: 'ngModel',
            link: function (scope, element, attrs, ngModel) {
    
                var timer;
                function startTimer() {
                    timer = $timeout(function () {
                        var value = element.val();
                        if (value && ngModel.$viewValue !== value) {
                            ngModel.$setViewValue(value);
                        }
                        startTimer();
                    }, INTERVAL_MS);
                }
    
                scope.$on('$destroy', function () {
                    $timeout.cancel(timer);
                });
    
                startTimer();
            }
        };
    }
    ]);
    Ответ написан
    Комментировать
  • Для чего нужна ORM?

    Вы не путаете ORM с DBAL? ORM это не технология замены SELECT * FROM goods WHERE cost < 100.00 на $db->select()->from('goods')->where('cost < 100.00'). ORM это способ задания связи объектов и РСУБД. По сути позволяет абстрагироваться от способа хранения объектов вообще, с лёгкостью переходя от SQL к NoSQL, memcache, файлам или REST/RPC API на удалённом сервере, оперируя на уровне модели (если говорить о MVC и т. п.) простыми plain old objects, а их персистентность отдать контроллеру. Не $db->select()->from('goods'),, не mysql_query('SELECT * FROM goods'), а $goodsRepository->findAll(), а уж будет репозиторий формировать SQL запрос, читать файлы или память, а может стучаться на Гугл и парсить его вывод — его, репозитория, личное дело (а также разработчика(ов), отвечающих за подсистему хранения).

    Кроме того ORM, как правило не исключает обращение к БД на уровне произвольных SQL запросов, оно лишь преобразуют результаты этих запросов в объекты модели предметной области (и наоборот), которые ничего не знают (в идеале) о таблицах, WHERE, HAVING и т. п.

    ORM это не только инструмент архитектурного разделения областей ответственности объектов и классов приложения, а также инструмент облегчения разделения труда разработчиков: кто хорошо шарит в SQL вообще и особенностях конкретного движка в частности — работает по «ту сторону» ORM, оптимизирует его как хочет, может нормализовывать и денормализовывать, например; кто хорошо разбирается в дебетах и кредитах — работает с plain old objects в терминах предметной области и может вообще ничего не зная об SQL, ему лишь нужно знать, что он всегда может получить объект или их коллекцию обратившись к методам вроде findById() или findAll() и сохранить результат работы методом save() или flush().
    Ответ написан
    3 комментария