четверг, 28 февраля 2013 г.

Как убрать /app.php из URL на Symfony 2

После очередных танцев с бубном получилось убрать app.php
Помог http://stackoverflow.com/questions/869092/how-to-enable-mod-rewrite-for-apache-2-2

Если у Вас тоже не получается и mod_rewrite на сервере включен и Вы используете виртуальные хосты на сервере то обратите внимание на директиву AllowOverride All. 
Опция AllowOverride указывает Apache, какие директивы в файле .htaccess допустимы
Как только я добавил эту директиву у меня все заработало!
        
<VirtualHost *:80>
        ServerName sym.example.com
        DocumentRoot /var/www/html/Symfony/web/
        CustomLog logs/symfony.access.log combined
        ErrorLog logs/symfony.error.log
        AddType application/x-httpd-php php
        AddDefaultCharset UTF-8
   <Directory "/var/www/html/Symfony/web">
        DirectoryIndex app.php
        Order allow,deny
        Allow from all
        Options Indexes FollowSymLinks
        AllowOverride All
   </Directory>
</VirtualHost>

пятница, 15 февраля 2013 г.

SonataAdminBundle и загрузка файлов

Ну во-первых можете меня поздравить! Мне дали задачу реализовать прототип архива нашего сайта на Symfony2 + Doctrine 2. Ух, это вещь скажу я вам! Далеко вперед шагнула современная веб-разработка. Давно я не получал удовольствия от программирования! В сторону Битрикса уже не хочется смотреть совсем )
Итак понадобилась админка. CRUD генератор Доктрин классная вещь, но из него нужно еще делать админку. Пока решил установить популярный SonataAdminBundle. Это оказалось не так уж просто. Решил, что лучше поставить также Composer (менеджер зависимостей), чтобы он сам определял зависимости. Ну и тут не обошлось без танцев с бубном. Погуглил, посмотрел issues на gitHub и с трудом Sonata установилась со всеми нужными пакетами.
Вещь классная, но тут стал вопрос как загружать изображения в админке. Для этого вроде бы есть SonataMediaBundle, но пока хотелось бы просто обойтись загрузкой файла.
Опять танцы с бубном. Погуглил.
Создал свойство $file, в сущности Image и метод который делает следующее:
    public function setFile($file)
    {
        $this->file = $file;
        $fileName = uniqid() . '.' . $file->guessExtension();
        $file->move($this->getUploadRootDir(), $fileName);
        $this->path = $fileName;
        $this->file = null;
    }
А чтобы наша картинки отображалась в списке в админке, нужно добавить след. строки в административный класс который наследует класс Sonata\AdminBundle\Admin\Admin:
class ImageAdmin extends Admin
{
...
public function configureListFields(ListMapper $listMapper)
    {
        $listMapper->add('id')
                   ->add('shortDescription')
                   ->add('path', null, array(
                       'template' => 'YOURNamespaceYourBundle:Image:showImage.html.twig'
                       ))
                   ->add('seoCode')
                   ->add('yearOfPainting')
                   ->add('_action', 'actions', array(
                       'actions' => array(
                           'edit' => array(),
                       )
                   ));
    }
а в шаблоне что-то типа:
<td>
    <img src="{{ object.photo }}" style="height: 100px;" />
</td>

правда, для разных списков может понадобиться создавать разные шаблоны, а править код сонаты не хочется. Но чувствую на этом ньюансы не закончатся! Может все таки стоит попробоавть SonataMediaBundle. До встречи!