サイト内検索機能について

解決済

#1

過日は丁寧なご回答ありがとうございました。
またしてもお伺いしたいことが出てきました。

サイト内検索で、ブログ記事を検索した際に、アイキャッチ、又は本文中の画像を表示させたいのですが、そのような方法はありますでしょうか?

何卒ご教示いただけますようお願いいたします。

  • baserCMSバージョン: 4.0.8
  • CakePHPバージョン: 2.8.5

#2

こんにちは
検索結果画面で取得できるデータを見てみたのですが、残念ながらアイキャッチと本文のデータは含まれていないようでした。

検索結果を表示するビューをカスタマイズして、検索データを元にブログデータをDBより取得した後、表示したいデータを表示するのが一番簡単だと思います。

# SearchIndices/search.php

# 30行目付近
<?php $BlogModel = ClassRegistry::init('Blog.BlogPost'); ?>

<?php foreach ($datas as $data): ?>
	<?php
	if ($data['SearchIndex']['model'] === 'BlogPost') {
		$post = $BlogModel->find('first', [
			'conditions' => [
				'id' => $data['SearchIndex']['model_id'],
			],
			'recursive' => -1,
		]);
		p($post);
	}
	?>
	# 略
<?php endforeach ?>
?>

#3

早速のご回答ありがとうございます。
ご教示いただいたコードはそのまま貼り付けしても大丈夫でしょうか?

試しに貼り付けてみたところ、

ib/Baser/View/SearchIndices/search.php (line 40)
array(
‘BlogPost’ => array(
‘id’ => ‘15’,
‘blog_content_id’ => ‘2’,
‘no’ => ‘1’,
‘name’ => ‘テスト登録テスト登録テスト登録テスト登録テスト登録テスト登録’,
‘content’ => 'テストテストテストテストテストテストテストテスト
',
‘detail’ => '

サンプルテキストサンプルテキストサンプルテキストサンプルテキストサンプルテキスト

のような表示なったのですが、記述する箇所が間違っていたりするのでしょうか?
あるいは、他に何か処理的な物を記述する必要がある感じでしょうか?

記述したファイルは
インストールフォルダ/lib/Baser/View/SearchIndicesの中のsearch.phpです。

何度もお手数おかけいたしますが、何卒ご教示いただけますと幸甚にございます。


#4

前回書いたコードは、ブログの記事データを取得するところまでですね。
アイキャッチを表示するには、あらかじめ <?php $this->loadHelper('Blog.Blog'); ?> でBlogHelperを読み込んだあと
echo $this->Blog->eyeCatch($post); でアイキャッチが表示できます。

本文中の画像はもう少し難しいです。
正規表現かなにかで本文中に含まれる画像を抜き出す処理が必要になります。

また、lib配下のファイルを編集してしまうと、バージョンアップの時に上書きされる場合があります。
そのため、 /theme/【テーマ名】/SearchIndices/search.php にlibからファイルをコピーして、そちらを編集することをおすすめします。


#5

ご回答ありがとうございます!
お返事遅くなってすみません。家のネットが断線しており1日中ネットに繋げない状態でした。。。

ご教示いただきました通りにやってみたところ、アイキャッチが表示されました!
もともとアイキャッチを表示させたかったので、バッチリでした!

ただ、
array(
‘BlogPost’ => array(
‘id’ => ‘15’,
‘blog_content_id’ => ‘2’,
‘no’ => ‘1’,
‘name’ => ‘テスト登録テスト登録テスト登録テスト登録テスト登録テスト登録’,
‘content’ => 'テストテストテストテストテストテストテストテスト
',
‘detail’ => ’
のような表示も、されてしまうのですが、これに関してはどのように対応するべきでしょうか?
記述するファイルが間違っていたりするのでしょうか?
なお、記述したファイルは、ご指摘いただきました通り、
/theme/【テーマ名】/SearchIndices/search.phpにコピーしております。

何度も本当に申し訳ございません
何卒ご教示いただけますようお願いいたします


#6

p($post); を消すとどうでしょうか。


#7

ご返信ありがとうございます!
p($post);を外すと消えました!
ありがとうございます!

ちなみに、アイキャッチ画像なんですが、検索結果で表示させた場合、全部同じアイキャッチが出てきてしまうのは仕方のないことなのでしょうか?
可能であれば記事ごとに異なるアイキャッチを設定しているので、それらを出してあげたいのですが、そう言ったことは可能なのでしょうか?


#8

追加したコードは、既存のforeachの中に記載されましたか?
全体像は以下になります。
私が試したところ、アイキャッチもそれぞれの記事のものが表示されました。

<?php if ($datas): ?>
	<?php $BlogModel = ClassRegistry::init('Blog.BlogPost'); ?>
	<?php $this->loadHelper('Blog.Blog'); ?>
	<?php foreach ($datas as $data): ?>
		<div class="section" style="overflow: hidden">
			<?php
			if ($data['SearchIndex']['model'] === 'BlogPost') {
				$post = $BlogModel->find('first', [
					'conditions' => [
						'id' => $data['SearchIndex']['model_id'],
					],
					'recursive' => -1,
				]);
				echo $this->Blog->eyeCatch($post);
			}
			?>
			<h3 class="result-head"><?php $this->BcBaser->link($this->BcBaser->mark($query, $data['SearchIndex']['title']), $data['SearchIndex']['url']) ?></h3>
			<p class="result-body"><?php echo $this->BcBaser->mark($query, $this->Text->truncate($data['SearchIndex']['detail'], 100)) ?></p>
			<p class="result-link"><small><?php $this->BcBaser->link(fullUrl(urldecode($data['SearchIndex']['url'])), $data['SearchIndex']['url']) ?></small></p>
		</div>
	<?php endforeach ?>
<?php else: ?>
	<div class="section">
		<p class="no-data"><?php echo __d('baser', '該当する結果が存在しませんでした。')?></p>
	</div>
<?php endif ?>

#9

ありがとうございます!
記述箇所が間違っておりました!

全くもってお恥ずかしい限りです…
無事表示することができました!

何度もお手数おかけして申し訳ございません
丁寧にご教示いただきましたこと、大変嬉しく思います。

この度は本当にありがとうございました!