понедельник, 27 июня 2011 г.

Генерация кода модуля в gii

Я решил создать модуль управления "статическими" страницами. «Статические», это страницы, которые могут быть на сайте и не являются страницами самого каталога. Например «О фирме», «Контактная информация», «Вакансии» и прочие.
Сейчас такая страница уже присутствует на моем сайте http://psyhos.vnet.ee/catalog/site/page/view/about Сейчас это просто файл Z:\home\catalog.loc\www\protected\views\site\pages\about.php , который можно редактировать вручную и закачивать на сервер. Моя цель – сделать модуль управления подобными страницами. Почему модуль? Ну, чтобы научиться делать модули и возможно использовать это в других проектах.
Итак начнём с проектирования нового модуля.

1) Пользователь может создавать неограниченное количество «статических страниц».
2) На каждой странице может быть неограниченное количество информационных сообщений.
3) Каждое информационное сообщение может находиться на нескольких страницах одновременно.

Например:
Страница «О фирме» содержит информационные сообщения:
* Адрес
* Схема проезда
* Контактные телефоны
Страница «Специальные предложения» содержит информационные сообщения:
* Специальное предложение1
* Специальное предложение2
* Контактные телефоны

То есть «Контактные телефоны» нужны и на той и на этой странице.

Для хранения страниц и сообщений создаю таблицы:

Модель базы данных в нотации UML

А вот и SQL код:
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

CREATE SCHEMA IF NOT EXISTS `catalog` 
DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
USE `catalog`;

-- -----------------------------------------------------
-- Table `catalog`.`tbl_sppage`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `catalog`.`tbl_sppage` ;

CREATE  TABLE IF NOT EXISTS `catalog`.`tbl_sppage` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `name` VARCHAR(45) NOT NULL DEFAULT 'name of the page' ,
  `url` VARCHAR(20) NOT NULL DEFAULT 'name in url' ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_unicode_ci
COMMENT = 'Pages for StaticPage module';


-- -----------------------------------------------------
-- Table `catalog`.`tbl_spmessage`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `catalog`.`tbl_spmessage` ;

CREATE  TABLE IF NOT EXISTS `catalog`.`tbl_spmessage` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `title` TEXT NULL ,
  `message` TEXT NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_unicode_ci
COMMENT = 'Messages of pages for StaticPage module';


-- -----------------------------------------------------
-- Table `catalog`.`tbl_sprelations`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `catalog`.`tbl_sprelations` ;

CREATE  TABLE IF NOT EXISTS `catalog`.`tbl_sprelations` (
  `tbl_sppage_id` INT NOT NULL ,
  `tbl_spmessage_id` INT NOT NULL ,
  PRIMARY KEY (`tbl_sppage_id`, `tbl_spmessage_id`) ,
  INDEX fk_tbl_sprelations (`tbl_sppage_id` ASC) ,
  INDEX fk_tbl_sprelations (`tbl_spmessage_id` ASC) ,
  CONSTRAINT `fk_tbl_sprelations`
    FOREIGN KEY (`tbl_sppage_id` )
    REFERENCES `catalog`.`tbl_sppage` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_tbl_sprelations`
    FOREIGN KEY (`tbl_spmessage_id` )
    REFERENCES `catalog`.`tbl_spmessage` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION);



SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;


Классическая связь MANY TO MANY многие ко многим.
Имена таблиц начинаются с "sp" что означает staticpage.
Когда таблицы созданы, начинаю генерировать код модуля в gii

Сначала подправляю файл Z:\home\catalog.loc\www\protected\config\main.php
//Modules
'modules'=>array(
'staticpage',
'gii'=>array(
'class'=>'system.gii.GiiModule',
'password'=>'123',
'ipFilters'=>array('127.0.0.1','::1'),),
),
staticpage – так назову новый модуль. Gii подключаю в этом файле, иначе не работает.

Из Z:\home\catalog.loc\www\protected\config\local_main.php подключение gii удаляю.

Далее захожу в gii (локально) http://catalog.loc/gii и генерирую новый модуль:
Генерация модуля в gii

Затем генерирую модели:
Генерация модели модуля в gii

И в конце генерирую CRUD для сообщений:
Генерация CRUD модуля в gii

И для страниц:
Генерация CRUD модуля в gii

Обратите внимание на картинки, там видны все пути, которые надо указывать, чтобы все сохранилось в нужном модуле!

И в конце надо изменить файл Z:\home\catalog.loc\www\protected\config\main.php чтобы новые контроллеры заработали красиво:

'urlManager'=>array(
'urlFormat'=>'path',   
'rules'=>array(
   
'page'=>'staticpage/sppage',
'page/'=>'staticpage/sppage/view',
'message'=>'staticpage/spmessage',
'message/'=>'staticpage/spmessage/view',
  
'<_c:(assortiment|category)>/'=>'<_c>/view',
'assortiment/category='=>'assortiment/index',
),
Если этот не сделать, доступ к контроллерам нового модуля будет по пути вида http://psyhos.vnet.ee/catalog/staticpage/sppage

Получился шаблон модуля с нужными таблицами. В другой раз буду делать, чтобы этот модуль работал как мне надо.
Продолжение следует.

5 комментариев:

  1. thanks. but would more better in english too.

    ОтветитьУдалить
  2. Нет уж, пусть на "Великом и могучем"

    ОтветитьУдалить
  3. Тут и на родном то не просто :) А вообще гугл транслейт рулит!

    ОтветитьУдалить
  4. Автор, спасибо тебе ОГРОМНОЕ! Твой блог мне очень сильно помог как начинающему в yii!

    ОтветитьУдалить
  5. Спасибо большое. Только маленькая поправочка. В конфиг модуль нужно добавлять ДО генерации CRUD, иначе создаются пути от корня приложения.

    ОтветитьУдалить