Concrete5 如何以编程方式断开块与其主页默认值上的主块的连接



我正在构建一个新的单页编辑器,它有自己的控制器来编辑一些特定用户的专业页面。这些页面已经通过页面类型defaults设置了一些默认块。

所有我想要的是编辑内容块的内容通过我的新单页编辑表单。该内容块已经在页面类型默认值中预定义。它被放置在Main Area的第一个block上。

为此,我在控制器上创建了这样一个函数

/* $p = the page object that I want to edit */
private function saveData($p){
        // get all blocks fromt the Main area
    $blocks = $p->getBlocks('Main');
        // setup $data with a POST variable 'contentBody'
    $data = array('content' => $this->post('contentBody'));
        // instantiate block with Content Block type
    $bt = BlockType::getByHandle('content');
        // try to iterate all the blocks obtained and update only the first block  
        foreach( $blocks as $b){
        $b->update($data);
                break;
    }
}

我认为这个简单的函数应该足以使它像我想要的那样工作。但显然不是。$b->update($data)函数似乎在其页面类型默认值上更新主块,而不仅仅是我正在编辑的这个特定页面上的这个特定块。所以它会更新所有包含默认内容块的页面。

我怎样才能把block和它的主默认断开呢。这样我就可以专门为这一页编辑了。内置的concrete5块编辑功能能够断开块。但我找不到任何关于如何断开那个块的线索或文档。我也不知道要挖掘什么具体的核心文件来找出如何断开它

你说得对。在编辑块之前(使用c5编辑接口——而不是api),块实际上是对页面类型的默认块的引用。下面的代码应该可以为您工作:

$blocks = $page->getBlocks('Main');
foreach ($blocks as $block) {
    if ($block->getBlockTypeHandle() == 'content') {
        $newblock = $block->duplicate($page);
        $block->delete();
        $newblock->update($data);
        break;
    }
}

最新更新