Павел
Юра
Флаш в флаше дедлок в дедлоке )
Тимофей
доброго времени суток, я только изучаю симфони, пишу небольшой проект, столкнулся с проблемой, не могу нигде найти ничего похожего... Есть сущность продукт, связана с характеристики, она связана с дефолтХарактеристики, а эта в свою очередь с дефолтВалуес.. Есть форма продуктХарактеристикс, она вложена через коллекшнТайп в продуктФорм, вопрос заключается в том, чтобы в продуктХарактеристикс чойсТайп заполнить чойсес дефолтными значениями относящимися к текущей дефолтХарактеристике... Может кто нить подсказать?
Konstantin
тяжеловато понять вопрос, напишите нормальным текстом, покажите примеры кода, скриншоты. объясните желаемый результат и покажите текущий.
щас выглядит как "я тут с телефона чего-то написал невнятного, помогайте мне"
Тимофей
Max
доброго времени суток, я только изучаю симфони, пишу небольшой проект, столкнулся с проблемой, не могу нигде найти ничего похожего... Есть сущность продукт, связана с характеристики, она связана с дефолтХарактеристики, а эта в свою очередь с дефолтВалуес.. Есть форма продуктХарактеристикс, она вложена через коллекшнТайп в продуктФорм, вопрос заключается в том, чтобы в продуктХарактеристикс чойсТайп заполнить чойсес дефолтными значениями относящимися к текущей дефолтХарактеристике... Может кто нить подсказать?
Ему надо товары заполнить дефолтными значениями, если они не указаны у товара
Готовое вряд-ли будет где-нибудь. Нужно писать руками
Павел
не пиши на транслите, пиши на Английском
Тимофей
Есть сущности:
#[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' =>
Незря у тебя ленивый написано, код мог бы хоть не портянкой скинуть
Тимофей
Тимофей
https://gist.github.com/liquid-G/a400cc32c84f206526b321fe5af51f3f
Тимофей
выложил... нор вопрос остался: как мне сделать выборку определенных дефолтных значений к определенной ТЕКУЩЕЙ характеристике??... стандартно не могу, передать тоже не пойму как..(((
Тимофей
Кто нибудь может помочь, или я что то снова "накосячил" в условиях?
Тимофей
как option пытался, не получилось... с сервисами еще не работал, но сейчас погуглю... спасибо...
Konstantin
я вопрос хоть правильно понял?
Konstantin
если да, щас попробую мини-пример накидать
Кирилл
Кирилл
Ну айди характеристики же есть?
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
не ну это уже тривиальная задача в симфони-мире, это надо уметь. добро пожаловать в доку
Тимофей
если бы я мог обратиться к текущим данным этой вложенной формы, то проблема сразу же решилась бы...
Тимофей
https://gist.github.com/liquid-G/bcfe4c452cca29e096a52b7db97cbcfb
Тимофей
изменил на EntityType, вернулся к вопросу как получить текущие данные
Павел
че такое метрики логирования и зачем нужны?
Тимофей
Могу быть не точным но смысл примерно в следующем: логирование (запись лога действий, ошибок, событий и т.п.) может осуществляться простой (сквозной) записью лога "всего подряд", либо группироваться по "метрикам", т.е. метрика событий приложения, метрика ошибок ввода, метрика поисковых запросов и т.п.... При разделении лога на метрики удобнее анализировать действия пользователей, выявлять ошибки приложения, отсутствие, либо избыточность контента при поиске и т.п.... Зависит от количества и качества самих метрик...
Тимофей
чем "уже" метрика, тем больше простора для аналитиков...
Тимофей
Вопрос по архитектуре: нужно создать сущность "Комментарий", она может быть связана как с постом, так и с фото, так и сама с собой, так и с другими сущностями... как правильно организовать связь? ЗЫ: вопрос по характеристикам пока в холде...
Тимофей
Перефразирую в последовательность: я создаю сущность "Комментарий", затем в сущности где она будет использована добавляю поле МногиеКОдному, правильно? или МногиеКоМногим?
Дмитрий
Юра
Юра
Ну или ответл себе на вопрос может ли один и тот же коментарий принадлежать нескольким постам
Юра
Вопрос вообще непонятный если честно. Сядь просто и подумай ко многим или к одному )
Юра
Так к примеру хранятся переводы
Тимофей
я не могу уловить тонкость... в этом всегда проблема... пока писал сообразил... жаль ненадолго...(( когда касается многих-немногих логику плохо улавливаю...
Тимофей
но всем спасибо разъяснили..)
Юра
Может ли ОДИН и ТОТ ЖЕ коментарий быть у нескольких постов?
Тимофей
Тимофей
либо много комментариев ко множеству постов
Юра
Это пройдет со временем
Юра
Она всех путает
Тимофей
Хотя диплом защищал, как раз по 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 обязательное поле получается
а в конструктор можно нул передать?
Иван
Иван
поле или нуллабл, или не
Тимофей
как допишу в git выложу... если кому интересно..) только функционал урежу....
Тимофей
сейчас пользователь выбирает категорию, потом переходит к созданию...
Иван
контракт базы, полей и конструктора должны совпадать
иначе какой смысл?
Тимофей
Тимофей
http://5.59.137.30:8002/shop/product/add
Тимофей
после регистрации роль добавлю, и будет доступ
Тимофей
ходя по идее симфони в дебаге... можно и код посмотреть...
Иван