suzukiのCakePHPブログ -4ページ目
<< 前のページへ最新 | 1 | 2 | 3 | 4

URLの取得方法

手っ取り早く$_SERVER['SERVER_NAME']で取得してみた。

"http://www.".$_SERVER['SERVER_NAME'].$html->url("");

ちなみに$_SERVER['SERVER_NAME']は
http://www.php.net/manual/ja/reserved.variables.php#reserved.variables.server
こちらにあるようにサーバのホスト名なのでサーバの設定によっては取れないこともあるのかも。

フレームワークの情報が見たいんだけど…

フレームワークの情報が見たいんだけど…

そんなときは、
viewで<?PHP pr($this); ?>でOK

コントローラ名、アクション名、モデル名などなど、
取得できる情報を一通り得られるよね。

AuthComponentの改造

追記2に修正を書きました

AuthComponentのパスワード自動ハッシュ化がネックになった。

詳細はねねとまつの小部屋さんをご覧頂くとして、

※stable版では、Auth->allow()に指定すれば、Model内のvalidationを使えるようになりそうです(2008/3/17更新)

とのことであるから、AuthComponentを上記の通りに改造しちゃえというのがこのエントリーの趣旨。

まずは(もう昨日の時点でやってあるんだけど)、
/cake/libs/controller/components/auth.phpを/app/controller/components/auth.phpにコピー。
で、これを編集する。
※stableになったらapp側を消すだけでいいからね。そういうことでしょ?

Auth.phpの

$this->data = $controller->data = $this->hashPasswords($controller->data);

これを、

  if ($this->allowedActions == array('*') || in_array($controller->action, $this->allowedActions)) {
   return false;
  }

これの後ろにもっていくだけ。
おそらく、Auth->arrowに設定されたアクションならここでリターンされちゃうんで、
その後ろに書けば最初のAuth->hashPasswordsを書けば、
Auth->arrowに指定したアクションではhashPasswordsは発動しないというわけだ!

でも、自信が無いのでおかしい点に気づいた方がいらっしゃいましたら
指摘していただけると幸いです。
って、誰も見てないでしょうけども。

追記1

上記でいいかな~と思ったら、ユーザの追加がうまくいかない。
passwordの項目をはずすとUser->saveがうまくいくので、
Auth関係であることは間違いなさそう。
原因がわかったらまた書きます。

追記2

よくわからんけど、
どうやら

$this->data = $controller->data

これが無いとsaveがうまくいかないことがわかったので、
以下のように修正(function startupね)

  $this->data = $controller->data = $this->hashPasswords($controller->data);

  if ($this->allowedActions == array('*') || in_array($controller->action, $this->allowedActions)) {
   return false;
  }

  if ($this->allowedActions == array('*') || in_array($controller->action, $this->allowedActions)) {
   $this->data = $controller->data;
   return false;
  }
  $this->data = $controller->data = $this->hashPasswords($controller->data);

これでようやく動くようになった..

と、いうことはですよ?
よくわかってないんだけど、
Authで指定されたモデルはAuthの$this->data経由でsaveされるってことなのかな?

AuthComponentのredirectでハマった

AuthComponentの$loginRedirectを設定しているのに設定しているパスにリダイレクトしてくれない…。

Auth.phpのソースを見てみたら、なんかセッションのAuth.redirectに、
$controller->referer()で取得したリンク元パスを設定していて、そのパスにリダイレクトしているようだ。

そこで、(ひどいやり方かもしれないけど)
ログイン時に$this->Session->del(Auth.redirect);してやった。

とりあえず、意図するとおりに動くようになった。

$loginRedirectはリファラが無い場合のみ機能するってことでいいのかな?

validateエラー出力方法

$this->validationErrors
でOK

$form->datetimeの改造

cake/lib/views/helpers/form.phpを
app/views/helpers/form.phpにコピー

function __generateOptionsの修正

   case 'month':
    for ($i = 1; $i <= 12; $i++) {
     #$data[sprintf("%02s", $i)] = strftime("%B", mktime(1, 1, 1, $i, 1, 1999));
     ↓
     $data[sprintf("%02s", $i)] = strftime("%m", mktime(1,1,1,$i,1,1999));
    }
   break;

これで、$form->datetimeが出力する月リストが数字になる

function dateTimeの修正

  #$attributes = array_merge(array('minYear' => null, 'maxYear' => null, 'separator' => '-'), (array)$attributes);
  ↓
  $attributes = array_merge(array('minYear' => null, 'maxYear' => null, 'separator' => null), (array)$attributes);
  ※デフォルトを"-"からnullへ

下のほう

   #$opt = implode($separator, $selects);
   ↓
   if (!isset($separator)) {
    $glue = array("年", "月", "日", "時", "分", "秒");
    $i = 0;
    foreach ($selects as $select) {
     $opt .= $select.$glue[$i];
     $i++;
    }
   } else {
    $opt = implode($separator, $selects);
   }

これで、セパレーターがnullなら年月日で並ぶようになる

<< 前のページへ最新 | 1 | 2 | 3 | 4