1

特定のユーザー向けに特化したページの一部を編集するための独自のコントローラーを備えた新しい単一ページのコンポーザーを構築しています。これらのページには、ページ タイプのデフォルトを介して、いくつかのデフォルト ブロックがすでに設定されています。

私が望むのは、新しい単一ページ編集フォームを介してコンテンツ ブロックのコンテンツを編集することだけです。そのコンテンツ ブロックは、ページ タイプのデフォルトですでに事前定義されています。メインエリアの最初のブロックとして配置されます。

そのために、このようにコントローラーに関数を作成しました

/* $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)私が編集しているこの特定のページのこの特定のブロックだけでなく、ページタイプのデフォルトでマスターブロックを更新しているようです。そのため、デフォルトのコンテンツ ブロックを含むすべてのページが更新されます。

では、そのブロックをマスターデフォルトから実際に切断するにはどうすればよいでしょうか。この特定のページだけを編集できるように。組み込みのconcrete5ブロック編集機能により、ブロックを切断できます。しかし、そのブロックを切断する方法についての手がかりやドキュメントはどこにも見つかりません。また、concrete5 コア ファイルをどのように切断して切断するかを調べる手がかりもありません。

4

1 に答える 1

2

あなたが正しい。ブロックが編集される前 (API ではなく c5 編集インターフェースを使用)、ブロックは実際にはページ タイプのデフォルト ブロックへの参照です。このコードはあなたのために働くはずです:

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

        $newblock->update($data);
        break;
    }
}
于 2012-12-24T07:16:00.890 に答える