CakePHP с нуля проверка, удаление и редактирование данных


Содержание

Добавление данных, редактирование и удаление их и БД

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

Добавлено через 31 минуту
данные в базу отправляются, интересует вопрос как их вывести чтобы каждая ячейка выводилась в нужную ячейку из таблицы в HTML и там же удалять по кнопке именно ту строку которая идёт в линии

21.05.2015, 21:57

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

Добавление, изменение, удаление, поиск данных из Json файла
Есть задание создать страничку сайта, через которую можно добавить данные в существующий.

Добавление, редактирование и удаление данных
Всем привет, ребята, обращаюсь за помощью так как сам в тупике. В общем на DataModule-е есть TQuery.

Добавление, удаление и редактирование в базах данных
Почему при добавлении не отображается новая запись вот сам запрос private void.

Работа с БД Access, добавление, редактирование, удаление данных
Добрые люди — подскажите пожалуйста. Дали задание, а я совсем новичек в этом деле, подскажите как.

Редактирование данных в MySql с помощью PHP (админ-панель)

Вывод, редактирование и удаление данных из MySql

Если ты полностью справился с предыдущим уроком, то данный урок можно пропустить :) Здесь мы с вами пошагово сделаем следующее:

  • Создадим таблицу MySql
  • Выведем из таблицы MySql данные
  • Сделаем форму для редактирования и удаления данных из таблицы MySql

Создание таблицы

Давайте создадим в нашей БД таблицу products со следующими полями: ID, Name, Price. Поле Name у нас будет иметь тип TEXT, остальные два — INT. Если вам лень в PhpMyAdmin создавать такую табличку руками, то можете просто в нем выполнить вот этот SQL-код:

Теперь давайте заполним нашу таблицу тестовыми данными. Для наглядности мы добавим 3 записи:

Заполнить таблицу можно либо ручками через PhpMyAdmin, либо опять же вот таким простым SQL-запросом:

Вывод записей

Следующим нашим шагом будет обычный вывод этих данных из MySql на web-страничку.

Создадим новую страницу, к примеру «product_list.php» с установленным соединением с БД:

Теперь выведем все записи из таблицы. Для этого после подключения к БД (перед закрывающимся тегом

Как отредактировать пользователя CakePHP 3

Поэтому я пытаюсь получить пользовательскую функциональность редактирования, работающую в моем приложении, и я немного запутался в том, как это сделать с CakePHP 3. Это то, что у меня есть для моего действия редактирования в моем UserController .php:

И в моем файле edit.ctp:

Form->input(’email’, [ ‘label’ => __(‘Email’), ‘placeholder’ => __(‘Email’), ‘autofocus’ ]); echo $this->Form->input(‘currency’, [ ‘label’ => __(‘Default Currency’), ‘options’ => [ ‘CAD’ => ‘CAD’, ‘USD’ => ‘USD’ ] ]); echo $this->Form->input(‘password’, array( ‘label’ => __(‘Password’), ‘placeholder’ => __(‘Password’), ‘value’ => » )); echo $this->Form->input(‘confirm_password’, array( ‘label’ => __(‘Confirm Password’), ‘placeholder’ => __(‘Confirm Password’), ‘type’ => ‘password’ )); ?>

Проблема заключается в том, что пароль, прикрепленный к форме, хэшируется, поэтому, когда я использую patchEntity, он снова получает хеширование, из-за этого в объекте User.php:

Я также пробовал это, не хватая пароль, когда я устанавливаю $ user в свой контроллер. Но тогда, когда я использую patchEntity, вместо этого он просто хэширует пустое значение.


Возможно, я об этом совершенно неправильно, я просто ищу какое-то направление, как решить эту проблему, если кто-то может помочь.

Разработка простого веб-приложения CakePHP (часть 2)

Что такое CakePHP?

CakePHP – это мощный и надежный фреймворк, разработанный на основе архитектуры Model-View-Controller (MVC, или «Модель-Представление-Контроллер»). Данный фреймворк не только обладает гибкостью разработки приложения, но и предоставляет структуру для организации имен файлов и таблиц базы данных, которая помогает сохранять все в последовательном и логичном порядке.

В предыдущих руководствах этой серии было показано, как установить и настроить CakePHP на облачном сервере, а также как создать небольшое приложение, выполняющее операции CRUD (create, read, update, delete). На данном этапе вы уже знаете, как прочитать данные (посты) при помощи модели (Post), запросить их с помощью контроллера (PostsController) и создать пару представлений для отображения информации.

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

Примечание: прежде чем следовать данному руководству, пожалуйста, выполните два предыдущих руководства (если они не были выполнены ранее):

Добавление данных

Научившись выполнять операцию «чтение», можно приступить к добавлению новых постов. Прежде чем создать метод для контроллера, убедитесь, что у контроллера есть все необходимые компоненты. В предыдущем руководстве был добавлен хелпер (helper) Form:

public $helpers = array(‘Form’);

Теперь нужно добавить хелперы HTML и Session; это делается путем внесения их в массив:

public $helpers = array(‘Form’, ‘Html’, ‘Session’);

Кроме того, нужно добавить компонент Session. Ниже, под только что отредактированной строкой, внесите следующее:

public $components = array(‘Session’);

Теперь нужно создать представление, которое будет содержать форму для добавления новой записи. Это представление будет использовать только что добавленный хелпер Form, что значительно упростит работу. Итак, в папке app/View/Posts/ создайте файл add.ctpи внесите в него следующий код:

Add Post

Как видите, хелпер Form доступен прямо из представления, что позволяет очень быстро создать форму. Важно, что метод create() не получил при этом никаких параметров, он будет считать, что форма подчиняется ему (метод контроллера, загружающий данное представление будет создан далее).

Метод input() самоочевиден; тем не менее, есть один важный момент: этот метод будет генерировать элементы формы, которые соответствуют данным в таблице. Сохраните файл и создайте метод PostsController.

Внесите следующий код прямо под ранее созданный метод view() в PostsController:

public function add() <
if ($this->request->is(‘post’)) <
$this->Post->create();
$post_data = $this->request->data;
if ($this->Post->save($post_data)) <
$this->Session->setFlash(__(‘New post saved successfully to the database’));
return $this->redirect(array(‘action’ => ‘index’));
>
$this->Session->setFlash(__(‘Unable to save the post to the database.’));
>
>

Эта функция (названная, как и представление, к которому она относится) сначала проверяет, поступил ли запрос типа POST, и вносит новые данные в таблицу, используя модель Post. Если все проходит успешно, функция добавляет данные сессии текущего пользователя и передает их методу index() (который выводит все посты на экран), который затем вернет сообщение с подтверждением. Если что-то пошло не так, метод вернет сообщение об ошибке. Чтобы проверить, все ли работает, перейдите по ссылке www.example.com/project/posts/add. Заполните форму, и она должна сохранить новый пост, перенаправить на индексную страницу поста и отобразить сообщение с подтверждением.

Поскольку PostsController был создан путем расширения контроллера CakePHP по умолчанию, он имеет доступ к большому количеству полезных функций, таким как объекты запроса. При помощи объекта запроса можно проверить, какие HTTP-запросы выполняются, а также получить доступ к данным POST. Кроме того, это дает доступ к методу redirect(), с помощью которого можно быстро перенаправить пользователя на другой метод или контроллер.

Проверка данных

На данном этапе нужно создать правило для модели Post, которое будет требовать установить заголовок при публикации нового поста. Добавьте следующую строку в модель Post:

public $val => array(‘rule’ => ‘notEmpty’));

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

Зачем нужен хелпер HTML?


Хелпер HTML необходимо включать в PostsController потому, что он может показать, как поставить правильную для CakePHP ссылку на страницу. Итак, откройте представление index.ctp, расположенное в папке app/View/Posts/ и добавьте следующий код после тега H1:

Html->link(
‘Add Post’,
array(‘controller’ => ‘posts’, ‘action’ => ‘add’)
); ?>

Это вернет ссылку с анкером Add Post, которая будет передана методу add() контроллера PostsController. При желании можно таким же образом снова отредактировать файл, превратив названия постов на этой странице в ссылки на их страницы. Замените:

Цукерберг рекомендует:  Основы безопасности и анонимности в сети. Основы безопасности и анонимности в сети

Html->link($post[‘Post’][‘title’], array(‘controller’ => ‘posts’, ‘action’ => ‘view’, $post[‘Post’][‘id’])); ?>

Больше информации о данном хелпере можно найти по этой ссылке.

Редактирование данных

Научившись создавать новые посты, можно попробовать отредактировать уже существующие посты. Рядом с add.ctp нужно создать представление, назвать его edit.ctp и внести следующее:

Edit Post

Главное отличие между представлениями edit.ctp и add.ctp состоит в том, что edit.ctp содержит идентификатор поста в качестве скрытых входных данных, благодаря чему CakePHP знает, что пост нужно редактировать, а не добавить. Сохраните и закройте файл. Теперь нужно создать метод edit() для PostsController:

public function edit($ > if (!$id) <
throw new NotFoundException(__(‘Post is not valid!’));
>
$post = $this->Post->findById($id);
if (!$post) <
throw new NotFoundException(__(‘Post is not valid!’));
>
if ($this->request->is(‘post’) || $this->request->is(‘put’)) <
$this->Post-> > $post_data = $this->request->data;
if ($this->Post->save($post_data)) <
$this->Session->setFlash(__(‘Your post has been updated.’));
return $this->redirect(array(‘action’ => ‘index’));
>
$this->Session->setFlash(__(‘Unable to update your post.’));
>
if (!$this->request->data) <
$this->request->data = $post;
>
>

Проверив ID поста, это поведение убеждается, что пост, к которому что пользователь пытается получить доступ, является действительным и существует в базе данных. Как и add(), этот метод проверяет, является ли запрос POST-запросом, и обновляет пост в базе данных. Если данных в объекте запроса нет, он заполнит элементы формы существующими в БД данными. И, как и поведение add(), это поведение перенаправляет пользователя к методу index() и выводит сообщение с подтверждением. Проверьте его работу.

Кроме того, можно отредактировать представление index.ctp и внести в него ссылку для редактирования отдельных постов. Добавьте следующий код после раздела Created:

Html->link(‘Edit’, array(‘action’ => ‘edit’, $post[‘Post’][‘id’])); ?>

Удаление данных

Последнее, что нужно сделать – это позволить пользователям удалять посты. Итак, добавьте к PostsController следующее поведение:

public function delete($id) <
if ($this->request->is(‘post’)) <
if ($this->Post->delete($id)) <
$this->Session->setFlash(__(‘The post number %s has been deleted.’, h($id)));
return $this->redirect(array(‘action’ => ‘index’));
>
>
>

Данный метод выдает исключение, если запрос относится к типу GET. Потом он использует модель Post (как и вышеуказанные поведения), но теперь он удаляет строку в таблице с идентификатором, который поставляется в запросе. В завершение он отправляет сообщение пользователю и перенаправляет на метод index(), который отображает сообщение.

Чтобы запустить метод delete(), нужно отредактировать представление index.ctp и использовать функцию postLink(), которая выведет небольшую форму, отправляющую POST-запросы, чтобы удалить строку из таблицы. Эта функция использует javascript, чтобы добавить окно предупреждения, а затем удаляет сообщение/пост. В файл index.ctp после ссылки на метод edit можно добавить следующее:

Form->postLink(
‘Delete’,
array(‘action’ => ‘delete’, $post[‘Post’][‘id’]),
array(‘confirm’ => ‘Are you sure you want to delete this post?’));
?>

Сохраните и закройте файл. Теперь посты можно удалять.

Итак, резюмируя все выполненные в руководстве действия, классы должны иметь такой вид:

Контроллер PostsController.php

class PostsController extends AppController <
public $helpers = array(‘Form’, ‘Html’, ‘Session’);
public $components = array(‘Session’);
public function index() <
$this->set(‘posts’, $this->Post->find(‘all’));
>
public function view($ > $post = $this->Post->findById($id);
$this->set(‘post’, $post);
>
public function add() <
if ($this->request->is(‘post’)) <
$this->Post->create();
$post_data = $this->request->data;
if ($this->Post->save($post_data)) <
$this->Session->setFlash(__(‘New post saved successfully to the database’));
return $this->redirect(array(‘action’ => ‘index’));
>
$this->Session->setFlash(__(‘Unable to save the post to the database.’));
>
>
public function edit($ > if (!$id) <
throw new NotFoundException(__(‘Post is not valid!’));
>
$post = $this->Post->findById($id);
if (!$post) <
throw new NotFoundException(__(‘Post is not valid!’));
>
if ($this->request->is(‘post’) || $this->request->is(‘put’)) <
$this->Post-> > $post_data = $this->request->data;
if ($this->Post->save($post_data)) <
$this->Session->setFlash(__(‘Your post has been updated.’));
return $this->redirect(array(‘action’ => ‘index’));
>
$this->Session->setFlash(__(‘Unable to update your post.’));
>
if (!$this->request->data) <
$this->request->data = $post;
>
>
public function delete($id) <
if ($this->request->is(‘post’)) <
if ($this->Post->delete($id)) <
$this->Session->setFlash(__(‘The post number %s has been deleted.’, h($id)));
return $this->redirect(array(‘action’ => ‘index’));
>
>
>
>

Модель Post.php

class Post extends AppModel <
public $val => array(‘rule’ => ‘notEmpty’));
>

Итоги

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


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

Как исключить пертикулярное поле из уникальной проверки в режиме редактирования в cakephp3.0 проверка

Я хочу проверить поле с именем survey_id , которое является вводом от пользователя для уникальности. Он работает правильно и дает правильный ответ при добавлении новой записи, но когда я пытался отредактировать эту запись, он дает ошибку [unique] => Provided value already exist . Поэтому я хочу исключить survey_id текущую запись из проверки уникальности, и если пользователь вводит какое-то другое значение для survey_id нее, следует проверить поиск уникальности.

В настоящее время я использую проверку CakePHP 3.0 с on create validation. Вот правило проверки, которое я использую:

Обеспечение поддержки операций CRUD (создание, чтение, обновление и удаление) для записей форм данных Provide CRUD (Create, Read, Update, Delete) Data Form Entry Support

Это 5 из бесплатной руководство по использованию приложения «NerdDinner» , пошаговое рассмотрение как создать небольшой, но завершить, веб-приложения с помощью ASP.NET MVC 1. This is step 5 of a free «NerdDinner» application tutorial that walks-through how to build a small, but complete, web application using ASP.NET MVC 1.

Шаг 5 показано, как использовать наш класс DinnersController, включите поддержку для изменения, создание и удаление ужинов с ним, а также. Step 5 shows how to take our DinnersController class further by enable support for editing, creating and deleting Dinners with it as well.

Если вы используете ASP.NET MVC 3, рекомендуется следовать Приступая к работе с MVC 3 или MVC Music Store учебники. If you are using ASP.NET MVC 3, we recommend you follow the Getting Started With MVC 3 or MVC Music Store tutorials.

NerdDinner Step 5: Создание, обновление и удаление формы сценариев NerdDinner Step 5: Create, Update, Delete Form Scenarios

Мы появились контроллеры и представления и описаны способы их использования для реализации более возможности списка и сведений для ужинов на сайте. We’ve introduced controllers and views, and covered how to use them to implement a listing/details experience for Dinners on site. Следующим этапом будет предпринимать никаких дополнительных наш класс DinnersController и включите поддержку редактирования, создание и удаление ужинов с ним, а также. Our next step will be to take our DinnersController class further and enable support for editing, creating and deleting Dinners with it as well.

URL-адресов, обрабатываемых DinnersController URLs handled by DinnersController

Методы действий ранее добавленного DinnersController, реализована поддержка два URL-адреса: /Dinners и /Dinners/сведения / [id]. We previously added action methods to DinnersController that implemented support for two URLs: /Dinners and /Dinners/Details/[id].

URL URL VERB VERB Назначение Purpose
/Dinners/ /Dinners/ GET GET Отобразить список предстоящих ужинов HTML. Display an HTML list of upcoming dinners.
/Dinners/сведения / [id] /Dinners/Details/[id] GET GET Отображение сведений о конкретных ужин. Display details about a specific dinner.

Теперь мы добавим методы действий для реализации три дополнительные URL-адреса: /Dinners/Edit / [id], /ужинов/Create, и /Dinners/Delete / [id]. We will now add action methods to implement three additional URLs: /Dinners/Edit/[id], /Dinners/Create, and /Dinners/Delete/[id]. Эти URL-адреса будет включить поддержку редактирования существующих ужинов, создание новых ужинов и удаление ужинов. These URLs will enable support for editing existing Dinners, creating new Dinners, and deleting Dinners.

Будет добавлена поддержка взаимодействия глагол HTTP GET и HTTP POST с эти новые URL-адреса. We will support both HTTP GET and HTTP POST verb interactions with these new URLs. HTTP-запросы GET на эти URL-адреса отображается исходное представление HTML данные (форма, заполняется данными ужин в случае «edit», пустую форму в случае «создать» и окно подтверждения удаления в случае «удалить»). HTTP GET requests to these URLs will display the initial HTML view of the data (a form populated with the Dinner data in the case of «edit», a blank form in the case of «create», and a delete confirmation screen in the case of «delete»). HTTP-запросы POST к этим URL-будет сохранение, обновление и удаление данных компании Dinner в наших DinnerRepository (и из него — в базе данных). HTTP POST requests to these URLs will save/update/delete the Dinner data in our DinnerRepository (and from there to the database).

URL URL VERB VERB Назначение Purpose
/Dinners/edit / [id] /Dinners/Edit/[id] GET GET Отобразить заполняются данными компании Dinner редактируемую форму HTML. Display an editable HTML form populated with Dinner data.
ПОМЕСТИТЬ POST Сохраните изменения формы для конкретной компании Dinner к базе данных. Save the form changes for a particular Dinner to the database.
/ Ужинов/создать /Dinners/Create GET GET Отображение пустой HTML-форму, позволяющий пользователям определять новые ужинов. Display an empty HTML form that allows users to define new Dinners.
ПОМЕСТИТЬ POST Создайте новый Dinner и сохраните его в базе данных. Create a new Dinner and save it in the database.
/Dinners/delete / [id] /Dinners/Delete/[id] GET GET Отображение удалить экран подтверждения. Display delete confirmation screen.
ПОМЕСТИТЬ POST Удаляет указанный dinner из базы данных. Deletes the specified dinner from the database.

Изменить поддержки Edit Support

Начнем с реализации сценария «изменить». Let’s begin by implementing the «edit» scenario.

Метод HTTP-GET редактирования действия The HTTP-GET Edit Action Method

Мы начнем с реализации поведения «GET» HTTP наши изменения метода действия. We’ll start by implementing the HTTP «GET» behavior of our edit action method. Этот метод будет вызываться при /Dinners/Edit / [id] запрашивается URL-адрес. This method will be invoked when the /Dinners/Edit/[id] URL is requested. Наша реализация выглядят следующим образом: Our implementation will look like:

Приведенный выше код использует DinnerRepository для извлечения объекта ужин. The code above uses the DinnerRepository to retrieve a Dinner object. Затем она визуализирует шаблон представления, с помощью объекта ужин. It then renders a View template using the Dinner object. Поскольку мы еще не передается явно имя шаблона сертификата для View() вспомогательный метод, чтобы устранить этот шаблон будет использоваться путь по умолчанию на основе соглашения об: /Views/Dinners/Edit.aspx. Because we haven’t explicitly passed a template name to the View() helper method, it will use the convention based default path to resolve the view template: /Views/Dinners/Edit.aspx.

Теперь создадим этот шаблон представления. Let’s now create this view template. Мы сделаем это, щелкните правой кнопкой мыши внутри метода Edit и выбрав из контекстного меню команду «Добавление представления»: We will do this by right-clicking within the Edit method and selecting the «Add View» context menu command:

В диалоговом окне «Добавление представления» здесь мы указываем мы передаваемый объект Dinner наш шаблон представления, как его модель и выберите шаблон «Изменить», для формирования шаблонов автоматически: Within the «Add View» dialog we’ll indicate that we are passing a Dinner object to our view template as its model, and choose to auto-scaffold an «Edit» template:

При нажатии кнопки «Добавить», Visual Studio добавит новый файл шаблона представления «Edit.aspx» для нас в каталоге «\Views\Dinners». When we click the «Add» button, Visual Studio will add a new «Edit.aspx» view template file for us within the «\Views\Dinners» directory. Он также открывает новый шаблон представления «Edit.aspx» внутри редактора кода — заполняется начальной «Изменить» каркаса реализации как ниже: It will also open up the new «Edit.aspx» view template within the code-editor – populated with an initial «Edit» scaffold implementation like below:

Давайте внести некоторые изменения в созданные каркаса Edit (изменить) по умолчанию и обновите представление шаблона редактирования приведенное ниже содержимое, (что устраняет некоторые из свойств, которые мы не хотим предоставлять): Let’s make a few changes to the default «edit» scaffold generated, and update the edit view template to have the content below (which removes a few of the properties we don’t want to expose):

При запуске приложения и запрос «/ ужинов/Edit/1» URL-адрес, мы увидим следующую страницу: When we run the application and request the «/Dinners/Edit/1» URL we will see the following page:

HTML-разметка, создаваемые нашего представления выглядит как ниже. The HTML markup generated by our view looks like below. Это стандартный HTML – с элемент, который выполняет запрос HTTP POST к /Dinners/Edit/1 URL-адрес при «Сохранить» нажатия кнопки. It is standard HTML – with a элемент: The open curly brace indicates the beginning of the element:


Как удалить изображение из веб-корня при редактировании данных и обновление с помощью CakePHP

December 2020

1.3k раз

Я пишу функцию редактирования, чтобы обновить данные Новости, удалить предыдущее изображение с веб-сервера и вставить новое изображение:

Я не могу удалить старое изображение и вставить новый образ, как я могу исправить свою функцию?

2 ответы

Pass путь_к_файла в качестве первого аргумента unlink() :

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

Здесь ваши данные не могут найти существующие данные. использовать этот код

WebForMyself [WebForMyself] Фреймворк CakePHP. Уроки, документация, обучение, использование (2020)

Arsenn32

Arsenn32

Автор: WebForMyself
Название: Фреймворк CakePHP. Уроки, документация, обучение, использование (2020)

Приветствую, Вас друзья в новой рубрике раздела Премиум, посвященной изучению и работе с фреймворком CakePHP!

Данная серия записывается преимущественно в качестве ответов на вопросы, которые вы задаете по материалам курса Фреймворк CakePHP: с Нуля до Гуру на примере создания корпоративного сайта. Для тех, кто не знаком с данным фреймворком, пожалуй, стоит сказать несколько слов о Кейке и почему с ним стоит работать.

CakePHP, как и любой фреймворк, предоставляет уже готовую структуру будущего приложения, готовый каркас с набором библиотек кода, которые мы можем использовать в своем проекте. А коль есть готовая структура — наше приложение будет создано гораздо быстрее. И действительно, Кейк позволяет создавать веб приложения проще, быстрее и писать меньше кода. В нем нет никаких сложных XML или YAML файлов. Достаточно просто сконфигурировать соединение с базой данных и можно начинать разработку.

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

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

CakePHP с нуля: проверка, удаление и редактирование данных

4388 просмотра

4 ответа

1487 Репутация автора

Как сохранить пользователей в моем приложении CakePHP, не требуя от них каждый раз менять свой пароль?

У меня есть код, чтобы проверить два поля пароля и применить некоторые правила проверки, которые отлично подходят для регистрации и изменения паролей в представлении «редактировать». Однако как пропустить правила проверки и сохранить пароль, если поля пароля остались пустыми в представлении «Редактирование»? Очевидно, я не хочу пропустить это требование при регистрации.

register.ctp и edit.ctp:

Правила проверки User.ctp:

и логика User.ctp перед сохранением:


Ответы (4)

1 плюс

5833 Репутация автора

1 плюс

1522 Репутация автора

Если вы используете CakePHP 2.2:

Также в функции beforeSave оберните первые две строки в условные выражения, если оба поля пароля не пусты.

плюса

1 Репутация автора

Просто удалите поле из edit.ctp

Потому что this-> request-> data заполняет хешированный пароль в поле пароля. При сохранении пароля пользователя хэшируется снова и становится другим, чем оригинальный

Автор: Ashok Размещён: 05.09.2015 10:54

плюса

4710 Репутация автора

Для тех, кто хочет что-то без изменения модели (и сохранения правила onUpdate при отправке нового пароля): Обновление пользователя с паролем или без него — CakePHP

LXF138:CakePHP

Подписка на печатную версию Весь 2015 год (12 номеров) Первое полугодие (6 номеров) Второе полугодие (6 номеров) Подписка на электронную версию Весь 2015 год (12 номеров) Первое полугодие (6 номеров) Второе полугодие (6 номеров) Подшивки старых номеров журнала (печатные версии) Весь 2014 год (12 номеров) Первое полугодие (6 номеров) Второе полугодие (6 номеров)

CakePHP’ Про­стая раз­ра­бот­ка web-при­ло­же­ний с БД. Ну, до­воль­но про­стая…

CakePHP
  • Часть 1: CakePHP: Раз – и web-при­ло­же­ние!
  • Часть 2: CakePHP: Раз – и web­-приложениe!
  • Часть 3: CakePHP: Пишем загрузчик файлов
  • Часть 4: CakePHP: Сайт для закладок
  • Заключсение: CakePHP: Важные ресурсы

Содержание

CakePHP: Раз – и web-при­ло­же­ние!

Ввод­ная стра­ни­ца CakePHP да­ет сла­бое пред­став­ле­ние о его мо­щи — вни­кай­те глуб­же!

На­ча­лось. У вас все­го 15 ми­нут, а нуж­но соз­дать ка­та­лог ог­ром­ной кол­лек­ции филь­мов. Кто при­дет на по­мощь? Конеч­но, CakePHP! CakePHP – кар­кас для бы­ст­рой раз­ра­бот­ки при­ло­жений, ох­ва­ты­ваю­щий все стан­дарт­ные ве­щи, встре­чаю­щие­ся в web-про­грам­ми­ро­вании. Ре­шение по­вто­ряю­щих­ся за­дач вы­сво­бо­дит вам боль­ше вре­мени на ко­фе, иг­ры и про­чее. На этом ввод­ном уро­ке мы соз­да­дим биб­лио­те­ку муль­ти­ме­диа, где бу­дет хранить­ся ин­фор­ма­ция о ва­ших филь­мах.

Для ра­бо­ты CakePHP нуж­но со­всем немно­го. По­на­до­бит­ся web-сер­вер ти­па Apache, PHP 4+ (луч­ше 5+), MySQL 4+ и тек­сто­вый ре­дак­тор на ваш вы­бор. На мо­мент напи­сания ста­тьи по­следней вер­си­ей CakePHP бы­ла 1.3.

За­гру­зить по­след­нюю вер­сию мож­но в ви­де ар­хи­ва с сай­та http://github.com/cakephp/cakephp/downloads, или по­лу­чить ее из ре­по­зи­то­рия http://github.com/cakephp/cakephp с по­мо­щью Git.

По­сле за­груз­ки ар­хи­ва с сай­та или из ре­по­зи­то­рия ско­пи­руй­те со­дер­жи­мое па­ке­та cakephp в DocumentRoot web-сер­ве­ра. У вас дол­жен поя­вить­ся ка­та­лог /directory, со­дер­жа­щий под­ка­та­ло­ги /app, /cake, /plugins и /vendors и фай­лы .htaccess, index.php и README.

На­строй­ка ба­зы дан­ных


Для по­вы­ше­ния бы­ст­ро­дей­ст­вия CakePHP за­пи­сы­ва­ет фай­лы кэ­ша и дру­гие ме­ло­чи в ка­та­лог app/tmp. Нуж­но убе­дить­ся, что у поль­зо­ва­те­ля, под ко­то­рым за­пу­щен web-сер­вер, есть пра­во на за­пись в этот ка­та­лог. Бы­ст­рее все­го раз­ре­шить за­пись всем ко­ман­дой: chmod -R 777 app/tmp

Сле­дую­щий шаг – на­строй­ка ба­зы дан­ных. Восполь­зу­ем­ся MySQL, так как это са­мая по­пу­ляр­ная из сво­бод­ных СУБД, и для на­ше­го при­ло­жения соз­да­дим сле­дую­щую ба­зу дан­ных:

Конеч­но, это все­го лишь таб­ли­ца, но для хранения ин­фор­ма­ции и ра­бо­ты при­ло­жения ее доста­точ­но.

Об­ра­ти­те внимание, что для иден­ти­фи­ка­то­ра ка­ж­дой запи­си ис­поль­зу­ет­ся по­ле ти­па CHAR(36). CakePHP за­ме­ча­ет это, и при до­бав­лении но­вых запи­сей ав­то­ма­ти­че­ски генери­ру­ет им уникаль­ный универ­саль­ный иден­ти­фи­ка­тор UUID вме­сто чи­сло­во­го зна­чения. Это по­лез­ная при­выч­ка, поскольку она уп­роща­ет дальней­шее слияние дан­ных из раз­лич­ных баз. Та­ков один из под­хо­дов CakePHP, осно­ван­ный на со­гла­шениях и от­ра­жаю­щий прин­цип раз­ра­бот­ки при­ло­жений в CakePHP: «Со­гла­шения важнее кон­фи­гу­ра­ции».

Еще один при­мер дан­но­го под­хо­да за­ме­тен в по­лях created и modified. Не нуж­но пи­сать ника­ко­го ко­да, что­бы по­ле created за­пол­ня­лось те­ку­щи­ми да­той и вре­менем при соз­дании запи­си. Для за­полнения вто­ро­го по­ля де­лать то­же ниче­го не нуж­но. CakePHP возь­мет все в свои ру­ки и по­за­бо­тит­ся об этом сам, зна­чи­тель­но уско­рив раз­ра­бот­ку при­ло­жения и уп­ро­стив его.

Так как для на­званий филь­мов мы вы­бра­ли по­ле title, что со­от­вет­ству­ет од­но­му из из­вест­ных CakePHP «умол­ча­тель­ных» за­го­лов­ков ко­ло­нок, мы уви­дим еще немно­го вол­шеб­ства – CakePHP ав­то­ма­ти­че­ски возьмет на­звания всех запи­сей (при со­став­лении спи­сков и да­лее в та­ком ду­хе) имен­но из это­го столб­ца.

Пе­ред пе­ре­хо­дом к сле­дую­ще­му ша­гу соз­дай­те таб­ли­цу.

Уста­нов­ка со­единения с БД

На­строй­ка ба­зы дан­ных в CakePHP про­ста. Есть файл /app/config/database.php.default – это при­мер фай­ла кон­фи­гу­ра­ции БД. Про­ще все­го ско­пи­ро­вать этот файл в /app/config/database.php. В соз­дан­ной ко­пии из­мените па­ра­мет­ры досту­па к ба­зе дан­ных. Для на­ше­го при­ло­жения нуж­но на­стро­ить толь­ко со­единение $default. Это долж­но вы­гля­деть при­мер­но так:

CakePHP вклю­ча­ет фай­лы .htaccess для ра­бо­ты с мо­ду­ля­ми mod_rewrite на сер­ве­рах Apache с эф­фек­тив­ной пе­ре­за­пи­сью URL-ад­ре­сов. Эти бо­лее удоб­ные ад­ре­са не обя­за­тель­ны, но с ни­ми пу­ти про­ще за­по­ми­на­ют­ся: http://mysite.com/movies/add луч­ше, чем http://mysite.com?url=movies/add. Ус­та­но­ви­те mod_rewrite для Apache, ес­ли вы это­го еще не сде­ла­ли, и на­строй­те его на при­ме­не­ние дру­же­люб­ных URL-ад­ре­сов.

Те­перь мож­но ­гру­зить страницу при­вет­ствия CakePHP, от­крыв в брау­зе­ре ад­рес, по ко­то­ро­му рас­по­ло­жен сер­вер. Вы уви­ди­те зе­ле­ные ин­ди­ка­то­ры, оз­на­чаю­щие успеш­ную уста­нов­ку CakePHP. Ес­ли в на­строй­ках что-то не так, ин­ди­ка­то­ры бу­дут жел­ты­ми, и поя­вит­ся под­роб­ное со­об­щение об ошиб­ке, ко­то­рое по­мо­жет ре­шить про­бле­му. Для на­ше­го при­ло­жения мож­но иг­но­ри­ро­вать все со­об­щения о за­тра­воч­ном зна­чении [Security Salt] или пре­ду­пре­ж­дения о клю­че шиф­ро­вания [Cipher Key] – ему это­го не на­до.

Возь­мем­ся за код все­рь­ез, соз­дав класс MoviesController в /app/controllers/movies_controller.php.

Для об­ра­бот­ки со­об­ще­ний об ошиб­ках мы вклю­чи­ли ком­по­нент Session.

Од­но за дру­гим соз­да­дим дей­ствия, предоставляемые поль­зо­ва­те­лям, про­смат­ри­ваю­щим ба­зу дан­ных филь­мов. Дей­ствия – это пуб­лич­но до­ступ­ные функ­ции кон­трол­ле­ра. Для всех опе­ра­ций, вы­пол­няе­мыхнад филь­мом в ба­зе дан­ных, соз­да­дим в кон­трол­ле­ре дей­ствия типа CRUD. CRUD – это со­кра­щение от Create, Read, Update и Delete [Соз­дать, Про­чи­тать, Об­но­вить и Уда­лить]. На­ши дей­ствия по­лу­чат на­звания index, add, edit, view и delete.

Начнем с дей­ствия index – вы­во­д спи­ска всех филь­мов в ба­зе дан­ных. В кон­тро­ле­ре есть объ­ект сущ­но­сти Movie; он пред­став­ля­ет со­бой мо­дель. Он ав­то­ма­ти­че­ски вклю­ча­ет­ся CakePHP и со­от­вет­ству­ет имени кон­трол­ле­ра. Мо­жер вы­звать find() в этой мо­де­ли, и CakePHP пре­об­ра­зу­ет эти вы­зо­вы в за­про­се к ба­зе дан­ных – нам не при­дет­ся пи­сать SQL-за­прос вруч­ную. По­тря­саю­ще! Ниже мы вы­зы­ва­ем ме­тод find() с ар­гу­мен­том all и запи­сы­ва­ем ре­зуль­тат в пред­став­ление для по­сле­дую­ще­го ото­бра­жения.

Вот и все, что нуж­но для дей­ствия index. Понимаю, что вы­гля­дит это бе­зы­скусным, но в том-то и пре­лесть CakePHP – неза­чем все услож­нять.

Соз­да­ем пер­вое пред­став­ление

Дей­ствие го­то­во – соз­дадим пред­став­ление, что­бы мож­но бы­ло про­смат­ри­вать дан­ные и ра­бо­тать с ними. Пред­став­ления в CakePHP – про­стые PHP-фай­лы с рас­ши­рением ctp. Они напи­са­ны на обыч­ном PHP.

Соз­дай­те свое пер­вое пред­став­ление в фай­ле /app/views/mov­ies/index.ctp. Сна­ча­ла соз­дайте ка­та­лог movies в /app/views. До­бавь­те ту­да код из фраг­мен­та 1 на LXFDVD:

Это бу­дет зна­ко­мо всем, кто стал­ки­вал­ся с HTML и PHP. От­ли­чие в том, как вспо­мо­га­тель­ные клас­сы пред­став­ления ис­поль­зу­ют­ся для вы­во­да ин­фор­ма­ции вро­де ссылок. Вспо­мо­га­тель­ный класс HtmlHelper по­зво­ля­ет пе­ре­да­вать мас­си­вы дан­ных в дей­ствия View, Edit и Delete. Они пре­об­ра­зу­ют­ся в ад­ре­са на­по­до­бие http://mysite.com/movies/view/1234 (для ссыл­ки на про­смотр).

Пред­став­ление ите­ри­ру­ет пе­ре­мен­ную $movies, уста­нов­лен­ную ранее кон­трол­ле­ром MoviesController, и вы­во­дит все запи­си в таб­ли­це (в кон­це кон­цов, это таб­лич­ные дан­ные).

Ес­ли у вас дру­гой стан­дарт струк­ту­ры ба­зы дан­ных, это не про­бле­ма. CakePHP спра­вит­ся с лю­бым. Сле­до­ва­ние со­гла­ше­ни­ям (http://book.cakephp.org/view/901) сэ­ко­но­мит вам вре­мя, но это не же­ст­кое тре­бо­ва­ние.

Те­перь от­кроем ад­рес /movies/index на ва­шем сер­ве­ре и про­смот­рим дан­ные, вы­ве­ден­ные но­вым пред­став­лением. Ес­ли на сер­ве­ре толь­ко од­но раз­ра­ба­ты­вае­мое при­ло­жение CakePHP, ад­рес бу­дет та­ким: http://mysite.com/movies/index. Или, ес­ли при­ло­жение на­хо­дит­ся в под­ка­та­ло­ге, об­ра­щай­тесь к нему: http://mysite.com/my_directory/movies/index.

На дан­ный мо­мент филь­мов в ба­зе нет. Сроч­но соз­да­дим функ­цио­нал для их до­бав­ления: вре­мя-то идет!

Соз­дание дей­ствия add и про­смотр

Те­перь рас­ши­рим наш кон­трол­лер, до­ба­вив в него функ­цию add. С ее по­мо­щью но­вые филь­мы бу­дут до­бав­лять­ся в ба­зу дан­ных. Нуж­но про­ве­рить, бы­ли ли вве­де­ны в фор­му ка­кие-то дан­ные, и ес­ли да, про­ве­рить ее на на­ли­чие оши­бок и об­ра­бо­тать. Это ка­жет­ся слож­ным, но CakePHP об­лег­ча­ет ре­шение дан­ной за­да­чи. Со­от­вет­ствую­щий фраг­мент ко­да мож­но уви­деть в Листин­ге 2 на LXFDVD.

Пред­став­ление для до­бав­ления филь­мов ис­поль­зу­ет вспо­мо­га­тель­ный класс форм CakePHP, по­зво­ляю­щий лег­ко соз­да­вать фор­мы на все слу­чаи жизни. Здесь мы про­сто оп­ре­де­ля­ем, для ка­кой мо­де­ли соз­да­ет­ся фор­ма (в дан­ном слу­чае, мо­дель Movie) и ка­кие по­ля мы пре­доста­вим поль­зо­ва­те­лям.


Соз­дай­те файл /app/views/movies/add.ctp и по­мести­те ту­да сле­дую­щий код:

Са­мо соз­дание фор­мы про­ис­хо­дит в пер­вых трех стро­ках фай­ла. Все осталь­ное – HTML-код для рас­по­ло­жения эле­мен­тов на странице и генера­ции ссыл­ки для воз­вра­та к спи­ску филь­мов.

Те­перь мож­но пе­рей­ти к фор­ме соз­дания филь­мов, от­крыв ад­рес /movies/add или щелк­нув по ссыл­ке «New Movie», ко­то­рую мы до­ба­ви­ли на глав­ную страницу.

Добавление фильма с действием Add Да, это просто, но вся пре­лесть в малом объеме требуемого кода

Бле­стя­ще! Но мож­но пой­ти даль­ше и до­ба­вить па­ру филь­мов. В при­ме­ре на сле­дую­щем эк­ран­ном сним­ке мы до­бав­ля­ем ин­фор­ма­цию о филь­ме «Че­ло­век-па­ук 3» в фор­ма­те Blu-ray. По­сле до­бав­ления ин­фор­ма­ции об оче­ред­ном филь­ме вы пе­ре­на­прав­ляе­тесь на глав­ную страницу, где в спи­ске филь­мов по­яв­ля­ет­ся но­вая запись.

Уда­ля­ем филь­мы

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

До­бавь­те дей­ст­вие уда­ле­ния в кон­трол­лер Movies:

Для тех, у ко­го на на­шем уро­ке воз­ник­ли про­бле­мы или про­сто не хва­та­ет тер­пе­ния на­би­рать код с жур­на­ла, был соз­дан ре­по­зи­то­рий, от­ку­да мож­но лег­ко и бы­ст­ро за­гру­зить код это­го при­ме­ра. Най­ти его мож­но на GitHub под мо­ей учет­ной за­пи­сью (http://github.com/predominant/cakephp_linux_format).

До­пол­ни­тель­ная ин­фор­ма­ция и ру­ко­во­д­ства по CakePHP дос­туп­ны че­рез офи­ци­аль­ную сеть его под­держ­ки. Мы по­пы­та­лись по­до­б­рать са­мые по­лез­ные:

Ранее мы уже до­ба­ви­ли ссыл­ки на уда­ление филь­мов на страницу ин­дек­са. А те­перь мож­но запросто уда­лять филь­мы, щелк­нув по этим ссыл­кам! Вы мог­ли за­ме­тить, что фраг­мент ко­да, соз­даю­ще­го ссыл­ку на уда­ление, длиннее, чем для дей­ствий про­смот­ра и ре­дак­ти­ро­вания. Это объ­яс­ня­ет­ся тем, что в дей­ствие уда­ления вклю­чен код JavaScript для по­ка­за пре­ду­пре­ж­дения, ко­то­рый спра­ши­ва­ет поль­зо­ва­те­ля, дей­ст­ви­тель­но ли он хо­чет уда­лить эту запись. Этот ме­ханизм по­зво­лит поль­зо­ва­те­лю вер­нуть­ся на­зад, из­бе­жав слу­чай­но­го уда­ления, так как с дей­стви­ем не свя­за­но ни од­но­го пред­став­ления.

До­бав­ле­ние филь­ма с дей­ст­ви­ем Add. Да, это про­сто, но вся пре­лесть в ма­лом объ­е­ме тре­буе­мо­го ко­да.

Ре­дак­ти­ру­ем дан­ные

Да­же луч­шим из луч­ших слу­ча­ет­ся оши­бить­ся, и хо­ро­шо бы иметь дей­ствие для ре­дак­ти­ро­вания дан­ных, что­бы при необ­хо­ди­мо­сти ис­прав­лять ошиб­ки или вно­сить в запи­си изменения. Это дей­ствие очень по­хо­же на дей­ствие до­бав­ления; основ­ное от­ли­чие в том, что ра­бо­та про­из­во­дит­ся с ID су­ще­ствую­щей запи­си. На са­мом де­ле они на­столь­ко по­хо­жи, что опыт­ные раз­ра­бот­чи­ки CakePHP объ­е­ди­ня­ют дей­ствия add и edit в од­но. Для эко­но­мии места код вынесен на LXFDVD в Листинг 3; до­бавь­те его в свой кон­трол­лер.

Основ­ные раз­ли­чия ме­ж­ду дей­ствия­ми add и edit в том, что дей­ствию ре­дак­ти­ро­вания пе­ре­да­ет­ся иден­ти­фи­ка­тор запи­си и в нем не вы­зы­ва­ет­ся ме­тод create() объ­ек­та Movie, по той при­чине, что при со­хранении в ба­зе долж­ны уце­леть все имею­щие­ся в запи­си поля.

Пред­став­ление для ре­дак­ти­ро­вания

По­ка все долж­но вы­гля­деть зна­ко­мым. Пред­став­ление edit, ко­то­рое мы на­ме­ре­ны соз­дать, поч­ти иден­тич­но фор­ме до­бав­ления add. По­вто­рюсь, раз­ра­бот­чи­ки, ка­кое-то вре­мя про­ра­бо­тав­шие с CakePHP, объ­е­ди­ня­ют add и edit в од­но пред­став­ление, что­бы не бы­ло по­вто­ров ко­да. Един­ствен­ное от­ли­чие со­сто­ит в по­яв­лении в фор­ме вход­но­го па­ра­мет­ра id и кноп­ки для от­прав­ки фор­мы.

Соз­дай­те файл /app/views/movies/edit.ctp и по­мести­те ту­да сле­дую­щий код:

Со­хра­ним пред­став­ле­ние

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

Когда вы от­кры­вае­те в брау­зе­ре дей­ствие про­смот­ра, ему пе­ре­да­ет­ся иден­ти­фи­ка­тор в URL-ад­ре­се, что­бы мы зна­ли, ин­фор­ма­цию о ка­ком филь­ме нуж­но по­ка­зать.

До­бавь­те та­кое дей­ст­вие про­смот­ра в кон­трол­лер Movies:

Про­смотр под­роб­ной ин­фор­ма­ции о филь­ме.

Соз­да­ем под­роб­ное пред­став­ле­ние

На­ше по­следнее пред­став­ление – про­сто таб­ли­ца со всей име­ющейся ин­фор­ма­ци­ей о филь­ме. Соз­дай­те это пред­став­ление в фай­ле /app/views/movies/view.ctp – код при­ве­ден в Листин­ге 4 на LXFDVD.

По­следние дей­ствие, на ко­то­рое мы со­сла­лись с глав­ной стра­ницы, те­перь ра­бо­та­ет! Щелкните по ссыл­ке «view» ря­дом с одним из филь­мов – вы уви­ди­те ре­зуль­тат ра­бо­ты толь­ко что соз­дан­но­го пред­став­ления. Об­ра­ти­те внимание, что вы­во­дит­ся так­же удоб­ный спи­сок под­хо­дя­щих дей­ствий для те­ку­щей запи­си.

Ес­ли из­менить запись или соз­дать но­вую, CakePHP об­но­вит по­ля со вре­менем соз­дания и из­менения. Это часть ав­то­ма­ти­че­ско­го функ­цио­на­ла, пре­достав­ляе­мо­го кар­ка­сом. От­ре­дак­ти­руй­те па­ру запи­сей, что­бы по­смот­реть, как ме­ня­ют­ся их по­ля.

Цукерберг рекомендует:  Чат для вашего сайта NodeJS + WebSockets
Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих