いろいろ細かい調整やら修正やら(CakePHP修行 #36)

SPONSORED LINK

Pocket

さてCakePHP修行。ひさびさに青い人に添削してもらいました。うれしす。ありがとう!

さて、それもこれも含め、次のステップに進む前に気になる部分が出てきたので細かいところを直しちゃいます。

■ Password生成関数について

「パスワードを忘れた方は」を実装したい(CakePHP修行 #22)』のコメント欄にて高田さんに次のようなコメントをいただきました。

初期パスワードを作るときに、「1」と「l(小文字のL)」や「o(小文字のO)」と「O(大文字のO)」と「0(数字の0)」のような似てる文字(フォントによって判別が難しい・・・)は適用しないようにしておくと少し幸せかもです。

おお・・・なるほどです。早速パスワード生成関数を修正しました。確かに重要ですね。ありがとうございました!

■ DBに依存しないフィールドはHTMLヘルパーなしで

青い人にずっと前に指摘された「DBに依存しないフィールドは手打ちで」という教え(詳細はこちら)をすっかり失念していました・・・。普通に書いて$this->params[‘form’][‘なんたら’]で取得できるのでしたね。

ログイン画面での「save my info?」のチェックボックス、それからプロフィール変更画面での画像削除チェックボックスは手打ちし、該当するコントローラーを修正しました。

■ Viewのテンプレート化をもちょっとすすめる

ページのテンプレートは現在/views/layout/default.thtmlでまかなっていますが、ログイン画面にあわせたレイアウトなので、ログイン画面以外では冗長なコードになってきました(メニューを何回も書いているとか)。そこでログイン系とそれ以外のテンプレートを分けて管理することにします。

なお、管理する際には下記のjakkさんのコメントを参考にさせていただきました。

もうご存知かもしれませんが
レイアウトは
$this->layout = “default”;
でかえれます。
挫折しないことをいのります(・人・

コントローラー内のlogin()、resetPwd()については以下の一行を追加。別のテンプレートを使うように指示します。

$this->layout = 'login_default';

そしてページ数の多いほうで使うdefault.thtmlはelementなども使い下記のように修正。その際にはHTMLヘルパーが良くまとまっているこちらのページも参考にしました(docTypeとか一部動かなかったけど)。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<?php echo $html->charset('utf-8'); ?>
<meta name="keywords" content="">
<meta name="description" content="">
<script type="text/javascript" src="/js/jquery.js"></script>
<?php echo $html->css('core'); ?>
<link rel="shortcut icon" href="/favicon.ico" />
<title><?php echo $title_for_layout; ?></title>
</head>
<body>
<div id="container" class="clear"> 
<?php echo $this->renderElement('header'); ?>
<div id="my_page" class="clear">
<h2><a href="/users/home/"><?= h($me['User']['name']); ?></a></h2>
<div id="contents">
<?php if (isset($sys_msg)) { ?>
<div id="sys_msg"><?= $sys_msg; ?></div>
<script>
$(document).ready(function() { $("#sys_msg").fadeOut(2000); });
</script>
<?php } ?>
<?php echo $this->renderElement('menu'); ?>
<?php echo $content_for_layout ?>
</div><!-- /contents -->
</div><!-- /my_page -->
</div><!-- end of container -->
<?php echo $this->renderElement('footer'); ?>
</body>
</html>

■ モデルのafterFind()を使う

プロフィール画像の幅とか高さとかファイル名とか表示するたびにいちいち計算するのが面倒なのでafterFind()に突っ込んでみます。

次のコードでうまくいったぽい。これでいいのかな>青い人?

まずは/models/user.php。afterFind()を追加。

function afterFind($results) {
  foreach ($results as $key => $val) {
    if (!empty($val['User']['pic'])  && file_exists(WWW_ROOT."pics".DS.$val['User']['pic'])) {
      $imginfo = getimagesize(WWW_ROOT."pics".DS.$val['User']['pic']);
      $results[$key]['User']['pic_loc'] = DS."pics".DS.$val['User']['pic'];
      $results[$key]['User']['pic_width'] = $imginfo[0];
      $results[$key]['User']['pic_height'] = $imginfo[1];
    } else {
      $results[$key]['User']['pic_loc'] = DS."pics".DS."uploadyourphoto.gif";
      $results[$key]['User']['pic_width'] = 50;
      $results[$key]['User']['pic_height'] = 50;
    }
  }
  return $results;
}

次にControllers&Views。コントローラーから画像に関するコードを削除、Viewsの方は次のように変更。これですっきり。

<img src="<?= $me['User']['pic_loc']; ?>" width="<?= $me['User']['pic_width']; ?>" height="<?= $me['User']['pic_height']; ?>" border="0" alt="" />

モデルの中でこうやるの便利だな・・・コードがもうちょっと複雑になってきたら積極的に使ってみよう。

■ 重大なセキュリティホールをふさぐ

青い人に指摘されたセキュリティホール、ふさがなくちゃですね。ちょっと長くなったのであとでやる。

※ CakePHP修業は百式管理人がSNSっぽいものをCakePHPで作ろうとして挫折するまでの日記です。前回までのあらすじはこちらへ。

ツイッターもやっています!

SPONSORED LINK

  1. No comments yet.

  1. No trackbacks yet.