アーカイブ : 2014年 4月

CakePHPでログアウト処理を呼び出したい

CakePHPでAuthコンポーネントを利用してログイン管理をしていて

退会処理を行った場合の実装で、コントローラーから

ログイン処理を呼び出したいということがあったのでメモ。

想像通り、簡単でした。

$this->Auth->logout();

を実行するだけでした。

退会しても、ユーザー情報は物理削除したくないので

usersテーブルに削除フラグを設定しておき、

「退会」のタイミングでこれを「2」に更新します。

退会用のページを作成し、退会理由を尋ねるための質問を用意します。

質問に回答してもらい、退会処理を実行します。

その退会処理の実装です。

$this->request->data['Entrepreneur']['delete_flg'] = '2';
if ($this->Entrepreneur->save($this->request->data, array('validate'=>false))) {
  $this->Auth->logout();
  return $this->redirect(array('action' => 'cancel_comp'));
} else {
  $this->Session->setFlash(__('退会処理に失敗しました。再度お試しください。'));
}

削除フラグを「2」に更新した後、ログアウト処理を実行し

退会完了画面に飛ばします。

ログアウトした状態になるので、

cancel_compはログインしていなくてもアクセスできるようにしておきます。

function beforeFilter() {
  parent::beforeFilter();
  $this->Auth->allow('cancel_comp');
}

CakePHPのradioボタンで、選択肢の後ろにbrタグを入れて改行させたい

CakePHPのradioボタンで、選択肢が長い場合等、

brタグを後ろに入れて改行したいことがあるかと思います。

そんな場合は、separatorを使用します。

<?php
$calcel_flg_arr = array("1"=>"機能が使いづらい、分かりづらい", "2"=>"参考にならなかった", "3"=>"使わなくなった", "4"=>"運営方針に不満があった", "5"=>"その他");
echo $this->Form->input('cancel_flg', array("type"=>"radio", "options"=>$calcel_flg_arr, 'separator' =>'<br />'));
?>

以下のようなHTMLを吐き出してくれます。

<input type="hidden" name="data[Entrepreneur][cancel_flg]" id="EntrepreneurCancelFlg_" value=""/>
<input type="radio" name="data[Entrepreneur][cancel_flg]" id="EntrepreneurCancelFlg" value="1" />機能が使いづらい、分かりづらい<br />
<input type="radio" name="data[Entrepreneur][cancel_flg]" id="EntrepreneurCancelFlg1" value="2" />参考にならなかった<br />
<input type="radio" name="data[Entrepreneur][cancel_flg]" id="EntrepreneurCancelFlg2" value="3" />使わなくなった<br />
<input type="radio" name="data[Entrepreneur][cancel_flg]" id="EntrepreneurCancelFlg3" value="4" />運営方針に不満があった<br />
<input type="radio" name="data[Entrepreneur][cancel_flg]" id="EntrepreneurCancelFlg4" value="5" />その他

CakePHPのページャーでnumbersメソッドを色々カスタマイズしたい

CakePHPで、データの一覧画面を作成する際に

Paginatorを利用すると非常に便利です。

bakeでビューファイルを生成すると、

以下のようなタグが生成されます。

<p>
<?php
echo $this->Paginator->counter(array(
'format' => __('Page {:page} of {:pages}, showing {:current} records out of {:count} total, starting on record {:start}, ending on {:end}')
));
?>
</p>
<div class="paging">
<?php
  echo $this->Paginator->prev('< ' . __('previous'), array(), null, array('class' => 'prev disabled'));
  echo $this->Paginator->numbers(array('separator' => ''));
  echo $this->Paginator->next(__('next') . ' >', array(), null, array('class' => 'next disabled'));
?>
</div>

前半分は、全○ページの○ページ目、全○件のうち○件表示・・・というような情報を表示します。

それぞれ、以下の情報を表示します。

{:page} 現在のページ
{:pages} 全ページ数
{:current} 表示件数
{:count} 全レコード数
{:start} 表示開始レコード番号
{:end} 表示終了レコード番号

後半の

<div class="paging">
~
</div>

の部分が

ページャーを表示する部分です。

デザイナーさんにサイトデザインをお願いした場合、

ページャーをカッコよく仕上げてくれることが結構あります。

カッコいい分、Paginatorを使って実装し辛かったりします。

今回はテーブルタグを使ったHTMLの対応を行ったので、対応方法をメモ。

<table class="page_n">
<tr>
<td class="arrow">&lt;</td>
<td><a href="#">1</a></td>
<td><a href="#">2</a></td>
<td><a href="#">3</a></td>
<td><a href="#">4</a></td>
<td class="active"><a href="#">5</a></td>
<td class="arrow"><a href="#">&gt;</a></td>
</tr>
</table>

(CSSは省略します)

「前へ」の

<td class="arrow">&lt;</td>


「次へ」の

<td class="arrow"><a href="#">&gt;</a></td>

以下のように実装しました。

■前へ
<td class="arrow"><?php echo $this->Paginator->prev(__('<'), array(), null, array('class' => 'arrow disabled')); ?></td>

■次へ
<td class="arrow"><?php echo $this->Paginator->next(__('>'), array(), null, array('class' => 'arrow disabled')); ?></td>

数字部分は以下のようにしました。

<?php echo $this->Paginator->numbers(array('separator' => '', 'tag'=>'td', 'currentClass'=>'active', 'modulus'=>10, 'first' => '先頭へ', 'last'=>'末尾へ')); ?>

separatorで、区切り文字を指定します。

tagで、数字を囲むタグを指定できます。今回の場合はtdタグで囲みます。

currentClassで、現在ページの場合のclassを指定できます。

現在ページの色等を変えたい場合に利用できます。

modulusで、表示するページ番号の数を指定できます。

first、lastは、先頭ページに戻る、末尾ページに移動する際に利用できます。

全ページ数がmodulusで指定したページ数を超える場合に表示されます。

前へ、次へのリンクでも、tagにtdを指定して実装したかったのですが、

リンクがある場合に指定したタグを表示してくれなかったので

上記のようにtagの指定は行わず、tdタグで囲みました。

以下のサイトを参考にさせて頂きました。
ページネーションを利用する CakePHP2.1初心者メモ

CakePHPで、ラジオボタン、セレクトボックスを使用する

CakePHPで選択肢を選んでもらう項目で、

ラジオボタン、セレクトボックスを表示する方法です。

まずはラジオボタンです。


"購読する", "2"=>"購読しない"); ?>
Form->input('mailmag', array("type"=>"radio", "options"=>$options)); ?>

セレクトボックスは以下のようにします。


"購読する", "2"=>"購読しない"); ?>
Form->input('mailmag', array("type"=>"select", "options"=>$options, "empty"=>"選択してください")); ?>

CakePHPのコントローラーでエラーチェックを行う

CakePHPで、確認画面を実装したいなどで

コントローラーにエラーチェックを実装したいということがあるかと思います。

$this->Model->validates() でエラーチェックを行うことが可能です。

注意したいのは、validatesを呼び出す前にModelにデータをsetすることです。

以下のようにします。


$this->Model->set( $this->request->data );
if ($this->Model->validates()) {
//エラーなしの場合
} else {
//エラーありの場合
}

さらに、特定の項目のみエラーチェックを行うことが可能です。

validates()に配列で項目名を渡してやります。


$this->Model->set( $this->request->data );
if ($this->Model->validates( array('name', 'tel') )) {
//エラーなしの場合
} else {
//エラーありの場合
}

これでname, telのバリデーションが行われます。

saveの時にバリデーションを行わないようにもできます。


if ($this->Model->save( $this->request->data, array( 'validate' => false))) {
// エラーなしの場合
}

CakePHPで独自の定数を設定する方法

CakePHPで、システム内のどこからでも利用できる

独自の定数を設定する方法です。

■手順1

app/Config/bootstrap.phpを開いて、以下の1行を追加します。


config('const');

これで、app/Config/const.phpファイルで、定数を設定できるようになります。

■手順2

app/Config/const.phpファイルを作成し、必要な定数を設定します。


define('TEISU','100');
?>

これで、TEISU = 100をシステム内のどこでも使用できます。

CakePHPで日付選択のセレクトボックスを「年月日」表示にしたい

CakePHPで日付選択のセレクトボックスを「年月日」表示にしたい

ということがあって調べたのでメモ。

CakePHP1.2用のものは見つかったのですが、

CakePHP2用のものが見つからなかったので、

以下の記事を参考にちょっと変更を加えました。

CakePHP1.2 HTMLヘルパーの日付コンボを年月日で表示する

コントローラーに以下を追加(1.2と同じ対応)。


$attr = array(
'minYear' => 2000,
'maxYear' => date('Y'),
'separator' => array('年', '月', '日'),
'monthNames' => false
);
$this->set('attr', $attr);
?>

lib/Cake/View/Helper/FormHelper.phpをapp/View/Helpler/にコピーして開きます。

public function dateTime内の以下の箇所を変更します。


$opt = implode($separator, $selects);

の1行を以下に置き換えます。

$opt = "";
$i = 0;
if (is_array($separator)) {
foreach($selects as $select) {
$opt .= $select.$separator[$i];
$i++;
}
} else {
$opt = implode($separator, $selects);
}

(これも変更内容は1.2と同じ)

ビューファイルに以下のように書きます。


echo $this->Form->dateTime('foo_date', 'YMD', 'NONE', $attr);

CakePHPのinputで、label、divタグを消したい

CakePHPのFormヘルパーでinputを使用した場合、

labelタグとdivタグが表示されます。

これを表示しないようにするには、以下のようにします。


echo $this->Form->input('name', array('type'=>'text', 'label'=>false, 'div'=>false));

ただ、これだと1個ずつ指定しなければならないので、面倒くさいです。

まとめて指定する方法がないか探してみたらありました。

Formヘルパーのcreateメソッドで、「inputDefaults」を指定します。

以下のように使います。


echo $this->Form->create('Item', array('inputDefaults'=>array('label' => false, 'div' => false));

CakePHPでCSSのlink タグをヘッダ内に表示する

/app/webroot/css ディレクトリ以下に置いたCSSファイルを表示するには、

viewファイルに以下のように記載します。


echo $this->Html->css('forms');

すると以下の様に表示されます。

ページごとに使用したいCSSを変えたい場合、

個別のviewファイルにCSSを書きます。

このときに、headタグ内にCSSに追加する方法です。

HtmlHelperのCSSメソッドは、以下のような定義になっています。


HtmlHelper::css(mixed $path, string $rel = null, array $options = array())

この$optionsパラメーターのキー‘inline’を「false」に設定すると

CSSのlinkタグはHTML内のheadタグ内にあるcssブロックに追加されます。

以下のようにします。


echo $this->Html->css('forms', null, array('inline'=>false));

CakePHPで、CSSとJavascriptのタグを表示する方法

CakePHPで、CSSファイル、Javascriptファイルのタグを表示する方法です。

Javascriptのタグを忘れやすいのでメモ。

まず、app/webroot/css/以下にCSSファイルを、

app/webroot/js/以下にJavascriptファイルを置きます。

Viewファイル(ここではapp/View/Layouts/default.ctp)に

以下のように記載します。


echo $this->Html->css('import');
echo $this->Html->script('jquery');

すると以下のようにタグが表示されます。


また、複数のCSS、Javascriptを同時に指定したい場合は、

引数に配列を使用します。


echo $this->Html->css(array('import', 'jquery.bxslider'));
echo $this->Html->script(array('jquery', 'jquery.bxslider.min'));

これで以下のように複数のタグが表示されます。