我正在尝试为撇号创建产品引擎。我在扩展页面设置表单时遇到了问题,此刻我想添加一个简单的textarea来为页面添加摘要 - 最终我想添加产品设置,但我需要首先使用基本操作。撇号CMS:引擎创建
我创建了一个表单和一个设置partial,它显示正常并保存数据(在一些小技巧的帮助下 - 可能不正确)。我遇到的麻烦是编辑页面时数据没有被拉回到表单中。说实话,我可能做了一些根本性的错误,但我缺乏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);
}
}
预先感谢任何帮助
编辑:
谢谢您的回答汤姆,我会尝试添加al更详细的信息。
我意识到一个页面对象被传递到发动机,但我不完全知道什么做与它 - 看到我的代码混淆行:
//$this->mergeForm(new aPageForm($object, $options, $CSRFSecret)); // merge the aPageForm - Nope, ignore it!?
为了澄清我的“产品” 是使用ccProduct引擎的页面。我现在想添加额外的信息到该页面。那有意义吗?用你的话说..
你是否试图创造一个独特的产品,在产品引擎页上有其唯一的“家”?这就是子类ccProductForm会做
是:)
编辑2:
继汤姆的第一个建议(Apostrophe CMS: Engine Creation)我可以用我的额外的字段和发动机延长APAGE表现在正在保存这些。
但是,标准的aPageTable :: getPagesInfo函数没有返回我保存的字段。我想我必须分别选择这些。
编辑3:
aPageTable :: retrieveBySlug()将做的工作:)
REVISITED
我决定重新审视这一尝试和汤姆的第二个方法..
另一种方法(如果出于某种原因你不想在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);
}
我希望这有助于
谢谢你的回答汤姆。第二个选项看起来更合适,因为我不希望每个页面都只有使用产品引擎的摘要页面。我会放弃并回报:) – 2011-03-08 13:02:30