テーマのカスタマイズのみでblog widgets blog_recent_entries でブログの投稿日時を表示させる。

kumatds > テーマのカスタマイズのみでblog widgets blog_recent_entries でブログの投稿日時を表示させる。 @ 2012/11/2 14:06
初めまして。kumatdsと申します。

最近PHPを触り始めたばかりで、PHP,CakePHP,BaserCMSの常識に疎いため
的外れな質問かもしれませんがよろしくお願いします。

blog_recent_entriesウィジェットにて最近のエントリーにブログの投稿日時を表示させるようにする
ためには、テーマのカスタマイズに限定するとどのような修正が必要なのかご相談させていただきました。

テーマディレクトリの外までカスタマイズを行うのであれば、
/app/plugins/blog/controllers/blog_controller.phpを
/baser/ディレクトリからコピーし、
function get_recent_entriesを

$data['recentEntries'] = $this->BlogPost->find('all', array(
	'fields'	=> array('no','name'),
	'conditions'=> $conditions,



$data['recentEntries'] = $this->BlogPost->find('all', array(
	'fields'	=> array('no','name', 'posts_date'),
	'conditions'=> $conditions,

とすることで、blog_recent_entries.php内でそれぞれのエントリーの投稿日時を取得することができ、
実装することはできました。

これをテーマ内のカスタマイズだけで、完結させるようにするためにはどのようなアプローチをすればいいのでしょうか?
# テーマ内でコントローラのオーバライドが出来ればいいのですが・・・

///
apache 2.2.14
PHP 5.2.16
BaserCMS 2.0.5
SQLite3
///
goichi > Re: テーマのカスタマイズのみでblog widgets blog_recent_entries でブログの投稿日時を表示させる。 @ 2012/11/2 22:25
こんにちは(^^
上手く動かなかったらすみません、参考までに書き込んでいます。
(他に良い方法があるような気もしますが、思いついたのは以下の様なものです。)

まず、テーマ内でブログのウィジェット部分の表示を変更できるよう、
以下のフォルダ構造を作ります。

/app/webroot/themed/テーマ名/blog/views/elements/widgets/

この「widgets」フォルダに
今回編集するファイル「blog_recent_entries.php」を作成します。
(/baser/plugins/blog/views/elements/widgets/からコピーします)

これで下準備が整ったとおもいますので、
ファイルを編集します。

まず、今回はviewファイルからDBを利用できるようにしなくてはなりません。。。

(MVCの概念からはちょっと外れますが、そこは目をつむって頂いて・・・。)
そこで、記事のリストを表示するループ処理の前段階で、
$blogModel = ClassRegistry::init('BlogPost');

と書いておきます。これでモデルが使えます。

次にDBを検索しますが、今回、ループ処理内の各記事のデータが「no」を持っていますので、
これを検索条件にしたら良いと思います。
$blogData = $blogModel->find('first',array(
	'conditions' => array(
		'no'=>$recentEntry['BlogPost']['no']
	),
	'feild' => array('posts_date')
	));



あとは取得した情報を出力します。
echo $blogData['BlogPost']['posts_date'];



参考までに上の追記をした「blog_recent_entries.php」全文を記載しておきます(^^
上手く動かなかった申し訳ないのですが、参考までにご覧いただければと思います。

<?php
/* SVN FILE: $Id$ */
/**
 * [PUBLISH] ブログ最近の投稿
 * 
 * PHP versions 5
 *
 * baserCMS :  Based Website Development Project <http://basercms.net>
 * Copyright 2008 - 2012, baserCMS Users Community <http://sites.google.com/site/baserusers/>
 *
 * @copyright		Copyright 2008 - 2012, baserCMS Users Community
 * @link			http://basercms.net baserCMS Project
 * @package			baser.plugins.blog.views
 * @since			baserCMS v 0.1.0
 * @version			$Revision$
 * @modifiedby		$LastChangedBy$
 * @lastmodified	$Date$
 * @license			http://basercms.net/license/index.html
 */
if(!isset($count)) {
	$count = 5;
}
if(isset($blogContent)){
	$id = $blogContent['BlogContent']['id'];
}else{
	$id = $blog_content_id;
}
$data = $this->requestAction('/blog/blog/get_recent_entries/'.$id.'/'.$count);
$recentEntries = $data['recentEntries'];
$blogContent = $data['blogContent'];
$baseCurrentUrl = $blogContent['BlogContent']['name'].'/archives/';

/* 追記 */
//ブログ記事のDBをViewから利用できるようにしておく。
$blogModel = ClassRegistry::init('BlogPost');

?>
<div class="widget widget-blog-recent-entries widget-blog-recent-entries-<?php echo $id ?> blog-widget">
<?php if($name && $use_title): ?>
<h2><?php echo $name ?></h2>
<?php endif ?>
	<?php if($recentEntries): ?>
	<ul>
		<?php foreach($recentEntries as $recentEntry): ?>
			<?php if($this->params['url']['url'] == $baseCurrentUrl.$recentEntry['BlogPost']['no']): ?>
				<?php $class = ' class="current"' ?>
			<?php else: ?>
				<?php $class = '' ?>
			<?php endif ?>
		<li<?php echo $class ?>>
        
        <?php 
		/* 追記 */
		//検索を行う
		$blogData = $blogModel->find('first',array(
				//記事の「no」が分かっているので、とりあえずそれを条件にする。
				'conditions' => array(
					'no'=>$recentEntry['BlogPost']['no']
				),
				//今回必要な投稿日時のみを取得する。
				'feild' => array('posts_date')
				));
		
		//とりあえず出力する。(適当に整形してみてください)
		echo $blogData['BlogPost']['posts_date'];

		?>
        
			<?php $bcBaser->link($recentEntry['BlogPost']['name'],array('admin'=>false,'plugin'=>'','controller'=>$blogContent['BlogContent']['name'],'action'=>'archives',$recentEntry['BlogPost']['no'])) ?>
		</li>
		<?php endforeach; ?>
	</ul>
	<?php endif; ?>
</div>
kumatds > Re: テーマのカスタマイズのみでblog widgets blog_recent_entries でブログの投稿日時を表示させる。 @ 2012/11/3 20:06
goichi様

ご回答ありがとうございます。

> まず、今回はviewファイルからDBを利用できるようにしなくてはなりません。。。
> (MVCの概念からはちょっと外れますが、そこは目をつむって頂いて・・・。)
直接DBを叩くことを完全に失念しておりました。
ずっと、既存のモデルやコントローラをテーマ内で継承する方法ばかり探しておりました。

具体的なコードまでありがとうございます。
私の方で動作確認までしましたら、ステータスを解決済みにいたします。
kumatds > Re: テーマのカスタマイズのみでblog widgets blog_recent_entries でブログの投稿日時を表示させる。 @ 2012/11/5 10:52
動作検証結果の自己レスです。

goichi様からご提示いただいたコードですと、Blogを複数作成した時に正しく検索できなかったため、
下記のように検索条件にBlogのIDを追加して動作することが確認できました。
'conditions' => array(
	'BlogPost.blog_content_id'=>$id,
	'no'=>$recentEntry['BlogPost']['no']
),


上記をもって本スレッドを解決済みにさせていただきます。
ありがとうございました。

以下、コードの全文となります。
<?php
/* SVN FILE: $Id$ */
/**
 * [PUBLISH] ブログ最近の投稿
 * 
 * PHP versions 5
 *
 * baserCMS :  Based Website Development Project <http://basercms.net>
 * Copyright 2008 - 2012, baserCMS Users Community <http://sites.google.com/site/baserusers/>
 *
 * @copyright		Copyright 2008 - 2012, baserCMS Users Community
 * @link			http://basercms.net baserCMS Project
 * @package			baser.plugins.blog.views
 * @since			baserCMS v 0.1.0
 * @version			$Revision$
 * @modifiedby		$LastChangedBy$
 * @lastmodified	$Date$
 * @license			http://basercms.net/license/index.html
 */
if(!isset($count)) {
	$count = 5;
}
if(isset($blogContent)){
	$id = $blogContent['BlogContent']['id'];
}else{
	$id = $blog_content_id;
}
$data = $this->requestAction('/blog/blog/get_recent_entries/'.$id.'/'.$count);
$recentEntries = $data['recentEntries'];
$blogContent = $data['blogContent'];
$baseCurrentUrl = $blogContent['BlogContent']['name'].'/archives/';

/* 追記 */
//ブログ記事のDBをViewから利用できるようにしておく。
$blogModel = ClassRegistry::init('BlogPost');

?>
<div class="widget widget-blog-recent-entries widget-blog-recent-entries-<?php echo $id ?> blog-widget">
<?php if($name && $use_title): ?>
<h2><?php echo $name ?></h2>
<?php endif ?>
	<?php if($recentEntries): ?>
	<ul>
		<?php foreach($recentEntries as $recentEntry): ?>
			<?php if($this->params['url']['url'] == $baseCurrentUrl.$recentEntry['BlogPost']['no']): ?>
				<?php $class = ' class="current"' ?>
			<?php else: ?>
				<?php $class = '' ?>
			<?php endif ?>
		<li<?php echo $class ?>>
        
        <?php 
		/* 追記 */
		//検索を行う
		$blogData = $blogModel->find('first',array(
				//BlogのIDと記事の「no」を検索条件とする。
				'conditions' => array(
					'BlogPost.blog_content_id'=>$id,
					'no'=>$recentEntry['BlogPost']['no']
				),
				//今回必要な投稿日時のみを取得する。
				'feild' => array('posts_date')
				));
		
		//とりあえず出力する。(適当に整形してみてください)
		echo $blogData['BlogPost']['posts_date'];

		?>
        
			<?php $bcBaser->link($recentEntry['BlogPost']['name'],array('admin'=>false,'plugin'=>'','controller'=>$blogContent['BlogContent']['name'],'action'=>'archives',$recentEntry['BlogPost']['no'])) ?>
		</li>
		<?php endforeach; ?>
	</ul>
	<?php endif; ?>
</div>
Nori > Re: テーマのカスタマイズのみでblog widgets blog_recent_entries でブログの投稿日時を表示させる。 @ 2016/5/11 1:37
nice-tempoにてこちらの機能を使用したく、
上記の通りに進めましたがうまくいきませんでした。
記事が2012年なのでバージョンによる違いが原因なのでしょうか?
であれば、現バージョンにも使える方法を教えていただければ幸いです。

あと、「最近の投稿」にアイキャッチ画像を表示したいです

でも質問していますので、
良ければ合わせてご指導いただければ幸いです。

なお、こちらの投稿を見ていてアイキャッチ画像の抽出も似たような方法で行けるのでは?
と素人ながらに期待している次第です…

■ BaserCMSのバージョン:3.0.9
■ レンタルサーバー名:ロリポップ
■ スマートURLの利用:OFF
■ 設置フォルダ:サブフォルダ
■ 利用しているデータベース:MySQL
■ PHPスキル:D

ログイン
ユーザー名:
パスワード:


  新規登録 / パスワード紛失

検索

facebook
フォーラムで悩みが解決した場合など、よかったら「いいね!」をポチっとクリックしてください!質問の回答者や開発者の励みになります

フォーラムガイド


関連リンク

オンライン状況
27 人のユーザが現在オンラインです。 (26 人のユーザが フォーラム を参照しています。)

登録ユーザ: 0
ゲスト: 27