Урок2 : Первичная настройка
Рубрика: Создаем блог вместе
5 Апр. 2009Эта статья устарела т.к. была написана для yii версии 1.0.х; Если вы используете более новую версию - у вас могут возникнуть ошибки из-за несовместимости. Обычно ответы на все вопросы работы на 1.1.х были описаны в комментариях ниже статьи.
Вот и начинается наконец то серьезная работа по написанию документации по блогу. Весь вчерашний день я был занят написанием небольших статей по компонентам и багам, но сегодня я постараюсь изложить побольше материала относительно блога.
Урок 2 : "Первичная настройка" - расскажет вам: о том какую структуру базы данных я подобрал для своего блога, как подключится к mySQL базе данных и многое другое.
---Структура базы данных
Для блога я использовал базу данных mySQL и несложную, практически стандартную, структуру для блога. В данный момент он не содержит в себе всего того функционала который я хотел в него вложить и постепенно он будет пополнятся. На момент написания данного урока - в базе данных у меня 4 таблицы.
Таблица user
Эта таблица нам нужна для хранения зарегистрированных пользователей блога. Содержит она в себе поле логина, пароля и дату регистрации.
Дамп:
CREATE TABLE `user` (
`id` int(11) NOT NULL auto_increment,
`login` varchar(250) NOT NULL,
`passwd` varchar(250) NOT NULL,
`created` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
Таблица post
Может считаться сердцем блога. Данная таблица содержит в себе все темы блога.
Дамп:
CREATE TABLE `post` (
`id` int(11) NOT NULL auto_increment,
`id_user` int(11) NOT NULL,
`id_category` int(11) NOT NULL,
`name` varchar(250) NOT NULL,
`url` varchar(100) NOT NULL,
`text` text NOT NULL,
`active` tinyint(4) NOT NULL default '1',
`created` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `url` (`url`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=20 ;
Обьясненеи полей:
id_user - порядковый номер создателя сообщения.
id_category - порядковый номер категории к которой относится сообщение.
name - название или тема сообщения
url - адрес сообщения
text - сам текст сообщения
active - флаг который говорит нам скрыто сообщение или нет
created - дата создания сообщения
Таблица category
Содержит в себе простой перечень категорий - и их адресов. Дамп таблицы выглядит следующим образом:
CREATE TABLE `category` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(250) NOT NULL,
`url` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=14 ;
Всё просто и думаю в разборе не нуждается.
Таблица comments
Хранит в себе комментарии пользователей блога. На момент написания данного урока - блог не принимает сообщения от незарегистрированных пользователей, но таблица создавалась на будущее и имеет ориентированные поля на данную функцию. Что это значит, объясняю, таблица содержит в себе поле login и поле id_user. Считалось что если в будущем будет дописана возможность незарегистрированным пользователям оставлять комментарии то поле логин - будет заполнено указанным именем гостя, а поле id_user = 0.
Дамп:
CREATE TABLE `comments` (
`id` int(11) NOT NULL auto_increment,
`id_post` int(11) NOT NULL,
`id_user` int(11) NOT NULL,
`login` varchar(250) NOT NULL,
`text` text NOT NULL,
`created` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;
id_post - номер сообщения к которому относится данный комментарий
id_user - номер автора комментария. 0 - если автор не зарегистрирован
login - логин автора сообщения. используется если автор сообщения - не зарегистрирован
text - текст сообщения
created - дата создания сообщения
Итог по структуре
Как вы видите структура базы очень простая и понятна. Все достаточно просто и с небольшим намёком на будущий функционал. Надеюсь проблем на данном этапе у вас никаких не возникло. Вам необходимо используя приведенные мною дампы - создать их у себя в базе данных. У меня база называется "zolter_blog", у вас может называться как то по другому.
Подключение Yii к MySQL
Теперь давайте перейдем к подключение Yii к нашей базе данных. Для этого нам надо войти в конфиг файл protected/config/main.php и найти там строчки отвечающие за подключение к базе данных:
'db'=>array(
.....
),
Всё что внутри данного массива вы можете удалить. После этого вы можете превратить его в нечто похожее как у меня:
'db'=>array(
'class'=>'system.db.CDbConnection',
'connectionString'=>'mysql:host=localhost;dbname=zolter_blog',
'username'=>'zolter_admin',
'password'=>'mypassworld',
'charset'=>'utf8'
),
И так что мы видим:
connectionString - содержит в себе строку DSN после host= вы можете указать адрес вашего сервера mySQL если он отличный от localhost. После dbname = вам следует указать имя вашей базы данных. Помните что чаще всего на хостингах если вы создаете базу данных test то автоматически с переди подставляется префикс вашего логина. И ваша база имеет имя не test а youlogin_test.
username - имя пользователя для работы с нашей базой. данный пользователь должен быть создан вами вместе с базой данных и обладать правами администратора (чтение/запись и удаление).
password - соотвественно пароль пользователя.
charset - кодировка соединения с базой данных. настоятельно рекомендую использовать всегда utf для ваших проектов. Yii отлично работает с данной кодировкой и проблем возникнуть не должно.
Вот в принципе и все действия которые необходимо произвести для подключения к mySQL базе данных.
Каталоги и файлы
Для создания блога я использовал стандартную структуру приложения Yii. Я создал первое приложение Yii по инструкции (читать), затем удалил все файлы внутри папок оставив только общую структуру.
У себя на хостинге файлы я разместил следующим образом:
(папка моего аккаунта)
| -- dbhelp.ru (мой домен)
|-- assets
|- -css
|-- images
|-- js
|-- protected
|-- storage
|-- themes
|-- index.php
| -- logs (системная папка хостинга)
|-- ...
| -- yii (папка с yii фреймворком)
|-- framework
|-- requirements
|-- ...
Этим я добился что папка Yii находится за приделами домена и недоступна из интернета через браузер. Структуру папок блога вы можете скачать в конце данного урока (если вам лень повторить пример по созданию первого приложения на Yii).
index.php
Со структурой думаю всем все понятно. Теперь нам надо открыть файлик index.php и прописать в нем пути к фреймворку. У меня на хостинге это выглядит вот так, но у вас естественно имена папок будут другими:
// change the following paths if necessary
$yii='/hsphere/local/home/zolter/yii/framework/yii.php';
$config=dirname(__FILE__).'/protected/config/main.php';
// remove the following line when in production mode
defined('YII_DEBUG') or define('YII_DEBUG',true);
require_once($yii);
Yii::createWebApplication($config)->run();
Подводим итоги..
В этом уроке мы разобрали структуру базы данных которая будет использоваться в блоге. Также в качестве примера мы рассмотрели как подключать наше приложение к базе данных MySQL. Я надеюсь вы следовали за уроком и в базе данных у вас уже созданы необходимые таблицы.
Теперь вы можете скачать структуру каталогов блога о которой мы говорили выше. Она не содержит в себе файлов контроллера и моделей, всё это будет в следующем уроке. Пока что пожалуйста просто скопируйте архив и установите его у себя на локальной машине или хостинге. Пропишите в index.php файле путь к Yii и переходите к следующему уроку.
Архив со структурой папок вы можете скачать по адресу - http://dbhelp.ru/files/blog-folders.rar
В следующем уроке мы рассмотрим с вами как создавать простой функционал для нашего блога!
Если хотите опубликовать этот материал у себя - пожалуйста, разместите ссылку на страницу откуда вы его взяли.
- Сегодня в пять утра пришлось ручками (через Zend) менять ссылки типа "test.html" на "http://ttt.ru/super_test.php" в примерно 2000 html файликах. ... "Вопрос: Замена одинаковых строчек в куче файлов"
- Хочу вас обрадовать выходном новой версии замечательного Yii фреймворка. Данный релиз был немного задержан посравнению с обычным графиком, но ... "Yii Framework 1.0.5"
- Я обычно часто просматриваю гугл сообщества в поисках чего-то нового (статьи, вопросы) и сам являюсь активным участником групп по ... "Сообщество Google"

[guest] Гость
Было сказано: Среда, 22 Апрель 2009
Было бы интересно изменить структуру Категорий, что бы она имела вложенности, любой метод который вам понравится (подойдет)....

[adm] zolter
Было сказано: Среда, 22 Апрель 2009
Конечно.
Эта статья была написана до того как я на своем блоге прикрутил возможность неограниченых вложеностей в категории. Обязательно освещу как это сделать в одной из статей.

jetli13
Было сказано: Понедельник, 27 Апрель 2009
Не совсем понял для чего эта строка в массиве:
class'=>'system.db.CDbConnection',
?
А вообще спасибо ;)

[adm] zolter
Было сказано: Понедельник, 27 Апрель 2009
system.db.CDbConnectionСам параметр "class" в данном случае мы можем опустить т.к. CDbConnection это класс по умолчанию чей экземпляр создается для работы с базой. Мне кажется правильнее всётаки этот параметр указывать что бы самому знать "откуда растут ноги" :)
Вот небольшая цитата из документации:
Для работы AR требуется подключение к базе данных. По умолчанию, предполагается, что компонент приложения db предоставляет необходимый экземпляр класса CDbConnection, который отвечает за подключение к базе.

jetli13
Было сказано: Вторник, 05 Май 2009
Большая просьба продолжить серию уроков в этой рубрике! Ждемс! )

[adm] zolter
Было сказано: Вторник, 05 Май 2009
Спасибо что напомнили =) то я завертелся с новыми статьями и забыл про это обучение. Обязательно скоро продолжу =)

[guest] Гость
Было сказано: Среда, 10 Июнь 2009
Кстати, лучше как раз отнаследоваться от CDbConnection, чтобы прописать правильный SET NAMES, а не патчить код Yii.

[adm] zolter
Было сказано: Среда, 10 Июнь 2009
В принципе да. Возможно в тот момент было бы проще просто переопределить initConnection и не замарачиватся. Почему то тогда я об этом не подумал :/

[adm] zolter
Было сказано: Воскресенье, 21 Июнь 2009
В смысле пускает без капчи? на коментах и входе капча стоит, без неё не как :)

[guest] Гость
Было сказано: Вторник, 23 Июнь 2009
просто ввожу сообщение и всё =)))
p,s,> автор, статьи кууул

[adm] zolter
Было сказано: Вторник, 23 Июнь 2009
Спасибо, щяс поправлю =) Наверно случайно правило снес когда статьи писал на живом проекте )

[adm] zolter
Было сказано: Вторник, 23 Июнь 2009
В моделе в function rules не хватало строчки:
array('verifyCode', 'captcha', 'allowEmpty'=>!extension_loaded('gd')),наверно случайно её грохнул когда то :)

[guest] MixTer
Было сказано: Вторник, 07 Июль 2009
Классный блог. Интересные темы, как для меня (новичка заинтересованного в yii). За это спасибо.
Перечитываю статьи так и комменты. Видел у тебя и виджет написан для вывода даты + вот вижу и в таблице для комментов есть дата создания, но вот на старнице ты ее не выводишь.
Просто случайно заинтересовало - когда у тебя не работала капча. Это так к примеру. :)
Так что может добавишь вывод даты и времени для комметов?

[adm] zolter
Было сказано: Вторник, 07 Июль 2009
Привет)
Да, конечно добавлю :) Просто мой виджит конфликтовал при переходе на новую версию Yii, поэтому пришлось отключить в комментариях и темах. Сегодня постараюсь переписать виджет для дат и сделать вывод :)

[guest] Intruder
Было сказано: Пятница, 14 Август 2009
Я так понимаю, что AUTO_INCREMENT не с единички потому, что бралось с работающей базы. Но для user хорошая идея ). Хотя я, лично, слово user в ДБ избегаю, даже несмотря на то, что префиксы имеются... может я параноик? ;)
P.S: Пасибки за мануал.

Intruder
Было сказано: Пятница, 14 Август 2009
Вот зарегся. Hello World!
P.S: А почему при регистрации не мат.каптча?
P.P.S: Забавно, во время регистрации каптча показала "peh", потом кликнул войти - опять "peh"...

pavel-v-frolov
Было сказано: Воскресенье, 31 Январь 2010
> id_user - порядковый номер создателя сообщения.
> id_category - порядковый номер категории к которой относится сообщение.
имхо понятнее: "порядковый номер" -> "идентификатор"

[guest] дед Захар
Было сказано: Пятница, 09 Апрель 2010
Спасибо за прекрасную и доходчивую серию уроков!
Один вопрос: почему в примерах, как правило, создаются две таблицы - категории и посты? Можно сделать как принято в Друпале, например, одну таблицу - узлы и различать их по типам - пост или категория, в таком случае не нужно дублировать поля типа url, meta и т.д. Как считаете? Или все-таки так нецелесообразно? Спасибо.

[adm] zolter
Было сказано: Пятница, 09 Апрель 2010
Спасибо! :)
В принципе это тоже верный подход в плане проектирования БД. Просто я люблю распределять нагрузку между таблицами. К примеру зачем заставлять базу делать выборку по миллионной таблице постов что бы получить всего то 5 категорий?
Хотя и тот и тот подход верный. Делайте как вам удобнее, я просто пишу как привык :)

[guest] дед Захар
Было сказано: Пятница, 09 Апрель 2010
Спасибо за консультацию. Я очень уважаю мнение людей, которые находят время и пишут полезные другим вещи, еще раз спасибо. У меня этот вопрос возник в связи с тем, что был один проект, где на каждой странице (рубрике) выводился список всех вложенных статей (постов) и подрубрик, вот, и заказчик хотел произвольно их сортировать, вне зависимости от того статья это или страница. Это был не блог, но я подумал, а что если для блога применить тот же принцип с узлами? Но Ваш подход мне нравится больше, он действительно рациональней, если не требуется мешанины из вложенных рубрик и постов.