2011-03-07 66 views
2

我正在尝试为撇号创建产品引擎。我在扩展页面设置表单时遇到了问题,此刻我想添加一个简单的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); 
    }

我希望这有助于

回答

2

有两种方法可以在这里遵循:

一个是扩展您的项目级别中的页面架构图/教义/的schema.yml文件:

aPage: 
    columns: 
    synopsis: 
     type: text 

现在每个APAGE对象都有一个故事大纲列,这将是默认为空,而你的引擎设置形式,可以只操作一个列。您的引擎表单子类aPageForm。你根本不需要构造函数(默认的会适合你),你的configure()方法只是:

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

繁荣,你有一个textarea的概要,当页面类型设置为此引擎时出现。您根本不需要ccProduct表。

另一种方法(如果出于某种原因,您不希望在页面中出现额外的列)是保留您的ccProduct表并获取相关的表。然后,您的引擎表单类不会继承一个PageForm,并且您的构造函数必须使用传递给它的页面来获取相关的ccProduct对象(使用Doctrine关系),或者创建一个新的对象(如果没有)。这并不困难,但到目前为止,只需向列表中添加一列,就可以保持更简单。

+0

谢谢你的回答汤姆。第二个选项看起来更合适,因为我不希望每个页面都只有使用产品引擎的摘要页面。我会放弃并回报:) – 2011-03-08 13:02:30

4

主要的是要记住的人:)是你的演义ne设置表单接收页面对象作为构造函数的第一个参数,并且您需要将您的数据与该页面对象相关联。通常引擎设置窗体是一个PageForm的子类,但它不一定是。所需要的只是以某种方式将产品对象与页面对象相关联。根据您的目标,您可能需要一个refClass,它可以在产品引擎页面和产品之间创建一对多关系,以及一个用于处理这些关系的表单。

从你的代码中我很难猜出你真正想做什么。您是否试图创建一个在产品引擎页面上拥有唯一“主页”的独特产品?这就是ccProductForm的子类。或者您是否想从产品表中选择现有产品并将其与每个引擎页面关联?或者您是否想要选择一个或更多产品并将它们与引擎页面关联?

馅东西放到请求对象绝对不是要走的路(:

请澄清,我可以帮助您进一步

  • 汤姆Boutell,撇号高级开发人员