特定ページで使用しているブロックのID取得

2015年10月23日 at 15:45

使用バージョン
concrete 5.6.3.3

特定ページ(例えばhome)
で使用しているブロックタイプの【bID】を取得する方法はありませんでしょうか?

もしくはどこのデータベーステーブルに保存されているかわかりませんでしょうか?

タグ:

Re: 特定ページで使用しているブロックのID取得

2015年10月23日 at 16:03
そのブロックのview.phpの中で
<?php echo $bID?>

と書けばいいです。

もしエラーか何かでエリアの中のブロックを取り出せないのであれば、
Where is my blockというアドオンを使うといいかもしれません。

http://www.concrete5.org/marketplace/addons/where-is-my-block/
 

Re: Re: 特定ページで使用しているブロックのID取得

2015年10月23日 at 16:12
返信ありがとうございます

説明不足でした、申し訳ございません。

表示しているページで使用されているブロックタイプのbIDを一覧として取得することはできないでしょうか?

テーブルblocksにはページ情報と紐づけされていないように見えるので・・・
ページ情報cIDとブロック情報bIDの紐づけはどこでされているのでしょうか?
 

Re: 特定ページで使用しているブロックのID取得

2015年10月23日 at 16:16
どういう目的で一覧を取得されたいのですか?
単なるデバッグか何かでしょうか?

ブロックタイプとおっしゃってますが、ブロックタイプのIDは、btIDです。
特定のcIDに存在するbtIDごとのbIDを確認したい、そういうことですか?
 

Re: 特定ページで使用しているブロックのID取得

2015年10月23日 at 16:30
たまたまconcrete5のDB見ていたので調べました。
見ていたのがc5.7.5.2になるので、5.6系では事情が違うかもしれませんが。

CollectionVersionBlocksテーブル内に、cIDとcvID(ページバージョン)を絞り込めば、どのbIDがどのエリアに配置されているかが確認できました。

あとは、BlocksテーブルでbIDとbtIDを対比すれば、どのエリアにどのブロックタイプのブロックが置かれているかわかりますね。
 

Re: Re: Re: 特定ページで使用しているブロックのID取得

2015年10月26日 at 8:34
ありがとうございます。
CollectionVersionBlocksテーブルを確認したところ、出来そうでした。

>ブロックタイプとおっしゃってますが、ブロックタイプのIDは、btIDです。
>特定のcIDに存在するbtIDごとのbIDを確認したい、そういうことですか?

おっしゃる通りです。
自身で使うブロックタイプを開発中でして、デバッグするのに必要でした。
 

Re: 特定ページで使用しているブロックのID取得

2015年10月26日 at 12:59
連投失礼します。

上記の流れで、bIDからブロックをインスタンス化するにはどうすればいいでしょうか?
インスタンス化し、そのブロックの中のcontroller.phpの中にあるメソッドをコールしたいのです。
 

Re: Re: 特定ページで使用しているブロックのID取得

2015年10月27日 at 8:06
私自身はそういう使い方をしたことがないので
的確な答えになってるかどうかわかりませんが、
下記URLをご参考になさってはいかがでしょうか
http://www.concrete5.org/community/forums/customizing_c5/get-first-block-in-area-then-get-that-blocks-data/
$blocksInArea = Page::getCurrentPage()->getBlocks('Main');
$block = Block::getByID($blocksInArea[0]->bID);
var_dump($block->getInstance()->title);

上記コードでは特定のエリアから最初ブロックを抽出していますが、Block::getByID()で、bIDを決め打ちにすれば、そのブロックのオブジェクトが取れると思います。
 

Re: Re: 特定ページで使用しているブロックのID取得

2015年10月30日 at 16:35
ありがとうございます!

思い通りの操作ができました!
 

Re: 特定ページで使用しているブロックのID取得

2015年10月28日 at 20:51
こんな感じでどうでしょう。
シンプルな仕組みですが・・・。

$page = Page::getByID(1); // cID で指定したページのオブジェクトを指定
$blocks = $page->getBlocks("Main"); // 指定した「Main」エリアのブロックの情報を取得
if ($blocks) {
foreach($blocks as $block) {
echo h($block->bID) . ", ";
}
}


http://gist.github.com/katzueno/24ba6a251a5e5ac4782b
 

Re: Re: 特定ページで使用しているブロックのID取得

2015年10月30日 at 17:01
返信ありがとうございます!

結局このような形で対応いたしました。

$c = Page::getCurrentPage(); // ページオブジェクトのインスタンス取得
$db = Loader::db(); // データベースのインスタンス取得
$q = 'SELECT DISTINCT bID FROM collectionversionblocks WHERE (cvID = ' . (int)$c->vObj->cvID . ' AND cID = ' . (int)$c->cID . ')' . " OR (arHandle = 'Main' );";
$r = $db->Execute($q, array());

while ($row = $r->FetchRow()) {
$block = Block::getByID($row["bID"]); //ブロックをインスタンス化
if($block instanceof Block){
if(method_exists($block->instance,"func")){
$block->instance->func(); //ブロックのメンバーメソッドをコール
}
}
}


ありがとうございました!