Дек 04 2008
И снова про основы
Попробую для новичков более подробно описать особенности взаимодействия частей приложения на CakePHP.
Первая основополагающая идея заложена в понятии «Модель». Что такое модель? Это объектно-ориентированное представление данных внутри приложения, с интуитивно-понятным интерфейсом. Под интерфейсом тут надо понимать не внешний вид, а именно способ взаимодействия с другими объектами приложения.
Чтобы было проще понять, приведу пример.
Представим, что у нас есть база данных из двух таблиц — категории и товары. В одной категории может быть несколько товаров. Для того чтобы вывести список всех категорий, в классическом php, прямо по примеру из мануала надо выполнить подключение к серверу БД, выбор базы данных, затем запрос «SELECT * FROM cats». Результатом запроса будет неудобоваримая переменная типа «ресурс», из которой в цикле, построчно, нужно выбирать строки данных. Если в другом месте программы опять понадобится список категорий, но отформатированный по-другому — добро пожаловать снова запрос и цикл.
А как аналогичный запрос выполнить в CakePHP? Подключение к серверу и выбор базы данных заменяются на прописывание настроек в /app/config/database.php и создание файла модели /app/models/cat.php:
<?php class Cat extends AppModel { var $name = 'Cat'; } ?>
В самом же коде приложения (в коде контроллера) вместо SELECT’а и построчной обработки «ресурса» достаточно вызвать
$cats = $this->Cat->find('all');
Значение этого вызова для человека, хотя бы немножко знающего английский должно быть абсолютно понятно — найти всё. В результате, в переменной $cats будет готовый массив, содержащий все категории из таблицы cats.
Догадайтесь, как удалить запись из таблицы? Правильно:
$this->Cat->remove($id);
или
$this->Cat->del($id);
А как сохранить запись? Опять элементарно:
$this->Cat->save($data);
Для того чтобы связать таблицы категорий и товаров не надо придумывать сложные запросы для совместного поиска, сохранения и удаления — достаточно прописать еще несколько строк в файле модели по стандартному образцу из документации и «автомагия» CakePHP будет все делать за вас.
Очень важно понять, что это не просто стандартные, заранее написанные функции поиска, сохранения и удаления. Это — концепция, представление данных внутри вашего проекта. Вызов этих функций из разных частей приложения, из разных контроллеров, компонентов, других моделей — всегда ведет к одному и тому же результату. Это — универсальный способ работы с данными, когда программист уже не заботится о сложностях написания многоэтажных sql-запросов, проблемах получения из них результатов и конверсии их к определенному, придуманному им типу или формату массива. Все эти функции уже возвращают один и тот же универсальный массив.
Январь 25th, 2009 at 20:42
Ну вот! Надеялся увидеть что-нибудь о взаимодействии, а увидел однотипный пример. Интересует пример межмодульного взаимодействия. Например, для данного случая - как на одной странице отобразить название выбранной категории и список товаров данной категории. То есть, здесь должно быть использование модели категорий (для получения наименования категории) и использование модели товаров (для получения списка товаров). Как это реализовать?
Февраль 9th, 2009 at 10:18
Очень просто - организуйте связь “один-ко-многим” (hasMany) категорий и товаров. Тогда при поиске категории, например
будет возвращен массив с информацией о категории и всех входящих в нее товаров.
Массив будет вида
Соответственно такой массив легко обработать или вывести с помощью foreach.