カテゴリー
EC-CUBE PHP

EC-CUBEに掲示板をつける実験

俺は何やってんだw

ちょっと実験してみたんだけど、EC-CUBEの管理ページにある「ページ詳細設定」で新しいページを追加して、そこに簡単な掲示板機能を付ける実験をしてみた。

で、そこで追加されるテンプレートファイル内で完結出来る様に考えたけど結構微妙になった感じ。

  • 「user_data/任意の名前.php」にアクセスで表示できる
  • 自動で作成されるtplファイル内の記述だけで完結する
  • DBは使わない

で、ポチポチ試してみると、postメソッドじゃフロントのphpにフォーム内容が飛ぶのでtplで受けるためにはgetメソッドじゃないと行けないっぽい。

色々頑張るとできるかもしれないけど、そこは頑張らない。

あ、この後掲示板のコードとか表示するけど、とてもミットモナイ上にセキュリチー的な何かとかは猛烈にいい加減なので、ご自分のアレにナニしてエライ目にあったとしても俺は知りませんヨ。ええ。

あと、動作の保証もありません。

まぁ、何かのヒントになればイイんじゃないッスかね?

動作テストは「EC-CUBE 2.12.5」が動いてる環境です。多分2.12.xなら問題無いか・・な?
あんまりEC-CUBEのシステムに依存しない感じなのでだいたいおkかもしれない。

で、とにかく「ページ詳細設定」で新しいページを作る。

仮に名称を「掲示板」、URLに「bbs」を入力して「登録する」

すると/data/Smarty/templates/使ってるテンプレートのdir/user_data/に「bbs.tpl」ができるので、それをダウンロードして下記を書いた。
個人的に危険な香りのするデタラメ加減w

/data/Smarty/templates/使ってるテンプレートのdir/user_data/bbs.tpl

<!--{php}-->
//▼色々取得したり設定したり
$bbs_name = '掲示板'; //掲示板の名前
$this_url = 'bbs.php'; //EC-CUBEで作ったページのphp名
$ipAddress1 = $_SERVER['REMOTE_ADDR']; //bbs.phpにアクセスしたユーザーのIPアドレス取得
$root_path = $_SERVER['DOCUMENT_ROOT']; //htmlディレクトリのパス取得
$bbs_html_dir = $root_path.'/user_data/bbs/'; //データをナニするディレクトリ
$bbs_log = $bbs_html_dir.'bbs01.dat'; //メインで表示するログファイル名
$bbs_count = $bbs_html_dir.'count.dat'; //ブッ細工なカウント用ファイル
$b_date = date('Y/m/d H:i:s');
//▲色々取得したり設定したり
 
//▼bbsディレクトリ作ったり
//上で設定したディレクトリを作ります。
//htmlディレクトリ側のuser_dataが書込める状態でない場合は
//手作業で作ってパーミッションを777にしてください。
if (is_dir($bbs_html_dir)) {
} else {
  mkdir($bbs_html_dir);
}
//▲bbsディレクトリ作ったり
 
//▼getメソッド受取ったり
$page_pin = htmlspecialchars($_GET['page_pin'],ENT_QUOTES,'UTF-8');
$ipAddress2 = htmlspecialchars($_GET['ipAddress2'],ENT_QUOTES,'UTF-8');
$b_name = htmlspecialchars($_GET['b_name'],ENT_QUOTES,'UTF-8');
$b_comment = nl2br(htmlspecialchars($_GET['b_comment'],ENT_QUOTES,'UTF-8'));
//▲getメソッド受取ったり
 
//▼あんまり使えてないクッキー
$b_name_cookie = $_COOKIE['denbbs01'];
//▲あんまり使えてないクッキー
 
//▼名無し設定
if($b_name == '') {
$b_name = '名前ないヨ';
}
//▲名無し設定
 
//▼ログ処理
$line_nam = '50'; //記録する書込みの件数
 
function log_make($ha,$line_nam) {
  $temp_tane = date('YmdHis');
  $bbs_temp = $temp_tane.'temp.dat'; //一時ファイル
   
  $log_line_nam = sizeof(file($ha));
  if ($log_line_nam > $line_nam) {
    //最終行取得
    $data = file($ha, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    $last_line = $data[count($data)-1];
    $last_line = $last_line.'
';
 
    //最終行削除
    $fp = fopen($ha,'r');
    flock($fp,LOCK_EX);
    while( $line = fgets($fp,4096) ){
      if($line === $last_line) {
      } else {
        $fp2 = fopen($bbs_temp,'a+');
        flock($fp2,LOCK_EX);
        fwrite($fp2,$line);
        flock($fp2,LOCK_UN);
        fclose($fp2);
      }
    }
    flock($fp,LOCK_UN);
    fclose($fp);
    copy($bbs_temp,$ha);//一時ファイルと置換え
    unlink($bbs_temp);//一時ファイル削除
  } else {
  }
}
//▲ログ処理
 
//▼書込み処理
//フォームの「page_pin」から送られる値が「0」でかつ
//フォームの「ipAddress2」と投稿データ受信時のIPアドレスが同じでかつ
//フォームの「b_comment」が空でない場合に書込み処理をする
if($page_pin == '0' && $ipAddress1 == $ipAddress2 && $b_comment != '') {

setcookie('denbbs01',$b_name);//あんまり使えてないクッキーセット

  //▼カウント
  $fp = @fopen($bbs_count,'r+');
  if( !$fp ) {
    $fp = fopen($bbs_count,'w');
      flock($fp,LOCK_EX);
      fwrite($fp,'1');
      flock($fp,LOCK_UN);
      fclose($fp);
  }
  set_file_buffer($fp,0);
  flock($fp,LOCK_EX);
  rewind($fp);
  $buf = fgets($fp,5);
  if(!$buf) {
    $buf = 1;
  } else {
    $buf++;
  }
  rewind($fp);
    fputs($fp,$buf);
  flock($fp,LOCK_UN);
  fclose($fp);
  $cereal = $buf;
  //▲カウント
 
  //▼データ生成
  //書込みの表示については↓の行でタグ書いたりしてください
  $new_line = '<div class="bbs_line01">'.$cereal.':'.$b_name.' : '.$b_date.'</div><div class="bbs_line02">'.$b_comment.'</div>';
 
  $new_line = str_replace(array("\r\n","\r","\n"), '', $new_line);
  $new_line = $new_line.'
';
  //▲データ生成
   
  //▼ログ生成
  $bbs_data = file_get_contents($bbs_log);
  $bbs_data = $new_line.$bbs_data;
  $fp = fopen($bbs_log,'w');
    flock($fp,LOCK_EX);
    fwrite($fp,$bbs_data);
    flock($fp,LOCK_UN);
    fclose($fp);
  //▲ログ生成
   
  //▼ログ処理
  log_make($bbs_log,$line_nam);
  //▲ログ処理
   
  $page_pin = '';
  header("HTTP/1.1 301 Moved Permanently");
  header("Location: $this_url");
  exit();
}
//▲書込み処理
<!--{/php}-->

<!-- ▼ページの表示 -->
  <div id="undercolumn">
  <h2 class="title"><!--{php}-->echo $bbs_name;<!--{/php}--></h2>
  <div id="head_area">
    <p>書込み数が<!--{php}-->echo $line_nam;<!--{/php}-->件までの簡単な掲示板です。会員様以外の方もご利用いただけます。<!--{php}-->echo $line_nam;<!--{/php}-->件を越えたコメントは消えます。
  </div>
  <div id="bbs_form_area">
  <form action="<!--{$smarty.const.ROOT_URLPATH}-->user_data/<!--{php}-->echo $this_url;<!--{/php}-->" method="get" name="bbs">
    <p>お名前:
    <input name="b_name" type="text" value="<!--{php}-->echo $b_name_cookie;<!--{/php}-->" />
    <input name="submit" type="submit" id="submit" value="送 信" />
    </p>
    <p>コメント:
    <textarea name="b_comment" id="b_comment"></textarea>
    </p>
    <input name="page_pin" type="hidden" value="0" />
    <input name="ipAddress2" type="hidden" value="<!--{php}-->echo $ipAddress1;<!--{/php}-->" />
  </form>
  </div>
  <hr />
  <div class="bbs_log_area">
    <!--{php}-->
      @include_once($bbs_log);
    <!--{/php}-->
  </div>
</div>
<!-- ▲ページの表示 -->

実際はログの分割とか色々書いたけどなんかゴチャゴチャになってるので指定数のログ書出しまでって感じで。
それと今回はログの書込みでドバっと一気に読込んで新しい書込み追加してるので、書込みの保存件数を増やしたい場合はこの辺再考が必要ですな。
掲示板を無しにしたいときは、管理画面の「ページ詳細設定」で「掲示板」ページを削除して、FTPとかでhtmlディレクトリ側のuser_data/にできてるハズのbbsディレクトリを削除して終わり。
掲示板のページとしてはDBに登録されるけど扱うデータは全部ファイルベースなのでw

あと登録会員のログイン規制とかはSmartyで↓みたいに必要箇所括ってやる方がイイんじゃないかとw

<!--{if $smarty.session.customer.password|count_characters > 0}--> 
	//ログインしてないときの表示		
<!--{else}-->
	//ログインしてるときの表示
<!--{/if}-->

表示スタイルはコード中のタグの部分書換えたりしてください。

あとなにしろ色々恥ずかしいトコいっぱいあるのでちゃんと書き直して・・・w

要はtplファイルに<!–{php}–><!–{/php}–>で括ったphpコードを書くってだけの話でしたw

んで、実はさっき導入したプラグインの「SyntaxHighlighter」を使ってみたかったってコトでw
どーしよ、寄付すっかな?

7月だしw
まぁ、そんな感じ。

%d