Переход к официальным ресурсам:      Codeigniter4 / Документация / Github / Форум / CodeIgniter3
Привет! В настоящий момент я временно прекратил перевод документации по причине того, что она она содержит целый ряд неточностей, а также еще дорабатывается со стороны разработчиков. Если ты заинтересован в изучении фреймворка CodeIgniter 4, то приглашаю тебя на свой канал на YouTube (Перейти на канал), где я более подробно выкладываю занятия по данному фреймворку.


Добавление новых записей в базу данных

Если ты успешно осилил два предыдущих урока, тогда ты уже знаешь, как создаются Контроллеры, Модели и Представления. Ты знаешь, как получать информацию из базы данных и настраивать собственные правила маршрутизации.

В этом разделе документации к фреймворку Codeigniter 4 ты научишься работать с html-формой, которая позволит тебе добавлять новые записи в базу данных.

Создание новой формы

Наша форма будет совсем простой, содержащей всего два поля: "Заголовок новости" и "Текст новости". Адрес страницы, известный как slug, будет формироваться автоматически. Перейди в директорию с Представлениями новостей app/Views/news/ и создай там новый файл с названием news-add.php, после чего внеси в него следующий код:

    <h2> <?= esc($title); ?> </h2>

    <?= \Config\Services::validation()->listErrors(); ?>

    <form method="post" action="/news/news-add">

        <label for="title">Заголовок новости</label>
        <input type="input" name="title" /><br />

        <label for="body">Текст новости</label>
        <textarea name="body"></textarea><br />
        <br />
        <input type="submit" name="submit" value="Добавить" />

    </form>
    <br /><br />

Как видишь, здесь нет ничего сложного, кроме непонятной записи в строке #3. Это встроенная функция, предназначенная для вывода ошибок при проверке форм. Теперь осталось добавить еще одно Представление, которое будет просто выводить текст о том, что новость успешно добавлена. В той же директории app/Views/news/ создай новый файл с названием news-success.php и добавь в него любой текст по своему желанию, например такой:

    <p>Новость успешно добавлена!</p>
    <br />
    <a href="/news">Вернуться к списку новостей</a>

 

Добавляем возможности в Контроллер

Вернемся к нашему Контроллеру новостей из предыдущего урока app/Controllers/News.php и добавим в него еще один метод:

    public function addNews()
    {
        helper('form');
        $model = new NewsModel();

        if (! $this->validate([
            'title' => 'required|min_length[3]|max_length[255]',
            'body'  => 'required'
        ]))
        {
            echo view('templates/header');
            echo view('news/news-add', ['title' => 'Добавить новость:']);
            echo view('templates/footer');

        }
        else
        {
            $model->save([
                'title' => $this->request->getVar('title'),
                'slug'  => url_title($this->request->getVar('title')),
                'body'  => $this->request->getVar('body'),
            ]);
            echo view('news/news-success');
        }
    }

Рассмотрим более детально, что выполняет этот метод. В строке #3 мы подключили встроенный Хэлпер по работе с формами. Что такое Хелперы? Это небольшие файлы, содержащие узкоспециализированные функции. Часть Хэлперов уже реализована в стандартном пакете фреймворка, а если тебе нужен свой, специфический функционал, ты можешь сам создавать Хелперы по своим потребностям. Об этом будет рассказано в других разделах руководства. Дальше, в строке #4, мы создаем экземпляр класса, через который мы будем работать с нашей БД, а вот дальше становится интереснее.

В базовой поставке фреймворка Codeigniter 4 присутствует очень мощная и полезная библиотека по валидации форм. С её помощью в строках с #6 по #15 мы запускаем проверку. В условиях этой проверки сказано, что поле формы с именем title (заголовок новости) должно быть обязательно заполнено, а также должно содержать минимум 3 и максимум 255 символов. Поле формы с именем body (текст новости) должно содержать хотя бы 1 символ. Если это условие НЕ выполняется (а при первом вызове формы оно и не выполнится, потому что еще ничего не вводили), тогда мы отображаем наше Представление с чистой формой, в противном случае, если форма заполнена корректно, тогда в строках с #18 по #23 мы обращаемся к экземпляру класса по работе с БД и через метод save() добавляем нашу запись в БД. В строке #23 мы отображаем наше Представление с информацией об успешной операции.

Обрати внимание на следующие моменты! Во-первых, в строке #18, через объект $model-> мы обращаемся еще к одному встроенному в Конструктор запросов (Query Builder) методу save(). Этот метод является "оберткой" сразу для двух других методов insert() и update(). Таким образом, через метод save(), ты можешь добавлять либо изменять данные в таблице БД. Полное описание всех методов Конструктора запросов ты можешь найти в соответствующем разделе документации. В этом уроке это рассматриваться не будет. Во-вторых, в строке #20 для формирования поля slug мы задействовали функцию url_title(). Она относится к другому Хелперу (URL Helper) идущему в составе фреймворка, но его подключение и загрузку мы нигде не указали. Оно и не нужно! Данный Хелпер автоматически подключается при каждом запросе и все его функции и возможности доступны без явного объявления. Эта функция, в переданной строке, заменяет все пробелы на симовлы "-" и приводит все символы к нижнему регистру. Для нас это идеальный вариант формирования красивых URL-адресов. В нашем случае, в качестве входной строки, используется текст из заголовка новости.

Итак, Представления готовы, Контроллер сформирован, осталось дело за Моделью и Маршрутами. Двигаемся дальше.

Добавляем возможности в Модель

Здесь больших изменений не будет. Единственное, что нам нужно будет добавить в файл Модели, так это еще одно свойство с перечнем полей нашей таблицы:

    protected $allowedFields = ['title', 'slug', 'body'];

Это свойство класса необходимо для корректной работы метода save(), который мы использовали в Контроллере для записи новости в БД. Если пояснить совсем простыми словами логику работы "обёртки" save(), то она выглядит так. Если ей был передан в качестве одно из параметров первичный ключ (id), тогда этот метод считает, что происходит обращение к какой-то конкретной записи и её необходимо ИЗМЕНИТЬ. Для этого мы и указали свойство класса, в котором прописаны конкретные поля, подлежащие обновлению. Если параметр id не передан, как в нашем случае, тогда этот метод понимает, что необходимо ДОБАВИТЬ НОВУЮ запись, что нам и нужно.

Добавляем маршрутизацию

Перед тем как мы начнем добавлять наши новости, тебе необходимо добавить еще один маршрут в уже известный файл. Открывай app/Config/Routes.php и добавь вот такой маршрут (из строки #2):

    $routes->match(['get', 'post'], 'news/news-add', 'News::addnews');
    $routes->get('news/(:segment).html', 'News::shownews/$1');
    $routes->get('news', 'News::index');

Теперь открывай браузер и набирай в строке: http://твой-домен/news-add и если ты всё сделал правильно, тогда ты увидишь форму для добавления новости. Попробуй заполнить её и отправить. Работает? Поздравляю!

И напоследок, в качестве бонуса

"А как же сделать красивое оформление? Например подключить скрипты или таблицы стилей?" - наверняка спросишь ты. Да всё очень просто! Вспоминай, какая директория является корнем нашего проекта? Пропустил этот момент? Тогда иди и читай снова! Если помнишь, тогда переходи в директорию /public и создай там папку css. В этой папке создай новый файл, например style.css со следующим кодом:

    h3 {color:#aa4818; font-size:20px}
    a {color:#aa4818; font-size:16px;text-decoration:underline}
    a:hover {text-decoration:none}

Таблица стилей есть. Осталось её подключить. Помнишь, где лежит файл header.php? Если нет, напоминаю: app/Views/templates/header.php. Это и есть наша "шапка" сайта, которая подключается для всех страниц. Открывай файл и между тегами head напиши:

    <link rel="stylesheet" href="/css/style.css">

Таким "макаром" ты можешь подключать любые файлы CSS, Javascript-файлы, Изображения и т.д.

Если у тебя возникли вопросы, что-то не работает или какой-то из моментов объяснён недостаточно, тогда не стесняйся, спрашивай в комментариях! Я не оставлю без внимания твою просьбу, обещаю!


Комментарии к разделу:

Кто-то уже оставил свои комментарии. Оставить свой!

Приветствую. Скажите как правильно в контролере добавить загрузку изображения к новости?
» Написал: Валерий (30-03-2020 в 17:44) Ответить
Здравствуйте. Если Вы пытаетесь прицепить картинку в Контроллере, то, могу предположить, что Вы делайте что-то не так...Не видя Вашего кода очень сложно дать правильный совет, как поступить лучше. Однако, в контроллерах картинки не нужно прикреплять. Все, что отвечает за отображение информации для пользователя, должно быть обработано в Представлениях!
» Ответил: code4 (06-04-2020 в 07:50) Ответить
А почему не использовать base url для подключения стилей скриптов и всего остального ?
» Написал: Дмитрий (06-04-2020 в 05:28) Ответить
Здравствуйте. Да, Вы правы, можно задействовать и $baseURL. Здесь используется прямой URL только лишь для того, чтобы еще раз показать в живую, откуда идет корень сайта.
» Ответил: code4 (06-04-2020 в 07:42) Ответить

Добавить комментарий к статье:


Ваше имя:
Ваша почта:

  Закрыть