CakePHP

Ещё весной после завершения работы над очередным сайтом я понял, что пора что-то менять в процессе программирования. А именно: найти и освоить подходящий «каркас» (framework) для более быстрой разработки. Пройдясь по нескольким сайтам со сравнениями (например этом), остановился на двух MVC-системах: CakePHP и Code Igniter. Важным условием для меня было и остаётся совместимость с PHP 4.

Решил остановиться на CakePHP из-за более полной документации и сравнительно неплохой поддержки (форум на Google Groups, примеры кода на CakeForge) Выглядит разработка приложения на CakePHP примерно так:

Модель (база данных), предположим, для таблицы users:

class User extends AppModel
{
    var $name = 'User';
}

И это всё. Теперь контроллер для пользователей:

class UsersController extends AppController
{
    var $name = 'Users';
    function index()
    {
        $this->pageTitle = 'Пользователи';
        $this->set('users', $this->User->findAll());
    }
function view($id = null)
    {
        $this->pageTitle = 'Пользователь №'.$id;
        $this->User->id = $id;
        $this->set('user', $this->User->read());
    }
}

Соответственно index() будет обрабатывать индексную страничку /users/, а view() — страничку пользователя /users/view/{id}/.

Ну и шаблон для функции view(), к примеру (файл шаблона называется по имени функции контроллера — view.thtml):

Email:

Т.е. просто выводим эти переменные в html. Где name, email и description — поля в таблице users.

Когда я делал первый сайт с помощью CakePHP, мне иногда казалось, что раньше я программировал на ASMе.

Хотелось бы отметить также, что CakePHP использует те же самые принципы, что и модный нынче RubyOnRails. Однако CakePHP имеет 1 очень важное преимущество перед RoR: огромная распространённость PHP. Сложно найти хостинг, который не имеет поддержки PHP 4.

Опубликовано 18.08.06 14:34 в Программирование.
  • Евгений

    А вы не подскажите как работать в связке cakephp+mysql=unicode?

    сколько ни пробую, юникод в php файлах отображается на ура, как только я беру данные из mysql, то все в «?????????» в вопросах.
    Iñtërnâtiônàlizætiøn не работает….
    везде поставил uft8_general_ci

  • http://yatsenko.ru Сергей Яценко

    Откройте файл cake/libs/model/dbo/mysql.php (или mysqli.php) и найдите такой код:

    if (mysqli_select_db($this->connection, $config['database'])) {
        $this->connected = true;
    }
    
    после фигурной скобки вставьте:
    mysqli_query($this->connection, "SET names utf8");
    
    чтобы выглядело примерно так:
    
    if (mysqli_select_db($this->connection, $config['database'])) {
    	mysqli_query($this->connection, "SET names utf8");
    	$this->connected = true;
    }
    
  • Евгений

    Спасибо огромное!
    Не первый год мучаюсь с этой проблемой. ))

  • http://inline.dn.ua/ Setti

    > Не первый год мучаюсь с этой проблемой

    Странно… И нашли решение только сейчас??

  • SerejK

    А в последней стабильно версии CakePHP проблема с кодировкой решается и того проще!)) Нужно в database.php в массив добавить ‘encoding’=>’utf8′! Не нужно рыть исходники самого CakePHP, он все за вас сделает!)) вот такой конфиг у меня получился:
    var $default =
    array(‘driver’ => ‘mysql’,
    ‘connect’ => ‘mysql_connect’,
    ‘host’ => ‘localhost’,
    ‘login’ => ‘root’,
    ‘password’ => »,
    ‘database’ => ‘test’,
    ‘prefix’ => »,
    ‘encoding’ => ‘utf8′);

  • http://cake-php.ru Николай

    Ребята какие-то занялись переводом английского мануала на русский язык. Думаю всем будет полезно: http://cake-php.ru

  • http://snowcore.blogspot.com/ Snowcore

    Сам перехожу на Cake — просто в восторге от его возможностей!

  • Aziz

    Огромное спасибо.
    у меня почему-то еncoding не заработал

  • http://www.vint.if.ua Тамерлан

    encoding нормально заработал
    ‘encoding’=>’cp1251′
    ??????????? теперь для меня не проблема :)

  • Марго

    У меня похожая проблема. Связка mySQL + cakePHP. В базе данных русские буквы нормально отображаются, а если выводить данные из таблицы в документ или просто русские данные выводить в html-документе, то выводятся они в какой-то непонятной кодировке. Если потом вручную в браузере исправить кодировку на windows-1251, то всё становится номрально. Но хочется ведь, чтоб всё автоматом выполнялось. Не подскажете, как это исправить? Где кодировку менять надо — в базе или cakephp?

  • http://yatsenko.ru Сергей Яценко

    Марго, последовательность действий для решений проблем с кодировками такая:

    1. Убедитесь, что база данных и/или текстовые поля созданы в нужной вам кодировке. Если нет, то поменяйте кодировку при помощи SQL типа:

    ALTER TABLE mytable CONVERT TO CHARACTER SET utf8 (или cp1251)
    

    2. Убедитесь, что соединение в вашем скрипте открывается с нужной кодировкой. В Cake это устанавливается путем настройки параметра encoding в конфиге базы данных database.php:

    'encoding' => 'utf8' (или cp1251)
    

    В других скриптах после соединения с БД нужно посылать специальный SQL для установки кодировки соединения:

    SET NAMES utf8 (или cp1251)
    

    И только затем работать с таблицами на чтение и запись.

    3. Ну и напоследок убедитесь, что в HTML-коде, выводящем данные из базы, установлена нужная кодировка. Такая же, как и в базе данных, естественно.

    Удачи!

  • Marvin

    Поизучал немного мануал и туториалы, но так и не понял простой вещи, как сделать что-бы на странице было несколько блоков из разных вьюверов? Использовать элементы?

  • Мамончик Александр

    Можно использовать Layout. Создайте несколько необходимых, а в контроллере меняйте их с условием.