• Можно ли объединить компоненты Symfony, устанавливаемые через composer?

    svscorp
    @svscorp
    Разные пакеты composer'a одного vendor'а стекаются в папке этого vendor'a. Не спроста они имеют формат: vendorName/packageName

    Вот мой composer.json моего проекта на Silex:
    {
        "require": {
            "silex/silex": "~1.2",
            "smarty/smarty": "dev-trunk",
            "cboden/Ratchet": "0.3.*",
            "react/zmq": "0.2.*",
            "doctrine/mongodb-odm": "1.0.0-BETA10",
            "neutron/mongo-odm-silex-provider": "*",
            "symfony/console": "2.6.*@dev"
        },
        "autoload": {
            "psr-0": {
                "Acme": "src/"
            }
        }
    }


    Вот контент папки vendor после выполнения комманды php composer.phar update:
    svscorp@ubu14:/var/www/silex$ ls vendor/
    autoload.php  cboden  composer  doctrine  evenement  guzzle  neutron  pimple  psr  react  silex  smarty  symfony


    Вот содержание папки symfony:
    console  debug  event-dispatcher  http-foundation  http-kernel  routing


    Как видно отсюда, пакет console попал в папку вендора symfony. И он не попал в Component, т.к. не является компонентом пакета symfony =)

    Т.е.:
    * HTTPFoundation - это компонент пакета symfony vendor'a symfony (symfony/symfony)
    * config или console - это пакет vendor'a symfony

    Т.е. config мог бы быть в vendor/symfony/symfony/src/Symfony/Component/, если бы являлся компонентом пакета symfony/symfony. Но он является отдельным пакетом symfony.
    Ответ написан
  • Почему Symfony2 Form вызывает remove* вместе c add* ?

    svscorp
    @svscorp
    Когда мы говорим об add и remove, имеется ввиду работа с отношением ManyToMany, например, т.е. с коллекциями ArrayCollection.

    Т.е. если у вашей сущности есть свойство posts, которое является ManyToMany или OneToMany к сущности Post, то Symfony будет искать addPost(Post $post) и removePost(Post $post).
    Ответ написан
    Комментировать
  • Где ищут работу разработчики на symfony2?

    svscorp
    @svscorp
    Согласен, я работаю в ЕС, здесь довольно много проектов на SF2. У нас в РФ не встречал особо.
    Ответ написан
    Комментировать
  • Как организовать динамические списки категорий и субкатегорий с использованием форм в Symfony2?

    svscorp
    @svscorp Автор вопроса
    Разбираюсь с ДатаТрансформерами и кастомными типами.

    Основная форма:
    class CategoryForm extends AbstractType
    {
        private $em;
    
        public function __construct($em) {
           $this->em = $em;
        }
    
        public function buildForm(FormBuilderInterface $builder, array $options) {
          $transformer = new CategoryToChoiceTransformer($this->em);
    
          $builder->add(
                   $builder->create('categories', 'collection',
                       array(
                          'type' => new CategoryCollectionType($this->em)
                       )
                   )->addModelTransformer($transformer));
    
    
    
            $builder->add('save', 'submit');
        }
    
        public function getDefaultOptions(array $options)
        {
            $resolver->setDefaults(array(
                    'data_class' => 'Acme\DemoBundle\Entity\Item',
            ));
        }
    


    CategoryCollectionType:
    class CategoryCollectionType extends AbstractType
    {
        private $em;
    
        public function __construct($em) {
            $this->em = $em;
        }
    
        public function buildForm(FormBuilderInterface $builder, array $options) {
    
            $builder->add('categories', 'collection', array(
                                                            'type' => 'entity',
                                                            'allow_add' => true,
                                                            'allow_delete' => true,
                                                            'prototype' => false,
                                                            'show_legend' => true,
                                                            'widget_add_btn' => array('label' => _('Добавить категорию')),
                                                            'options' => array(
                                                                            'widget_control_group' => false,
                                                                            'label_render' => false,
                                                                            'show_legend' => false,
                                                                            'class' => 'AcmeDemoBundle:Category',
                                                                            'query_builder' => function(EntityRepository $er) {
                                                                                return $er->createQueryBuilder('c')
                                                                                    ->orderBy('c.id', 'ASC');
                                                                            },
                                                                            'property' => 'name',
                                                                            'empty_value' => _('Выберите категорию'),
                                                                        ),
    
                                                        )
                                  );
    
    
        }
    
        public function getName()
        {
            return 'category_collection_type';
        }
    }
    


    DataTransformer:
    
    class CategoryToChoiceTransformer implements DataTransformerInterface
    {
        /**
         * @var ObjectManager
         */
        private $om;
    
        /**
         * @param ObjectManager $om
         */
        public function __construct(ObjectManager $om)
        {
            $this->om = $om;
        }
    
        /**
         *
         * @param  Issue|null $issue
         * @return string
         */
        public function transform($categories)
        {
            $categoriesExpanded = new ArrayCollection();
    
            if (!empty($categories)) {
                $categoryRepository = $this->om->getRepository('AcmeDemoBundle:Category');
    
                foreach ($categories as $category) {
                    $path = new ArrayCollection($categoryRepository->getPath($category));
                    $categoriesExpanded->add($path);
                }
            }
    
            return $categoriesExpanded;
        }
    
        public function reverseTransform($f) {
          ...
       }
    }
    


    Вот, что я получаю:
    Хотя, ожидаю увидеть 3 селектбокса в 1 группе и 3 во второй (data transformer возвращает массив вида:
    array(
    [0] => array( ObjectCategory#..., ObjectCategory#..., ObjectCategory#..., ),
    [1] => array( ObjectCategory#..., ObjectCategory#..., ObjectCategory#..., )
    


    Есть у кого идеи, что здесь не верно?
    Ответ написан
    Комментировать
  • Bundle для категоризации любой вложенности для Symfony2?

    svscorp
    @svscorp Автор вопроса
    Кстати, собственно реализация решения… вдруг пригодиться:

    1) Создаем Entity:

    <?php
    // src/Acme/DemoBundle/Entity/Category.php
    namespace Acme\DemoBundle\Entity;
    
    use Gedmo\Mapping\Annotation as Gedmo;
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * @Gedmo\Tree(type="nested")
     * @ORM\Table(name="categories")
     * use repository for handy tree functions
     * @ORM\Entity(repositoryClass="Gedmo\Tree\Entity\Repository\NestedTreeRepository")
     */
    class Category
    {
        /**
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue
         */
        private $id;
    
        /**
         * @Gedmo\Translatable
         * @ORM\Column(name="title", type="string", length=64)
         */
        private $title;
    
        /**
         * @Gedmo\TreeLeft
         * @ORM\Column(name="lft", type="integer")
         */
        private $lft;
    
        /**
         * @Gedmo\TreeLevel
         * @ORM\Column(name="lvl", type="integer")
         */
        private $lvl;
    
        /**
         * @Gedmo\TreeRight
         * @ORM\Column(name="rgt", type="integer")
         */
        private $rgt;
    
        /**
         * @Gedmo\TreeRoot
         * @ORM\Column(name="root", type="integer", nullable=true)
         */
        private $root;
    
        /**
         * @Gedmo\TreeParent
         * @ORM\ManyToOne(targetEntity="Category", inversedBy="children")
         * @ORM\JoinColumn(name="parent_id", referencedColumnName="id", onDelete="CASCADE")
         */
        private $parent;
    
        /**
         * @ORM\OneToMany(targetEntity="Category", mappedBy="parent")
         * @ORM\OrderBy({"lft" = "ASC"})
         */
        private $children;
    
        /**
         *
    
         * @Gedmo\Translatable
    
         * @Gedmo\Slug(fields={"title"})
    
         * @ORM\Column(name="slug", type="string", length=128)
    
         */
    
        private $slug;
    
        public function getId()
        {
            return $this->id;
        }
    
        public function getSlug()
    
        {
    
            return $this->slug;
    
        }
    
        public function setTitle($title)
        {
            $this->title = $title;
        }
    
        public function getTitle()
        {
            return $this->title;
        }
    
        public function setParent(Category $parent = null)
        {
            $this->parent = $parent;
        }
    
        public function getParent()
        {
            return $this->parent;
        }
    }
    


    2. В контроллере реализуем добавление категорий:

                use Acme\DemoBundle\Entity\Category as CategoryEntity;
    
                // ... your code before
                $em = $this->getDoctrine()->getManager();
                $cat1= new CategoryEntity();
                $cat1->setTitle('Фрукты');
                
                $subcat = new CategoryEntity();
                $subcat->setTitle('Экзотические');
                $subcat->setParent($cat1);
         
                $cat2 = new CategoryEntity();
                $cat2->setTitle('Овощи');
    
                $em->persist($cat1);
                $em->persist($cat2);
                $em->persist($subcat);
                $em->flush();
         
    


    Вы получите меню вида:
    — Фрукты
    — — Экзотические
    — Овощи

    3) Получаем список категорий (в виде массива):

    // ...
    $categoryEntity = $this->em->getRepository('Acme\DemoBundle\Entity\Category');
    $categories = $categoryEntity->childrenHierarchy();
    // ...
    


    Успехов!
    Ответ написан
    1 комментарий
  • Нужна помощь в выдергивании параметра через регулярные выражения

    svscorp
    @svscorp Автор вопроса
    Спасибо, всем за комментарии и наставления. Буду учить матчасть.
    Ответ написан
    Комментировать
  • Как найти тестировщика для проекта?

    svscorp
    @svscorp Автор вопроса
    Ок, спасибо!
    Ответ написан
    Комментировать