ブログ・エス技研

当ブログは引越しをしました。10秒後に自動で転送しますが、転送されない場合は、http://blog.s-giken.net/ をご覧ください。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
[ --年--月--日 --:-- ] カテゴリ:スポンサー広告 | TB(-) | CM(-)

baserCMS ID以外のカラムでアソシエーション(連携)をさせる場合

baserCMSは、CakePHPの上で動いていますので、基本的に CakePHPの仕様に従ってプログラムを作っていけばいいのですが、ID以外のカラムでアソシエーション(テーブルの連携)をさせる処理で、CakePHPと違う処理がありましたので書いておきます。


CakePHPにおいて、テーブルの連携については(http://ssgiken.blog.fc2.com/blog-entry-63.html)に記事を書きましたので参考にしてください。


では、何が違うのか!
  baserCMSは $hasOne しか使えない
ということです。


プラグインでオリジナルのテーブルから情報を取得する処理を作成していたのですが、その際、テーブル連携に ID以外のカラム同士の連携をさせたい場面がありました。
ですが、CakePHPの仕様の通りに連携させようとしていましたが、なかなかうまくいかず、あれこれと試した結果、baserCMSは $hasOne しか使えないということにたどり着きました。

もしかすると、baserCMS全体ではなく、baserCMSのプラグインの仕様なのかもしれませんが、少なくともプラグインとして作った場合は、$hasOneでの連携しか動きませんでした。

具体的な記述の方法は、上記に書いた CakePHPのテーブル連携で書いた処理を参考にしてください。

また、プラグインを作るのに参考にしたサイトは、以下になります。
http://blog.komomo.biz/log/archives/1
http://blog.komomo.biz/log/archives/3

また、下記のページにも記事を書いています。
http://ssgiken.blog.fc2.com/blog-entry-62.html


プラグインからの設置になってしまいますが、上記のサイトを参考にしながら設置をしてみてください。
基本的には、「http://blog.komomo.biz/log/archives/1」のサイトを参考にしながら、CakePHPでテーブル連携した処理と同じ処理を書いたものになります。

CakePHPでも同じように作ってもらえると分かるのですが、CakePHPでは表示される「$belongsTo」で取得する「Detail2」が表示されないのです。
「Detail3」は、$hasOne で処理しますので取得できます。


もともとは、こちらの baserCMSの中でテーブルの連携の実験をやっていましたので、正解にたどり着くまでかなりの試行錯誤をする結果となってしまいましたが、それをそのまま baserCMSを挟まない CakePHPの環境に持って行ったところどちらでも動いたことで、baserCMS特有の問題なのだと判明しました。


※この方法で「$primaryKey = 'sec_code'」を指定すると、個別の詳細ページを表示させる際のキーになるカラムが「sec_code」になりますので注意が必要です。
 詳しくは http://ssgiken.blog.fc2.com/blog-entry-64.html を参照ください。

-----------------テーブル「bc_pg_bcforum_posts」
CREATE TABLE IF NOT EXISTS `bc_pg_bcforum_posts` (
  `id` int(8) NOT NULL AUTO_INCREMENT,
  `sec_code` char(4) DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL,
  `created` datetime NOT NULL,
  `modified` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
-----------------

-----------------テーブル「bc_pg_bcforum_details」
CREATE TABLE IF NOT EXISTS `bc_pg_bcforum_details` (
  `id` int(8) NOT NULL AUTO_INCREMENT,
  `post_id` int(8) NOT NULL,
  `sec_code` char(4) DEFAULT NULL,
  `list` varchar(255) DEFAULT NULL,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
-----------------

-----------------/app/plugins/bcforum/models/bcforum_post.php
<?php
class BcforumPost extends AppModel {
  var $name = 'BcforumPost';
  var $plugin = 'Bcforum';
  var $useDbConfig = 'plugin';

  var $primaryKey = 'sec_code';

  var $belongsTo = array(
    "Post2" => array(
      "className" => "PgBcforumDetail",
      "foreignKey" => "sec_code",
      "conditions" => "",
      "fields"     => "",
      "order"      => ""
    ),
  );

  var $hasOne = array(
    "Post3" => array(
      "className" => "PgBcforumDetail",
      "foreignKey" => "sec_code",
      "conditions" => "",
      "fields"     => "",
      "order"      => ""
    ),
  );
}
?>
-----------------

-----------------/app/plugins/bcforum/models/bcforum_detail.php
<?php
class BcforumDetail extends AppModel {
  var $name = 'BcforumDetail';
  var $plugin = 'Bcforum';
  var $useDbConfig = 'plugin';

  var $primaryKey = 'sec_code';

  var $belongsTo = array(
    "Detail2" => array(
      "className" => "PgBcforumPost",
      "foreignKey" => "sec_code",
      "conditions" => "",
      "fields"     => "",
      "order"      => ""
    ),
  );

  var $hasOne = array(
    "Detail3" => array(
      "className" => "PgBcforumPost",
      "foreignKey" => "sec_code",
      "conditions" => "",
      "fields"     => "",
      "order"      => ""
    ),
  );
}
?>
-----------------

-----------------/app/plugins/bcforum/controllers/bcforum_details_controller.php
<?php
// 継承するコントローラのpluginsをインポートする
app::import('Controller', 'Plugins');

// baserCMS にパッケージされている PluginsController を継承させます
class BcforumDetailsController extends PluginsController {
  var $name = "BcforumDetails";
  var $uses = array('Plugin', 'Bcforum.BcforumDetail');
  var $components = array('BcAuth','Cookie','BcAuthConfigure');

  function index() {
    $this->pageTitle = 'トピックス一覧・New';
    $datas = $this->BcforumDetail->find('all');
    $this->set('datas', $datas);
  }
}
?>
-----------------

-----------------/app/plugins/bcforum/views/bcforum_details/index.php
<?php
  echo "
\n";
  print_r($datas);
  echo "
\n"; ?>
-----------------


【Cakephp 2.3・baserCMS テーブルの連携(アソシエーション)関連記事】
baserCMSでオリジナルのデータベースから情報を取得する場合
CakePHP 2.3 ID以外のカラムでアソシエーション(連携)をさせる場合
CakePHP 2.3 ID以外のカラムでアソシエーション(連携)をさせる場合の詳細ページの注意点
CakePHP 2.3 連携先のテーブルの項目で条件抽出する場合
CakePHP 2.3 テーブルの項目を演算した結果を条件として抽出する方法
baserCMS ID以外のカラムでアソシエーション(連携)をさせる場合


スポンサーサイト
[ 2013年12月24日 00:21 ] カテゴリ:baserCMS | TB(0) | CM(0)

baserCMSでオリジナルのデータベースから情報を取得する場合

baserCMSでサイトを作ってみました。
そして、次はやっぱりオリジナルの機能を新規のデータベースの作成から行ってみたい!という気持ちが出てくるかと思います。
そんな場合にどうするか、のお話です。


具体的には、新たな機能を追加する場合は、プラグインという形で機能を追加していきます。

プラグインを作る場合下記のサイトが参考になります。
http://blog.komomo.biz/log/archives/1
http://blog.komomo.biz/log/archives/3


プラグイン名やテーブル名はオリジナルのものを付けるでしょうし、テーブルが一つではない場合も多々あるでしょう。
でも、まず何をとっかかりに作業を始めていいのかさっぱりだった私にとっては救世主的なページでしたね。
基本的な作り方さえわかれば、あとは、その中に組み込んでいく処理を一つずつ組み立てていけばいいわけですからね。CakePHPの処理に沿ってあちこちのサイトを参考にしながら。



ちなみに、このプラグインの作成方法を学びながら作ったのが下記のサイトです。
 株主優待情報.info

baserCMSでオリジナルのデータベースにアクセスしてデータを取得する場合はどうするのだろう?
というところから分からなかったのですが、上記のサイトを見つけて参考にしながら作ったサイトです。

参考サイトを見つけた時は、すでにプログラムの内容などは決まっていましたのであとは、サンプルを見ながら少しずつカスタマイズをしていきながら、具体的な形に仕上げていく感じで進めていきました。

しかし、次から次から分からないことや問題が発覚し、思うように動かないことが延々と続くわけです。
そのたびにサイトで調べ、ローカル環境で実験をし...そんな悪戦苦闘の末に出来上がったのが上記のサイトなわけですが、まだ開発中の機能もあります。ハイ。


そんな悪戦苦闘の中でもいろいろ理解した部分をまとめてみましたので、何かの参考になれば、と思います。



ちなみに、悪戦苦闘の一つの原因は、CakePHPと baserCMSにおいて、テーブルの連携(アソシエーション)の挙動が違うことが挙げられます。

今回の一連の記事は、その件に関しての内容になっています。

また、この挙動が違う件について baserCMSのフォーラムに投稿をしてみましたが、何が原因なのかは今のところ不明です...
http://forum.basercms.net/modules/newbb/viewtopic.php?topic_id=1214&forum=7&post_id=4755#forumpost4755
http://forum.basercms.net/modules/newbb/viewtopic.php?topic_id=1215&forum=7&post_id=4756#forumpost4756


【Cakephp 2.3・baserCMS テーブルの連携(アソシエーション)関連記事】
baserCMSでオリジナルのデータベースから情報を取得する場合
CakePHP 2.3 ID以外のカラムでアソシエーション(連携)をさせる場合
CakePHP 2.3 ID以外のカラムでアソシエーション(連携)をさせる場合の詳細ページの注意点
CakePHP 2.3 連携先のテーブルの項目で条件抽出する場合
CakePHP 2.3 テーブルの項目を演算した結果を条件として抽出する方法
baserCMS ID以外のカラムでアソシエーション(連携)をさせる場合


[ 2013年12月16日 23:50 ] カテゴリ:baserCMS | TB(0) | CM(0)

baserCMSは 3種類のデバッグモードが用意されています

baserCMSですが、デバッグモードが 3種類用意されています。

デバッグモードはその名の通り、デバッグ用のモードですが、このモードにするとキャッシュがされなくなりますので、プログラムの修正やデザインの修正を行っているときに変にキャッシュされなくて済むために非常に重宝します。

どうせアクセスが少ないサイトだから、このままデバッグモードで公開したい、と思うくらいです。
出来れば、通常公開設定でキャッシュしないモードを追加してほしいところですね。


ところで、デバッグモードは 3種類あるのですが、その違いについての説明ページがありません。

何が違うか、と言いますと、1→2→3となっていくにしたがってデバッグの情報がより詳細なものになっていく、ということです。
変えていくことでより多くの情報が追加されていきます。

デバッグモードは、1、2、3と変更してもまたすぐに元に戻すこともできますので、どんな情報が表示されるのか、試して変更してみるといいでしょうね。

ちなみに、エラーを出す際に一番いいのは URLを間違って入力してみることでしょうか。
[ 2013年11月18日 00:02 ] カテゴリ:baserCMS | TB(0) | CM(0)

baserCMS トップページのニュースの部分をメンテナンスしたい場合

baserCMSで、トップページのニュースの部分を自分の指定通りに変更したい場合にどうするか、という記事です。

http://blog.mani-lab.com/wp_import/archives/65
このサイトが非常に分かりやすいです。

トップページのニュースの部分をメンテナンスをする場合は、下記の関数を使います。
http://basercms.net/reference_2/archives/31

トップページのニュースの部分をメンテナンスする場合は、「固定ページ一覧」-「index」を開き、6行目にある

------------
<?php $bcBaser->blogPosts('news', 5) ?>
------------

の部分を下記の様に変更します。
例えば、「topics」というブログを追加し、それをトップページに表示させる場合は、

------------
<?php  $bcBaser->blogPosts('topics', 5, array( 'template' => 'posts2' ) ) ?>
------------

1つ目の引数がブログ名ですので、それを「topics」に変更します。
そして、3つ目の引数がオプションですので、そこで反映させるテンプレートを選択します。

そこで指定するテンプレートは下記になります。
/app/webroot/themed/{テーマ名}/blog/{ブログ名}/posts2.php

テンプレートを指定する際は、「.php」の部分を記述する必要はありません。
デフォルトでは「posts.php」が指定されますので、その「posts.php」をもとにしてデザインを変更していくと比較的短時間に変更をすることができるでしょう。

[ 2013年11月15日 23:55 ] カテゴリ:baserCMS | TB(0) | CM(0)

baserCMS お問い合わせフォームのボタンを画像に変えたい場合(ボタンのテキストを変えたい!っていう場合も)

baserCMSですが、お問い合わせフォームのボタンは、テキストで記述されています。
これを画像に変えたい!そういう要望はそれなりにあるのかと思いますが、変更の方法がマニュアルなどに掲載されていないため、かなり悩みましたが、その対応方法を書いておきます。
(ボタンのテキストを変えたい!というときも参考になるでしょう。)


ボタンの情報の記述は、下記ファイルにあります。
 /baser/plugins/mail/views/elements/mail_form.php

69行目、70行目が入力確認ページのボタンで、72行目が入力ページのボタンですが、下記は 72行目の入力ページのボタンをサンプルで書いています。

-------------
<?php echo $mailform->submit(' 入力内容を確認する ', array('div' => false, 'class' => 'btn-orange button form-submit', 'id' => 'BtnMessageConfirm'))  ?>
-------------
 ↓このように修正
-------------
<?php echo $mailform->submit( 'aaaaa.jpg', array('alt' => ' 入力内容を確認する ', 'div' => false, 'class' => 'btn-orange button form-submit', 'id' => 'BtnMessageConfirm'))  ?>
-------------

修正ポイントは、テキストで表示される「 入力内容を確認する 」を「aaaaa.jpg」の様にファイル名に変更するだけです。実に簡単!

使用する画像は「/app/webroot/themed/{テーマ名}/img/」のフォルダに入っていれば、ファイルのパスも記述する必要もなく、自動的にパスも付与されます。
必要であれば、下記の様に「'alt' => ' 入力内容を確認する '」を追加し、画像の altを追加することもできます。



対応方法は分かってみれば至極簡単な方法なのですが、ボタンを画像にするだけなのにここに行きつくまでに 3時間~4時間も試行錯誤してしまいました...

※この対応を行うと、すべてのボタンが共通して変更してしまいますので、フォームごとにボタンを変えたい場合は、ページによって分岐する処理を作る必要があるでしょう。(もしくはテンプレートファイルを分岐させる処理が必要でしょう。)


※ボタンの文言に修正したい場合は、単純にテキストを変更しましょう。
 画像にする場合と同様に、フォームごとにボタンのテキストを変える場合も分岐が必要になりますね。

※画像のファイル名が違っていたり、画像が「img」フォルダの中にない場合は、「実行」というよくあるボタンが表示されます。その場合は、画像の場所、ファイル名を確認してみてください。



ちなみに、65行目~67行目にある下記の入力のリセットをするボタンの処理ですが、フォームのコンバージョンをアップするためには削除しておくべきですね。
-------------
<?php if($this->action=='index'): ?>
	
<?php endif; ?>
-------------

まるっと削除してもいいですし、下記の様にコメントアウトしてもいいでしょう。
-------------
<?php /* if($this->action=='index'): ?>
	
<?php endif; */ ?>
-------------

※コンバージョンアップのためには、入力する項目を減らす、不必要なリンクを減らす、といった対策に加え、「リセットボタン」は使わないということも重要だそうです。

[ 2013年11月13日 23:03 ] カテゴリ:baserCMS | TB(0) | CM(0)
プロフィール

エス技研

Author:エス技研
性別:男性
職業:Web系エンジニア
エンジニアになって 15年ほど経ちますが、その途中で 5年ほどディレクタ、マネジメントを中心とした業務を行っていたためにやや現場を離れていましたが、転職をきっかけに 2012年に現場に復帰し、新たな技術を楽しみながら勉強しています。
メインの環境は LAMP環境です。

FC2ブログランキング
FC2カウンター
FC2拍手ランキング
GoogleAdWords
カレンダー
06 | 2017/07 | 08
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
検索フォーム
ブロとも申請フォーム
QRコード
QR
フリーエリア


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。