アーカイブ

2009 年 5 月 のアーカイブ

[symfony]Javascriptを用いたリンク処理

2009 年 5 月 29 日 コメントはありません

普通にウェブプログラミングをしていると、ハイパーリンク内で特定のスクリプトのトリガーを引きたくなるときがある。

「戻る」や「ポップアップ」機能がその代表例とも言えるだろう。

symfonyにはjavascriptヘルパーが用意されており、これらを用いると比較簡単にリンク処理をすることができる。

  1.  <?php
  2.  
  3.  echo link_to_function('戻る', 'history.back()');
  4.  // <a href="#" onclick="history.bakc()">戻る</a>
  5.  
  6.  echo button_to_function('削除', 'if confirm("本当に削除してもよろしいですか?"){ do_delete(); }');
  7.  // <input type="button" onclick='if confirm("本当に削除してもよろしいですか?"){ do_delete(); }' value="削除" />
  8.  
  9.  ?>

ちなみにpear内のJavascriptHelper.phpには次のように書かれていた。

  1.  <?php
  2.    /**
  3.    * Returns a link that'll trigger a javascript function using the
  4.    * onclick handler and return false after the fact.
  5.    *
  6.    * Examples:
  7.    *  <?php echo link_to_function('Greeting', "alert('Hello world!')") ?>
  8.    *  <?php echo link_to_function(image_tag('delete'), "if confirm('Really?'){ do_delete(); }") ?>
  9.    */
  10.    function link_to_function($name, $function, $html_options = array())
  11.    {
  12.      $html_options = _parse_attributes($html_options);
  13.  
  14.      $html_options['href'] = isset($html_options['href']) ? $html_options['href'] : '#';
  15.      $html_options['onclick'] = $function.'; return false;';
  16.  
  17.      return content_tag('a', $name, $html_options);
  18.    }
  19.  
  20.    /**
  21.    * Returns a button that'll trigger a javascript function using the
  22.    * onclick handler and return false after the fact.
  23.    *
  24.    * Examples:
  25.    *  <?php echo button_to_function('Greeting', "alert('Hello world!')") ?>
  26.    */
  27.    function button_to_function($name, $function, $html_options = array())
  28.    {
  29.      $html_options = _parse_attributes($html_options);
  30.  
  31.      $html_options['onclick'] = $function.'; return false;';
  32.      $html_options['type']    = 'button';
  33.      $html_options['value']  = $name;
  34.  
  35.      return tag('input', $html_options);
  36.    }
  37.  
  38.  ?>

ヘルパーのファイルを探索すれば、意外に便利なものが見つかるかもしれない。

カテゴリー: javascript, symfony タグ: , ,

[symfony]定数を定義する

2009 年 5 月 16 日 コメントはありません

プロジェクトを開発するにあたり、システムフラグなど定数を定義する必要が出てくる。

symfonyでは

  • プロジェクト全体(全てのアプリケーション)で使える定数
  • アプリケーション内で使える定数
  • モジュール内定で使える定数

の三段階で定数を定義できる。

ちなみに定義するファイルは

  • プロジェクト全体の定数定義は、プロジェクトルート/config/settings.yml(なければ作成する)
  • アプリケーション内の定数定義は、アプリケーション/config/app.yml
  • モジュール内の定数定義は、モジュール/config/mod.yml(なければ作成する)

となっている。

以下はプロジェクト全体の定数定義の例。

  1.  #settings.yml
  2.  all:
  3.    flg:
  4.      off:      0
  5.      on:      1
  6.    default:    0

と定義すると

  1.  <?php
  2.  sfConfig::get('sf_flg_off'); // 0
  3.  sfConfig::get('sf_flg_on'); // 1
  4.  sfConfig::get('sf_default'); //0
  5.  ?>

で値が取れる。

ちなみにsfConfig::get(‘sf_xxxxxx’)で変数を取得でき、
階層に分けている場合は_(アンダーバー)で区切る。
sfの部分は設定ファイルによって、app,modにそれぞれ変るようです。

詳しくはsymfony book 日本語ドキュメント 設定の説明を見てください。

カテゴリー: symfony タグ:

[php]変数を用いてconstの値を取得する

2009 年 5 月 13 日 コメントはありません

変数を用いて定数、メソッドを呼ぶ方法をメモ。

まず以下のようなクラスを考える。

  1.  <?php
  2.  class Hoge {
  3.    const bar = "uho";
  4.    static pubilc function boo($v) {
  5.      echo $v;
  6.    }
  7.  }
  8.  ?>

定数を抜き出したい場合はcall_user_funcではなく、constantを用いて

  1.  <?php
  2.  $model = "Hoge";
  3.  echo constant($model."::bar");
  4.  // uho が出力される
  5.  ?>

とすればOK。

逆にスタティックメソッドを呼び出したい場合は

  1.  <?php
  2.  $model = "Hoge";
  3.  echo call_user_func(array($model, "boo"), "test");
  4.  // test が出力される
  5.  ?>

のようにすればOK。

カテゴリー: php タグ:

[symfony]forward先のアクションに値を渡す

2009 年 5 月 5 日 コメントはありません

forward先のアクションに値を渡したい場合は、まずリクエストに値をsetする。

  1.  $v = "test";
  2.  $this->getRequest()->setParameter('value', $v);
  3.  $this->forward(module, action);

そしてforward先のアクションでgetすればOK。

  1.  $this->getRequestParameter('value');
  2.  // test が取得できる

セッションに入れても渡すことができるが、消し忘れが面倒なのでパラメーターで渡してみた。

カテゴリー: symfony タグ:

[symfony]csvダウンロードを実装する

2009 年 5 月 3 日 コメントはありません

今回はCSVファイルをダウンロードさせる処理をメモ。

Symfony Tips:ファイルダウンロード処理の実装(IE×SSLの罠)によると、CSVファイルに限らずTEXTファイルなどをダウンロードさせる処理を実装する場合は、view.ymlに以下のような設定を追加するらしい。
例:downloadアクションでファイル名data.csvをダウンロードさせる場合

  1.  downloadSuccess:
  2.    http_metas:
  3.      cache-control: public
  4.      pragma: public
  5.      content-type: application/octet-stream; name=data.csv
  6.      content-disposition: attachment; filename=data.csv

なるほど確かにdownloadSuccess.phpが呼ばれると、ダウンロードが始まった。
しかし、実際にエクセルで見てみるとカンマで区切られずに、A1のセルに全部入ってる。

「なぜだー!?」と思い、terapadで開いてみると、

  1.  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2.  ・・・・・
  3.  ・・・・・

という文字列が目に入った。

・・・・layout.phpを読みこんどる・・・・・・

ってなわけでview.ymlを以下のように修正した。

  1.  downloadSuccess:
  2.    http_metas:
  3.      cache-control: public
  4.      pragma: public
  5.      content-type: application/octet-stream; name=data.csv
  6.      content-disposition: attachment; filename=data.csv
  7.    has_layout: off

こうすることによってlayoutが読み込まれなくなり、エクセルでもきちんと表示できた。

symfonyではデフォルトでuploadsディレクトリが定義されているが、downloadsディレクトリが定義されていない。
そういったとこからも、やはりダウンロードファイルはテンプレートで作れということなのだろう。

カテゴリー: symfony タグ: ,

[symfony]Insertしたデータのプライマリーキーを取得する

2009 年 5 月 3 日 コメントはありません

今回はInsertに関するメモ。

新規登録されたレコードのプライマリーキーを取得するには

  1.  <?php
  2.  $id = SamplePeer::doInsert($this->sample);
  3.  ?>

とやれば、新規登録したレコードのPKを返してくれる。
ログインなどの処理で、ユーザーを新規登録してそのままセッションにidを持たせたいときに便利。

ちなみにBaseSamplePeerのdoInsertは次のように書かれていた。

  1.  <?php
  2.  public static function doInsert($values, $con = null) {
  3.    if ($con === null){
  4.      $con = Propel::getConnection(self::DATABASE_NAME);
  5.    }
  6.    if ($values instanceof Criteria) {
  7.      $criteria = clone $values;
  8.    } else {
  9.      $criteria = $values->buildCriteria();
  10.    }
  11.    $criteria->setDbName(self::DATABASE_NAME);
  12.    try {
  13.      $con->begin();
  14.      $pk = BasePeer::doInsert($criteria, $con);
  15.      $con->commit();
  16.    } catch(PropelException $e) {
  17.      $con->rollback();
  18.      throw $e;
  19.    }
  20.    return $pk;
  21.  }
  22.  ?>

上記のコードからもプライマリーキーを返していることがわかる。

カテゴリー: symfony タグ:
Get Adobe Flash player