DbHelp.ru
Маленький Yii блог
Комментарии
zolter: Спасибо за хороший отзыв. Постараюсь уделять на статьи больше времени, особенно на обучающие...
den: Ух ты! между этой статьёй и прошлой год разницы. Я как-то прочитал все статьи одним махом и теперь п...
ATI: Хорошее решение для нотисов в админке. Спасибо автору.
wlnner: Не забыл. Есть.
wlnner: Не забыл. Есть.


Урок2 : Первичная настройка

Рубрика: Создаем блог вместе

Оцените эту статью:

Рейтинг: 0.00 (0)
5 Апр. 2009

Эта статья устарела т.к. была написана для yii версии 1.0.х; Если вы используете более новую версию - у вас могут возникнуть ошибки из-за несовместимости. Обычно ответы на все вопросы работы на 1.1.х были описаны в комментариях ниже статьи.

Yii Framework Blog img http://dbhelp.ruxboxxne Вот и начинается наконец то серьезная работа по написанию документации по блогу. Весь вчерашний день я был занят написанием небольших статей по компонентам и багам, но сегодня я постараюсь изложить побольше материала относительно блога.

Урок 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

В следующем уроке мы рассмотрим с вами как создавать простой функционал для нашего блога!



Если хотите опубликовать этот материал у себя - пожалуйста, разместите ссылку на страницу откуда вы его взяли.
Другие yii статьи:

  1. Сегодня в пять утра пришлось ручками (через Zend) менять ссылки типа "test.html" на "http://ttt.ru/super_test.php" в примерно 2000 html файликах. ... "Вопрос: Замена одинаковых строчек в куче файлов"

  2. Хочу вас обрадовать выходном новой версии замечательного Yii фреймворка. Данный релиз был немного задержан посравнению с обычным графиком, но ... "Yii Framework 1.0.5"

  3. Я обычно часто просматриваю гугл сообщества в поисках чего-то нового (статьи, вопросы) и сам являюсь активным участником групп по ... "Сообщество 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 и не замарачиватся. Почему то тогда я об этом не подумал :/

[guest] Гость

Было сказано: Воскресенье, 21 Июнь 2009

а почему меня пускает без капчи??))

код_сюда

[adm] zolter

Было сказано: Воскресенье, 21 Июнь 2009

В смысле пускает без капчи? на коментах и входе капча стоит, без неё не как :)

[guest] Гость

Было сказано: Вторник, 23 Июнь 2009

в смысле я не ввожу капчу и пишу эту месагу)))

[guest] Гость

Было сказано: Вторник, 23 Июнь 2009

просто ввожу сообщение и всё =)))

p,s,> автор, статьи кууул

[adm] zolter

Было сказано: Вторник, 23 Июнь 2009

Спасибо, щяс поправлю =) Наверно случайно правило снес когда статьи писал на живом проекте )

[adm] zolter

Было сказано: Вторник, 23 Июнь 2009

готово :)
еще раз сенк :)

[guest] Гость

Было сказано: Вторник, 23 Июнь 2009

о, пашет =))

[guest] Гость

Было сказано: Вторник, 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, поэтому пришлось отключить в комментариях и темах. Сегодня постараюсь переписать виджет для дат и сделать вывод :)

[adm] zolter

Было сказано: Вторник, 07 Июль 2009

добавил :)

[guest] MixTer

Было сказано: Среда, 08 Июль 2009

оо отлично :)))

[guest] Intruder

Было сказано: Пятница, 14 Август 2009

Я так понимаю, что AUTO_INCREMENT не с единички потому, что бралось с работающей базы. Но для user хорошая идея ). Хотя я, лично, слово user в ДБ избегаю, даже несмотря на то, что префиксы имеются... может я параноик? ;)

P.S: Пасибки за мануал.

Intruder

Было сказано: Пятница, 14 Август 2009

Вот зарегся. Hello World!

P.S: А почему при регистрации не мат.каптча?
P.P.S: Забавно, во время регистрации каптча показала "peh", потом кликнул войти - опять "peh"...

[guest] tester

Было сказано: Четверг, 27 Август 2009

Всем Привет! Классная статья! Автор, спасибо!

[adm] zolter

Было сказано: Четверг, 27 Август 2009

Пожалуйста! Заходите еще

pavel-v-frolov

Было сказано: Воскресенье, 31 Январь 2010

> id_user - порядковый номер создателя сообщения.
> id_category - порядковый номер категории к которой относится сообщение.

имхо понятнее: "порядковый номер" -> "идентификатор"

[guest] zolter

Было сказано: Воскресенье, 31 Январь 2010

не всем так понятно =)

[guest] дед Захар

Было сказано: Пятница, 09 Апрель 2010

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

[adm] zolter

Было сказано: Пятница, 09 Апрель 2010

Спасибо! :)

В принципе это тоже верный подход в плане проектирования БД. Просто я люблю распределять нагрузку между таблицами. К примеру зачем заставлять базу делать выборку по миллионной таблице постов что бы получить всего то 5 категорий?

Хотя и тот и тот подход верный. Делайте как вам удобнее, я просто пишу как привык :)

[guest] дед Захар

Было сказано: Пятница, 09 Апрель 2010

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

Оставить комментарий


Код:
Имя: