Я пытаюсь создать механизм продукта для 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);
}
Надеюсьэто кому-то помогает :)