Змінення макета форми доктрини генератора адміністратора

Мені потрібно змінити форму докторської форми генератора адміністратора, яка входить до складу:

$this->embedRelation('MyRelation');

Макет за умовчанням виглядає так:

Screenshot 1

Мета - кожен елемент вибору повинен відображатися як текст в окремому рядку плюс ціна та кількість:

Screenshot 2

схема.имл

Game:
    actAs:
      Timestampable: ~
    columns:
      id: { type: integer(4), primary: true, autoincrement: true, unsigned: true }
      game_name: { type: string(100), notnull: true }
    indexes:
      it:
  fields: game_name
  type: unique

  Campaign:
    actAs:
      Timestampable: ~
    columns:
      id: { type: integer(4), primary: true, autoincrement: true, unsigned: true }
      name: { type: string(100), notnull: true }
      is_active: { type: boolean, notnull: true, default: 0 }
      start: { type: datetime, notnull: true }
      end: { type: datetime, notnull: true }
    relations:
      CampaignMatrix: { onDelete: CASCADE, local: id, foreign: campaign_id, foreignAlias: CampaignMatrixCampaign }

  CampaignGames:
    actAs:
      Timestampable: ~
    columns:
      id: { type: integer(4), primary: true, autoincrement: true, unsigned: true }
      campaign_id: { type: integer(4), notnull: true, unsigned: true }
      game_id: { type: integer(4), notnull: true, unsigned: true }
    indexes:
      tc:
  fields: [campaign_id, game_id]
  type: unique
    relations:
      Campaign: { onDelete: CASCADE, local: campaign_id, foreign: id, foreignAlias: CampaignCampaignGames }
      Game: { onDelete: CASCADE, local: game_id, foreign: id, foreignAlias: GameCampaignGames }

  CampaignMatrix:
    actAs:
      Timestampable: ~
    columns:
      id: { type: integer(4), primary: true, autoincrement: true, unsigned: true }
      item_id: { type: integer(4), notnull: true, unsigned: true }
      campaign_id: { type: integer(4), notnull: true, unsigned: true }
      price_id: { type: integer(4), notnull: true, unsigned: true }
      quantity: { type: integer(4), notnull: true, unsigned: true }
    relations:
      Item: { onDelete: CASCADE, local: item_id, foreign: id, foreignAlias: ItemCampaignMatrix }
      Campaign: { onDelete: CASCADE, local: campaign_id, foreign: id, foreignAlias: CampaignCampaignMatrix }
      Price: { onDelete: CASCADE, local: price_id, foreign: id, foreignAlias: PriceItems }

  Price:
    columns:
      id: { type: integer(4), unsigned: true }
      currency_code: { type: string(3), notnull: true }
      price: { type: float, notnull: true }
    indexes:
      tc:
  fields: [id, currency_code]
  type: unique

  Item:
    actAs:
      Timestampable: ~
      I18n:
  fields: [name, description, image]
    columns:
      id: { type: integer(4), primary: true, autoincrement: true, unsigned: true }
      game_id: { type: integer(4), notnull: true, unsigned: true }
      product_id: { type: string(100), notnull: true }
      price_id: { type: integer(4), notnull: true, unsigned: true }
      quantity: { type: integer(4), notnull: true, unsigned: true }
      name: { type: string(100), notnull: true }
      description: { type: string(255), notnull: true }
      image: { type: string(255), notnull: true }
    indexes:
      it:
  fields: item_type
    relations:
      Game: { onDelete: CASCADE, local: game_id, foreign: id, foreignAlias: GameItems }
      Price: { onDelete: CASCADE, local: price_id, foreign: id, foreignAlias: PriceItems }

Ось як я це роблю:

$list = MainItemTable::getInstance()->findByGameId($gameId);

$CampaignMatrix = new CampaignMatrix();

foreach($list as $index => $item) {

    $itemAssocForm = new CampaignMatrixForm($CampaignMatrix);
    $itemAssocForm->item_id = $item->getId();//Need it in the form as hidden field
    $this->embedForm($item->getProductId(), $itemAssocForm);
}

І це так, як я намагаюся отримати значення:

$this->widgetSchema['item_id'] = new sfWidgetFormInputText(array(), array('value' => $this->item_id));//It doesn't get the Id

Але у мене є помилка: Фатальна помилка: максимальне час виконання 30 секунд перевищено в /vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Relation/Parser.php на лінії 237.

  1. Якщо я вимкнув price_id у CampaignMatrixForm, помилка не виникала. Як уникнути виконання тих самих даних для кожного ряду елементів у циклі?
  2. Ідентифікатор елемента відсутній, але мені це потрібно як приховане поле. Як передавати ідентифікатор CampaignMatrix поточного рядка до CampaignMatrixForm?
0
Я оновив моє запитання ^
додано Автор Roman Newaza, джерело
Ви можете опублікувати відповідні таблиці зі схеми?
додано Автор yitznewton, джерело

3 Відповіді

Вам потрібно послідовно поєднуватись із emebid формою асоціації до основної форми. Це може бути простим, якщо ви публікуєте частину своєї schema.yml.

Спробуйте повторно використати цей фрагмент:

$list = MyRelatedObjectTable::getInstance()->findAll();

foreach($list as $item)
{
  $itemAssoc = AssociationTable::getInstance()->findByObjectId($this->object->id, $item->id);

  if(!$itemAssoc)
  {
    $itemAssoc = new Association();
    $itemAssoc->value_id = $itemAssoc->id;
    $itemAssoc->user_id = $this->object->id;
  }

  $itemAssocForm = new AssociationForm($itemAssoc);
  $this->embedForm('itemAssoc'.$item->code, $itemAssocForm);
}
1
додано
Отже, як ви маєте доступ до параметрів preference_id та user_id у формі?
додано Автор Roman Newaza, джерело
Це взагалі не складно ;-)
додано Автор Roman Newaza, джерело
Я не зміг оновити дані за допомогою моєї форми, але тільки вставте ... Вставлені елементи не можуть бути попередньо вибрані у вбудованій формі. Шви, як мені потрібно, щоб це було абсолютно індивідуально. Я думаю, AJAX допоможе.
додано Автор Roman Newaza, джерело
Ваша модель, можливо, занадто складна ... спробуйте відремонтувати CampaignMatrix в CampaignGames. Щоб досягти своєї мети, ви повинні глибоко інвестувати себе в створення та обробку спеціальних форм. Зробіть спеціальний клас форми, завантажте спеціальні віджети та widgetSchema. Для обробки створіть свій власний метод і збережіть метод для оновлення вашого доктрини objetc. EmbedForm страждає поганим дизайном, і, можливо, просто не підходить вашим цілям.
додано Автор dxb, джерело

ви можете отримати код з кеш-пам'яті та перейти до вашого бекенда/модулів/nameAPP та наступного шаблону редагування

0
додано
ця доктринальна форма. Я думаю, що має бути кращий шлях.
додано Автор Roman Newaza, джерело

Найкращим способом є створення часткового для цього. Майте на увазі, що вам потрібно unset вибрати поле для елемента в класі форми або ви втратите свою асоціацію. Я можу роз'яснити це, якщо вам потрібна додаткова допомога.

0
додано
якщо дія відправки не отримує жодної інформації в цьому полі (віджет не відображається), це як надіслання порожнього поля. Це очищає цінність. Але найкращим варіантом буде перетворення поля у поле sfWidgetFormInputHidden - що зберігає зв'язок та запобігає втраті значення.
додано Автор samura, джерело
Чому асоціація буде втрачена, якщо я не відмовився? Виберіть пункт?
додано Автор Roman Newaza, джерело
Я оновив запитання
додано Автор Roman Newaza, джерело