Posts Tagged ‘baserCMS’

baserCMSを3.0.9へアップデートしました(あっさり)

おひさしぶりです。muraveです。

恒例(?)のbaserCMSアップデート話です。

3.0.7にアップデートする時にスマートURLをオンにした状態ではアップデート処理を実行できなかったり(baserCMSを3.0.2から3.0.7へ。ところでカテゴリ名ってまだ簡単に取れないんです?)、その後.htaccesをいじっていたり(URLを統一したくなったので.htaccessで301リダイレクト)したので、不安がありまして、時間が取れる状況になってから作業しました。

リリースから約一週間、先ほど作業したところ

公式に書いてある手順であっさりアップデートできました!

ヽ(=´▽`=)ノばんざ〜い ←絶対何かで引っかかると思っていた人

どんどん扱いやすいCMSになっていると感じました。

そうそう、管理ページのレイアウトが少しかわっているのでアップデート直後少し表示が崩れて見えたというのがありましたがブラウザのキャッシュの問題で、リロードしたらなおりました。

Facebooktwitterlinkedintumblrmail

URLを統一したくなったので.htaccessで301リダイレクト

自社サイトにWOVN(https://wovn.io)を導入してみました。

http://www.lancard.com/ にアクセスすると右下にウィジェットが表示されていると思います。今のところほぼ機械翻訳なのでご笑覧ください(ランカードコムが orchid card com と訳されているところに気づいたら直したくらい)。

そんなわけでWOVNの管理ページを見ていたら http://lancard.com/ でのアクセスや http://www.lancard.com/work/index といったindex付きのアクセス(拡張子無しのindexなのはBaserCMS絡みです)が結構あって、URLを統一しないとアカンなぁと思ったのでした。SEO的にも統一したほうが良いとは聞きますし。

Apacheで動かしてるので.htaccessでどうにかします。
www付きに統一して、indexは無しという方針。

RewriteEngine on
#www付きに統一
RewriteCond %{HTTP_HOST} ^lancard\.com
RewriteRule (.*) http://www.lancard.com/$1 [R=301,L]

#indexなしに統一
RewriteCond %{THE_REQUEST} ^.*/index
RewriteRule ^(.*)index$ http://www.lancard.com/$1 [R=301,L]

#BaserCMS
RewriteBase /
RewriteRule ^$ app/webroot/ [L]
RewriteRule (.*) app/webroot/$1 [L]

こんな感じになりました。

Facebooktwitterlinkedintumblrmail

baserCMS 3.0.7 でカテゴリ名、簡単に取れました

muraveです。

チョイ前の記事

baserCMSを3.0.2から3.0.7へ。ところでカテゴリ名ってまだ簡単に取れないんです?

で、タイトル通りの疑問を書いてましたら親切な匿名の方からコメントで情報を頂きました。

曰く、$category = $this->BcPage->getCategory(); echo h($category[‘title’]);

$categoryへの代入等はこちらで追加させてもらいましたが、確かにこれです!

ありがとうございます。

てなわけで、getCategory関数を使用してのカテゴリーのタイトル取得は以下のようになりました。

//カテゴリーのタイトルを取得
$category = $this->BcPage->getCategory();
$product_title = $category['title'];

真っ当感、ありますな。

ところで、このgetCategory関数のリファレンス、http://wiki.basercms.net/関数リファレンス/getCategoryにあったんですが、用例が変ですね。

BcPage->getCategory() ?>

でカテゴリー名が出力されるように読めるんですが、getCategory関数の返り値はarrayですのでそのままechoしちゃだめです。

Facebooktwitterlinkedintumblrmail

baserCMSを3.0.2から3.0.7へ。ところでカテゴリ名ってまだ簡単に取れないんです?

muraveです。どもども。

時間ができたので自社サイトのbaserCMSを3.0.2から3.0.7へアップデートしました。今朝。

残念ながら順調にはいかなかったので自分のためにもメモを残しておこうと思います。
ところでカテゴリ名ってまだ簡単に取れないんです?(前振り)

■ アップデート処理を実行出来なかった件
スマートURLをオンにした状態ではアップデート処理を実行できませんでした

ギニャーーーー!

WordPress(ココ)と同居していることもあって.htaccessにいろいろと設定を追加しているせいかPOST先のページにアクセスできなかった模様。
スマートURLについて手作業でオフ、.htaccessを調整して実行しました。

/app/config/install.php の次の行をコメントアウト。

//Configure::write('App.baseUrl', '');

/app/webroot/.htaccess の一部をコメントアウト

RewriteEngine on
RewriteBase /app/webroot
#RewriteCond %{REQUEST_FILENAME} !-d
#RewriteCond %{REQUEST_FILENAME} !-f
#RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

もちろん実行後、手作業で元に戻しました。

■ レイアウトの中でカテゴリ名を取得していたページが全滅
どうかんがえてもイリーガルなことをやっていたので文句はいえないのですが、参りました。

イリーガルなことってのはこういうこと。

//カテゴリーのタイトルを取得
$product_record = $this->BcBaser->PageCategory->find('first',array(
      'fields' => array('title'),
      'conditions' => array('name' => $product_category),
      'recursive' => -1,
));
$product_title = $product_record['PageCategory']['title'];

3.0.7のコードを調べた所 $this->BcBaser を $this->Page に変えたら行けそうな気がしたのですが、気のせいだったのでさらにイリーガル感が増してしまいました。

//カテゴリーのタイトルを取得
$page_category = new PageCategory(false, null, 'baser');
$product_record = $page_category->find('first',array(
      'fields' => array('title'),
      'conditions' => array('name' => $product_category),
      'recursive' => -1,
));
$product_title = $product_record['PageCategory']['title'];

本当はこんなことしたくないんです! カテゴリ名って簡単に取れるようになってるんでしょうか?

Facebooktwitterlinkedintumblrmail

baserCMS2系から3系への道(アップデートメモ)

 オレはようやくのぼりはじめたばかりだからな
       このはてしなく遠いbaserCMS坂をよ… 未完

という気持ちになるくらいイロイロとありましたが(2日かかってしまいました)、無事2.1.1から3.0.2へ移行できました。注意点のメモを残します。

まずは、移行作業の参考にさせていただいたサイト。

本家本元、
 baserCMS開発ブログ『baserCMS 2.1系 から baserCMS3に移行する』

うっかりナスビさんでもお馴染み我流さんの、
 我流天性 がらくた屋『baserCM2.1.2から 3.0.0へ移行を試してみたよ』

作業手順については上記、2つサイトを参考にすれば問題ないと思います。
移行作業で使用するプラグインは、現在、baserマーケットからダウンロード出来ます。
DBマイグレーター(作業時バージョン1.0.3)
アドオンマイグレーター(作業時バージョン1.0.1)

では、はじめに大事なことを。
普通に運用しているサイトであれば重要なのは1点。

 「まず、3.0.0に移行するのだ! 後のアップデートは3.0.0で動いてからだ!」

baserCMSユーザーズフォーラムの「2→3 の移行途中で /maintenance/index に強制リダイレクト」というトピックに書きましたが、DBマイグレーターの移行対象は(現状)、3.0.0のみだと思われます。

よって、一旦3.0.0で対応作業を行ってから以降のバージョンへのアップデートを行う、という手順で比較的容易に移行できると思います(移行用プラグイン優秀!)。

私が作業していた時には http://basercms.net/download/past から3系の旧バージョンがダウンロード出来なくなっていたのですが、素早く対応していただき、現在はダウンロード出来るようになっています。

私の最初の一日は3.0.2へのデータ復元後のメンテナンス画面への強制リダイレクトやデータベースアクセスエラーの原因を調べるのに費やされました。この情報で、みなさんの一日が守られればと思います。

以降はサイトの状況によってまったく異なってくると思いますので参考程度に。
弊社の場合はいろいろとカスタマイズしていたので様々な問題がでました。デバッグモードで動かし、表示されるNoticeを一つ一つ潰していきました。

・プラグインが無効化されずにサイト全体が死亡
 DBマイグレーターで変換したデータを3.0.0に復元した後、なぜかプラグインが無効化されておらず、プラグイン周りでエラーが発生してサイトが死亡しました。データベース直編集でプラグインを無効化してエラーを回避しました。

・テーマヘルパーでエラー
 テーマヘルパーはアドオンマイグレーターの変換では動作しませんでした。まずはテーマヘルパーを使用しているところをコメントアウトしてサイトが動作する状況にした後、デフォルトのヘルパーを参考に手作業で対応作業を行いました。

・カスタマイズしていたサイトマップでエラー
 前の記事をご参照下さい。

・パンくず周りの変更に対応
 古いテーマだとパンくず周りで「Not Found: …/elements/navi.php」といったNoticeが出てパンくずが正常に動作しません。3系に添付されているテーマの elements/crumbs.php をコピー、カスタマイズして対応するのが良いと思います。

・$bcBaser->paramsの値を直接参照していたところでエラー
 反則に近いかもしれないのですが$bcBaser->params(2系の場合)中の値を直接参照して判定を行っていた箇所が結構ありまして、エラーとなりました。$this->BcBaser->params(3系の場合)の内容を調べて、同様の動作をするように書き換えました。3系のほうが情報が増えていて便利でした。

・3.0.0セットアップ時テーマのメールフォームと移行元メールフォームのフィールドが混在
 これはプラグインが無効化されなかったときに直接データベースをいじって対応したのが原因かもしれないのですが(データ復元時にエラーが出ていたのかもしれない)、既存テーマのcontactメールフォームと移行元のcontactメールフォームのフィールド情報などが混在状態になってしまい難儀しました。既存テーマの情報をデータベースから直接削除するなどして対応しました。

以上、アップデートメモでした。

Facebooktwitterlinkedintumblrmail

baserCMS3系でのサイトマップカスタマイズ

bserCMS3系へのメジャーバージョンアップからはや半年以上、やっと弊社サイトを2.1.1から3.0.2へバージョンアップしました。

バリバリにカスタマイズしているので腰が引けていたのです。

旬を外していたり、イレギュラーなカスタマイズをやっていたりでバージョンアップにはかなり苦労したのですが、その話は次にとっておきまして、まずは以前書いた『baserCMSのサイトマップをカスタマイズ』のフォローを。

上記記事のコードですが、アドオンマイグレーター(http://barket.jp/products/detail.php?product_id=11)でテーマを変換しただけでは(やはり)動きませんでした。

少し修正が必要でしたので修正後の弊社のサイトマップのコードを置いておきます。参考にどうぞ。

BcBaser->sitemap() で呼び出す
 */
//ここから設定
//表示しないurl
$disables = array(
'/index_test',
);

//$inserts = array(before_url=>array(title, url),,,)
//before_urlの次に挿入url,titleで作成したアイテムを挿入
//ブログ、メールフォームなどpage以外を途中に挿入することが出来る。
$inserts = array(
'/sitemap' => array('新着情報', '/news'),
'/news' => array('お問い合わせ', '/contact'),
'/it-model/faq' => array('ダウンサイジングについてのお問い合わせ', '/contact_itmodel'),
'/roundcube/faq' => array('Roundcubeについてのお問い合わせ', '/contact_roundcube'),
'/kolab/faq' => array('Kolabについてのお問い合わせ', '/contact_kolab'),
);
//設定ここまで

//関数
$bcBaser = $this->BcBaser;
$outputPageItem = function ($recursive, $title, $url) use (&$bcBaser) {
?>
  • link($title, $url) ?>
  • link($title, $url); else: echo $category_title; endif; echo PHP_EOL; }; $outputCategoryItemTail = function () { ?>
    • BcBaser->element('sitemap', array( 'pageList' => $pageCategories['children'], 'category_title' => $category_title, 'category_url' => $category_url, 'recursive' => $recursive+1 )); endif; if($outputed_category_li): $outputCategoryItemTail(); endif; endforeach; endif; ?>

    ポイントは「$bcBaser = $this->BcBaser;」して$bcBaserを無形関数に渡して使用するところです。

    Facebooktwitterlinkedintumblrmail

    LT『baserCMSでホームページをリニューアルしたときのアレコレ』のスライド

    オープンソースカンファレンス2012 Kansai@Kyoto の「ライトニングトークfor Business」で話した『baserCMSでホームページをリニューアルしたときのアレコレ』のスライドです。

    baserCMSでホームページをリニューアルしたときのアレコレ

    書きすぎたとは思っていましたが、実際に話すと思ってた以上にボリュームありすぎでした。

    5分なんだってば。失敗。

    Facebooktwitterlinkedintumblrmail

    baserCMSを2.0.1から2.0.3に更新

    弊社サイトで使用しているbaserCMSのバージョンを2.0.1から2.0.3に更新しました。

    あっさりサックリ上手く行ったのでホッとしたのですが、動作確認するとブログでの一覧表示でおかしな所が。「≫ 続きを読む」をクリックするまで隠れているはずの詳細が一覧で見えてしまっていました。

    あれ〜?と思いつつbaserCMS公式にいくと関係しそうな解決済チケットがありました。

    BlogHelper::getPostContent の挙動がおかしい

    リビジョン a845999e から更新ファイルを取ってきてファイルを差し替えました。

    さぁ〜、どうだ! あれ〜? なおらないな。

    しばし悩む。 フォーラムを見に行ったりしつつ。

    ああ、そうか。ブログのviewカスタマイズしてるからかも。 そうでした。

    lancardというテーマ名の場合ですが、以下の2ファイルをリポジトリのindex.phpの変更内容に合わせて修正したらなおりました。
    app/webroot/themed/lancard/blog/default/index.php
    app/webroot/themed/lancard/blog/default/archives.php

    修正内容はリポジトリの差分を見てもらうのが手っ取り早いですね。

    index.phpの差分

    $blog->postContent($post, false, true) と第2引数がfalseに変わってます。

    Facebooktwitterlinkedintumblrmail

    baserCMSの認証をカスタマイズ(WordPressのアカウントでログイン)

    baserCMSのバージョンは2.0.1です。

    現在弊社のサイトはbaserCMSとWordPress(スタッフブログ)が同居しています。

    アカウントの管理を統一したかったのでbaserCMSにWordPressのアカウントでログイン可能なようにbaserCMSの認証をカスタマイズしました(先にWordPressを運用していたのでスタッフのアカウントがWordPressにありますので)。

    次のような仕様にしました。

    • WordPressのアカウントでbaserCMSにログインした場合、事前に作成したstaffアカウントとしての操作になる。
    • 公開ページで表示される名前(氏名)はstaffとする。
    • ログイン中、氏名を「staff(WordPressアカウント)」とする。
    • 誰が操作したかの記録は欲しいのでダッシュボードの「最近の動き」に by 氏名 と付加して記録する。

     

    baserCMSの認証はbcAuthComponent(baser/controllers/components/bc_auth.php)に切り出してありますので、このファイルをappディレクトリの同一階層にコピーしてそのファイルを修正します。元のbcAuthComponentは携帯の簡単ログイン対応になっていたのですが携帯でのログインは必要なかったので全部削除して書き直しって感じになりました。
    app/controllers/components/bc_auth.php

    App::import('Component', 'Auth', 'Sanitize');
    class BcAuthComponent extends AuthComponent {
    //WordPressアカウントでstaffとしてログイン murave
    function login($data = null) {
    $this->__setDefaults();
    $this->_loggedIn = false;
    
    $wordpress_id = null;
    
    if (empty($data)) {
    $data = $this->data;
    }
    
    $model =& $this->getModel();
    $alias = $model->alias;
    $cnt = $model->find('count', 
    array('conditions' => array($this->userModel . '.' . $this->fields['username'] => $data['User']['name'])));
    if($cnt == 0) {//baserCMSには存在しないユーザー
    if($this->_wp_CheckPassword($_POST['data']['User']['name'], $_POST['data']['User']['password'])) {
    $wordpress_id = $_POST['data']['User']['name'];
    $staff_record = $model->find('first',
    array('conditions' => array($this->userModel . '.' . $this->fields['username'] => 'staff')));
    
    $username = $staff_record[$this->userModel][$this->fields['username']];
    $password = $staff_record[$this->userModel][$this->fields['password']];
    $data = array(
    $this->userModel . '.' . $this->fields['username'] => $username,
    $this->userModel . '.' . $this->fields['password'] => $password
    );
    }
    }
    
    if ($user = $this->identify($data)) {
    if(!is_null($wordpress_id)) {
    $user['real_name_2'] = '('.$wordpress_id.')';
    }
    $this->Session->write($this->sessionKey, $user);
    $this->_loggedIn = true;
    }
    return $this->_loggedIn;
    
    }
    
    /**
     * WordPressユーザー認証を行う。
     */
    private function _wp_CheckPassword($wordpress_id, $password) {
    //WordPressの関数を使って認証を行ない結果をtrue/falseで返す処理です。
    }
    
    }
    

    _wp_CheckPasswordがWordPressに認証させる処理で「肝心な所」ではあるのですが、環境によって異なるはずなので申し訳ありませんが割愛しています。
    baserCMSにアカウントが無かったらWordPressに認証させて、WordPressで認証に成功したらstaffというアカウントでbaserCMS側は認証、その場合には $user[‘real_name_2’] = ‘(‘.$wordpress_id.’)’ とreal_name_2に設定してからセッションに書き込んでいます。real_name_1はstaffにしているので操作中の氏名は「staff(WordPressアカウント)」となります。

    次に「最近の動き」への記録ですがBaserAppModelのsaveDbLogメソッドで行われていますのでこのメソッドの動作を変更します。baser/models/app_model.phpをappディレクトリの同一階層にコピーしてメソッドを定義すれば上書きできます。

    app/models/app_model.php

    class AppModel extends BaserAppModel {
    function saveDbLog($message) {
    // ログを記録する
    App::import('Model', 'Dblog');
    $Dblog = new Dblog();
    $logdata['Dblog']['name'] = $message
    .' by '.@$_SESSION['Auth']['User']['real_name_1'].@$_SESSION['Auth']['User']['real_name_2'];
    $logdata['Dblog']['user_id'] = @$_SESSION['Auth']['User']['id'];
    return $Dblog->save($logdata);
    }
    }
    

    これで当初予定していたカスタマイズが一通り完了しました。baserCMSはカスタマイズしやすくていいですね。

    Facebooktwitterlinkedintumblrmail

    baserCMS 2系で追加されたテーマヘルパーが便利(だけど要注意)

    本日の「忘れないうちに書いとくぜ!baserCMSネタ」のお時間がやってまいりました。

    baserCMS 2系でテーマヘルパーが追加されました。
    http://basercms.net/functions/theme_helper

    弊社サイトはlancardというテーマを作ってその下で構築しています。

    現在、その中で、これから追加や編集をしていく予定があり、書き方が複雑だけど規則性がある、「ホームページのピックアップ(上部の画像切替)」と「ウィジェットのバナー表示」についてテーマヘルパーを利用して更新コストを下げています。

    参考に、バナー表示用のヘルパーのコードを抽出して貼ります(ピックアップについては複雑なので)。
    app/webroot/themed/lancard/helpers/lancard.php

    BcBaser->getUrl('/themed/lancard/img/bunner/'.$imgFile, true)
    .')';
    $this->BcBaser->link(
    $title,
    $url,
    $linkAttributes
    );
    }
    }
    ?>
    

    使用方法はこんな感じ。

    bunner('OSSダウンサイジング', 'downsizing.jpg', '/it-model') ?>
    

    と書くと

    OSSダウンサイジング
    

    と出力されます。便利です。

    しかし、このテーマヘルパー、注意して扱わないと大変ヒドイ目にあいます。

    テーマヘルパー用のディレクトリに「正しいテーマヘルパー以外のファイル」を置くとサイトのルーティングが全滅します。管理ページもアクセス不能! 初めてこの現象に遭遇したときは超ビビリました。

    ヘルパーを読み込もうとしてエラーが発生するわけですが、その影響範囲が想定の範囲外!

    私がやってしまったパターン

    • テーマヘルパー開発中に動作確認しようとしたらサイトが全滅してた。
    • テーマヘルパーを更新するときに旧ファイルをlancard.php_oldとリネームしたら全滅。

     
    いかがでしょうか。恐ろしいですね。

    しかしこの副作用、次のチケットでかなり解決しそうですので一時的な問題だと思います。
    TODO #2604 「テーマヘルパの読み込みはテーマ名のヘルパのみにする」

    そうそう、ヘルパー名は上記チケットの内容にしたがってつけておきましょうね。

    Facebooktwitterlinkedintumblrmail