巷で噂の「Concrete5」をさくらでインストールしてみた。

巷で噂の「concrete5」ですが、話題になった当初から気になってたのですが、ついに我慢できずに使ってみることにしました。


MOONGIFTで紹介された直後に、さくらインターネットレンタルサーバでインストールを試みたのですが、見事に失敗。
他の誰かが試みるのを待ってたのですが、誰もやらなそうなので、重い重い腰を上げることにしました。


気をつける点は以下の3つ。
【注意点1】PHPのバージョンは5を使用する。(たぶん)
どこぞに、動作要件としてPHP5と書いてあったので、5を使うように。
私はもともとPHP5を使用してたので、特に問題ありませんでした。
PHP4を使用している人は、管理コンソールから5にしておきましょう。


【注意点2】空のデータベースを用意する。
はい、無理です。既に他のサービスで使ってたりするので、これから新規に契約する人以外は結構厳しい条件です。
しょうがないので、DBが空かどうかチェックしている箇所をコメント化することに。

(concrete5配置ディレクトリ)/concrete/controllers/install.phpの143〜146行目付近

  $num = $db->GetCol("show tables");
  if (count($num) > 0) {
    $e->add(t('There are already %s tables in this database. Concrete must be installed in an empty database.', count($num)));
  }

↓のように変更する。

  $num = $db->GetCol("show tables");
  if (count($num) > 0) {
     //$e->add(t('There are already %s tables in this database. Concrete must be installed in an empty database.', count($num)));
  }

【注意点3】SQLエラーを回避する。
MySQL4.1以上が必須の動作環境なので、さくらで使用しているMySQL4.0ではこんな感じのSQLエラーが出ます。

mysql error: [1064: You have an error in your SQL syntax. 
Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT optionID FROM btSurveyOptions WHERE bID = 32 ) A] 
in EXECUTE("DELETE FROM btSurveyResults WHERE optionID NOT IN ( SELECT optionID FROM btSurveyOptions WHERE bID = 32 ) AND bID = 32 ") 

MySQLには全然詳しくないのですが、どうも4.0では副問い合わせができない模様。
で、1ヶ所副問い合わせを使用している箇所があるので、そこを修正すればおk。
(concrete5配置ディレクトリ)/concrete/blocks/survey/controller.phpの177〜182行目付近

  $query = "DELETE FROM btSurveyResults 
    WHERE optionID NOT IN (
      SELECT optionID FROM btSurveyOptions WHERE bID = {$this->bID}
      ) 
    AND bID = {$this->bID} ";
  $db->query($query);

↓のように変更する。(適当にやっているので、間違っているかも。。。)

 $r3 = $db->query("SELECT optionID FROM btSurveyOptions WHERE bID = {$this->bID}");
 $optionid = array();
 if ($r3) {
   while ($row = $r3->fetchRow()) {
     array_push($optionid , $row['optionID']);
   }
 }
 if (count($optionid) == 0 ) {
   $query = "DELETE FROM btSurveyResults WHERE bID = {$this->bID} ";
 } else {
   $query = "DELETE FROM btSurveyResults WHERE optionID NOT IN ('".implode("','",$optionid)."') AND bID = {$this->bID} ";
 }
 $db->query($query);


うまく行かなかった場合は、作成された66個ぐらいのテーブルを全て削除すれば、再度インストールができます。
既にテーブルがある場合は、DBの一意制約違反でエラーになるので、面倒だが削除またはtruncateする必要があります。


ちなみに使用したのは、concrete5.1.0です。
5.0.0だと、charsetの指定がutf8になっていない箇所が数箇所あるので、一部日本語が化けます。


とりあえず、これでインストールはできると思います。(インストール方法は他に書いている方がたくさんいるのでそちらを。)
ただ、無理やり使っているので、問題等発生する可能性大有りです。
ちょっとだけページの追加や編集やってみたりしたのですが、今のところ問題発生はしていません。
(気づいていないだけという可能性もありますが。。。)

私以外にも人柱が欲しかったので、とりあえず書いてみました。


他に気づいた点等あったら、追記します。