Работа на чистом PHP /

Учим контроллеры работать через Ajax

Неожиданно выяснилось, что я обещал написать о работе контроллеров через Ajax, но забыл:

Позже мы научим наши контроллеры обрабатывать запросы и выдавать ответы через Ajax.

Так что пишу еще один, самый-самый последний урок из курса =)

Общие принципы работы через Ajax заключаются в том, что

  • javascript посылает запрос на сервер, используя метод XMLHttpRequest

  • Контроллер определяет, что запросы был сделан через ajax и отвечать нужно в определённом формате — мы любим JSON

  • При успехе или ошибке на фронтенд всегда возвращается массив с данными установленного формата

  • В зависимости от ответа, javascript что-то делает со страницей

Чтобы детально разобраться в работе через ajax, мы сделаем на нашем сайте ajax-пагинацию, используя контроллер News. Нетерпеливые читатели могут сразу посмотреть на результат.

Читать далее
Личный блог /

Неожиданный роуминг в сети Мегафон

На выходных я столкнулся с неприятным поведением сотового оператора Мегафон, услугами которого пользуюсь уже почти 10 лет. Дело в том, что, прокатившись из Кемерово в Новосибирск на 2 дня, я заплатил 500 рублей за 50 мегабайт мобильного интернета.

Распечатка списаний показала, что на моём тарифе «Всё включено», где предоплачено 3 Gb трафика, 50 мегабайт в Новосибирской области списали за дополнительную плату. Я не первый раз езжу в соседний областной центр в гости к родственникам, но никогда такого не было — ибо это один сибирский регион.

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

Читать далее
Личный блог /

Про сервис Sony

Некоторое время назад взяла и сломалась любимая Sony PS4. Это прекрасный чудо-прибор, подаривший огромное количество приятных часов отдыха и удовольствия, вдруг стал выключаться сам по себе, вопреки моему желанию. То есть, включаешь консоль, а она берёт и выключается через 2-3 минуты.

Делать нечего, звоню в местный сервис, благо до окончания гарантии еще 3 недели, где меня натурально шокируют — в Кемерово нет сервиса для PS4.

Более того, во всей огромной Российской Федерации ровно один сервисный центр для консолей Sony, который располагается в Москве, так что нужно звонить в техподдержку по номеру 8 800 200 7667.

Читать далее
Работа на чистом PHP /

Добавляем новостям пагинацию

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

Первым делом выбираем что-нибудь попроще на packagist.org/search/?q=pagination — мне приглянулся второй пункт, с kilte/pagination. Добавляем его в наш composer.json и устанавливаем на сервере.

Теперь пишем новый метод в Brevis\Controller:


    /**
     * Возвращает массив с постраничной навигацией
     *
     * @param $totalItems
     * @param int $currentPage
     * @param int $itemsPerPage
     * @param int $neighbours
     *
     * @return array
     */
    public function getPagination($totalItems, $currentPage = 1, $itemsPerPage = 10, $neighbours = 2) {
        $pagination = new Pagination($totalItems, $currentPage, $itemsPerPage, $neighbours);

        return $pagination->build();
    }

А в начале файла указываем

use \Kilte\Pagination\Pagination as Pagination;

Всё, в нашем проекте уже есть постраничная навигация.

Дальше мы научим контроллер новостей её использовать, а шаблон — оформлять.

Читать далее
Работа на чистом PHP /

Выводим новости

На прошлом занятии мы подключили xPDO и попробовали его в работе. Сегодня мы можем добавим в БД пару новостей и вывести их на отдельных страницах.

Для этого нам нужно будет научить контроллер News определять, что именно запросил пользователь: список новостей или отдельную новость. Это несложно, нужно только проверять, что указано в url после /news/.

Пишем контроллер Brevis\Controllers\News с вот такой инициализацией:


    public function initialize(array $params = array()) {
        if (empty($params)) {
            $this->redirect("/{$this->name}/");
        }
        elseif (!empty($params[0])) {
            $c = $this->core->xpdo->newQuery('Brevis\Model\News');
            if (is_numeric($params[0])) {
                $c->where(array('id' => $params[0]));
            }
            else {
                $c->where(array('alias' => $params[0]));
            }
            if ($news = $this->core->xpdo->getObject('Brevis\Model\News', $c)) {
                $alias = $news->get('alias');
                if (isset($params[1]) || $params[0] != $alias) {
                    $this->redirect("/{$this->name}/{$alias}");
                }
                else {
                    $this->item = $news;
                }
            }
            else {
                $this->redirect("/{$this->name}/");
            }
        }

        return true;
    }

Давайте разберёмся, что здесь происходит?

Читать далее
Работа на чистом PHP /

Подключаем xPDO

На прошлом занятии мы освоили Composer, переместили Fenom в зависимости, и переписали наш проект для поддержки автозагрузки стандарта PSR-4.

А сегодня мы добавим в проект xPDO, напишем схему, сгенерируем модель, создадим таблицу и выведем новости на сайте.Для этого нам придётся внести много изменений в код проекта.

Например, мы избавимся от переменной Core::config и будем загружать конфигурацию из файла. Это позволит нам гибко менять параметры проекта и задать полезные константы, типа PROJECT_BASE_PATH, для использования в файлах.

Но, сначала мы меняем наш composer.json:


{
  "name": "Brevis",
  "autoload": {
    "psr-4": {
      "Brevis\\": "core/"
    }
  },
  "require": {
    "php": ">=5.3.0",
    "fenom/fenom": "2.*",
    "xpdo/xpdo": "3.0.*@dev"
  },
  "scripts": {
    "post-install-cmd": "\\Brevis\\Core::cleanPackages",
    "post-update-cmd": "\\Brevis\\Core::cleanPackages"
  }
}

В блоке scripts я добавил вызов нового метода для очистки ненужные директорий устанавливаемых пакетов (тесты, примеры, документация и т.п.). Они только замедляют синхронизацию проекта с удалённым сервером.

Читать далее
Работа на чистом PHP /

Осваиваем Composer

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

А именно — начать использовать менеджер зависимостей для PHP — Composer. Он позволит нам легко устанавливать разные полезные вещи на сайт, обновлять их и даже удалять. Если вы уже работали с менеджером пакетов GNU/Linux — то вам всё это будет очень знакомо.

В качестве разминки, удалим Fenom из директории core и установим через Composer. Для этого нужно в корне сайта создать файл composer.json и прописать в нём требуемые пакеты (подробнее можно прочитать на Хабре):


{
    "require": {
        "php":">=5.3.0",
        "fenom/fenom": "2.*"
    }
}

Теперь нужно только скачать composer.phar и запустить его в корне сайта:

php composer.phar install

На modhost.pro и качать ничего не нужно — просто запускаем composer в директории:

composer install

И волшебным образом у нас появляется директория /vendor/ с установленным Fenom. Что же с ним делать дальше?

Читать далее
Работа на чистом PHP /

Расширение и наследование шаблонов Fenom

На прошлом занятии мы подключили шаблонизатор Fenom к нашей системе и написали простенький шаблон.

Теперь пришло время написать уже нормальные шаблоны для страниц Home и Test, при этом они будут наследовать один общий шаблон Base, в котором будет генерироваться меню сайта.

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

Поэтому, в конце урока вам предлагается выбрать, как именно мы будем работать дальше. На всякий случай, вот как должен выглядеть наш сайт после этого урока — s1889.bez.modhost.pro.

Читать далее
Работа на чистом PHP /

Подключаем шаблонизатор Fenom

Знаю-знаю, мы собирались работать на чистом PHP, безо всяких фреймворков, но о шаблонизаторах речи не было!

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

Варианта ровно два: написать собственный жуткий глючный велосипед, который будет читать шаблон и заменять в нём плейсхолдеры на значения через str_replace(), или подключить нормальный шаблонизатор.

Так как мы все тут от MODX люди не очень далёкие, так почему бы не освоить работу с Fenom, который в нём с некоторых пор доступен? Думаю, возражений не будет, так что поехали!

Читать далее
Работа на чистом PHP /

Базовый контроллер и его методы

На прошлом занятии мы набросали основу нашего ядра, а сегодня нам предстоит воспользоваться преимуществами ООП и написать базовый контроллер, от которого будут наследоваться все остальные.

Зачем это нужно? Да, хотя бы, затем, чтобы не прописывать одни и те же методы в каждом контроллере. Написать один общий, а потом менять только нужные части. Это гораздо правильнее и удобнее.

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

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

Итак, приступаем.

Читать далее
Работа на чистом PHP /

Основы ООП и контроллеры страниц

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

Ядро - это один основной класс, с общими для всех контроллеров методами. А контроллеры - это другие php классы, которые будут отвечать за функционал какого-то раздела сайта.

Контроллеры будут лежать в специальной директории, откуда их запустит основной класс. Запрос приходит на index.php, тот инициализирует основной класс и просит обработать запрос. Ядро определяет, к какому разделу сайта обращён запрос и загружает его контроллер, передавая ему все полномочия на генерацию ответа.

Дальше контроллер проверит параметры запроса и выдаст результат, или редирект на страницу с ошибкой. Позже мы научим наши контроллеры обрабатывать запросы и выдавать ответы через Ajax.

Логическая цепочка выходит такая: index.php -> Сore -> Controllers_Page.

Читать далее
Работа на чистом PHP /

Вводное занятие

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

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

Хочу предупредить вас сразу, что я не считаю себя экспертом в программировании. По образованию я врач-эпидемиолог, и программирование в медицинской академии не преподавали. Всё, что я знаю, я освоил сам по книжкам и «методом тыка».

Люди, уже программирующие на PHP, из этих уроков ничего нового не вынесут (ну, может что-то и подсмотрят любопытное, но не факт), так что курс будет интересен исключительно новичкам. Я рассчитываю на то, что вы знаете только базовые функции PHP и умеете писать простейший спагетти-код, то есть PHP вперемешку с HTML и выводом через echo().

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

Первое занятие бесплатное, а дальше будет нужно купить доступ. Всё уже открыто бесплатно.

Читать далее
born2slip
pishnaa istntome
22.11.2022 14:06
огромное спасибо! )
inetlover
Александр Наумов
14.11.2022 10:19
посмотри документацию. Спасибо, что-то она мне не нагуглилась. Это просто функции объединения для о...
bezumkin
Василий Наумкин
10.11.2022 05:46
Спасибо за поздравления!
inetlover
Александр Наумов
09.11.2022 17:08
Посмотрел в ДевТулсе свойство overscroll-behavior: none; присутствует, проверил в Chrome и Chromium ...
bezumkin
Василий Наумкин
03.11.2022 20:57
Поискать в исходниках ссылки на её адрес и поменять - скорее всего только nuxt.config.js. А зачем эт...
ni.kolokol@mail.ru
Николай Каленников
03.11.2022 19:43
Спасибо. Попробую тоже с нуля переставить
inetlover
Александр Наумов
03.11.2022 19:24
Спасибо!!! Все заработало!
bezumkin
Василий Наумкин
28.10.2022 05:23
В тексте есть подсказка // Контроллер требует новое разрешение protected $scope = 'ord...
bezumkin
Василий Наумкин
27.10.2022 13:25
Понял, спасибо!
inetlover
Александр Наумов
23.10.2022 13:33
Понял, спасибо!