自宅Windows では、当然 MSOffice を利用してきた訳だが、よく考えるとバージョンは2003。会社では2007→2010を使用しているのだが、どうしても馴染めずに違和感すら感じるようになった。
そこで、Macに移行したこともあるので、Mac & Windows の両方で、OpenOffice を使用すれば、何の問題もないのかと思い、これから実行してみる。
とりあえず、下記サイトからダウンロード。
使い勝手は、後日報告したい。
自宅Windows では、当然 MSOffice を利用してきた訳だが、よく考えるとバージョンは2003。会社では2007→2010を使用しているのだが、どうしても馴染めずに違和感すら感じるようになった。
そこで、Macに移行したこともあるので、Mac & Windows の両方で、OpenOffice を使用すれば、何の問題もないのかと思い、これから実行してみる。
とりあえず、下記サイトからダウンロード。
使い勝手は、後日報告したい。
下記エラー発生。3日程ハマった。
csrf token: Required.
基本的には、バインド (sfForm::bind) の使用の仕方を理解していなかった。
formクラスに下記の要素名定義を行っていなかった為にバインドがうまく行かずに、バリデーションエラーとなっていた。
アクションクラス
class HogeAction extends sfActions { public function executeIndex(sfWebRequest $request) { //フォーム生成 $this->form = new HogeForm(); if($request->isMethod(sfRequest::POST)) { $this->form->bind($request->getParameter('hoge')); if($this->form->isValid()) { $hoges = $this->form->getValues(); $hoge = $hoges['hoge']; // $this->getUser()->setFlash('hoge', $hoge); $this->redirect('next/foo'); } } }
フォームクラス
class HogeForm extends BaseForm { public function configure() { //フォーム設定 $this->setWidgets(array('hoge'=> new sfWidgetFormInput())); //バリデーション設定 $this->setValidators(array('hoge'=> new sfValidatorString())); //要素名定義 $this->widgetSchema->setNameFormat('hoge[%s]'); } }
アクションクラス内で、各アクション共通の変数を持たせたかったのだが、普通は下記のメソッドを使用するらしい。
public function preExecute() { //共通処理 $this->common = "共通変数"; } public function executeIndex1() { //ログ出力 $this->getLogger()->info($this->common); } public function executeIndex2() { //ログ出力 $this->getLogger()->info($this->common); }
滅多に変更しないが覚え書き。
SQL> ALTER TABLE old_table RENAME TO new_table;
sfMelodyPluginについては、正直言って、使用をほとんど諦めているのだが、続けられるところまでと思って、前回の続き。下記認証画面が表示されるところまで辿り着いた。
するとエラー。
500 | Internal Server Error | Doctrine_Record_UnknownPropertyException Unknown record property / related component "field1" on "sfGuardUser"
だけど見事にコールバックされているようだ。うれしい。それでコールバックされてURL欄を見てみると、確かに oauth_token と oauth_verifier が発行されている事に気付く。
http://local.whoocus.com/frontend_dev.php/access/twitter?oauth_token=Zl9fNdYadhdbuc&oauth_verifier=5R65EtJ66NtAlDu5F4k
結局のところ、sfDoctrineGuardPlugin の使用方法に問題がありそうだ。今回はまた出直そうと思う。
ちなみに、この oauth_token とは、twitter がアプリ認証の際に、ユーザに対して発行されるリクエストトークンと呼ばれる文字列である。つまり、sfDoctrineGuardPlugin の仕組みの中で、ユーザ登録と同時に、このリクエストトークンを自サイトのユーザ情報として保持しなければならないのだろうと推測する。
とりあえず、Doctrine_Record_UnknownPropertyException を調べる事とする。
その後、symfony や OAuth認証それ自体の理解不足という事で勉強していた。sfMelodyPlugin の使用をあきらめかけ symfony と関係なくtwitteroauthという有名らしい phpライブラリを試してみた。
認証の仕組みを何となく理解し、早々と sfMelodyPlugin の使用に戻ってみると、どうやら自分のrouting.yml の設定が悪いらしい。もう一度 symfony の routing をおさらいして設定。
すると、以前は、twitterのエラー画面に飛んでいた画面が、下記のお馴染みの画面と連携できた。
原因不明だが、以前エラー画面に飛んでいた時は、下記パラメータのoauth_token=xxxxxxxxxxxxxxxx が送信できていなかったようだ。
https://api.twitter.com/oauth/authorize?param1=value&oauth_token=xxxxxxxxxxxxxxxx
今回はうまくリクエストを送信できたようだ。詳細は、また調査後に記述しようと思う。一歩一歩進んでいる。
続きはまた後日・・・。
※その後の調査の結果、筆者はWindows と Mac それぞれで開発しているのだが、Mac だとうまく上記 oauth_token=xxxxxxxxxxx パラメータ付きでリクエストされる。Windows で開発した場合はどうしてもパラメータが付加されずに下記画面になってしまう。
尚も原因不明である。
symfony へのプラグイン登録は、対象プラグインを、pluginディレクトリに配置し、 config/ProjectConfiguration.class.php に登録する。
class ProjectConfiguration extends sfProjectConfiguration { public function setup() { $this->enablePlugins(array( 'sfDoctrinePlugin', 'sfDoctrineGuardPlugin', 'sfDoctrineOAuthPlugin', 'sfMelodyPlugin')); } }
※注意 この記事は現在調査を進めながら記述していますので、完全な情報ではありません。
sfMelodyPlugin のReadmeも理解できないし、情報サイトもほとんどないし、使用方法が全く分からないので、ソースコードを追ってみることにした。
とりあえず、わかったことは、下記の継承関係が存在する。ライブラリ的には依存関係。
■OAuth関係
class sfOAuth1 extends sfOAuth { }
class sfMelody1 extends sfOAuth1 { }
class sfTwitterMelody extends sfMelody1 { }
■ユーザ関係
interface sfSecurityUser { }
class sfUser implements ArrayAccess { }
class sfBasicSecurityUser extends sfUser implements sfSecurityUser { }
class sfGuardSecurityUser extends sfBasicSecurityUser { }
class sfMelodyUser extends sfGuardSecurityUser { }
class myUser extends sfMelodyUser //class myUser extends sfBasicSecurityUser { }
つまり、親クラスのメソッドや変数(属性)を利用可能ということ。
で、README にある下記のコードは、ユーザを通してメソッドを使用するということのようだ。
public function executeIndex(sfWebRequest $request) { //ユーザを取得しサービスに接続する $this->getUser()->connect('twitter'); //app.yml に登録したサービス名 }
ということは、下記コードはインスタンスを得られるという事なのか?
$melody = $this->getUser()->getMelody('twitter');
どうしても、Alias と Namespaces の使用方法が理解できない。
また行き詰った・・・。
Symfony1.4 で連携を語る前に、そもそものtwitter API を利用するために登録していなかったし、twitter API の仕組みも理解していない。ということで、早速 twitter API の開発者用サイトへ移動する。
とりあえず、お決まりで ①のGet Started をのぞいて見る。
1番目のExplore the API with the Web Console は開発で利用できそうなコンソール画面。
2番目のLearn all about API authentication はOAuth認証の解説ドキュメント。
3番目のRegister your own Twitter application はアプリの登録画面らしい。
移動すると登録画面。登録できそうな項目のみ登録してみた。自分はアプリのURLを仮で登録しておいた。
後で変更できるようなので、気軽に登録してみるとよい。
Callback URLとか決まってないしね。
無事に登録できると、開発に必要な情報が設定画面に表示される。
設定画面はお見せできないが、前画面にて設定した下記情報が閲覧できる。
どこで何を使用するかは未だ不明だが、とりあえず、これで開発に取り掛かれそうだ。
※注意 この記事は現在調査を進めながら記述していますので、完全な情報ではありません。
Symfony1.4 で連携しようと思ってたどり着いた sfMelodyPlugin。
Symfony1.4 の使用方法も間々ならないままにplugins/sfMelodyPlugin ディレクトリにインストール。中にある英語のREADME.txt を読んでみる。
一般的には下記のコマンドでインストールできるようだが、PEARが効かない環境なので一式配置。
$ php symfony plugin:install sfMelodyPlugin
キャッシュをクリアして、
$ php symfony cc
sfMelody を settings.yml に設定する。
ちなみに、Doctrine使用の場合、sfDoctrineOAuthPlugin と sfDoctrineGuardPlugin が必要らしい。
sfMelody と同様に pluginsディレクトリに配置した。
all: .settings: enabled_modules: [default, sfGuardAuth, sfMelody]
適用するアプリケーションにあるmyUser.class.php の継承元を変更する。
apps/my-app/lib/myUser.class.php:
class myUser extends sfMelodyUser //class myUser extends sfBasicSecurityUser { }
app.yml を設定する。
all: melody: create_user: false # 対象サービス(twitter等)に接続した時にログオンできない場合新規作成するかどうか redirect_register: false # 登録画面にリダイレクトするかどうか twitter: #name key: my_service_key # twitter で発行されたコンシューマー・キー(API key)を記述 secret: my_secret_key # twitter で発行されたコンシューマー・シークレットを記述 callback: @mymodule_index # コールバックURLを記述 #オプション (↓↓↓↓↓調査中↓↓↓↓↓↓) user: # to create an user field_1: call: xx call_parameters: [x, x, x] path: xx.xy.zz prefix: xx_ suffix: _xx key: false ... provider: twitter #対象サービス名 (他google / facebook等) request_token_url: https://api.twitter.com/oauth/request_token # リクエスト・トークンURL request_auth_url: https://api.twitter.com/oauth/authorize #URLを許可する access_token_url: https://api.twitter.com/oauth/access_token #アクセス・トークンURL # (↓↓↓↓↓調査中↓↓↓↓↓↓) namespaces: # namespaces are used to make some api calls - see namespace Section ns1: http://my.name.space ... aliases: # Alias is an easy way to simplify api calls me: my/alias ... auth_parameters: param1: value call_parameters: param1: value access_parameters: param1: value output_format: json create_user: true redirect_register: false #optional only for OAuth 1 request_parameters: param1: value request_token_url: https://api.twitter.com/oauth/request_token # リクエスト・トークンURL
まだ何もわからないまま、アプリケーションを実行してみる。呼び出すべき actions.class に接続のアクションメソッド(executeIndex)とCallbackを受けるアクションメソッド(executeShow)を記述。
public function executeIndex(sfWebRequest $request) { $this->getUser()->connect('twitter'); //nameで指定した名前 } public function executeShow(sfWebRequest $request) { $this->me = $this->getUser()->getMelody('twitter')->getMe(); }
それに伴いrouting.yml も設定する。
twitter_callback: url: /:module param: { action: show }
すると、何やら sfOAuth1 が見つからないとのエラー。実際のファイルが sfDoctrineOAuthPlugin に無いのかなと予測したらやはり無い。どうやら OAuthBase のモジュールが別途必要なようだ。急いでダウンロードしたらこのエラーは無くなった。
しかし次のエラー
Fatal error: Call to undefined function curl_init()
どうやらphpにて、cURLが有効になっていない模様。
php.ini で同モジュールを有効にしてApacheの再起動したらtwitterページにリダイレクトできました。
エラー画面なので連携とまではいけませんでした。
まだまだ、完全な連携には程遠いのですがちょっと感動です。
続きは後日・・・。
■参考サイト
Symfohub