具体如何以编程方式从页面默认设置中断块与其主块

时间:2012-12-23 11:07:03

标签: php block concrete5

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

我想要的只是通过我的新单页编辑表单编辑内容块的内容。内容块已在页面类型默认值上预定义。它被放置为主区的第一个区块。

为此,我在我的控制器上创建了一个这样的功能

/* $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)函数似乎是在其页面类型默认值上更新主块,而不仅是我正在编辑的这个特定页面上的这个特定块。因此,它会更新包含默认内容块的所有页面。

那么我怎么能真正断开该块与它的主默认值。这样我就可以为这个特定页面编辑它。内置的具体5块编辑功能可以断开块。但是我无法找到关于如何断开该块的任何线索或文档。我也不知道要挖掘哪些具体的5个核心文件以找出如何断开它。

1 个答案:

答案 0 :(得分:2)

你是对的。在编辑块之前(使用c5编辑界面 - 而不是API),块实际上是对页面类型的默认块的引用。此代码应该适合您:

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

        $newblock->update($data);
        break;
    }
}