Апостроф CMS: создание движка - PullRequest
2 голосов
/ 07 марта 2011

Я пытаюсь создать механизм продукта для Apostrophe.У меня проблемы с расширением формы «Параметры страницы», в данный момент я хочу добавить простую текстовую область, чтобы добавить краткий обзор на страницу - в конце концов, я хочу добавить параметры продукта, но сначала мне нужно, чтобы основы работали.

Я создал форму и частичную настройку, она отображает нормально и сохраняет данные (с помощью небольшого взлома - может быть не правильно).Проблема у меня заключается в том, что когда вы редактируете страницу, данные не возвращаются обратно в форму.Честно говоря, я, вероятно, делаю что-то в корне неправильно, но мне не хватает опыта в Symfony.

Моя схема таблицы

ccProduct:
  tableName: cc_product
  actAs:
    Timestampable: ~
  columns:
    page_id:
      type: integer
      notnull: true
    synopsis:
      type: text
  relations:
    Page:
      class: aPage
      local: page_id
      foreign: id
      type: one
      onDelete: CASCADE

Моя форма ccProductEngineForm.class.php

class ccProductEngineForm extends ccProductForm
{
  public function __construct($object = null, $options = array(), $CSRFSecret = null)
  {
    // when editing the page the values are not show, this is an attempt to get it to work - it still doesn't :(
    $page_id = sfContext::getInstance()->getRequest()->getParameter('id');
    sfContext::getInstance()->getRequest()->setParameter('page_id', $page_id);

    $ccProduct = Doctrine::getTable('ccProduct')->findOneByPageId($page_id);
    if ($ccProduct) {
      sfContext::getInstance()->getRequest()->setParameter('id', $ccProduct->getId());
    }


    // aPageForm object is passed in
    parent::__construct(null, $options, $CSRFSecret); // construct normally
    //$this->mergeForm(new aPageForm($object, $options, $CSRFSecret)); // merge the aPageForm - Nope, ignore it!?

  }

  public function setup() {
    parent::setup();

    $this->useFields(array('synopsis'));

    $this->widgetSchema->setNameFormat('enginesettings[%s]');
    $this->widgetSchema->setFormFormatterName('aPageSettings');
  }

  protected function doSave($con = null)
  {
    // page_id is missing! possible bug? BaseaActions.class.php ~ 520
    $this->values['page_id'] = sfContext::getInstance()->getRequest()->getParameter('enginesettings[pageid]');

    parent::doSave($con);
  }

}

Заранее спасибо за любую помощь

РЕДАКТИРОВАТЬ:

Спасибо за ваш ответ Том, я постараюсь добавить немного больше деталей.

Iзнал, что объект страницы передается в Engine, но я точно не знал, что с ним делать - посмотрите мою запутанную строку кода:

//$this->mergeForm(new aPageForm($object, $options, $CSRFSecret)); // merge the aPageForm - Nope, ignore it!?

Чтобы уточнить мой «продукт» страница, которая использует движок ccProduct.Теперь я хочу добавить дополнительную информацию на эту страницу.Имеет ли это смысл?В ваших словах ..

Вы действительно пытаетесь создать уникальный продукт, у которого есть единственная "домашняя страница" на странице механизма продукта?Вот что делает подкласс ccProductForm

Да:)

РЕДАКТИРОВАТЬ 2:

Следуя первому предложению Тома ( Apostrophe CMS:Создание движка ) Мне удалось расширить таблицу aPage моими дополнительными полями, и теперь Engine сохраняет их.

Однако стандартная функция aPageTable :: getPagesInfo не возвращает сохраненные поля.Я предполагаю, что мне придется выбрать их отдельно?

РЕДАКТИРОВАТЬ 3:

aPageTable :: retrieveBySlug () выполнит работу:)

ПЕРЕСМОТРЕНО

Я решил вернуться к этому и попробовать второй подход Тома.

Другой подход (если по какой-либо причине вам не нужны дополнительные столбцы вaPage) должен сохранить вашу таблицу ccProduct и получить соответствующую

Мне удалось заставить это работать, мой конструктор формы ccProductEngine теперь выглядит следующим образом ..

class ccProductEngineForm extends ccProductForm
{
  public function __construct($aPage = null, $options = array(), $CSRFSecret = null)
  {
    $page_id = $aPage->getId();

    if ($page_id) {
      $product = Doctrine_Core::getTable('ccProduct')->findOneByPage_id($page_id);
      if ($product) {
        $ccProduct = $product;
      } else {
        $ccProduct = new ccProduct();
      }
    }

    parent::__construct($ccProduct, $options, $CSRFSecret);
  }

Надеюсьэто кому-то помогает :)

Ответы [ 2 ]

4 голосов
/ 07 марта 2011

Главное, что нужно помнить, это то, что ваша форма настроек движка получает объект страницы в качестве первого параметра для конструктора, и вам нужно связать все ваши данные с этим объектом страницы.Обычно форма настроек движка является подклассом aPageForm, но это не обязательно.Все, что требуется, - это связать объект (ы) продукта с объектом страницы каким-либо образом.В зависимости от ваших целей вам, вероятно, понадобится refClass, который создает отношения «один ко многим» между страницами механизма продуктов и продуктами, и форму для управления этими отношениями.

Из вашего кода мне трудно догадаться,Вы действительно хотите сделать.Вы действительно пытаетесь создать уникальный продукт, у которого есть единственная «домашняя страница» на странице движка продукта?Это то, что делает подкласс ccProductForm.Или вы просто хотите выбрать существующий продукт из таблицы продуктов и связать его с каждой страницей механизма?Или вы хотите выбрать один или несколько продуктов и связать их со страницей движка?

Заполнение объектов в объекте запроса определенно не подходит (:

Пожалуйста, уточните, и я могу помочь вам в дальнейшем.

  • Том Бутелл, старший разработчик Apostrophe
2 голосов
/ 08 марта 2011

Здесь вы можете следовать двум подходам.

Один из них - просто расширить схему aPage в файле config / doctrine / schema.yml уровня вашего проекта:

aPage:
  columns:
    synopsis:
      type: text

Теперь у каждого объекта aPage есть столбец синопсиса, который по умолчанию будет нулевым, и ваша форма настроек движка может просто манипулировать этим одним столбцом. Ваш движок формирует подклассы aPageForm. Вам вообще не нужен конструктор (по умолчанию он вам подойдет), а ваш метод configure () просто:

$ this-> useFields (массив ( 'синопсис'));

Бум, у вас есть текстовая область для краткого обзора, которая появляется, когда для этого типа страницы задан тип движка. Вам не нужен стол ccProduct вообще.

Другой подход (если по какой-то причине вам не нужны дополнительные столбцы в aPage) - это сохранить вашу таблицу ccProduct и получить соответствующую. Ваш класс формы движка не подкласс aPageForm, и ваш конструктор должен использовать страницу, переданную ему, чтобы получить связанный объект ccProduct (используя отношение Doctrine) или создать новый, если его еще нет. Это не сложно, но, похоже, вы можете сделать это еще проще, просто добавив столбец в aPage.

...