 ログイン
 検索
 メインメニュー
 フォーラムメニュー
 オンライン状況
24 人のユーザが現在オンラインです。 ( 23 人のユーザが フォーラム を参照しています。) 登録ユーザ: 0 ゲスト: 24 もっと...
|
 |
| |
|
 リンク集
|
| 投稿者 |
スレッド |
| nishimura |
投稿日時: 2009-11-3 3:41 |
Baker スタート   登録日: 2009-10-18 居住地: 投稿: 16 |
Re: CakePHP1.2でのファイルアップロードの定石を教えて下さい 引用: MASA-Pさんは書きました: echo $medium->embed('filter/'.$filter.'/'.$pic['dirname'].'/'.$pic['basename']);
なるほど。そういう方法もあるのですか。 ファイルパスを直接指定している感じですね。
|
|
|
| nishimura |
投稿日時: 2009-11-3 3:44 |
Baker スタート   登録日: 2009-10-18 居住地: 投稿: 16 |
Re: CakePHP1.2でのファイルアップロードの定石を教えて下さい >slywalkerさん 詳しい解説ありがとうございます。勉強になります! $post['Attachment'][0]は定義されていないので、$this->data['Attachment'][0] としましたが $this->data['Attachment'] の中を見てみたところ、以下のようになっていました。
array (
0 =>
array (
),
1 =>
array (
'id' => '1',
'model' => 'Post',
'foreign_key' => '1',
'dirname' => 'transfer/img',
'basename' => 'logo.jpg',
'checksum' => 'dae9c4cebc146316b1248fe3b9243f02',
'alternative' => '',
'group' => 'attachment',
'created' => '2009-11-02 01:36:28',
'modified' => '2009-11-02 01:36:28',
),
)
ですので、以下のようにすることで画像を表示することが出来ました。 ありがとうございます>< <?php echo $medium->embed($medium->file('filter/s', $post['Attachment'][1])); ?>
いろいろ試しているうちに、参考にしたサイトと自分のデータがずれてしまっていたようです。
|
|
|
| nishimura |
投稿日時: 2009-11-3 23:14 |
Baker スタート   登録日: 2009-10-18 居住地: 投稿: 16 |
Re: CakePHP1.2でのファイルアップロードの定石を教えて下さい Media Plugin を使ってみて、またわからないことが出てきてしまいました。
・attachemntをカスタマイズする場合、APP/plugins/media/views/elements/attachments.ctp を 直接編集すれば良いのでしょうか?
・1つのページで複数のアップロードフォームを設置する場合、どのようにすれば良いのでしょうか? (1つのフォームでアップロード出来るファイル数は1つの場合)
・同じページでも、ログインしている人が違う場合などでは、どのようにファイルを区別すれば良いのでしょうか?
CakePHP自体もまだ慣れているわけでは無いので、おかしなことを質問しているのかもしれませんが どうか教えていただけませんでしょうか?
|
|
|
| hide99 |
投稿日時: 2009-11-4 3:02 |
一人前   登録日: 2007-7-2 居住地: 投稿: 107 |
Re: CakePHP1.2でのファイルアップロードの定石を教えて下さい こんばんわ。躓くところ一緒ですね。 とりあえず僕がわかる範囲で。
・attachemntをカスタマイズする場合、APP/plugins/media/views/elements/attachments.ctp を
直接編集すれば良いのでしょうか?
直接編集でいいんじゃないでしょうか。とりあえず僕が今できるようになったのは画像削除するくらいですね。
・1つのページで複数のアップロードフォームを設置する場合、どのようにすれば良いのでしょうか?
(1つのフォームでアップロード出来るファイル数は1つの場合)
僕もわからないです。一回適当にいじってたらできたのですが、またできなくなってしまってそれから放置です。できたら5個くらい一気にアップロードできるようにしたいですよね。
・同じページでも、ログインしている人が違う場合などでは、どのようにファイルを区別すれば良いのでしょうか?
foreign_key フィールドで判別します。 つまり id 10 のユーザーが登録したときに、foreign_key も 10で登録されるようにする。 また、madiapluginのすげーと思ったところは alternative や groupフィールドでどの用途のファイルをアップロードしたかってのがわかるのがいいですね。 わからないことだらけで申し訳ないですけど。 少しでも情報が増えれば。
|
|
|
| slywalker |
投稿日時: 2009-11-4 10:35 |
Baker ユーザ   登録日: 2007-1-8 居住地: 日本 大阪 投稿: 28 |
Re: CakePHP1.2でのファイルアップロードの定石を教えて下さい 引用: ・attachemntをカスタマイズする場合、APP/plugins/media/views/elements/attachments.ctp を 直接編集すれば良いのでしょうか? 自分の場合は、元のプラグインに手を加えたくないので、 いったん app/views/elements/attachments.ctp とコピーした上で変更してます。 呼び出しは echo $this->element('attachments'); ちなみにModelの場合も同様で app/models/attachment.php とコピーして変更してます。 あとの2点については、私もやってみてないのでうまくいったらまたレポートしてもらえたらうれしいです
|
|
|
| hide99 |
投稿日時: 2009-11-7 16:20 |
一人前   登録日: 2007-7-2 居住地: 投稿: 107 |
Re: CakePHP1.2でのファイルアップロードの定石を教えて下さい 複数ファイルのアップロードができました。 attachments.ctp element 一枚でやろうとするとどうしてもバグるので ・uploads.ctp ・del.ctp の両方を作ることで解決しました。 contoroller <?php //ファイルアップロード //アップロードをいくつもつくるのはだるいので、 alternative で判断し、モデルは全てユーザーに統一 //携帯版、PC版とも写真は一枚ずつアップロードしてください /* @params str $alternative 写真の種類 */ function upload($alternative = 'user') { if(!empty($this->data)){
$this->User->set($this->data);
if ($this->User->saveAll($this->data)) { $this->Session->setFlash('更新しました'); $this->redirect('/users/upload/'); } else { $this->Session->setFlash('アップロードできません'); } } //削除する画像を指定 $data = $this->User->find(array('id' => $this->Auth->user('id'))); foreach($data['Attachment'] as $v){ if($v['alternative'] == $alternative){ $this->data['Attachment'][] = $v; } } $this->set( compact( 'alternative' ) ); } ?>
view <?php <h1>ファイルをアップロード (画像をアップロードする) </h1> <?php $session->flash(); echo $form->create('User', array('type' => 'file', 'url'=> "/users/upload/")); echo $form->input('User.id',array('type' => 'hidden','value' => $user['User']['id'])); echo $this->element('uploads', array('plugin' => 'media','alternative' => $alternative,'count' => 5));//alternative で何の写真かを指定 echo $form->end('submit'); ?>
<h1>画像を削除する</h1> <?php echo $form->create('User', array('type' => 'file', 'url'=> "/users/upload/")); echo $form->input('User.id',array('type' => 'hidden','value' => $user['User']['id'])); echo $this->element('del', array('plugin' => 'media','alternative' => $alternative));//alternative で何の写真かを指定 echo $form->end('submit'); ?> ?>
でもってエレメント。 以下をコピペすればそのまま動くと思います。 アップロードするときに呼び出すエレメント uploads.ctp <?php /** * uploads File * * Element listing associated attachments of the view's model * Add an Attachment * * Copyright (c) 2007-2009 David Persson * * Distributed under the terms of the MIT License. * Redistributions of files must retain the above copyright notice. * * PHP version 5 * CakePHP version 1.2 * * @package media * @subpackage media.views.elements * @copyright 2007-2009 David Persson <davidpersson@gmx.de> * @license http://www.opensource.org/licenses/mit-license.php The MIT License * @link http://github.com/davidpersson/media */
if (!isset($count)) { $count = 1; }
if (!isset($previewVersion)) { $previewVersion = 's'; }
if (!isset($alternative)) { $alternative = ''; }
/* Set $assocAlias and $model if you're using this element multiple times in one form */
if (!isset($assocAlias)) { $assocAlias = 'Attachment'; } else { $assocAlias = Inflector::singularize($assocAlias); }
if (!isset($model)) { $model = $form->model(); }
$modelId = $form->value($form->model().'.id');
if (isset($this->data[$assocAlias][0]['basename'])) { array_unshift($this->data[$assocAlias],array()); } ?> <div class="attachments element"> <?php printf(__('%s', true), Inflector::pluralize($assocAlias)) ?> <!-- New Attachment --> <div class="new"> <?php $i = 0; while($count > $i){ echo $form->hidden($assocAlias . '.'.$i.'.model', array('value' => $model)); echo $form->hidden($assocAlias . '.'.$i.'.group', array('value' => strtolower($assocAlias))); echo $form->input($assocAlias . '.'.$i.'.file', array( 'label' => __('File', true), 'type' => 'file', 'error' => array( 'error' => __('An error occured while transferring the file.', true), 'resource' => __('The file is invalid.', true), 'access' => __('The file cannot be processed.', true), 'location' => __('The file cannot be transferred from or to location.', true), 'permission' => __('Executable files cannot be uploaded.', true), 'size' => __('The file is too large.', true), 'pixels' => __('The file is too large.', true), 'extension' => __('The file has the wrong extension.', true), 'mimeType' => __('The file has the wrong MIME type.', true), ))); echo $form->input($assocAlias . '.'.$i.'.alternative', array( 'label' => __('Textual replacement', true), 'value' => $alternative, 'error' => __('A textual replacement must be provided.', true), 'type' => 'hidden'//09.10.20修正 )); $i++; } ?> </div> <!-- Existing Attachments --> </div> ?>
画像を削除したいときに呼び出すエレメント del.ctp <?php /** * del File * * Element listing associated attachments of the view's model * Add an Attachment * * Copyright (c) 2007-2009 David Persson * * Distributed under the terms of the MIT License. * Redistributions of files must retain the above copyright notice. * * PHP version 5 * CakePHP version 1.2 * * @package media * @subpackage media.views.elements * @copyright 2007-2009 David Persson <davidpersson@gmx.de> * @license http://www.opensource.org/licenses/mit-license.php The MIT License * @link http://github.com/davidpersson/media */ if (!isset($previewVersion)) { $previewVersion = 's'; }
if (!isset($alternative)) { $alternative = ''; }
/* Set $assocAlias and $model if you're using this element multiple times in one form */
if (!isset($assocAlias)) { $assocAlias = 'Attachment'; } else { $assocAlias = Inflector::singularize($assocAlias); }
if (!isset($model)) { $model = $form->model(); }
$modelId = $form->value($form->model().'.id');
if (isset($this->data[$assocAlias][0]['basename'])) { array_unshift($this->data[$assocAlias],array()); } ?> <!-- Existing Attachments --> <div class="existing"> <?php if (isset($this->data[$assocAlias])): ?> <?php for($i = 1; $i < count($this->data[$assocAlias]); $i++): ?> <div> <?php $item = $this->data[$assocAlias][$i];
echo $form->hidden($assocAlias . '.' . $i . '.id', array('value' => $item['id'])); echo $form->hidden($assocAlias . '.' . $i . '.model', array('value' => $model)); echo $form->hidden($assocAlias . '.' . $i . '.group', array('value' => $item['group'])); echo $form->hidden($assocAlias . '.' . $i . '.dirname', array('value' => $item['dirname'])); echo $form->hidden($assocAlias . '.' . $i . '.basename', array('value' => $item['basename'])); echo $form->hidden($assocAlias . '.' . $i . '.alternative', array('value' => $item['alternative'])); echo $medium->embed($medium->file('filter/s', $item)); echo $form->input($assocAlias . '.' . $i . '.delete', array( 'label' => __('削除', true), 'type' => 'checkbox', 'value' => 0 )); ?> </div> <?php endfor ?> <?php endif ?> </div> ?>
です。
|
|
|
| jyokyoku |
投稿日時: 2009-12-8 20:55 |
Baker スタート   登録日: 2008-2-16 居住地: 投稿: 14 |
Re: CakePHP1.2でのファイルアップロードの定石を教えて下さい こちらのスレッドを参考にMediaプラグインを利用してみました。 利用したのはリポジトリから持ってきた最新(0.60beta?)です。
ファイルのアップロードに関しては文句なく便利ですね。 他のモデルとの連携もスムーズで、 自力で開発しようと思っていたところだったのでとても重宝しています。
ただ、複数ファイルのアップロードの部分を実装していて気づいたのですが、 アップロードフォームの中に一つでもバリデーションエラーが発生すると、 アップロードを行わなかった全てのフォームに、同様のエラーの表示がされてしまいませんか?
全てのアップロードフォームにファイルを指定した場合は問題無いのですが、 1つでも空のアップロードフォームが存在すると、 他のアップロードフォームで発生したエラーが表示されてしまうんですよね・・。
自分の環境だけだったらとても恐縮なのですが、 同じような現象が発生していらっしゃる方いますでしょうか?
とりあえずTransferBehaviorのbeforeValidate関数の最初で、 $this->reset($Model); を呼んで解決することはしているのですが、 何か不都合がでないか少々心配ではあります・・。
|
|
|
| hide99 |
投稿日時: 2009-12-9 4:52 |
一人前   登録日: 2007-7-2 居住地: 投稿: 107 |
Re: CakePHP1.2でのファイルアップロードの定石を教えて下さい 今、アップロードファイルを5個に設定してますが問題なく動いていますね。
validateする前に
「空の$_FILESがあれば削除」
をすればいいんじゃないでしょうか。
|
|
|
| jyokyoku |
投稿日時: 2009-12-9 10:49 |
Baker スタート   登録日: 2008-2-16 居住地: 投稿: 14 |
Re: CakePHP1.2でのファイルアップロードの定石を教えて下さい ご回答ありがとうございます。 引用: hide99さんは書きました: 今、アップロードファイルを5個に設定してますが問題なく動いていますね。
validateする前に
「空の$_FILESがあれば削除」
をすればいいんじゃないでしょうか。
おー、確かにその通りだと思いまして、 空の$_FILESを削除してみたらエラーの表示も無くなりました。 ちなみに複数アップロードの際は、 やはり空の$_FILESを削除されておりますか? 何もなしに動いているようであれば、なんだか気持ち悪いので、 ちょっと自分の環境を洗ってみたいと思います。
|
|
|
| morygonz |
投稿日時: 2010-2-5 16:41 |
Baker スタート   登録日: 2010-1-20 居住地: 投稿: 3 |
Re: CakePHP1.2でのファイルアップロードの定石を教えて下さい お世話になります。 CakePHP 1.2.6、MediaPlugin 0.6で複数ファイルのアップロードを実装しようとしています。空のフォームがあるときに出るエラーでうまくいっていないのですが、 引用: validateする前に
「空の$_FILESがあれば削除」
をすればいいんじゃないでしょうか。 とは具体的にどういう風にすれば良いのでしょうか。 $_FILES の各配列をチェックし、空のものがあれば unset() するのかなとは思うのですが、どのファイルのどこのタイミングで処理すれば良いのかが分かりません。「validateする前」とはどこでのvalidationを指すのでしょうか? よろしければお教え下さい。 よろしくお願いいたします。
|
|
|
|
 |
 |