Создание новостных записей
Теперь вы знаете, как читать данные из базы данных с помощью CodeIgniter, но ещё не записывали информацию в базу. В этом разделе вы расширите контроллер и модель новостей, созданные ранее, чтобы включить эту функциональность.
Включение фильтра CSRF
Прежде чем создавать форму, включим защиту CSRF.
Откройте файл app/Config/Filters.php и обновите свойство $methods следующим образом:
public $methods = [
'post' => ['csrf'],
];
Это настраивает фильтр CSRF для включения для всех запросов POST. Вы можете узнать больше о защите CSRF в библиотеке Security.
Создание формы
Для ввода данных в базу данных вам необходимо создать форму, где вы можете ввести информацию для хранения. Это означает, что вам понадобится форма с двумя полями: одно для заголовка и одно для текста. Вы будете получать слаг из нашего заголовка в модели. Создайте новый вид в app/Views/news/create.php.
<h2><?= esc($title) ?></h2>
<?= service('validation')->listErrors() ?>
<form action="/news/create" method="post">
<?= csrf_field() ?>
<label for="title">Title</label>
<input type="input" name="title" /><br />
<label for="body">Text</label>
<textarea name="body" cols="45" rows="4"></textarea><br />
<input type="submit" name="submit" value="Create news item" />
</form>
Вероятно, только две вещи здесь выглядят непривычно. Функция service('validation')->listErrors() используется для отображения ошибок, связанных с проверкой формы. Функция csrf_field() создаёт скрытый элемент ввода с токеном CSRF, что помогает защитить от некоторых распространённых атак.
Вернитесь к вашему контроллеру News. Здесь вы выполните два действия: проверьте, была ли отправлена форма, и прошли ли отправленные данные правила проверки. Для этого вы будете использовать библиотеку проверки формы.
public function create()
{
$model = model(NewsModel::class);
if ($this->request->getMethod() === 'post' && $this->validate([
'title' => 'required|min_length[3]|max_length[255]',
'body' => 'required',
])) {
$model->save([
'title' => $this->request->getPost('title'),
'slug' => url_title($this->request->getPost('title'), '-', true),
'body' => $this->request->getPost('body'),
]);
echo view('news/success');
} else {
echo view('templates/header', ['title' => 'Create a news item']);
echo view('news/create');
echo view('templates/footer');
}
}
Приведённый выше код добавляет множество функций. Сначала мы загружаем NewsModel. После этого мы проверяем, имеем ли мы дело с запросом POST, а затем используется функция-помощник контроллера для проверки данных ввода пользователя. В данном случае данные POST, и поля заголовка и текста являются обязательными.
CodeIgniter обладает мощной библиотекой проверки, как показано выше. Вы можете узнать больше об этой библиотеке здесь.
Продолжая ниже, вы можете увидеть условие, которое проверяет, прошла ли проверка формы успешно. Если нет, форма отображается; если она была отправлена и прошла все правила, вызывается модель. Это позаботится о передаче записи новостей в модель. Эта модель содержит новую функцию url_title(). Эта функция, предоставленная помощником URL, обрабатывает строку, заменяя все пробелы дефисами (-) и убеждается, что всё находится в нижнем регистре. Это даёт вам хороший слаг, идеально подходящий для создания URI.
После этого загружается вид для отображения сообщения об успехе. Создайте вид в app/Views/news/success.php и напишите сообщение об успехе.
Это может быть так просто:
News item created successfully.
Обновление модели
Осталось только убедиться, что ваша модель настроена для правильного сохранения данных. Метод save(), который использовался, определит, следует ли вставить информацию или если строка уже существует и должна быть обновлена, в зависимости от наличия первичного ключа. В данном случае, поле id не передаётся, поэтому он вставит новую строку в свою таблицу, news.
Однако по умолчанию методы insert и update в модели не будут фактически сохранять данные, поскольку они не знают, какие поля безопасно обновлять. Измените NewsModel, чтобы предоставить ему список обновляемых полей в свойстве $allowedFields.
<?php
namespace App\Models;
use CodeIgniter\Model;
class NewsModel extends Model
{
protected $table = 'news';
protected $allowedFields = ['title', 'slug', 'body'];
}
Это новое свойство теперь содержит поля, которые мы разрешаем сохранять в базе данных. Обратите внимание, что мы опускаем id? Это потому, что вам почти никогда не придётся этого делать, так как это поле автоинкремента в базе данных. Это помогает защититься от уязвимостей масс-ассайнмента. Если ваша модель обрабатывает метки времени, вы также опустите их.
Маршрутизация
Прежде чем вы сможете добавлять новостные записи в своё приложение CodeIgniter, вам необходимо добавить дополнительное правило в файл app/Config/Routes.php. Убедитесь, что ваш файл содержит следующее. Это гарантирует, что CodeIgniter видит create как метод, а не как слаг записи новостей. Вы можете узнать больше о различных типах маршрутизации здесь.
$routes->match(['get', 'post'], 'news/create', 'News::create');
$routes->get('news/(:segment)', 'News::view/$1');
$routes->get('news', 'News::index');
$routes->get('(:any)', 'Pages::view/$1');
Теперь перейдите по адресу вашего локального окружения разработки, где установлено CodeIgniter, и добавьте /news/create в URL. Добавьте несколько новостей и просмотрите различные страницы, которые вы создали.
Поздравляем
Вы только что завершили своё первое приложение CodeIgniter4!
Изображение ниже показывает папку app вашего проекта со всеми файлами, которые вы создали красным цветом. Два изменённых файла конфигурации (Config/Routes.php и Config/Filters.php) не показаны.
© 2014–2020 British Columbia Institute of Technology
Licensed under the MIT License.
https://codeigniter.com/user_guide/tutorial/create_news_items.html