2009年3月31日火曜日

 

【EC-CUBE】商品の規格2が表示される問題

規格管理で・・ - EC-CUBE 開発コミュニティサイト

商品規格の2つ目が「選択してください」のみの<select>タグで表示され、購入できない件。
商品に関連付けられた規格が削除されると、DBの商品規格テーブルからは削除されるが、商品詳細テーブルにある規格2のリレーションだけが残って選択できない<select>タグになるようだ。
なので、商品を登録しなおすか、DBにSQLを発行して削除されて無効な商品規格に関連付けられてる商品を探し出して修正する。

dtb_classcategory - 商品規格テーブル classcategory_id
dtb_products_class - 商品と規格のリレーションテーブル product_id,classcategory_id1,classcategory_id2

「dtb_classcategory」テーブルで削除されてたりデータがNULLだったりする「classcategory_id」カラムを持つ「product_id」カラムを「dtb_products_class」テーブルから探して「classcategory_id1」カラムまたは「classcategory_id2」カラムを変更。


UPDATE dtb_products_class SET classcategory_id1 = 0 WHERE classcategory_id1 = {消去した規格ID};  UPDATE dtb_products_class SET classcategory_id2 = 0 WHERE classcategory_id2 = {消去した規格ID}

ラベル:


 

【EC-CUBE】ファイル構成

EC-CUBEマニュアルサイト
dataフォルダ内のファイル構成
htmlフォルダ内のファイル構成

メール・テンプレートの追加

メールテンプレートは「data\Smarty\templates\」以下に「chmod:0666」で作る。
『管理画面』の「システム設定->マスタデータ管理」から「mtb_mail_template」と「mtb_mail_tpl_path」を設定。

ラベル:


2009年3月28日土曜日

 

【symfony】formのsetDefaults

/* アクション内でフォームのデフォルト値 */
  $this->form = new ModelForm();
  $this->form->setDefault('name', 'value'); 

setDefaults()を使えば連想配列で複数指定できるけど、リセットされるのでモデル内で設定したものが上書きされ無い様に、getDefaults()してそれに追加してから渡すように注意。

と、いう事らしいんだが次のようにモデル、アクション両方で指定した場合、inputタグのvalue属性値のデフォルトは空になった。

/* フォームのデフォルト値 - 失敗 */
  // モデル
  $this->widgetSchema['user_id'] = new sfWidgetFormInputHidden(array(),array('value'=>'3'));
  // アクション
  $this->form->setDefault("user_id", "1");
  // 生成された
  <input value="" type="hidden" name="model[user_id]" id="model_user_id" />

以下であれば大丈夫。

/* フォームのデフォルト値 - アクション内 */
  // モデル
  $this->widgetSchema['user_id'] = new sfWidgetFormInputHidden();
  // アクション
  $this->form->setDefault("user_id", "1");

または

/* フォームのデフォルト値 - モデル内 */
  // アクション
  $this->widgetSchema['user_id'] = new sfWidgetFormInputHidden(array(),array('value'=>'3'));

ラベル:


2009年3月27日金曜日

 

【API】Wassr APIをPHPから

Wassr API Documents - Wassr

とっても判りにくく不親切な気がする仕様書ですが、以下のリンク先を参考にします。

Wassr API -

流れにすると次の様なコードでしょうか。

curl_setopt - PHP マニュアル
/* Wassr APIからcURLでPOST */
  $username = 'username';
  $password = 'password';
  $url = 'http://api.wassr.jp/statuses/update.json';
  $message = 'This is Test.';
  $userpwd = $username.':'.$password;
  $params = array('status' => rawurlencode($message), 'image' => "@image.jpg");

  $ch=curl_init();
  curl_setopt($ch,CURLOPT_URL, $url);
  curl_setopt($ch,CURLOPT_POST, 1);
  curl_setopt($ch,CURLOPT_USERPWD, $userpwd);
  curl_setopt($ch,CURLOPT_POSTFIELDS, $params); // ポストするデータ
  curl_setopt($ch,CURLOPT_HEADER, FALSE); // TRUEにするとヘッダも返す
  curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
  $result=curl_exec($ch);
  curl_close($ch);
  var_dump(json_decode($result));

画像は「multipart/form-data」として送らなくてはいけないようです。「http_build_query()」をリンク先では使って「$params」をPOSTしてますが、配列を渡すことで「multipart/form-data」POSTが出来るので使いません。画像の指定は「@ファイルパス」です。
リンク先のコードはワサチャンネルへPOSTですがURLとパラメータを変えれば同じように出来るのではないでしょうか。

「cURL」を使わない場合のコードです。こちらは「stream_context_create()」を使っております。

/* Wassr APIからストリーム関数でPOST */
  $url = "http://api.wassr.jp/statuses/update.json?";
  $params = "status=". rawurlencode($message);
  $result = file_get_contents($url.$params , false, stream_context_create(array(
      "http" => array(
          "method" => "POST",
          "header" => "Authorization: Basic ". base64_encode($username. ":". $password)
      )
  )));

stream_context_create()」で「multipart/form-data」をヘッダに付けるには「header」に指定するようです。
URLを変更して認証用のヘッダを付ければWassrにPOST出来るかも知れません。試してません。


   $fileHandle = fopen("someImage.jpg", "rb");
   $fileContents = stream_get_contents($fileHandle);
   fclose($fileHandle);

   $params = array(
      'http' => array
      (
          'method' => 'POST',
          'header'=>"Content-Type: multipart/form-data\r\n",
          'content' => $fileContents
      )
   );
   $url = "http://somesite.somecompany.com?someParam=someValue";
   $ctx = stream_context_create($params);
   $fp = fopen($url, 'rb', false, $ctx);

   $response = stream_get_contents($fp);
stream_context_create - PHP マニュアル

関連

(はてな|Tumblr|Twitter|Wassr) APIクラス - さぼてん:2009年3月25日

ラベル:


2009年3月25日水曜日

 

【API】(はてな|Tumblr|Twitter|Wassr) APIクラス

はてな API

はてなAPIを利用するわかりやすいPHPクラス - JAPANOLOGY

「PEAR_HTTP/Request」が必要。

Tumblr API

Tumblr API を使った photo の POST に成功 - minorio のプログラミング・メモ

cURLを使用。
openpearにもあるけどリリースされずに止まってるようだ。

Services_Tumblr - openpear

Twitter API

Services_Twitter

如月 悠希さんが開発したPHP4対応。

Package Information: Services_Twitter - pear

PEARライブラリ。PHP5以降。

Services_Twitter-0.1.0 betaがリリースされたので日本のと比較してみた - sotarok

PHPのバージョンによる書き方の違い以外は、PEARはcURLでリクエストして悠希さんのはsoket。

Services_Twitter - ゆめうつつ

悠希さんの方のインストール・メモ。

Wassr API

Wassr API - よやのじっけんしつ

cURL使用。

関連

cURLを使わずに、PHPでPOSTリクエストを送信する - PHPプロ!ニュース

stream_context_create()」を使う。

Twitter APIの利用とbot作成 - さぼてん:2008年11月29日

ラベル:


2009年3月20日金曜日

 

【symfony】

symfonyのテンプレートコード断片化 - ueblog

スペニット?とか自作のヘルパーやコンポーネントの種類と使用法。

インクルード(include)

静的なHTMLやactionなどに依存しないテンプレート。

/* テンプレート呼び出し */
<?php include(sfConfig::get('sf_app_template_dir').'/footer.php')) ?>

「templates/」ディレクトリ配置。

パーシャル(partial)

actionからの引数を渡せるテンプレート。
ファイル名は「_(アンダーバー)」をつける。

/* パーシャル呼び出し */
<?php include_partial('global/sidebar', array('site' => $site)) ?>

例では「app/application/template/_sidebar.php」。moduleを生成した時に出来る「_form.php」はこれか。
呼び出されるファイルは以下のように変数を使える。

/* 「_sidebar.php」 の例 */
<h1><php echo $site ?></h1>

コンポーネント(component)

パーシャルよりもさらに動的なロジックが必要な場合。action本来の処理とは関係ないプログラムを分ける。
テンプレートやレイアウトそのものじゃなく、それに関わるクラスとか処理。

/* コンポーネント呼び出し */
<?php include_component('news', 'headlines', array('user' => $user)) ?>

コンポーネントスロット(component_slot)

コンポーネントを、呼び出すactionやmoduleによって変化させる。設定は「apps/myapp/config/view.yml」や「app/myapp/module/frontend/view.yml」などにする。(オーバーロードみたいなもんか)

スロット(slot)

テンプレートで部品を繰り返したい時に使う。同じ処理を2度しないで済む様、結果を変数を使わず呼び出せる。

/* スロットの使い方 */

<?php slot('hoge') ?>
  hoge
<?php end_slot() ?>
<?php include_slot('hoge') ?>

ラベル:


2009年3月16日月曜日

 

【symfony】CriteriaでBETWEEN句

次の様な、"BETWEEN"句の条件付SQLをsymfonyで発行したい時。

 /* BETWEEN句を使ったSQL文 */
SELECT * FROM datas WHERE create_ad BETWEEN '2008-09-01 00:00:00' AND '2008-09-30 23:59:59'
// 2008年9月中に作成されたデータ

symfonyのサンプルだと2つの方法が載っている。サンプルは“「$date1」と「$date2」のどちらかがある期間内に含まれるか”という条件で複雑。

Simulating a BETWEEN construct - symfony > Code Snippets

Criteria::CUSTOM

一つは「Criteria::CUSTOM」を使って条件文を直接記述する方法。

 /* BETWEEN句 - Criteria::CUSTOMを使った方法 */
$c = new Criteria();
$date_from = '2008-09-01 00:00:00';
$date_to    = '2008-09-30 23:59:59';
$c->add(TestPeer::CREATED_AT, TestPeer::CREATED_AT." between ".$date1." and ".$date2, Criteria::CUSTOM);

getNewCriterion()

もう一つは「getNewCriterion()」を使って複数の条件をカラムに指定する方法。

 /* BETWEEN句 -  getNewCriterion()を使った方法 */
$c = new Criteria();
$date1Criterion = $criteria->getNewCriterion(TestPeer::CREATED_AT, $date_from, Criteria::GREATER_EQUAL);
$date2Criterion = $criteria->getNewCriterion(TestPeer::CREATED_AT, $to_from, Criteria::LESS_EQUAL);
$date1Criterion->addAnd($date2Criterion);
$criteria->add($date1Criterion);

こんなにも回りくどくなる理由は、add()で一つのカラムに複数条件を指定しても最後のみ有効になる仕様だから。以下のリンクに詳しい。

Symfony Tips:同じカラムのAND条件を作る場合のCriteriaの罠 - 開発人日記
 /* add()でBETWEEN条件指定がうまくいかない例 */
$criteria->add(TestPeer::CREATED_AT, $date_from, Criteria::GREATER_EQUAL);
$criteria->add(TestPeer::CREATED_AT, $to_from, Criteria::LESS_EQUAL); // この条件だけ有効

addAnd()

addAnd()」を使って複数条件を指定する方法でも可能。

 /* BETWEEN句 -  addAnd()を使った方法 */
$criteria->add(TestPeer::CREATED_AT, $date_from, Criteria::GREATER_EQUAL);
$criteria->addAnd(TestPeer::CREATED_AT, $to_from, Criteria::LESS_EQUAL);

getNewCriterion()との違いは判らないが、この方法が良さそうだ。

ラベル:


This page is powered by Blogger. Isn't yours?

登録 投稿 [Atom]

Google