EC-CUBEのインストール

このサイトを設置しているサーバーに、EC-CUBEをインストールしようと1週間くらいまえから四苦八苦していました。EC-CUBEはPHPで書かれたECオープンソースのショッピングシステムです。
説明を見ると、「株式会社ロックオンが2000年の創業以来、手がけてきたECサイト構築により培ったノウハウ(モジュール群)をオープンソースとして提供したECサイト構築パッケージです。」ということでインターネットショッピングのホームページを構築するすべてがこのプログラムで無料でできるということです。
とうことで、インストールにチャレンジしました。
要件としたら、PHPが4.1以上、MySQL4.1以上などが必須ですが、一応満たしているようなので、早速インストールしてみました。
しかし、インストールが成功して、管理画面に移りますいうところで、画面が真っ白に。
この原因が分かるまでに2~3日はかかりました。インストールは成功しているようなのですが、FFFTPでサーバーにアップロードしている以外にインストール作業を通じて作成されているホルダーとファイルが出来ています。その所有者をFFFTPで見てみると、本来の所有者ではない「apache」という名前になっていました。特にSmarty/template_cの中に生成されています。それを一度、ローカルにダウンロードし、サーバーに生成していたファイルとホルダーを削除して、ローカルからアップロードして属性を書き込み可に変え・・というようなことをすると真っ白な画面がログイン画面に。

つぎに苦労するのは、クレジットシステムの導入です。最初から本体についていればいいのですが、クレジット決済については、後付でモデュールとして取り付けるようになっているようです。おそらくバージョンが変わっていくと、最初からマニュアルで付くようになると思います。
決済システムは、EC-CUBEの置いてあるロックオンから無料で購入する形をとるので、ECCUBE2.0を設置したURLとメールアドレスが必要です。そしてメールアドレスに届いたKEYを管理画面に入力設定してダウンロードしてインストールします。この作業が管理画面からの自動作業なので、分かりにくい。マニュアルならダウンロードしたファイルをどこにアップロードしてどういう処置をして、設定できるということがわかるのですが。
このようなエラーがでて設定失敗です。

/var/www/vhosts/ドメイン名/httpdocs/data/downloads/backup/update_1205473883/
詳細 バックアップディレクトリの作成に失敗しました

そこでEC-CUBE開発コミュニティというユーザー交流サイトで同様なエラーを調べると、どうもPHPのSAFTYMODEが原因になっているようでした。
PHPのSAFTYMODEがONになっているとプログラム書き込みの所有者と本来のプログラムの所有者が異なっていた場合に処理を続行してくれないようになっているようです。
EC-CUBEは本来の所有者名でないapacheという所有者でファイルができるようなのでそこに原因はあるようです。
これはもうどうしようもないとあきらめかけていたのですが、safemodeで検索をかけて調べていたら、このサーバーは仮想専用サーバーで、pleskで管理しています。pleskのドメインの管理画面からphPのsafemodeが選べるようになっていることが分かりました。
そこでsafemodeのチェックを外してトライアルするとZEUSの設置は一応できました。
とりあえずこれでEC-CUBE2.0のインストールはできた。ということです。疲れました。


APIで悩みました

今、アフリエイトサービスにAPIを利用できるところができています。なんとかAPIをPHPを使って利用できるようになってきたので、LINKSHAREのクロスオーバーサーチ(リンクシェア・Webサービス)を申し込み、アクセス許可のトークンをいただきました。
そして、いつものようにPEARのXML/Unserializer.phpというユーティりティを使ってみたのだけれど文字化けするのです。今まで、アマゾンでも、リクルートのWEBサービスでも利用できたのに・・・。XMLのソースをみると日本語がUNICODEという記号になっています。いままでこんなことはなかったのに、ということで、半日悩みました。
 それで、他にリンクシェアのクロスオーバーサーチを活用しているところがないかと検索したら、「LinkShare Technical 」を見つけました。こちらはPHPのソースも公開しておられるのでダウンロードしてみました。よく出来たプログラムで、私のような初心者には大変勉強になります。PEARのXML/XML_Tree_Ex.phpを利用していましたが、基本は一緒なので、よくみると、URLからXMLを読み込んで出力する時に「UTF-8」というオプションコードを加えていました。
今まで、PEARのXML/Unserializer.phpでは別に加えなくても支障なく配列に出力してくれていましたが、試しに
$parser = new XML_Unserializer(array('parseAttributes' => true,'targetEncoding' => 'utf-8'));
と書いて見ました。結果は文字化け解消です。
自分の記憶に残るよう、書いておきます。LinkShare Technical さんありがとうございました。


JSONについて

無料のAPIサービスを調べていたら、星占いに関するものが見つかった。

Web ad Fortune 無料API

というサービスです。
占いデータを http://api.jugemkey.jp/api/horoscope/free に GET リクエストを送ると、データを JSON フォーマットで取得できるというものです。フリー百科事典『ウィキペディア(Wikipedia)』によると、

「JSON(ジェイソン、JavaScript Object Notation)は、JavaScriptにおけるオブジェクトの表記法をベースとした軽量なデータ記述言語である。

JavaScript言語以外でのほとんどの言語において、JSONは単純な処理で書き出しや読み込むことができる。

とあるので、今まで、APIをXMLで受け取っていたのと同様に利用できるようでした。では、PHP4で利用できる、JSONを処理するためのツールがあるのではと思い、検索したところ「Jsphon」というPHPで書かれたJSONライブラリが見つかりました。日本語との相性もいいようなので、早速、PEARコマンドでインストール。デコード処理を、試したところ、きちんと配列で返してくれました。ここまでくれば、後は、配列をHTMLに配置するだけです。「Jsphon」の作者の方に感謝します。とりあえず、今日の星占い1に載せてみました。


APIサービスを利用

APIサービスを利用して岡山WEBというサイト名にそったコンテンツを作ってみました。前回はアマゾンWEBサービスを利用して岡山作家ガイドを特集しましたが、今回「ぐるなび」という全国のグルメ情報をを扱っているサイトの「ぐるなびwebサービス」を利用して、グルメサーチ岡山というコンテンツにしてみました。次にリクルートのフロム・エーナビというアルバイト・バイト・仕事探しの総合サイトの「お仕事検索webサービス」を利用して岡山エリアのアルバイト情報に特化したコンテンツを試作してみました。


アマゾンwebサービスを使う

前々から、岡山WEBネットに岡山出身の作家の著作一覧を表示させることが出来たらと思っていたのですが、APIサービスのアマゾンwebサービスを使うことで可能ということが分かりました。参考にしたのは「PHP×WEBサービス APIコネクションズ」という本です。残念なことにPHP5を前提に書かれているので、サンプルコードをそのまま使うことは出来ませんでしたが、一部を変更することでPHP4.3でもTESTすることが出来ました。

一応の結果をチャンネル::岡山出身作家ガイドに載せています。

今のところ、その作家以外に、その作家の名前のついた文学賞の受賞作もいっしょについてきていますがそのうち修正します。

なお、アマゾンからのデータは一度(1ページ)に10件分しか出てきませんので、10件以上のデータを表示するにはページ送りのページャーが必要です。今回、ページャーは、レッツPHP!さんの「簡易ページャ」を使わせてもらいました。このような便利なツールを公開してくださったことに感謝いたします。

今度はぐるなびの岡山版の情報をを岡山WEBネット上に載せてみようと思います。APIサービスのおかげで単なるホームページリンク集に加えて、岡山に関するサイトとして充実できそうです。


APIを使いたい-3

APIの対象は、livedoor「お天気Webサービス。」です。ここから例えば岡山南部の明日の天気予報をリクエストパラメーターを使用して、XMLで呼び出し、その中から必要なデータを取り出してWEBに表示させようと思います。PEARのXML_Serializerを使うことでXMLの解析ができ、必要な情報が読み出せます。


require_once "XML/Unserializer.php";
$xml_data = file_get_contents("http://weather.livedoor.com/forecast/webservice/rest/v1?city=88&day=tomorrow");
$parser = new XML_Unserializer(array('parseAttributes' => true));
$parser->unserialize($xml_data);
$XML = $parser->getUnserializedData();
print_r ($XML);

このprint_rは、変数の情報をかえすコマンドで、この場合、$XMLに収められた変数(パラメーターから得られたXMLの情報)の構造が分かります。実は最初見た時はよく分かりませんでした。このようになります。(UTF-8で出てくるのでブラウザのエンコードをUTF-8にします。)

Array
(
[version] => livedoor Weather Web Service 1.0
[author] => livedoor Weather Team.
[location] => Array
(
[area] => 中国
[pref] => 岡山県
[city] => 岡山
)
[title] => 岡山県 岡山 - 明日の天気
[link] => http://weather.livedoor.com/area/33/88.html?v=1
[forecastday] => tomorrow
[day] => Tuesday
[forecastdate] => Tue,28 Aug 2007 00:00:00 +0900
[publictime] => Mon,27 Aug 2007 05:00:00 +0900
[telop] => 曇り
[description] => 中国地方は、薄雲が広がっていますが、高気圧に覆われているため、概ね晴れています。
今日(27日)は、高気圧に覆われますが、湿った空気の影響で大気の状態が...
[image] => Array
(
[title] => 曇り
[link] => http://weather.livedoor.com/area/33/88.html?v=1
[url] => http://image.weather.livedoor.com/img/icon/8.gif
[width] => 50
[height] => 31
)


PHPの参考書など読んだ時、少し分かりにくいのでいつもとばしていた連想配列と気づくのに少し時間がかかりました。そのうえ、初歩の説明には、単純な連想配列の説明だけなので、このような配列の中に配列があるような多次元連想配列の分かりやすい説明には、なかなかお目にかかりません。いろいろと検索していると、
JOHO.BOO.JP というサイトにプログラミングメモのコーナーがあり、PHP、多次元配列という項目がありました。ここに多次元配列の情報を読み出す方法が書いてありました。これにより、先ほどの$XMLから必要な項目だけ読み出すことが出来ます。

print $XML["location"]["city"];
print $XML["link"];
print $XML["title"];
print $XML["telop"];
print $XML['image']['url'];

これで出力結果は、
岡山 http://weather.livedoor.com/area/33/88.html?v=1岡山県 岡山 – 明日の天気曇りhttp://image.weather.livedoor.com/img/icon/8.gif
となるはずです。後は、ひとつずつ文字コードをエンコードして、わかりやすくレイアアウトすればいいと思います。


APIを使いたい-2

PHP5がサーバーにインストールされていたらこんなに苦労しなくてもすんだのですが・・・、
PHP4.3とPEARの力を借りてlivedoor「お天気Webサービス。」が使えそうです

いろいろと参考になりそうなサイトを検索してようやくたどり着いたのがEC studioというブログ。そこにPEARのXML_Serializerを使うことによりXMLデータを配列に格納する処理ができるということがわかりました。

XML_Util とXML_Parser が必要なのでそれらもいっしょに追加。次は、どんな配列になるか確認して見ようと思います。


APIを使いたい

最近は公開API(アプリケーション・プログラミング・インターフェース)という便利なツールがある。それらは、お天気情報や楽天のショップ情報、アマゾンのショップ情報などをXMLなどで提供してくれるサービスなので、PHPを勉強するのならやはりAPIにもとりかかりたいということで、いろいろと情報を集めて見ました。

参考にしたサイトは10分で理解する初めてのAPIとかPHPでWebAPIを骨までしゃぶるです。

しかし、どうも調べるにつれPHPのバージョンが5.0以降でないとついていけないようです。このブログを置いているレンタルサーバーのPHPは4.3なのです。それでも説明をよく読むと、PEARというライブラリをインストールするとできないこともないようだということでした。

レンタルサーバーにPEARを導入するには、サーバーの管理会社へ依頼するか自分でインストールするしかないのですが、今回はとりあえず自分でインストールしました。

まず、ローカルのWINDOWSパソコンにインストールしているPHPには既にPEARのインストーラーgo-pear.batがあるのでそれをdosプロンプトで実行し、その後必要なライブラリーを追加でインストール。

この辺りは、WindowsへPEARをインストールする が参考になりました。

そして、ローカルのPEARをサーバーにアップロードしHTACCSEEにPEARのパスを通して完了。いよいよお天気APIに挑戦してみることにします。


PHPで配列の勉強2-Feedcreatorを試用

CGIでRSSフィードを生成するのにはYUKI::RSSが簡単に使えることは以前このブログで紹介しましたが、PHPには、Feedcreatorという便利なライブラリーがありました。このライブラリーはLGPLなのでだれでも自由に使用できるものということなので試用して見ることにしました。

ダウンロードはSourceForge.netからです。

RSS 0.91/1.0/2.0、Atom 0.3/1.0などのフォーマットに対応しているので、好みのスタイルでフィードを作成することができます。デフォルトはRSS0.91でした。

まず、ダウンロードしてきたファイルのうち、ライブラリーは「feedcreator.class.php」ですが、日本語に対応させるため、672行あたりのvar $encoding = “ISO-8859-1″; のISO-8859-1をUTF-8に変更しました。サンプルのdemo.phpをみると、YUKI::RSSと同じようにライブラリーを読み込ませ、最初のブロック(//define channel)の部分でサイトのタイトル、説明、サイトURLなどの固定部分を書き込み、次のブロック(//channel items/entries)に記事を書きこんだらいいようです。//channel items/entriesのブロックにデータベースからデータを読み込む例がダウンロードしたファイルのofficial_demo.phpに書いてありましたが、そこまではまだ手が出ないので、CSVのようなデータファイルから配列を使って一行ずつ書き出すように考えて見ました。(配列の勉強です)

1、データファイルの準備
ファイル名 data.txt(UTF-8で保存)
内容:
111111,aaaaaaa
22222,bbbbbb
33333,cccccccc

こんなデータを作って保存。今回は文字の変換を考えないように、エンコードをUTF-8で保存。

2、RSSフィードを作成するためのPHPプログラムを以下のように作ってみました。

< ?php
define(’TIME_ZONE’,‘+09:00′);//日本時間に変更
require_once ‘include/feedcreator.class.php’;//設置場所のパスを指定
$rss = new UniversalFeedCreator();
$rss->useCached();
$rss->title = ‘新着情報’;
$rss->description = ‘岡山WEBサーチの新着情報です’;
$rss->link = ‘http://www.okayamaweb.net/’;
$rss->syndicationURL = ‘http://www.okayamaweb.net/***.xml’;

//データファイルから記事を読み出す
$file_data=file(”data.txt”);
//複数行に渡るファイルの内容を読み出す
foreach($file_data as $value){
   list($title,$body) = split(”,”,$value);

$item = new FeedItem();
$item->title=$title;
$item->link = ‘http://www.okayamaweb.net/’;
$item->description =$body;
$item->author = ‘okayamaweb’;

$rss->addItem($item);
}

//$rss->saveFeed(’RSS2.0′,’sample.xml’);
$rss->outputFeed(’RSS2.0′);//RSS2.0を空欄にすると0.91で表示1.0と記入するとRSS1.0で表示
?>

とりあえず簡単な例ですが、いろいろと応用できそうです。一応エスケープ文字にも対応していました。ただし、日本語への変換がどこまで出来ているのかは使って見なければ分かりません。


PHPで配列の勉強

久しぶりにPHPで配列の勉強をした。

目次などの表示を列表示で大項目-小項目-小項目というようなデータの表示を考えていました。いわばツリー状なデータの項目表示で、ホームページのメニュー表示をPHPの配列で表示できないかということです。

例えば、

コンピューター(大項目)

  1. アップル
  2. 九十九電機
  3. エプソンダイレクト
  4. DELL

というようなメニューを配列を使ってPHPで表示したかったのです。

データの登録方法などいろいろ試行錯誤した結果、データ1行に大項目と小項目を書き込んだら配列で表現できるということが分かりました。

例えば、

<?php
$data=(“コンピューター,アップル,九十九電機,DELL,エプソンダイレクト,ヒューレットパッカード”);//先頭に大項目を、次から小項目を書き込む
$data=explode(“,”,$data);
$daikoumoku=$data[0];
$count=count($data);
print($daikoumoku);//ここで大項目$data[0]を書き出す
print(“<ol>”);
for ($i=1; $i<$count; $i++)//dataの2項目$data[1]から項目数より一つ少ない$data[5]までひとつずつ書き出します
{
$syoukoumoku=$data[$i];
print(“<li>”);
print($syoukoumoku);
print(“</li>”);
}
print(“</ol>”);
?>

というようにです。

なお、まだまだ勉強中なのでおかしなところがあるかも分かりませんがご容赦を。