Ответы пользователя по тегу Symfony
  • Подходит ли framework Symfony?

    @jaxel
    Отлично подходит. Есть довольно удобные бандлы для лёгкой реализации REST. https://github.com/FriendsOfSymfony/FOSRestBundle
    https://github.com/nelmio/NelmioApiDocBundle
    Ответ написан
    Комментировать
  • Почему замедляется работа скрипта?

    @jaxel
    Каким образом парсите XML? На файлах большого объёма надо использовать способы, не загружающие файл в память. Например через XMLReader.

    Как происходит добавление в базу? Доктриной? Если да, то надо разбивать добавление на небольшие пачки. Через каждые 100-200 $em->persist нужно делать $em->flush() и удалять сущности из списка управляемых $em->getUnitOfWork()->clear()

    Ещё надо учесть, что в dev окружении каждый запрос профилируется, и при больших объёмах данных это даёт многократное замедление. Надо или делать запросы в prod окружении, или отключить профилирование:
    $this->em->getConnection()->getConfiguration()->setSQLLogger(null);
    
            foreach ($this->em->getEventManager()->getListeners() as $event => $listeners) {
                foreach ($listeners as $listener) {
                    $this->em->getEventManager()->removeEventListener($event, $listener);
                }
            }
    Ответ написан
    5 комментариев
  • Как подключить изображения для mcelfinder в symfony2?

    @jaxel
    Используйте опцию cssrewrite
    {% stylesheets '@FMElfinderBundle/Resources/public/css/*' filter='cssrewrite' %}
        <link rel="stylesheet" type="text/css" href="{{ asset_url }}" />
    {% endstylesheets %}

    Или просто подключите стили без ассетика.

    Ресурсы в web установлены?
    php app/console assets:install --symlink
    Ответ написан
    Комментировать
  • При редактировании коллекции сущностей не сохраняются новые сущности - почему?

    @jaxel
    Ох, ну и накуролесили вы тут. Как оно вощбще работает?))

    Если делать вашим методом, то сущность Test должна выглядеть примерно так:
    /**
     * Test
     * @ORM\Table(name="test")
     * @ORM\Entity
     */
    class Test {
        /**
         * @var integer
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue
         */
        private $id;
    
        /**
         * @ORM\OneToMany(targetEntity="Acme\AppBundle\Entity\Breakagedemand", mappedBy="test", cascade={"persist"})
         */
        private $collection;
    
        public function __construct()
        {
            $this->collection = new ArrayCollection();
        }
    
        ...
    
        public function addCollection( Breakagedemand $breakagedemand )
        {
            // Устанавливаем  для каждого добавляемого в коллекцию элемента  тест, к которому он относится
            $breakagedemand->setTest($this);
    
            // И только после этого добавляем его в коллекцию
            $this->collection[] = $breakagedemand;
    
            return $this;
        }
    
        ...
    }


    А сущность Breakagedemand так:
    /**
     * Breakagedemand
     * @ORM\Table(name="breakagedemand")
     * @ORM\Entity
     */
    class Breakagedemand {
        /**
         * @var integer
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue
         */
        private $id;
    
    
        // cascade={"persist"} тут не нужен, с этой стороны мы не будем редактировать сущность Breakage
        // Название сущности выбрано неверное, так как тут не будет никакого ID, а будет экземпляр сущности Breakage
        /**
         * @var integer
         * @ORM\ManyToOne(targetEntity="Acme\AppBundle\Entity\Breakage", inversedBy="breakagedemands")
         * @ORM\JoinColumn(name="posbreakage_id", referencedColumnName="id")
         */
        private $posbreakage;
    
    
    
        // cascade={"persist"} тут не нужен, с этой стороны вы тест добавлять никогда не будете
        // referencedColumnName="id" должен быть ID - так как мы связываем после по ИД с таблицей тестов
    
        /**
         * @ORM\ManyToOne(targetEntity="Acme\AppBundle\Entity\Test", inversedBy="collection")
         * @ORM\JoinColumn(name="test_id", referencedColumnName="id")
         */
        private $test;
    
    
        // $this->test не является коллекцией, не надо объявлять new ArrayCollection() в конструкторе
        public function __construct()
        {
        }
    
        // соответственно метод должен быть не addTest а setTest
        public function setTest(Test $test = null)
        {
            $this->test = $test;
    
            return $this;
        }
    
        public function getTest()
        {
            return $this->test;
        }
    
        public function setPosbreakage(Breakage $posbreakage )
        {
            $this->posbreakage = $posbreakage;
            return $this;
        }
    
        /**
         * Get posbreakage
         * @return integer
         */
        public function getPosbreakage()
        {
            return $this->posbreakage;
        }
    
    }


    В комментах я написал где вы накосячили.

    На сколько я понял вашу задачу, у вас есть заранее составленный список возможных поломок. И к тесту надо просто прикрепить некоторые из них. В этом случае вам лучше совсем убрать сущность Breakagedemand и просто сделать связь многие ко многим Test и Breakage(это если в сущности Breakagedemand не хранятся дополнительные данные и если одна поломка не должна добавляться несколько раз):

    /**
     * Test
     * @ORM\Table(name="test")
     * @ORM\Entity
     */
    class Test {
        /**
         * @var integer
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue
         */
        private $id;
    
        /**
         * Список номеров, в котором должно выйти объявление
         * @var \Doctrine\Common\Collections\Collection
         *
         * @ORM\ManyToMany(targetEntity="Breakage")
         * @ORM\JoinTable(name="test2breakage",
         *   joinColumns={
         *     @ORM\JoinColumn(name="test_id", referencedColumnName="id")
         *   },
         *   inverseJoinColumns={
         *     @ORM\JoinColumn(name="breakage_id", referencedColumnName="id")
         *   }
         * )
         */
        private $breakages;
    
        public function __construct()
        {
            $this->breakages = new ArrayCollection();
        }
        public function addBreakage(Breakage $breakage)
        {
    
            $this->breakages[] = $breakage;
    
            return $this;
        }
    
        /**
         * Remove nomer
         *
         * @param Breakage $breakage
         */
        public function removeBreakage(Breakage $breakage)
        {
            $this->breakages->removeElement($breakage);
        }
    
        /**
         * Get nomer
         *
         * @return \Doctrine\Common\Collections\Collection
         */
        public function getBreakages()
        {
            return $this->breakages;
        }
    }
    
    /** 
     * @ORM\Entity
     * 
     **/
    class Breakage
    {
        // ...
    }


    И форма для работы с такой сущностью будет в 100 раз проще:
    public function buildForm(FormBuilderInterface $builder, array $options)
        {
            ...
            $builder->add('breakages', 'entity', array(
                'class' => 'NameSpace\MyBundle\Entity\Breakage',
                'property' => 'name',
                'multiple'  => true
            ));
        }


    Неймспейсы я брал на обум, если что поправите.
    Ответ написан
    Комментировать
  • Как в Twig вывести вывод метода класса?

    @jaxel
    На сколько я знаю в твиге нельзя использовать статичные методы классов.
    Могу предложить 2 варианта:
    1) Создать свой экстеншен для твига, и использовать его на переменной как фильтр
    {{ salonTables.cityId|cityNameFromId }}
    2) Передавать в шаблон экземпляр класса City и использовать метод уже из него.
    {{ city.nameFromId(salonTables.cityId) }}
    Ответ написан
    1 комментарий
  • Какую бесплатную cms/фреймворк использовать для интернет-магазина?

    @jaxel
    Если выбор стоит между CMS и фреймворком, есть довольно простой алгоритм. Если возможности CMS решают 100% задач и быстрого дальнейшего развития не ожидается - надо брать CMS. Если же хотя бы 5% функционала придётся дописывать, лучше взять фреймворк и сделать всё под себя.

    Как показывает практика, эти 5% допилок окажутся такой головной болью в будущем, что сделать 100% функционала на фреймворке будет дешевле и быстрее.
    Ответ написан
    Комментировать
  • Как подключить elfinder и tinymce в symfony2?

    @jaxel
    Ресурсы от бандла установлены?
    php app/console assets:install --symlink

    В шаблоне подключены?
    Ответ написан
  • Symfony2 + авторизация по id?

    @jaxel
    Для этих целей есть HWIOAuthBundle. Он позволяет сделать авторизацию через ВК и работает c FosUserBundle и SonataUserBundle/
    Ответ написан
    1 комментарий
  • Как очистить карту отображения?

    @jaxel
    Кеш почистить. Если был сгенерирован оптимизированный автолоад, то опять сделать команду composer dump-autoload -o Если были созданы связи, сервисы и тд, то поправить в них название класса. Ну и проверить правильность неймспейсов, если сущности были из другого бандла.
    Ответ написан
    Комментировать
  • Как изменить в symfony query формат в GET?

    @jaxel
    Из кода не совсем понятно, откуда у тебя берутся лишние поля. У тебя тип поля entity. Соответственно и передаётся сущность. Если хочешь просто ключ-значение, сделай другой тип поля, например choice.
    Ответ написан
  • Деплой symfony2. Как установить composer на хостинге timeweb?

    @jaxel
    А в чём проблема то? Заливаешь composer.phar на хостинг в папку проекта и всё.
    Ответ написан
    5 комментариев
  • Symfony2. Как правильно переименовать директорию web?

    @jaxel
    Если хостер поддерживает symlink, то проще всего сделать ссылку public_html на папку web. Не обязательно изменять имя папки.
    Ответ написан
    2 комментария
  • Удаление связей many-to-many с промежуточной таблицей?

    @jaxel
    Для удаления записей, с которым разорвана связь нужно добавить в аннотации orphanRemoval=true

    Если ты хочешь просто разрывать связь, то у тебя главной стороной связи должна быть та, с которой связь управляется.
    Ответ написан
    Комментировать