Symfony1 撇号CMS:引擎创建
我正在尝试为撇号创建一个产品引擎。我在扩展页面设置表单时遇到了问题,目前我想添加一个简单的文本区域来为页面添加一个概要-最终我想添加产品设置,但我需要先让基础工作正常 我已经创建了一个表单和一个设置部分,它显示良好并保存了数据(借助一点小技巧-可能不正确)。我遇到的问题是,当你编辑一个页面时,数据没有被拉回到表单中。老实说,我可能做了一些根本错误的事情,但我缺乏Symfony方面的经验 我的表模式Symfony1 撇号CMS:引擎创建,symfony1,apostrophe,Symfony1,Apostrophe,我正在尝试为撇号创建一个产品引擎。我在扩展页面设置表单时遇到了问题,目前我想添加一个简单的文本区域来为页面添加一个概要-最终我想添加产品设置,但我需要先让基础工作正常 我已经创建了一个表单和一个设置部分,它显示良好并保存了数据(借助一点小技巧-可能不正确)。我遇到的问题是,当你编辑一个页面时,数据没有被拉回到表单中。老实说,我可能做了一些根本错误的事情,但我缺乏Symfony方面的经验 我的表模式 ccProduct: tableName: cc_product actAs: T
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);
}
}
提前谢谢你的帮助
编辑:
谢谢你的回答,汤姆,我会尽量补充一点细节
我知道一个页面对象被传递到引擎中,但我不确定该如何处理它-请参阅我混乱的代码行:
//$this->mergeForm(new aPageForm($object, $options, $CSRFSecret)); // merge the aPageForm - Nope, ignore it!?
澄清我的“产品”是一个使用ccProduct引擎的页面。现在,我想向该页面添加额外信息。这有意义吗?用你的话来说
您是否正在尝试创建一个在产品引擎页面上有唯一“主页”的独特产品?这就是子类化ccProductForm的作用
是:)
编辑2:
根据Tom的第一个建议(),我能够用额外的字段扩展aPage表,引擎现在正在保存这些字段
但是,标准的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);
}
我希望这对某人有所帮助:)要记住的主要一点是,引擎设置窗体接收一个页面对象作为构造函数的第一个参数,并且您需要将任何数据与该页面对象相关联。通常,引擎设置表单是aPageForm的一个子类,但不一定是。所需的只是以某种方式将产品对象与页面对象关联起来。根据您的目标,您可能需要一个在产品引擎页面和产品之间创建一对多关系的refClass,以及一个用于处理这些关系的表单 从你的代码中,我很难猜出你真正想做什么。您是否正在尝试创建一个在产品引擎页面上有唯一“主页”的独特产品?这就是子类化ccProductForm的作用。还是只想从product表中选择一个现有产品并将其与每个引擎页面关联?还是要选择一个或多个产品并将其与引擎页面关联 将内容填充到请求对象中肯定不是一种方法(: 请澄清,我可以进一步帮助你
- Tom Boutell,撇号高级开发人员
- 这里有两种方法可以遵循
一种是在项目级config/doctor/schema.yml文件中扩展aPage的模式:
aPage:
columns:
synopsis:
type: text
现在,每个aPage对象都有一个大纲列,默认情况下该列为空,您的引擎设置窗体只能操作该列。您的引擎窗体将aPageForm子类化。您根本不需要构造函数(默认的构造函数将适合您),您的configure()方法就是:
$this->useFields(数组(‘大纲’)
Boom,当页面类型设置为此引擎时,会出现一个用于大纲的文本区域。您根本不需要ccProduct表
另一种方法(如果出于任何原因,您不希望aPage中有额外的列)是保留您的ccProduct表并获取相关的列。然后,您的引擎表单类不会对aPageForm进行子类化,并且您的构造函数必须使用传递给它的页面来获取相关的ccProduct对象(使用条令关系)如果还没有,也可以创建一个新的。这并不困难,但到目前为止,您只需在页面中添加一列,就可以让它变得更简单。谢谢您的回答,Tom。第二个选项看起来更合适,因为我不希望每个页面都有使用产品引擎的摘要页面。我会尝试一下,然后再报告:)