Pull to refresh

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

Reading time 4 min
Views 2.3K
Original author: 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).

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

Всего наилучшего!
Tags:
Hubs:
+13
Comments 15
Comments Comments 15

Articles