ファイルアップロードをするフォームを表示するときはModel::recursiveを0以上にしてください。
Model::recursive = -1の場合、Modelに添付されたアップロードファイルの情報が取得できないため、NetCommonsForm::uploadFile()は添付されたファイルが無いと判断してしまいます。
認証キープラグインと組み合わせることで特定の認証キーを知っているユーザだけがファイルダウンロード可能にできます。
ダウンロードアクションを実装しているコントローラで AuthorizationKeyComponent を使います
public $components = array(
'Files.Download',
'AuthorizationKeys.AuthorizationKey' => [
'operationType' => 'redirect',
'targetAction' => 'download_pdf',
'model' => 'BlogEntry',
],
);
ダウンロードアクション内で認証キーによるガードを設定します
public function download_pdf() {
// ここから元コンテンツを取得する処理
$this->_prepare();
$key = $this->params['pass'][1];
$conditions = $this->BlogEntry->getConditions(
Current::read('Block.id'),
$this->Auth->user('id'),
$this->_getPermission(),
$this->_getCurrentDateTime()
);
$conditions['BlogEntry.key'] = $key;
$options = array(
'conditions' => $conditions,
'recursive' => 1,
);
$blogEntry = $this->BlogEntry->find('first', $options);
// ここまで元コンテンツを取得する処理
// 認証キーによるガード
$this->AuthorizationKey->guard('redirect', 'BlogEntry', $blogEntry);
// ダウンロード実行
if ($blogEntry) {
return $this->Download->doDownload($blogEntry['BlogEntry']['id'], ['filed' => 'pdf']);
} else {
// 表示できない記事へのアクセスなら404
throw new NotFoundException(__('Invalid blog entry'));
}
}
ダウンロードアクションを実装しているコントローラで AuthorizationKeyComponent を使います
public $components = array(
'Files.Download',
'AuthorizationKeys.AuthorizationKey' => [
'operationType' => 'redirect',
'targetAction' => 'download_pdf',
'model' => 'BlogEntry',
],
);
ダウンロードアクション内でのガードをpopupにします
$this->AuthorizationKey->guard('popup', 'BlogEntry', $blogEntry);
ダウンロードリンクを書き換えてポップアップ画面が表示されるようにします。 認証キーポップアップはAngularJSのディレクティブ authorization-keys-popup-link として実装されています。
<div>
PDF :
<?php echo $this->Html->link('PDF',
'#',
['authorization-keys-popup-link',
'url' => $this->NetCommonsHtml->url(
[
'action' => 'download_pdf',
'key' => $blogEntry['BlogEntry']['key'],
'pdf',
]
),
'frame-id' => Current::read('Frame.id')
]
); ?>
</div>
認証キーの詳細については認証キーのドキュメントも参照してください。
AttachmentBehaviorでUploadビヘイビアのバリデーションルールを利用できます。