Ответы пользователя по тегу Symfony
  • Как правильно добавить поля и таблицы БД в рабочий проект на Symfony 1.2, чтобы ничего не поломать?

    silentvick
    @silentvick
    Обязательно перед изменениями сделайте бэкап

    Начать стоит со схемы в файле config/schema.yml , которая хранит описание структуры БД. Для новой таблицы надо будет описать ее схему в этом файле. Новое поле добавить проще: надо просто дописать его объявление к уже существующей схеме таблицы. Делайте по примеру уже написанных схем. Если задуманная структура не очень сложная, то это не должно составить труда. Также советую заглянуть в пример из документации.

    Далее можно обновить саму БД. Сделать это можно вручную (например, через phpmyadmin). Также можно выполнить команду:
    $ php symfony propel:build-sql
    Это создаст sql-файл в data/sql директории, содержащий запросы для создания описанной структуры БД. Оттуда можно взять запрос для новой таблицы. Это исключит возможность несоответствия таблицы, созданной "вручную" от описанной в schema.yml.

    Возможно, программисты из веб-студии использовали какой-нибудь плагин для реализации механизма миграций. Например: sfPropelMigrationsLightPlugin . Тогда, если хотите сохранить хорошее качество кода, стоит почитать документацию плагина и обновлять базу с помощью миграций, а не вручную.

    Дальше следует обновить модели, формы и фильтры:
    $ php symfony propel:build-model
    $ php symfony propel:build-forms
    $ php symfony propel:build-filters
    Это создаст классы моделей, форм и фильтров для новых таблиц, а также обновит свойства и методы для уже существующих классов при добавлении новых полей (можно будет вызывать $item->getNewfield()).

    После этого не забудьте очистить кэш:
    $ php symfony cache:clear

    Этого должно быть достаточно для несложных изменений.

    P.S.: Индексы не потеряются, но их все-таки стоило бы прописать в схеме :)
    Ответ написан
    1 комментарий
  • Symfony на virtualHost?

    silentvick
    @silentvick
    Переименовывать app_dev.php в index.php не нужно. Подозреваю, вы забыли положить файл .htaccess: symfony/.htaccess

    Также по теме:
    Symfony: Configuring a Web Server
    Ответ написан
    Комментировать
  • Как можно организовать дочерний layout в symfony 1.4?

    silentvick
    @silentvick
    Наследуемых layout-в в symfony 1.4 нет. Можно делать отдельные layout-ы, и указывать их как default в view.yml модуля. Если вас беспокоит повторение кода, то эти части можно вынести в партиалы в какой-нибудь share-модуль. Остальной контент у вас и так должен быть разбит по компонентам/партиалам.
    Ответ написан
  • Symfony 1.4, Как сохранять данные с формы в две таблицы?

    silentvick
    @silentvick
    Встраиваемые формы нужно подключать вручную в классе формы:

    <?php
    // lib/form/doctrine/PostForm.class.php
    public function configure()
    {
        //...
    
        $this->embedRelation('images'); // где "images" - имя связи
    }
    Ответ написан
    3 комментария
  • Даты создания связи Many-To-Many Symfony/Doctrine

    silentvick
    @silentvick
    Создайте третью таблицу, в которой будут храниться: оценка, ссылка на пользователя, ссылка на запись в блоге и время. Чтобы не выставлять время "вручную" можно воспользоваться Timestampable расширением.
    Ответ написан
    1 комментарий
  • Как реализовать массовое представление/редактирование сущностей на одной форме?

    silentvick
    @silentvick
    Создайте оберточную форму и встраивайте в нее сколько угодно форм сущностей
    How to Embed a Collection of Forms

    Например...

    1. Создаем класс, который будет просто держать коллекцию нужных нам сущностей. Для примера, назову его ConfigHolder.
    namespace Ns\TestBundle\Entity;
    
    use Doctrine\Common\Collections\ArrayCollection;
    
    class ConfigHolder
    {
        protected $_configs;
    
        public function getConfigs()
        {
            if ( is_null($this->_configs) ) {
                $this->_configs = new ArrayCollection();
            }
    
            return $this->_configs;
        }
    
        public function setConfigs(ArrayCollection $configs)
        {
            $this->_configs = $configs;
        }
    }

    2. Создадим форму для этого класса. Можно, конечно, было обойтись без отдельного класса, но мне кажется, так код будет немного чище. В конструкторе формы добавляем поле типа collection, и указываем тип встраиваемых полей - ConfigType (класс формы для Config; его создание тривиально, поэтому я буду исходить из того, что он уже написан)
    namespace Ns\TestBundle\Form\Type;
    
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;
    
    class ConfigHolderType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder->add('configs', 'collection', array('type' => new ConfigType()));
        }
    
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'Ns\TestBundle\Entity\ConfigHolder',
            ));
        }
    
        public function getName()
        {
            return 'config_holder';
        }    
    }

    3. Осталось дело за малым. Всего сотня-другая строчек кода... :) Теперь, когда есть все необходимое можно создать форму в контроллере и работать с ней, как и со всеми остальными формами. Например:
    namespace Acme\TaskBundle\Controller;
    
    use Ns\TestBundle\Entity\ConfigHolder;
    use Ns\TestBundle\Entity\Config;
    use Ns\TestBundle\Form\Type\ConfigHolderType;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Doctrine\Common\Collections\ArrayCollection;
    
    class ConfigHolderController extends Controller
    {
        public function editAction(Request $request)
        {
            // Подгружаем нужные конфиги из базы, получая массив объектов
            // $configs = ...
    
            $configHolder = new ConfigHolder();
            $configHolder->setConfigs(new ArrayCollection($configs));
    
            $form = $this->createForm(new ConfigHolderType(), $configHolder);
            $form->handleRequest($request);
    
            if ( $form->isValid() )
            {
                // получили данные и делаем с ними все, что захотим,
                // можно, например, в базу данных сохранить...
            }
    
            return $this->render('NsTestBundle:ConfigHolder:edit.html.twig', array(
                'form' => $form->createView(),
            ));
        }
    }

    4. Остался вывод формы. Здесь нужно лишь пройтись в цикле по вложенным формам.
    {# src/Ns/TestBundle/Resources/views/ConfigHolder/edit.html.twig #}
    
    {{ form_start(form) }}
        {% for config in form.configs %}
            <div>
                {{ form_row(config.name) }}
            </div>
            <div>
                {{ form_row(config.value) }}
            </div>
            <div>
                {{ form_row(config.description) }}
            </div>
        {% endfor %}
    {{ form_end(form) }}

    Код писал «на глаз», возможны ошибки, но суть, надеюсь, передана.
    Ответ написан
    3 комментария