web-dev-qa-db-ja.com

カスタムコンポーネント-JInputがフォーム入力を取得していない

管理ビューに入力フォームがあります:

_<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」セクションにあります。

4
Eric

いくつかのこと。まず、非推奨だがまだ機能している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');
2
Brian Bolli