管理ビューに入力フォームがあります:
_<form name="upload" method="post" enctype="multipart/form-data">
<input type="file" name="file_upload" />
<input type="submit" value="Upload Image" />
<input type="hidden" name="option" value="com_newsshowcase" />
<input type="hidden" name="task" value="upload" />
<?php echo JHtml::_( 'form.token' ); ?>
</form>
_
このフォームはコントローラーの関数upload()を呼び出します:
_public function upload()
{
// Check for request forgeries
JSession::checkToken('request') or jexit(JText::_('JINVALID_TOKEN'));
$app = JFactory::getApplication()->input;
$file = $app->files->get('file_upload');
$filename = JFile::makeSafe($file['name']);
}
_
_$filename
_および_$file
_変数をエコー(デバッグ)してきましたが、エコーされている値はありません。私が次のようなものをエコーすると:
_echo '<pre>',print_r($file,1),'</pre>';
_
何もエコーされません。これは、この関数によってアップロードされるファイルがビューからコントローラーに渡されていないことを意味すると思いますか?
pdate:また、JInputを明示的にインポートしました(これは、必要ではないが害はないと言って、検索結果にさまざまなものが見られました)。私の元のコントローラーはJControllerを拡張しました。これをJControllerFormに変更して、それに応じてインポートの依存関係を変更しましたが、それでも何もしませんでした。
pdate#2: _var_dump
_を_$_POST
_で実行すると、フォームデータは表示されますが、_var_dump
_を_$_FILES
_で実行すると空の配列を示します。
pdate#3:アップロードしようとしている画像のサイズは、テストとして345バイトです(非常に小さい)。
pdate#4:別のスタンドアロンにフォームを複製しました(Joomla固有のフィールドを削除しました)PHP PHP var_dump($_FILES)
を実行し、アップロードデータを表示するエンドポイント。
pdate#5:重要かどうかはわかりませんが、HTMLフォームは管理ページの「default_body」セクションにあります。
いくつかのこと。まず、非推奨だがまだ機能しているJRequestを使用してファイルデータを取得し、これがバグであることを確認します。最近、ファイルをアップロードする必要があるため、この方法を自分で使用する必要がありました。
$file = JRequest::getVar('file_upload', null, 'files', 'array');
それでもうまくいかない場合は、$ _ FILES ['file_upload']リクエスト変数をダンプして、ファイルが送信されていることを確認してください。私の考えでは、JRequestを使用するとうまくいきます。
次に、ビューの特定のコントローラーにアップロードメソッドをアタッチする必要があります。プライマリエントリポイントでパブリックメソッドに到達する必要がありますが、到達することができますが、モデル/ビューを利用するコントローラーを作成して接続する必要があります。
さらに、タスクが適切なコントローラーに移行されると、JInputオブジェクトを親クラスの一部として取得する必要がなくなります。
議論のために、ビューがファイルであるとしましょう、コントローラは次のようになります:
NewsShowcaseControllerFiles extends JControllerLegacy {
public function upload() {
jimport('joomla.filesystem.file');
jimport('joomla.filesystem.folder');
// Check for request forgeries
JSession::checkToken('request') or jexit(JText::_('JINVALID_TOKEN'));
// Notice in the controllers context, no need to instansiate Application Object
$file = $this->input->files->get('file_upload');
$filename = JFile::makeSafe($file['name']);
// logic to save file or dump data to verify success
}
}
コンポーネントsite/admin rootにあるプライマリコントローラーエントリポイントで、displayメソッドに次の行を追加してタスクを登録します。
$this->registerTask('files.upload', 'upload');
最後に、フォームのエンドポイントURLを変更するか、フォームの送信を処理するAJAXリクエスト:
JRoute::_('index.php?option=com_newsshowcase&task=files.upload');