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

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

Время на прочтение4 мин
Количество просмотров2.3K
Автор оригинала: 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).

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

Всего наилучшего!
Теги:
Хабы:
Всего голосов 13: ↑13 и ↓0+13
Комментарии15

Публикации

Истории

Работа

PHP программист
129 вакансий

Ближайшие события

One day offer от ВСК
Дата16 – 17 мая
Время09:00 – 18:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн
Антиконференция X5 Future Night
Дата30 мая
Время11:00 – 23:00
Место
Онлайн
Конференция «IT IS CONF 2024»
Дата20 июня
Время09:00 – 19:00
Место
Екатеринбург
Summer Merge
Дата28 – 30 июня
Время11:00
Место
Ульяновская область