Этап
Готова
Тип
Задача
Приоритет
Высокий
Трудоемкость
Сложная
Создана
Дата создания
4 года назад
Назначена
Обновлена
4 года назад

Расточительно хранить справочники в виде отдельных таблиц. Здесь предлагается создать упакованные в json объекты, из которых будет предоставляться всякие настройки проекта, в том числе и справочники. В качестве примера работы системы реализовать простой справочник “Тип задачи”. При первом настройке предлагается применить шаблон набора пунктов:

  • “Задача”
  • “Ошибка”
  • “Документация”.

Пользователь по необходимости редактирует имеющиеся и создает дополнительные. Прикрепляются элементы справочника к сущности стандартным способом, через поле int task_type.

На первых порах у справочника будет имя и описание. В будущем туда стоит запихнуть иконку, но не из font-awesome/glyphicon, а загруженную пользователем.

Панель управления

Комментарии могут оставлять только авторизованные пользователи
 demius 4 года назад

Пока продолжаем старый способ закрытия по принятию MR

 demius 4 года назад

С другой стороны а какое еще движение сейчас у задачи может быть? Вот когда будут у задачи этапы, а уж тем паче релизы. Или хотя бы стенды будут для тестирования релизов, можно будет вытаскивать задачи на этап rc или тест, а при релизе скопом закрывать.

 demius 4 года назад

Прошло ревью. Может не закрывать?

 demius 4 года назад

Доделал. На ревью

 demius 4 года назад

Сделал самую суть системы в простой реализации

 demius 4 года назад

Отказался от сериализатора, вернулся к самостроящимся и самосворачивающимся объектам. Базовое редактирование готово. Осталось его везде заюзать.

 demius 4 года назад

Entity->get|setField читает и слушатель, ожидая сырой массив и после бизнес-логика, ожидая сформированный объект. И разделить это никак нельзя, не создавая новые проекси, костыли, проверки и т.д. Может все же отказаться от сериализатора, достал

 demius 4 года назад

Второй вопрос, как скрыть из интерфейса словаря изменение id, но позволить словарю сохранять и поддерживать id, даже когда форма меняет словарь (добавляя, например элемент) через getItems/setItems

 demius 4 года назад

Так же, мы при загрузке entity еще можем хуком вызвать Листенер, который подменить содержимое поля. Но в будущем мы все равно будем вызвать $project->getTaskSettings, и в этот момент мы не моежм быть уверены развернутый там объект или его json-представление. В итоге в попытке отладить редактирование объекта мы все равно скатились к тому, что объект то и дело сам себя разворачивает из массива или пакует в массив. Либо надо подключать сериализатор к энтити, либо обходится целиком без него. Либо вобще считать, что энтити выдает только raw, а объект получать из сервиса.

 demius 4 года назад

Symfony/Serializer не может понять какой объект класть в проперти вида

/** @var Object[] */
array $propert;

Надо или переходить на php8 и явно указывать Object[] $property;, или разворачивать в объект вручную

 demius 4 года назад

Ну вот в такм куцем виде система на загрузку заработала. Обратно тоже трансформирует, осталось в контроллере тыкнуть сохранение. (точнее в Filler’е).

Надо бы только подраздвинуть поле и бьютифицировать json. Из коробки этого сериализатор не умеет, или писать свой json-encoder (что ради разовой задачи удаляемого контрола - такое), или в трансформере быстро расставить переносы и пробелы.

 demius 4 года назад

Тут сразу стоит убрать и сложную иерархию Type-классов. Тем более что DicitionaryItem все равно не влазит в прототип для allow_add CollectionType

 demius 4 года назад

Продолжая идею MVP, может выкинуть сложный контрол редактирования справочника в отдельную задачу. Настройки проекта видны только мне, как единственному pm на долгое время. Чтобы не зависать неделями над сложным JS или тем паче vue.js, можно предоставить текстовое поле с красиво разложенным json, который можно вручную заполнить. А в будущем это текстовое поле будет скрытым и его будет заполнять vue-компонент

 demius 4 года назад

Если реализовать событие doctrine->postPersist(Entity), можно будет использовать сервисы для инициализации нашего объекта из json’а. А для универсальной мощной десериализаиции, не требующей в каждом объекте перечислять поля десериализуемые, использовать symfony/serializer

 demius 4 года назад

Up. Merge from last release.

 demius 4 года назад

Сейчас самая сложная часть, форма редактирования справочника. Либо это делать vue.js либо обычным. В любом случае я не хочу сохранения на лету, а значит надо делать иерархию форм. Видимо Общий тип JsonEntityType и от него DictionaryType и DictionaryItemType

 demius 4 года назад

Можно ввести свой тип JsonObject. Но тип не имеет доступа к своему описанию, потому не знает какой класс ему инстанцировать своими данными. Стандартный же тип json возвращает php-array. Либо на каждый справочник создавать тип. Либо в каждом сериализованном объекте хранить тип. Либо гидрировать в array и гетером переделывать в класс (каждый раз или меняя тип

 demius 4 года назад

Документация по системе лежит в [Система справочников] http://tndt.demius.ru/p/tndt/doc/sistema-spravochnikov

 demius 4 года назад

Пока нет системы активности буду отмечать комментариями, чтобы и даты сохранились, и задачу апнуть Начал реализацию.