Я плохо знаком с симфонией и имею некоторые простые вопросы. Я пытаюсь понять систему модуля, но я не понимаю, как я создаю фактическую домашнюю страницу или другие страницы, которые не базируются прочь модели от дб. Например, простое о странице, которая имеет статическую информацию или домашнюю страницу, которая является комбинацией набора информации из различных моделей.
Кто-либо может помочь?
Во-первых, модули не обязательно ограничивать моделью из базы данных. Вы можете иметь модуль Foo, который не зависит от содержимого базы данных, и модуль Bar, который в основном базируется на 3-х различных моделях. Разделение модулей - это способ логически разделить ваш сайт на управляемые разделы. Сайт электронной коммерции может иметь модуль Продукты, модуль Категории и Корзина и так далее.
Ваше последнее предложение можно разделить на 2 части:
1) Статическая информация может быть на любой странице - если это для таких вещей как "О нас", "Часто задаваемые вопросы" и т.д., то я лично склонен использовать модуль "по умолчанию" или "домашний", и создавать там различные действия vis:
./symfony generated:module appname home
и
class homeActions extends sfActions
{
public function executeAbout(sfWebRequest $request)
{
// ...
}
public function executeFaq(sfWebRequest $request)
{
// ...
}
}
с соответствующими файлами шаблонов (aboutSuccess.php, faqSuccess.php).
2) Страница может состоять из данных из множества различных моделей - просто используйте предпочтительный для ORM метод извлечения данных и установите его в вид ($this->data = MyModel->findByColumn(...)
и т.д.). Если вы имеете в виду данные из разных модулей, то вам, наверное, лучше посмотреть на части или компоненты для элементов страницы, которые могут быть использованы в разных модулях (навигация и т.д.). Смотрите документы Symfony для получения более подробной информации по этим вопросам.
Я привык работать со статическими страницами таким образом.
Сначала я создаю новую запись в apps/frontend/config/routing.yml:
page:
url: pages/:page
param: { module: page, action: index }
Затем я пишу модуль "страница" (apps/frontend/modules/page/actions/actions.class.php):
<?php
class pageActions extends sfActions
{
public function executeIndex()
{
$this->page = $this->getRequestParameter("page");
$this->forward404Unless($this->_partialExists($this->page));
}
protected function _partialExists($name)
{
$directory = $this->getContext()->getModuleDirectory();
return (is_readable($directory.DIRECTORY_SEPARATOR."templates".
DIRECTORY_SEPARATOR."_".$name.".php"));
}
}
Последний шаг, вставляю модули/страницу/шаблоны/indexSuccess.php этот код:
<?php include_partial($page); ?>
Итак, отныне все, что вам нужно сделать - это создать частичную для каждой статической страницы, т.е.. apps/frontend/modules/page/templates/_home.php, к которым можно обратиться по адресу http://yousite/pages/home (без необходимости добавлять новую запись маршрутизации для каждой страницы)
.Кроме вышеизложенного, подумайте о том, чтобы иметь CMS для статических страниц, так что вам не понадобятся технически подкованные люди, чтобы управлять ими или менять их. Это, конечно же, зависит от проекта.
Можно создать модуль, например, под названием static
и создать действия для каждой статической страницы или только одно действие, которое доставляет страницу в зависимости от переменной запроса. Единственное, что делает это загружает шаблон.
IMHO было бы неплохо, если бы symfony поставлялась с модулем по умолчанию для этого.
Например, действия (моего пользовательского) модуля static
:
class staticActions extends sfActions
{
public function executeIndex(sfWebRequest $request)
{
if(!$request->hasParameter('site')) {
return sfView::ERROR;
}
$this->site = $request->getParameter('site');
}
}
С этим шаблоном:
//indexSuccess.php
<?php include_partial($site) ?>
Сайты фактической статики - все партиальны.
В моем routing.yml
выглядит следующим образом:
# static stuff
about:
url: /about
param: {module: static, action: index, site: about}
Таким образом, вам нужно будет создать новую частичную и новую запись маршрутизации только при добавлении статического сайта и вам не нужно будет прикасаться к PHP-коду.