Как стать автором
Обновить

Создаем собственную тему для CRUD генератора в symfony

Symfony
Перевод
Автор оригинала: Artem Vysotsky

Проблема


Нам нравится 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('&#60;?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('&#60;?php echo $this->getUrlForAction('list') ?>') ?]">Back to list</a>
<?php else: ?>
<a href="[?php echo url_for('&#60;?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).

Вуаля! Теперь у Вас есть чистая безтабличная верстка.

Всего наилучшего!
Теги:symfonycrudtheme
Хабы: Symfony
Всего голосов 13: ↑13 и ↓0 +13
Просмотры2K

Похожие публикации

Python для веб-разработки
24 июня 202190 000 ₽SkillFactory
DevOps-инженер
24 июня 202172 000 ₽SkillFactory
UI-дизайнер
25 июня 202147 940 ₽Нетология
Python для работы с данными
25 июня 202131 500 ₽Нетология

Лучшие публикации за сутки