Создание объектной модели и первоначальная генерация VT
Развертывание проекта
Если вы все делали правильно по инструкции и у вас Windows, то пути можно не менять и bat-файлы смело запускать, иначе анализируйте каждый свой шаг, связанный с первоначальным развертыванием проекта.
При запуске bat файлов убедитесь, что они запускаются от администратора. Помните, что при намеренном запуске файла в режиме администратора (UAC), домашняя директория меняется на %WINDIR%\System32.
Системные требования: PHP 5.2, php_mbstrings, php_mysql, php_postgres.
Распакуйте архив в D:\Documents\Projects\PHP\Panda
Замените файл docs\Panda.dm2 своей версией.
Откройте файл docs\Panda.dm2 в TDM, нажмите F9.
В качестве имени файла введите D:\Documents\Projects\PHP\Panda\docs\Panda.sql
Нажмите кнопку Default (сохранение настроек), после этого – Generate. Таким образом, у вас появился файл docs\Panda.sql с правильной структурой базы данных.
Перейдите в папку docs, в файл
docs\rebuild-database.bat после строки '%PGSQL_ROOT%\createdb.exe …' необходимо добавить следующий код:
%PGSQL_ROOT%\psql.exe -U %DATABASE_USER% -f D:\usr\postgres\share\contrib\ltree.sql %DATABASE_NAME%
Запустите файл create-hosts.bat (не забудьте посмотреть исходный код файла).
Запустите файл rebuild-database.bat (не забудьте посмотреть исходный код файла).
-
Работа с MF.Devenv
Описание
MFD – специальная программа, выполняющая следующие функции:
создание объектной модели;
создание представлений;
создание классов для работы с ней;
создание административного интерфейса;
поддержание объектной модели в актуальном состоянии;
перевод и локализация интерфейсов.
При желании можно проинсталлировать программу (тогда появится ассоциация с файлами проектов *.mfd). Для этого нужно запустить MF.Devenv.exe /install
В архиве в папке mfd самая последняя версия 1.5.6.102. Если у вас специфичные настройки с базой данных, то в mfd\database.config можно поменять их.
Основные правила работы с MFD
Все изменения нужно сохранять вручную
Ctrl+S – сохранение текущей вкладки с объектом.
Ctrl+Shift+S – сохранение проекта целиком в файл.
Для того чтобы создать пакет, нужно нажать Ctrl+P или правой кнопкой мыши по проекту Add New Package.
Для того чтобы создать объект на основе таблицы, нужно нажать правой кнопкой мыши по необходимому пакету и выбрать пункт Add Entity from Database.
Для того чтобы сгенерировать код, нужно нажать правой кнопкой мыши по необходимому пакету и выбрать пункт Run Eaze Generator.
Для того чтобы закрыть вкладку с объектом, нужно нажать одну из комбинаций клавиш – Ctrl+F4, Ctrl+W или средней кнопкой мыши.
Порядок добавление объектов – от базового к сложным (например, необходимо добавить сначала categories, а только потом news).
Если после изменения значения selectbox или checkbox сразу нажать Ctrl+S без перевода фокуса на другое поле, то последние изменения не сохранятся.
При создании Views выбирайте только те колонки в дополнительных таблицах, которые необходимы (например, в vfsFiles необходимы только fileId, folderId, title, path, а status.* можно вообще не использовать).
Создание объектной модели
Открыть файл docs/Model/Panda.mfd.
Создать новый пакет Panda.News (в нее будем добавлять categories, news, comments, newsRatings).
Добавление нового объекта из БД
Вызвать Add Entity from Database.
Выбрать соединение, базу panda и таблицу categories. Нажать «применить».
Убрать галочки Add to View с полей status.* (для того, чтобы они не попали во view).
Нажать на кнопку «Создать представление».
Скопировать код view в папку docs/Views/Panda.News.sql. Добавить в него по желанию order by.
Нажать кнопку «Ок», после Ctrl+S.
Настроить объект.
Настройка объектов
Подробнее про Model Flags.
Настраиваем объект Category:
Отмечаем необходимые флаги (у этого объекта их нет).
Выбираем тип поиска по title SEARCHTYPE_ILIKE.
Идем во вкладку templates.
Убираем поиск по alias.
Сохраняем объект.
Настраиваем объект News:
Отмечаем флаг CanPages.
По полям title, foreword, content ставим тип поиска SEARCHTYPE_ILIKE.
C «createdAt» убираем галочки Addable и Updatable, ставим Nullable: Yes.
Идем в Templates, осуществляем перевод (для тех, где пусто – ничего не пишем).
Для categoryId нажимаем edit, изменяем Добавлять пустое = true вместо false.
Control type для foreword ставим как
HTML_TEXT.
Снимаем галочки с List для foreword, url.
Снимаем галочки с Edit для createdAt, rating.
В Search снимаем галочки с createdAt, rating.
Сохраняем объект.
Настраиваем объект NewsRatings:
View для этого объекта не нужна.
Отмечаем флаги CanPages, WithoutTemplates.
C «createdAt» убираем галочки Addable и Updatable, ставим Nullable: Yes.
В поле View: ставим newsRatings вместо getNewsRatings.
Сохраняем объект.
Настраиваем объект Comment:
При создании View нам нужны только поля из таблицы comments.
Отмечаем флаг CanPages.
По полям author, email, comment ставим тип поиска SEARCHTYPE_ILIKE.
C «createdAt» убираем галочки Addable и Updatable, ставим Nullable: Yes.
Control type для comment ставим как
HTML_TEXT.
Control type для IP ставим как
HTML_INPUT.
Снимаем галочки с List для createdAt.
Снимаем галочки с Edit для createdAt.
Удаляем строчку news.title, ставим галочку List для “newsId”.
В Search снимаем галочки с createdAt, parentCommentId.
Сохраняем объект.
Сохраняем проект.
Генерация кода
Вызвать Eaze Generator для Panda.News.
Выбрать любой класс из selectbox.
Перейти на вкладку pages.xml, скопировать код, вставить полученный код в секцию vt в pages.xml.
Save All → выбираем все файлы, сохраняем.
Пересобираем базу включая Panda.News.sql. http://panda/vt/news/ - первый результат.
Локализация
Выбираем Eaze – Language Editor.
Выбираем File – Open.
Выбираем Load from project, language code – ru (utf-8).
Вводим названия для single и plural.
Нажимаем Decline, после ОК, после – Ctrl+S.
-
Добавление меню
В файле etc/templates/vt/header.tmpl.php добавляем меню для news, categories, comments в виде трех отдельных верхних пунктов (без вложенности).
Не забываем перевести их.
Делаем пункты меню выделенным на страницах списка news, categorties, comments – по аналогии, как в static-pages (смотрим на Panda.Common.SetStaticPagesMenu в pages.xml и lib/Panda.Common/Panda.Common.xml).
Изменения в коде
SaveNewsAction.php, getFromRequest();
if ( $originalObject != null ) {
$object->newsId = $originalObject->newsId;
$object->rating = $originalObject->rating;
} else {
$object->rating = 0;
}
Черновая генерация закончена. Можно переходить разделу Работа с VT.