Павел
Юра
Флаш в флаше дедлок в дедлоке )
Павел
Флаш в флаше дедлок в дедлоке )
Ну если конурентности нет - спасает)
Тимофей
доброго времени суток, я только изучаю симфони, пишу небольшой проект, столкнулся с проблемой, не могу нигде найти ничего похожего... Есть сущность продукт, связана с характеристики, она связана с дефолтХарактеристики, а эта в свою очередь с дефолтВалуес.. Есть форма продуктХарактеристикс, она вложена через коллекшнТайп в продуктФорм, вопрос заключается в том, чтобы в продуктХарактеристикс чойсТайп заполнить чойсес дефолтными значениями относящимися к текущей дефолтХарактеристике... Может кто нить подсказать?
Konstantin
тяжеловато понять вопрос, напишите нормальным текстом, покажите примеры кода, скриншоты. объясните желаемый результат и покажите текущий. щас выглядит как "я тут с телефона чего-то написал невнятного, помогайте мне"
Павел
не пиши на транслите, пиши на Английском
Тимофей
Есть сущности: #[ORM\Entity(repositoryClass: ProductRepository::class)] class Product { #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column(type: 'integer')] private int $id; #[ORM\ManyToOne(targetEntity: Category::class)] #[ORM\JoinColumn(nullable: false)] private Category $category; #[ORM\OneToMany(mappedBy: 'product', targetEntity: ProductCharacteristic::class, cascade: ['remove',])] private Collection $characteristics; public function __construct(Category $category = null) { $this->characteristics = new ArrayCollection(); if($category){ $this->setCategory($category); $defChars = $category->getDefaultCharacteristics(); foreach ($defChars as $char) { $this->addCharacteristic(new ProductCharacteristic($char)); } } } } #[ORM\Entity(repositoryClass: CategoryRepository::class)] class Category { #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column(type: 'integer')] private int $id; #[ORM\ManyToMany(targetEntity: DefaultCharacteristics::class, mappedBy: 'categories')] private Collection $defaultCharacteristics; public function __construct() { $this->defaultCharacteristics = new ArrayCollection(); } } #[ORM\Entity(repositoryClass: DefaultCharacteristicsRepository::class)] class DefaultCharacteristics { #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column(type: 'integer')] private int $id; #[ORM\ManyToMany(targetEntity: Category::class, inversedBy: 'defaultCharacteristics')] private Collection $categories; #[ORM\OneToMany(mappedBy: 'Characteristic', targetEntity: DefaultCharactericticsValues::class, orphanRemoval: true)] private Collection $defaultCharacteristicsValues; public function __construct() { $this->categories = new ArrayCollection(); $this->defaultCharacteristicsValues = new ArrayCollection(); } } #[ORM\Entity(repositoryClass: DefaultCharactericticsValuesRepository::class)] class DefaultCharactericticsValues { #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column(type: 'integer')] private int $id; #[ORM\Column(type: 'string', length: 255)] private string $value; #[ORM\ManyToOne(targetEntity: DefaultCharacteristics::class, inversedBy: 'defaultCharactericticsValues')] #[ORM\JoinColumn(nullable: false)] private DefaultCharacteristics $Characteristic; public function __construct() { } } //------------------------------------------------------------- Есть формы: class ProductFormType extends AbstractType { /** * @param FormBuilderInterface $builder * @param array $options */ public function buildForm(FormBuilderInterface $builder, array $options): void { $builder ->add('characteristics', CollectionType::class, [ 'entry_type' => ProductCharacteristicFormType::class, 'entry_options' => [ 'label' => false, ], 'allow_add' => true, 'allow_delete' => true, ]) ->add('submit', SubmitType::class, [ 'label' => $btnLabel, 'attr' => ['class' => 'btn btn-success', ] ]); } /** * @param OptionsResolver $resolver */ public function configureOptions(OptionsResolver $resolver): void { $resolver->setDefaults([ 'data_class' => Product::class, ]); } } class ProductCharacteristicFormType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options): void { $builder ->add('name', TextType::class, [ 'label' => false, 'attr' => ['readonly' => 'readonly'], 'row_attr' => [ 'style' =>
Nikolay
Есть сущности: #[ORM\Entity(repositoryClass: ProductRepository::class)] class Product { #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column(type: 'integer')] private int $id; #[ORM\ManyToOne(targetEntity: Category::class)] #[ORM\JoinColumn(nullable: false)] private Category $category; #[ORM\OneToMany(mappedBy: 'product', targetEntity: ProductCharacteristic::class, cascade: ['remove',])] private Collection $characteristics; public function __construct(Category $category = null) { $this->characteristics = new ArrayCollection(); if($category){ $this->setCategory($category); $defChars = $category->getDefaultCharacteristics(); foreach ($defChars as $char) { $this->addCharacteristic(new ProductCharacteristic($char)); } } } } #[ORM\Entity(repositoryClass: CategoryRepository::class)] class Category { #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column(type: 'integer')] private int $id; #[ORM\ManyToMany(targetEntity: DefaultCharacteristics::class, mappedBy: 'categories')] private Collection $defaultCharacteristics; public function __construct() { $this->defaultCharacteristics = new ArrayCollection(); } } #[ORM\Entity(repositoryClass: DefaultCharacteristicsRepository::class)] class DefaultCharacteristics { #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column(type: 'integer')] private int $id; #[ORM\ManyToMany(targetEntity: Category::class, inversedBy: 'defaultCharacteristics')] private Collection $categories; #[ORM\OneToMany(mappedBy: 'Characteristic', targetEntity: DefaultCharactericticsValues::class, orphanRemoval: true)] private Collection $defaultCharacteristicsValues; public function __construct() { $this->categories = new ArrayCollection(); $this->defaultCharacteristicsValues = new ArrayCollection(); } } #[ORM\Entity(repositoryClass: DefaultCharactericticsValuesRepository::class)] class DefaultCharactericticsValues { #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column(type: 'integer')] private int $id; #[ORM\Column(type: 'string', length: 255)] private string $value; #[ORM\ManyToOne(targetEntity: DefaultCharacteristics::class, inversedBy: 'defaultCharactericticsValues')] #[ORM\JoinColumn(nullable: false)] private DefaultCharacteristics $Characteristic; public function __construct() { } } //------------------------------------------------------------- Есть формы: class ProductFormType extends AbstractType { /** * @param FormBuilderInterface $builder * @param array $options */ public function buildForm(FormBuilderInterface $builder, array $options): void { $builder ->add('characteristics', CollectionType::class, [ 'entry_type' => ProductCharacteristicFormType::class, 'entry_options' => [ 'label' => false, ], 'allow_add' => true, 'allow_delete' => true, ]) ->add('submit', SubmitType::class, [ 'label' => $btnLabel, 'attr' => ['class' => 'btn btn-success', ] ]); } /** * @param OptionsResolver $resolver */ public function configureOptions(OptionsResolver $resolver): void { $resolver->setDefaults([ 'data_class' => Product::class, ]); } } class ProductCharacteristicFormType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options): void { $builder ->add('name', TextType::class, [ 'label' => false, 'attr' => ['readonly' => 'readonly'], 'row_attr' => [ 'style' =>
Незря у тебя ленивый написано, код мог бы хоть не портянкой скинуть
Nikolay
Я просто не знаю как нужно..((
Есть сервисы типа gist, pastebin
Тимофей
https://gist.github.com/liquid-G/a400cc32c84f206526b321fe5af51f3f
Тимофей
выложил... нор вопрос остался: как мне сделать выборку определенных дефолтных значений к определенной ТЕКУЩЕЙ характеристике??... стандартно не могу, передать тоже не пойму как..(((
Тимофей
Кто нибудь может помочь, или я что то снова "накосячил" в условиях?
Konstantin
выложил... нор вопрос остался: как мне сделать выборку определенных дефолтных значений к определенной ТЕКУЩЕЙ характеристике??... стандартно не могу, передать тоже не пойму как..(((
я буквально на горной дороге сейчас нахожусь, но я правильно понимаю, что вам надо набор сущностей передать для choices? если ничего не поменялось, есть два базовых способа это сделать: 1) передать этот список как option (не забыв предварительно объявить) 2) зарегать форму как сервис, инжектнуть в нее репозиторий и у него попросить этот список
Тимофей
как option пытался, не получилось... с сервисами еще не работал, но сейчас погуглю... спасибо...
Konstantin
я вопрос хоть правильно понял?
Konstantin
если да, щас попробую мини-пример накидать
Кирилл
Тимофей
"как option пытался, не получилось" - почему? какая ошибка?
не получилось отфильтровать дефолтные значения по текущей характеристике, т.к. у каждой характеристики свои возможные значения
Тимофей
я вопрос хоть правильно понял?
да, все верно, но с фильтром по текущим данным...
Кирилл
Ну айди характеристики же есть?
Konstantin
то есть динамически перезагружать список зависимых значений?
Konstantin
как если бы вы выбирали страну, а в селекте ниже страны надо подгрузить ее города?
Тимофей
сейчас...
Тимофей
Сейчас тут текстовые поля, а мне нужно заменить Select-ами, с заранее предустановленными значениями
Konstantin
если выбрали в первом "для кошек" должны ли измениться остальные пункты?
Konstantin
ну типа если выберут "для попугаев", вряд ли там должен быть вариант "этот корм из курицы" ))
Тимофей
нет, это было бы проще для меня, аджаксом подгрузить списки, я не могу изначально заполнить со стороны symfony необходимую информацию, т.е. для характеристики "предназначен для" ( значения собаки, кошки и т.п.)... если гружу как EntityType, то выводятся все значения, вне зависимости от текущей характеристики....
Konstantin
ну короче, это слабо относится к делу, но вам скорее надо посмотреть на что-то типа https://packagist.org/packages/evercodelab/dependent-select-bundle
Konstantin
я не могу конкретное что-то порекомендовать, тк не пользуемся, но идти нужно с этой стороны
Konstantin
а что касается модели данных - начните с неё. на входе должно быть что-то вроде
Konstantin
$characteristics = [ [ 'name' => 'Для кого предназначен', 'variants' => [ [ 123 => 'Для кошек', 124 => 'Для собак', // ... ], ], [ 'name' => 'Возраст', 'variants' => [ [ 123 => '1 мес', 124 => '2 мес', // ... ], ], ], // ... ];
Konstantin
скорее, на сущностях, а не массивах, но смысл примерно такой. следовательно, вы бежите по списку верхнего уровня циклом и внутри цикла уже добавляете вложенные type-ы. оба этих списка можно подготовить одним запросом
Konstantin
корневой список в форму передаете вышеозвученными путями - опция, либо инъекция репозитория, откуда это можно достать
Konstantin
ну без фронта не получится всё равно)
Тимофей
вот с инъекцией репозитория я как раз таки и пытался, но не нашел инфо как реализовать...
Konstantin
не ну это уже тривиальная задача в симфони-мире, это надо уметь. добро пожаловать в доку
Тимофей
скорее, на сущностях, а не массивах, но смысл примерно такой. следовательно, вы бежите по списку верхнего уровня циклом и внутри цикла уже добавляете вложенные type-ы. оба этих списка можно подготовить одним запросом
просто я не совсем понимаю механизм билдинга форм, поэтому возникает трудность, и у меня билдинг автоматический, да еще с вложенными формами, поэтому совсем не могу понять как достать до сущности, а в сифони как я понял строгое разделение между моделью и вьювкой....
Тимофей
не ну это уже тривиальная задача в симфони-мире, это надо уметь. добро пожаловать в доку
доки читал, но не совсем понятным языком там написано, иначе бы вопрос не возник, т.е. из-за недостатка практики и знания симфони (повторюсь, месяца 4 как начал его/её изучать, в свободное от работы время) не могу сразу сориентироваться...
Тимофей
если бы я мог обратиться к текущим данным этой вложенной формы, то проблема сразу же решилась бы...
Тимофей
https://gist.github.com/liquid-G/bcfe4c452cca29e096a52b7db97cbcfb
Тимофей
изменил на EntityType, вернулся к вопросу как получить текущие данные
Павел
че такое метрики логирования и зачем нужны?
Тимофей
Могу быть не точным но смысл примерно в следующем: логирование (запись лога действий, ошибок, событий и т.п.) может осуществляться простой (сквозной) записью лога "всего подряд", либо группироваться по "метрикам", т.е. метрика событий приложения, метрика ошибок ввода, метрика поисковых запросов и т.п.... При разделении лога на метрики удобнее анализировать действия пользователей, выявлять ошибки приложения, отсутствие, либо избыточность контента при поиске и т.п.... Зависит от количества и качества самих метрик...
Тимофей
чем "уже" метрика, тем больше простора для аналитиков...
Тимофей
Вопрос по архитектуре: нужно создать сущность "Комментарий", она может быть связана как с постом, так и с фото, так и сама с собой, так и с другими сущностями... как правильно организовать связь? ЗЫ: вопрос по характеристикам пока в холде...
Тимофей
Перефразирую в последовательность: я создаю сущность "Комментарий", затем в сущности где она будет использована добавляю поле МногиеКОдному, правильно? или МногиеКоМногим?
Юра
Перефразирую в последовательность: я создаю сущность "Комментарий", затем в сущности где она будет использована добавляю поле МногиеКОдному, правильно? или МногиеКоМногим?
Представь себе таблицу без доктрины. Если у тебя в коменте логично post_id значит мгогие к одному. Если не логично, значит многие ко многим
Юра
Ну или ответл себе на вопрос может ли один и тот же коментарий принадлежать нескольким постам
Юра
Вопрос вообще непонятный если честно. Сядь просто и подумай ко многим или к одному )
Дмитрий
Перефразирую в последовательность: я создаю сущность "Комментарий", затем в сущности где она будет использована добавляю поле МногиеКОдному, правильно? или МногиеКоМногим?
Как возможное решение.. можно не заморачиваться с промежуточными таблицами, а для комментария хранить тип сущности к которой он относится и внешний ключ. external-id : entity : text-comment 1 : photo : text 1 2 : photo : text 2 1 : post : text 3 Выбирать можно по составному индексу : external-id + entity
Юра
Так к примеру хранятся переводы
Тимофей
я не могу уловить тонкость... в этом всегда проблема... пока писал сообразил... жаль ненадолго...(( когда касается многих-немногих логику плохо улавливаю...
Тимофей
но всем спасибо разъяснили..)
Юра
Может ли ОДИН и ТОТ ЖЕ коментарий быть у нескольких постов?
Тимофей
Может ли ОДИН и ТОТ ЖЕ коментарий быть у нескольких постов?
меня путает реверсия... много комментариев к одному посту... а связь ОдинКоМногим...
Тимофей
либо много комментариев ко множеству постов
Юра
Это пройдет со временем
Юра
Она всех путает
Тимофей
Хотя диплом защищал, как раз по SQL... правда тема триггеры..)
Иван
Есть сущности: #[ORM\Entity(repositoryClass: ProductRepository::class)] class Product { #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column(type: 'integer')] private int $id; #[ORM\ManyToOne(targetEntity: Category::class)] #[ORM\JoinColumn(nullable: false)] private Category $category; #[ORM\OneToMany(mappedBy: 'product', targetEntity: ProductCharacteristic::class, cascade: ['remove',])] private Collection $characteristics; public function __construct(Category $category = null) { $this->characteristics = new ArrayCollection(); if($category){ $this->setCategory($category); $defChars = $category->getDefaultCharacteristics(); foreach ($defChars as $char) { $this->addCharacteristic(new ProductCharacteristic($char)); } } } } #[ORM\Entity(repositoryClass: CategoryRepository::class)] class Category { #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column(type: 'integer')] private int $id; #[ORM\ManyToMany(targetEntity: DefaultCharacteristics::class, mappedBy: 'categories')] private Collection $defaultCharacteristics; public function __construct() { $this->defaultCharacteristics = new ArrayCollection(); } } #[ORM\Entity(repositoryClass: DefaultCharacteristicsRepository::class)] class DefaultCharacteristics { #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column(type: 'integer')] private int $id; #[ORM\ManyToMany(targetEntity: Category::class, inversedBy: 'defaultCharacteristics')] private Collection $categories; #[ORM\OneToMany(mappedBy: 'Characteristic', targetEntity: DefaultCharactericticsValues::class, orphanRemoval: true)] private Collection $defaultCharacteristicsValues; public function __construct() { $this->categories = new ArrayCollection(); $this->defaultCharacteristicsValues = new ArrayCollection(); } } #[ORM\Entity(repositoryClass: DefaultCharactericticsValuesRepository::class)] class DefaultCharactericticsValues { #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column(type: 'integer')] private int $id; #[ORM\Column(type: 'string', length: 255)] private string $value; #[ORM\ManyToOne(targetEntity: DefaultCharacteristics::class, inversedBy: 'defaultCharactericticsValues')] #[ORM\JoinColumn(nullable: false)] private DefaultCharacteristics $Characteristic; public function __construct() { } } //------------------------------------------------------------- Есть формы: class ProductFormType extends AbstractType { /** * @param FormBuilderInterface $builder * @param array $options */ public function buildForm(FormBuilderInterface $builder, array $options): void { $builder ->add('characteristics', CollectionType::class, [ 'entry_type' => ProductCharacteristicFormType::class, 'entry_options' => [ 'label' => false, ], 'allow_add' => true, 'allow_delete' => true, ]) ->add('submit', SubmitType::class, [ 'label' => $btnLabel, 'attr' => ['class' => 'btn btn-success', ] ]); } /** * @param OptionsResolver $resolver */ public function configureOptions(OptionsResolver $resolver): void { $resolver->setDefaults([ 'data_class' => Product::class, ]); } } class ProductCharacteristicFormType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options): void { $builder ->add('name', TextType::class, [ 'label' => false, 'attr' => ['readonly' => 'readonly'], 'row_attr' => [ 'style' =>
а ничо, что category обязательное поле получается а в конструктор можно нул передать?
Тимофей
а ничо, что category обязательное поле получается а в конструктор можно нул передать?
нет, там перед формой заполнения карточки выбирается категория, и она заведомо известна, а если у категории нет дефолтных характеристик, то они добавляются пользователем вручную... null был добавлен для обратной совместимости...
Иван
поле или нуллабл, или не
Тимофей
как допишу в git выложу... если кому интересно..) только функционал урежу....
Тимофей
какой такой совместимости? там не должно быть нула конструктор должен создавать валидный объект иначе какой смысл?
изначально не было дефолтов, и все набиралось вручную, и категория в том числе задавалась при создании карточки...
Тимофей
сейчас пользователь выбирает категорию, потом переходит к созданию...
Иван
контракт базы, полей и конструктора должны совпадать иначе какой смысл?
Тимофей
контракт базы, полей и конструктора должны совпадать иначе какой смысл?
блин... только закоментил этот функционал.... щас...
Тимофей
http://5.59.137.30:8002/shop/product/add
Тимофей
после регистрации роль добавлю, и будет доступ
Тимофей
ходя по идее симфони в дебаге... можно и код посмотреть...
Иван