Проблема
Нам нравится Symfony MVC Framework за набор готовых задач, которые позволяют ускорить разработку приложения. В Symfony существует полезная команда – CRUD (от create, read, update, delete) генератор. Но, честно говоря, генерируемый им HTML код имеет ряд недостатков:
- создается табличная верстка вместо блочной;
- табличная верстка не является семантической;
- табличная верстка не оптимизирована с точки зрения SEO.
Я предлагаю избавиться от этих недостатков путем создания собственной темы для CRUD генератора.
Решение
Я полагаю, что Вы используете Symfony 1.4 и Doctrine ORM 1.2
Шаг 1
Скопируйте стандартную тему CRUD генератора из
%sf_symfony_lib_dir%/plugins/sfDoctrinePlugin/data/generator/sfDoctrineModule/default
в data/generator/sfDoctrineModule/mytheme
в корневую директорию проекта.Шаг 2
Отредактируйте файлы шаблона.
//data/generator/sfDoctrineModule/mytheme/template/templates/_form.php
[?php use_stylesheets_for_form($form) ?]
[?php use_javascripts_for_form($form) ?]
<?php $ticket$form = $this->getFormObject() ?>
<?php if (isset($this->params['route_prefix']) && $this->params['route_prefix']): ?>
[?php echo form_tag_for($form, '@<?php echo $this->params['route_prefix'] ?>') ?]
<?php else: ?>
<form action="[?php echo url_for('<?php echo $this->getModuleName() ?>/'.($form->getObject()->isNew() ? 'create' : 'update').(!$form->getObject()->isNew() ? '?<?php echo $this->getPrimaryKeyUrlParams('$form->getObject()', true) ?> : '')) ?]" method="post" [?php $form->isMultipart() and print 'enctype="multipart/form-data" ' ?]>
[?php if (!$form->getObject()->isNew()): ?]
<input type="hidden" name="sf_method" value="put" />
[?php endif; ?]
<?php endif;?>
<div>
<?php if (isset($this->params['non_verbose_templates']) && $this->params['non_verbose_templates']): ?>
[?php echo $form ?]
<?php else: ?>
[?php echo $form->renderGlobalErrors() ?]
<?php foreach ($form as $name => $field): if ($field->isHidden()) continue ?>
<div>
[?php echo $form['<?php echo $name ?>']->renderLabel() ?]
[?php echo $form['<?php echo $name ?>']->renderError() ?]
[?php echo $form['<?php echo $name ?>'] ?]
</div>
<?php endforeach; ?>
<?php endif; ?>
<div>
<?php if (!isset($this->params['non_verbose_templates']) || !$this->params['non_verbose_templates']): ?>
[?php echo $form->renderHiddenFields(false) ?]
<?php endif; ?>
<?php if (isset($this->params['route_prefix']) && $this->params['route_prefix']): ?>
<a href="[?php echo url_for('<?php echo $this->getUrlForAction('list') ?>') ?]">Back to list</a>
<?php else: ?>
<a href="[?php echo url_for('<?php echo $this->getModuleName() ?>/index') ?]">Back to list</a>
<?php endif; ?>
[?php if (!$form->getObject()->isNew()): ?]
<?php if (isset($this->params['route_prefix']) && $this->params['route_prefix']): ?>
[?php echo link_to('Delete', '<?php echo $this->getUrlForAction('delete') ?>', $form->getObject(), array('method' => 'delete', 'confirm' => 'Are you sure?')) ?]
<?php else: ?>
[?php echo link_to('Delete', '<?php echo $this->getModuleName() ?>/delete?<?php echo $this->getPrimaryKeyUrlParams('$form->getObject()', true) ?>, array('method' => 'delete', 'confirm' => 'Are you sure?')) ?]
<?php endif; ?>
[?php endif; ?]
<input type="submit" value="Save" />
</div>
</div></code>
</form>
* This source code was highlighted with Source Code Highlighter.
Это всего лишь пример. Вы также можете изменять другие шаблонные файлы в папке
data/generator/sfDoctrineModule/mytheme/template/templates
.Шаг 3
Создайте собственный класс форматирования формы. Создайте sfWidgetFormSchemaFormatterDiv.class.php и вложите его в корневую директорию проекта.
//lib/widet/sfWidgetFormSchemaFormatterDiv.class.php
class sfWidgetFormSchemaFormatterDiv extends sfWidgetFormSchemaFormatter
{
protected
$rowFormat = "<div>\n %error%%label%\n %field%%help%\n%hidden_fields%</div>\n",
$nestedFormFormat = "%field%",
$errorRowFormat = "<div>\n%errors%</div>\n",
$helpFormat = '<br />%help%',
$decoratorFormat = "\n %content%";
}
* This source code was highlighted with Source Code Highlighter.
Теперь нам нужно настроить проект или приложение, чтобы использовать созданный класс форматирования формы. В зависимости от того, что Вы хотите настраивать проект (
config/ProjectConfiguration.class.php
) или приложение (apps/myapp/config/myappConfiguration.class.php
), измените соответствующий конфигурационный файл. public function configure()
{
sfWidgetFormSchema::setDefaultFormFormatterName('div');
}
* This source code was highlighted with Source Code Highlighter.
Шаг 4. Последний
Запустите задачу Symfony
doctrine:generate-module
.php symfony doctrine:generate-module myapp mymodule MyModel --theme=mytheme
Замените
myapp
на имя Вашего приложения (например frontend
), mymodule
– на желаемое имя модуля (например post
) и MyModel
– на имя Вашей модели (например Post
).Вуаля! Теперь у Вас есть чистая безтабличная верстка.
Всего наилучшего!