Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony1 撇号CMS:引擎创建_Symfony1_Apostrophe - Fatal编程技术网

Symfony1 撇号CMS:引擎创建

Symfony1 撇号CMS:引擎创建,symfony1,apostrophe,Symfony1,Apostrophe,我正在尝试为撇号创建一个产品引擎。我在扩展页面设置表单时遇到了问题,目前我想添加一个简单的文本区域来为页面添加一个概要-最终我想添加产品设置,但我需要先让基础工作正常 我已经创建了一个表单和一个设置部分,它显示良好并保存了数据(借助一点小技巧-可能不正确)。我遇到的问题是,当你编辑一个页面时,数据没有被拉回到表单中。老实说,我可能做了一些根本错误的事情,但我缺乏Symfony方面的经验 我的表模式 ccProduct: tableName: cc_product actAs: T

我正在尝试为撇号创建一个产品引擎。我在扩展页面设置表单时遇到了问题,目前我想添加一个简单的文本区域来为页面添加一个概要-最终我想添加产品设置,但我需要先让基础工作正常

我已经创建了一个表单和一个设置部分,它显示良好并保存了数据(借助一点小技巧-可能不正确)。我遇到的问题是,当你编辑一个页面时,数据没有被拉回到表单中。老实说,我可能做了一些根本错误的事情,但我缺乏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);
  }

}
提前谢谢你的帮助

编辑:

谢谢你的回答,汤姆,我会尽量补充一点细节

我知道一个页面对象被传递到引擎中,但我不确定该如何处理它-请参阅我混乱的代码行:

//$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。第二个选项看起来更合适,因为我不希望每个页面都有使用产品引擎的摘要页面。我会尝试一下,然后再报告:)