ラベル PHP の投稿を表示しています。 すべての投稿を表示
ラベル PHP の投稿を表示しています。 すべての投稿を表示

2013年7月23日火曜日

[CakePHP] 1ページのフォームで複数レコード登録と、inputフィールドの数でひっかかったこと

CakePHPで、1ページ内のフォームで、複数レコードの登録画面を作成しました。
一括でテーブルを編集したいことがありますよね。
ASP.NETだとRepeaterとか使えば簡単に出来ますが、CakePHPでもちょっとしたコツで簡単に実装できます。

メニューテーブルを全部表示して登録する例です。
ビューはこのようになります。

<?php echo $this->Form->create('Menu'); ?>
<?php echo $this->Form->submit('店舗メニューを登録する');
?>
<table>
<thead>
<tr>
 <th>ID</th>
 <th>メニュー名</th>
</tr>
</thead>
<?php foreach($data as $key => $menu):?>
<tr>
 <td><?php echo $this->Form->input("{$key}.id", array('type' => 'text', 'value' => $menu['Menu']['id'])); ?></td>
 <td><?php echo $this->Form->input("{$key}.name", array('value' => $menu['Menu']['subname'], 'label' => false)); ?></td>
</tr>
<?php endforeach; ?>
</table>

<?php echo $this->Form->end(); ?>
これで結局、idなどがMenu0Idみたいな形になって、複数レコードの表示ができます。
コントローラーは以下としました。

function multiregist() {
  //登録
  if($this->request->isPost()){
   if($this->Menu->saveAll($this->request->data['Menu'])) {
    $this->Session->setFlash('メニューを登録しました', 'default', array('class' => 'alert alert-success'));
   } else {
    $this->Session->setFlash('登録に失敗しました', 'default', array('class' => 'alert alert-error'));
   }
  }
  //データ取得
  $data = $this->Menu->find('all');
  $this->set('data', $data);
}

これだけです。
saveAll一発で登録できてしまうので便利です!

実際に作成したものはもっと項目が多かったのですが、なぜか登録時に一定レコードまでしかPOSTされず、かなり悩みました。
CakePHPのrequestとかでデフォルト値が決まってるのか?とか思ったのですがCakePHP関係では一向に情報が出て来ません。
でもさらに調べてみると、PHPのほうでフォームのinputの数に制限がかかっていることがわかりました。
php.iniにmax_input_varsを設定します。
初期値は1000になっているようでした。

max_input_vars = 10000

大きめの数にしてみるとすんなりPOSTできました!
数時間程度悩んでたのですが、見つかってよかったです、ほんと。。
まだまだPHPやCakePHPは初心者だなぁと感じました。

参考になれば幸いです。

2013年5月22日水曜日

ロリポップでphpMyBackupProで自動バックアップ #fb

とある案件で、ロリポップのロリポプランを使ってPHP+MySQLなシステムを動かしています。
クライアントシステムからデータを受信してDBにためてるんですが、となるとバックアップが
必要となってきます。
以前から目をつけていたphpMyBackupProを導入して、cronでシェルでbackup.phpを動かして
自動バックアップしていたのですが、、ある日を境にOut of memoryとかで途中で止まって
しまうようになってしまいました。

WebからphpMyBackupProにログインして手動でバックアップすると問題なくバックアップ出来ます。
PHP初心者なところもあり、わからないところもかなりあるのですが、、どうもcron時に
つかえるメモリが少なめなのかなという感じですが、じゃあどうしたら良いのか。。
一番安いプランなのでそんなもんなのかも・・・ということで別の方法を探りました。

もともとphpMyBackupProにはSchedule Backupという項目があって、スケジュール用のPHP
スクリプトを作成して出力してくれます。
なぜこれを使っていなかったかというと、、ちょっとやってみてバックアップできなかったから。。

このスクリプトはWebのPHPページにインクルードして使うもので、あるページを開くと
指定したタイミングでバックアップをとってくれるようです。
詳しくはわかってないですが。。
とりあえず、毎回バックアップするようにして作成し、ブラウザから開いてみるものの、、
バックアップはされず。
作成されたPHPをみてみると、下の方で以下のようなコードになっていました。

@chdir("/home/users/2/lolipop.jp-xxxxxx/web/");
@include("backup.php");
@chdir("/home/users/2/lolipop.jp-xxxxxx/web/phpMyBackupPro/");


ん?
bakup.phpはphpMyBackupProディレクトリにあるのですが、1行目でなぜかその一つ上の
ディレクトリにchdirされてます。
これを以下に修正すると、バックアップ出来ました!

@chdir("/home/users/2/lolipop.jp-xxxxxx/web/phpMyBackupPro/");
@include("backup.php");
@chdir("/home/users/2/lolipop.jp-xxxxxx/web/phpMyBackupPro/");


あとはこれをcronで呼び出す用のスクリプトを作成します。

<?php
file_get_contents('http://your.domain/phpMyBackupPro/mycron.php');
?>


file_get_contentsで、ブラウザで開いた体になるのでメモリ問題もなく
バックアップが取れるっぽいです。

ひょっとしたら他になにか設定でどうにかなるのかもですが、、
今のスキルではこの程度ですね。
とりあえず動くのでよし。

余談ですが最近、もっとLinuxとか、PerlやPHPもやっとけばよかったなと
思います。もともとUNIX系をやってたのに、業務系はWindowsが多いので
どうしてもそっち方面のVB.NETだのばかりやってしまってました。

でもまあ、これからでも十分できると思うのでやっていくつもりです。


堀江貴文氏などのブロマガをKindleに自動でいれる方法

ニコニコのブロマガで堀江貴文氏や夏野剛氏のメルマガを購読しています。
メルマガなのでそのままメーラーで読んだり、Webから読んだりしています。
しかし、堀江氏のメルマガは特に長く、途中まで読んであとで続きを読もうとすると
スクロールしないといけなかったりして面倒です。
ブロマガはepubもダウンロード出来るのでiBooksで読めばいいのですが、、
いちいちダウンロードするというのがまた面倒で、、何回かやった後にやめて
しまいました。
あと、いまいち軽快じゃないし。

と、しばらくは諦めてブラウザで読んでいたのですがふと、send-to-kindleって
あったけど、あれどうなんだろうと。
ひょっとしてメールをそのまま転送したらKindleに入るのでは?と思ってやって
みたのですが、添付ファイルを読み込む仕様で、メールそのものは入りません。
じゃあ、ということで、一旦メールサーバでメールを受け、それをテキストファイルに
して、それを添付後Kindleに送るスクリプトを作ってみました。

最近PHPを使っているのでスクリプトはPHPで作成。
前準備としてメールサーバ側で受信時にPHPスクリプトにメールを渡す設定が
必要です。
僕はさくらのレンタルサーバーを使っていますが、Mailboxの.mailfilterを
書き換えてパイプで渡すようにしてみました。


PHPスクリプトですが、以下のように書いてみました。


#!/usr/local/bin/php

<?php
require("PHPMailer/class.phpmailer.php");

$file = "mail.txt";
$content = null;
$fp=fopen("php://stdin",'r') or die('File Open Error');

while( !feof($fp) ){
$content .= fgets( $fp ,1024);
}

file_put_contents($file, $content);


mb_language("japanese");
mb_internal_encoding("UTF-8");

$to = "xxx@kindle.com";
$subject = "test";
$body="test";
$from = "xxx@xxx.xxx"; //送り主

$mail = new PHPMailer();
$mail->CharSet = "iso-2022-jp";
$mail->Encoding = "7bit";

$mail->AddAddress($to);
$mail->From = $from;
$mail->FromName = mb_encode_mimeheader(mb_convert_encoding($fromname,"JIS","UTF-8"));
$mail->Subject = mb_encode_mimeheader(mb_convert_encoding($subject,"JIS","UTF-8"));
$mail->Body = mb_convert_encoding($body,"JIS","UTF-8");

//添付ファイル追加
$mail->AddAttachment($file);
$mail->Send();
?>


ファイルを添付して送信するのに、PHPMailerを使わせて頂きました。
単に来たメールをそのままテキスト保存し、添付して送信しているだけです。
さらに手を入れるなら本文だけにしたりファイル名を元メールのSubjectにしたりとか
いろいろ考えられますが、、面倒だったのでこれで完了です。
とにかくKindleで読めればいいので。
メールヘッダーとかごっちゃり入りますが、気にしない。

やっぱりKindleだと割とサクサク読めます。
ただ、URLがページの一番上とか下に来た時に開くことができない時があります。。
ちょっと微妙です。。(iOS版です)
でもURLはアプリ内ブラウザで開けるのでいちいちアプリが切り替わらなくて良いです。