[symfony]ドラッグ&ドロップの処理を実装してみた

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

フリッカーのグルーピングのようなドラッグ&ドロップで画像を操作する機能を実装したいと思い、色々と調べてみた。

symfonyのJavascriptヘルパーの中身を調べていたら

draggable_element()
drop_receiving_element()

の2つのヘルパーで実装できることが判明。

まずはドラッグするための機能を説明する。

  1.  <div id="product_list" class="product">
  2.  <?php foreach($products as $id => $title): ?>
  3.    <?php echo image_tag('product'.$id, array(
  4.      'id'    => 'product_'.$id,
  5.      'alt'  => $title,
  6.      'class' => 'products'
  7.    )) ?>
  8.    <?php echo draggable_element('product_'.$id, array('revert' => true)) ?>
  9.  <?php endforeach ?>
  10.  </div>

draggable_element(ドラッグさせたい要素のid, [オプション])
で指定した要素をドラッグ出来るようになる。

draggable_elementは次のパラメーターを受け取る。

パラメーター 説明
revert trueに設定した場合、要素が放たれたときに元の位置に戻るようになる。
また任意の関数を呼び出すことも可能。
ghosting 要素をクローンして、要素が放たれても元の位置に戻らないようになる。
snap falseに設定した場合、スナッピングされない。

次にドロップの機能を説明する。

  1.  <?php forearch ($labels as $label) : ?>
  2.  <div id="label_<?php echo $label->getId() ?>">
  3.  <span id="count_<?php echo $label->getId() ?>">0</span>
  4.  <span id="indicator_<?php echo $label->getId() ?>">loading now....</span>
  5.  <?= drop_receiving_element('label_'.$label->getId(), array(
  6.    'url' => 'blg/add?label_id='.$label->getId(),
  7.    'accept' => 'product',
  8.    'update' => array(
  9.      'success' => 'count_'.$label->getId(),
  10.      'failure' => 'error_'.$label->getId()
  11.    ),
  12.    'method' => 'GET',
  13.    'hoverclass' => 'label-active',
  14.    'script' => 'true',
  15.    'confirm' => '"'.$label->getLabelName().'に追加しますが、よろしいですか?"',
  16.    'loading' => 'Element.show("indicator_'.$label->getId().'")',
  17.    'complete' => 'Element.hide("indicator_'.$label->getId().'")',
  18.  )) ?>
  19.  </div>

drop_receiving_element(ドロップさせたい要素のid, [オプション])
で指定した要素をドロップ出来るようになる。

drop_receiving_elementは次のパラメーターを受け取る。

パラメーター 説明
url ドロップされたときに実行するurl
accept ドロップさせる要素を文字列またはcssクラスで指定する。
update 更新する要素を指定する。配列を指定することで成功時と失敗時の要素を指定できる。
method POST、GETなどを指定する。
script trueの場合、指定したアクションでjavascriptを実行できる
hoverclass 要素をドラッグしている最中(ドラッグしているがドロップはしていないとき)のcssクラスを指定する
confirm 確認ダイアログに表示する文字列を指定する

またdrop_receiving_elementに限ったことではないが、
symfonyのajaxヘルパーには以下のようなコールバックのトリガーが設定されている。

コールバック 説明
before クエストが初期化される前
after リクエストが初期化された直後で読み込まれる前
loading ブラウザからのデータでリモートの文章が読み込まれているとき
loaded ブラウザがリモートの文章を読み込み終えたとき
interactive ユーザーが読み込みを終えずにリモートの文章とやりとりしているとき
success XMLHttpRequest が完了し、HTTP ステータスコードが 2XX のとき
failure XMLHttpRequest が完了し、HTTP ステータスコードが 2XX でないとき
404 url が 404 ステータスを返すとき
complete XMLHttpRequest が完了したとき ( 失敗であろうと成功であろうと )

参考:第11章-Ajaxの統合
    symfony book 日本語ドキュメント Javascriptヘルパー

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

[symfony]cookieを使う

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

symfonyでクッキーを使うには次のようにすればよい。

  1.  <?php
  2.  // アクション内で取得する方法
  3.  // cookieをセット
  4.  $this->getResponse()->setCookie();
  5.  // cookieを取得
  6.  $this->getRequest()->getCookie();
  7.  
  8.  // クラスを選ばない取得方法
  9.  // cookieをセット
  10.  sfContext::getInstance()->getResponse()->setCookie();
  11.  // cookieを取得
  12.  sfContext::getInstance()->getRequest()->getCookie();
  13.  ?>

個人的には後者のやり方で統一するほうが好きw

カテゴリー: symfony タグ: ,

[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 日 コメント 1 件

今回は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 タグ:

【就活】Yahoo! Japan

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

ヤフーの最終面接が終わったのでメモ。

・説明会(システム開発経験者用?)

私が行った説明会はシステム開発経験者専用みたいなことを言われ、ちょっと選考過程が異なるかもしれません・・・
その辺はあしからずw
内容は会社説明と簡単なGD。選考には関係ないと思われます。

・筆記テスト

前回の説明会参加者のみ参加できるちょっと早い筆記テスト。会社説明会も兼ねていました。
問題は非常にユニークなものでした。
1つはロジックテストで、

・「風が吹けば桶屋がもうかる」のようなテスト
⇒「電車が24時間運行になると」⇒○⇒○⇒○⇒○⇒「日本人の寿命が延びる」というもので、間の4つをロジックが通るように考えるテストでした。

・ドラえもんの飴玉問題
⇒詳しくは覚えていないが、うそつきを判別する判断推理だった。上・中級公務員 標準判断推理―確かな解答力が身につく“基本書”をやっておけばまず間違いなく解けます。

という内容でした。

2つ目はプログラム、数列、暗号などを総合的に盛り込んだ問題。
内容は多岐に渡り、覚えている限りでは以下の問題がありました。

・4つの数字を四則演算して10にする
・あなたはyahooに入社して1年目の社員です。家でyahooのあるサービスが止まっていることに気づきました。どうしますか?
・プログラムリストの穴埋め
・フローチャートでプログラムを記述
・エラーページ401,403,404,500の意味は?

しかし知人はほとんど出来なくて内定もらっているので、あんまり関係ないかも。

・一時面接(ES持参)

2月中旬に一次面接。
ESの項目は以下の通りです。

・興味を持って取り組んだ授業について具体的に記入してください
・普段、インターネットをどのように活用していますか?
・個人作成のウェブサイトがある場合はURLを記入してください
・保有資格
・あなたが学生時代に最も打ち込んだこと
・入社後すぐに活かせると思う自分の強みを記入してください
・入社3年後にヤフーでチャレンジしたいことと、そのために必要だと思うことを記入してください

これらをA4に2枚でまとめる。イラレとかフォトショでやると差別化できると思います。

面接での質問内容は以下の通りです。

・どのような業界を受けてる?
・なぜヤフー?
・ヤフーのサービスは何か使ってますか?(メールやオークションなど有名なやつ以外で)
・改善したほうがいいと思うサービスは?
・入社後やりたいことは?
・質問

ベンチャー企業でどっぷりウェブシステムを開発しているだけに、なぜエンジニア?という質問はされなかった。

・筆記試験

これはヤフー指定の受験会場に行ってやりました。
内容は

・テストセンターとまったく同じテスト
・TAL

の2つで、
TALの方はSPIノートの会:ウェブシリーズ3
に詳しく載っているので参考にすることをお勧めします。

・最終面接(3対3)

最終面接は開発部長クラス2、人事部1と学生2~3のグループ面接。
聞かれたことは

・自己PRをキーワード3つで
・ヤフーに入ったら何をしたいのか?入れなかったらどこで何をしたいのか?
・得意なプログラミング言語とそれを学ぶ上で困難だったこと
・チームで開発した経験のある人はチームでの役割を、ない人はプログラミングする際に気をつけたこと
・ヤフーのサービスで改善したほうが良いと思う点は?
・質問タイム

最初の2点は人事部から、他は部長クラスからの質問でした。
4人で40分くらいだったので、簡潔に話せるかが重要だと思います。

・内々定

最終面接から2日後にリクナビ宛にメールが来ており、次回また来社してくれとのことでした。
他の就活サイトで来社のお願い=内々定ということを知っていたので、内々定の気分でミッドタウンの本社に向かいました。
人事の方との1対1の面接で、遠まわしに内々定と言われます。現在の選考状況を伝えたら2週間は待ってくれるとのこと。
あとは履歴書の確認や募集要項の確認などをして、面接は30分程度で終わりました。

まとめ

学歴不問ということもあり、他の企業と比べ中堅私大の人数が多かったような気がします。
ただオフィスは綺麗ですし、和やかな雰囲気でしたので好印象でした。

カテゴリー: 就活 タグ:

【就活】アビームコンサルティング

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

先日アビームコンサルティングの最終面接が終わりました。

面接で聞かれたこととかをメモ。

・ES、適性検査

ESは以下の通り。

・学生時代であなたが最も誇りを持てる成果は何ですか?成果を挙げるために努力したこと、工夫したことを教えてください (全角 400 文字以内)
・今までの人生で最大のピンチは何ですか?そのピンチをどのようにして乗り越えたのかを教えてください (全角 400 文字以内)
・チームで協力して一つのことをやり遂げた経験はありますか?そこであなたが感じたチームで成果をあげることの魅力について教えてください。 (全角 200 文字以内)
・あなたは今、何のプロフェッショナルですか? (全角 200 文字以内)

適性検査は普通に難しくて6割ちょいしかできなかったけど通った。2chとかで東大生が落ちているところを見ると性格診断重視だと思われます。

・GD

お題は「金融危機の中、ビジネスマンとしてどうすべきか?」というもの。
発表がなかったのでリーダーとかを決めずに自由に討論する形式にしました。

GDともかく自分の価値を示すために有効な発言をすることが重要だと思います。
私は他人の意見の修正やまとめを適時やっていました。

・GI、小論文

学生3、社員2のグループインタビュー。
聞かれたことは

・自己紹介
・強みと弱み
・チームで何かを成し遂げた経験
・今まである業務を改善し、結果をもたらした経験
・質問タイム

で約1時間弱。
話の中身というよりはロジックが通っているかを見ていたような気がします。

小論文のテーマは毎回異なるらしく、私たちの回は「ネット犯罪を失くすためにどうしたらよいか?」というものでした。
30分だったので最初の10分で構成を考えて残りの20分で書き、ネット犯罪を失くすための手段と自分の付加価値をつけるため、ネット犯罪の被害者に対する対応策も考えました。

・最終面接(プリンシパル面接・人事面接)1:1

最終は1日で2回面接しました。
P面では人間性、コンサルとしての適正を見られていた気がします。
質問内容としては、

・ITコンサルに抱いていたイメージは
・ITコンサルですぐに活かせる強みとまだまだ駄目だと思う弱み
・人間性としてまだまだだなと思う点
・将来のビジョンは?
・質問タイム

という流れでした。

人事面接の質問内容は

・他にどのような会社を受けているか?
・会社選びの基準は何か?
・学生時代頑張ってきたこと
の3点。

ATSから内定をもらっていると伝えたら、なるべく早く連絡するとの回答。

まとめ

ITコンサルファームの中では一番人の雰囲気が良く、面白い会社だと思いました。
ちなみに私たちの年代はちょうど金融危機が直撃し、内定者も200人から50人に減りましたね・・・、NECの影響もあるかもしれません。

カテゴリー: 就活 タグ:
Get Adobe Flash playerPlugin by wpburn.com wordpress themes