我正在尝试为撇号创建一个产品引擎。我在扩展页面设置表单时遇到了麻烦,目前我想添加一个简单的textarea来向页面添加一个概要 - 最后我想添加产品设置,但我需要先了解基础知识。
我已经创建了一个表单和一个设置部分,它显示正常并保存数据(借助一点点黑客 - 可能不正确)。我遇到的麻烦是当您编辑页面时数据没有被拉回到表单中。说实话,我可能做了一些根本错误的事情,但我缺乏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);
}
}
提前感谢您提供任何帮助
修改
感谢您的回答Tom,我会尝试添加更多细节。
我知道页面对象被传递到引擎中,但我不确定如何处理它 - 请看我困惑的代码行:
//$this->mergeForm(new aPageForm($object, $options, $CSRFSecret)); // merge the aPageForm - Nope, ignore it!?
澄清我的'产品'是使用ccProduct引擎的页面。我现在想要向该页面添加额外信息。那有意义吗?用你的话说..
您是否正在尝试创建一个在产品引擎页面上拥有唯一“主页”的独特产品?这就是ccProductForm的子类化
是的:)
编辑2:
根据Tom的第一个建议(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);
}
我希望这有助于某人:)
答案 0 :(得分:4)
要记住的主要事情是你的引擎设置表单接收一个页面对象作为构造函数的第一个参数,你需要将你的数据与该页面对象相关联。通常,引擎设置表单是aPageForm的子类,但它不一定是。所需要的只是以某种方式将产品对象与页面对象相关联。根据您的目标,您可能需要一个refClass,它在产品引擎页面和产品之间创建一对多关系,以及一个用于操纵这些关系的表单。
从你的代码中我很难猜出你真正想做什么。您是否正在尝试创建一个在产品引擎页面上拥有唯一“主页”的独特产品?这就是ccProductForm的子类化。或者您只是想从产品表中选择现有产品并将其与每个引擎页面相关联?或者您想选择一个或更多产品并将它们与引擎页面关联起来?
将东西填入请求对象绝对不是可行的方法(:
请澄清,我可以进一步帮助你。
答案 1 :(得分:2)
您可以在此处遵循两种方法。
一种是在项目级别config / doctrine / schema.yml文件中扩展aPage的架构:
aPage:
columns:
synopsis:
type: text
现在每个aPage对象都有一个概要列,默认情况下为null,您的引擎设置表单只能操作那一列。您的引擎表单是aPageForm的子类。您根本不需要构造函数(默认适合您),而您的configure()方法只是:
$这 - > useFields(阵列( '概要'));
Boom,当页面类型设置为此引擎时,您有一个文本区域用于概要。您根本不需要ccProduct表。
另一种方法(如果出于任何原因,您不希望在aPage中添加额外的列)是保留ccProduct表并获取相关的列。您的引擎表单类不会子类化aPageForm,并且您的构造函数必须使用传递给它的页面来获取相关的ccProduct对象(使用Doctrine关系)或者如果还没有,则创建一个新的。这并不困难,但到目前为止看起来只需在aPage中添加一列即可让它更简单。