2013-07-25 15 views
5

SOLUTION:How to Save Uploaded File's Name on Databaseこれは私を助けてしまったのJoomla 3.0 MVCファイルのアップロード

XMLとデータベースを使用してカスタムコンポーネントにファイルアップロードを追加しようとしています。

私は静的なPHP環境でファイルのアップロードを行う方法を知っていますが、joomlaのPHP MVC構造について私の知識 はそれを作成して追加できません。

私がこれまで行っているもの:

(File型の)XMLファイル内のフィールドを追加しました•

を追加しました•
管理ビュープロジェクトでフォームフィールドを追加し、余分なフィールドMY_PROJECTテーブル•
( )画像アップロード列と同じ

それが動作します。この時点まで。(フィールドは管理者のバックエンド・コンポーネントに示されている)今

あなたはadminにアップロードされたファイルで文書を保存するときに戻ってそれはそれを保存しない終了データベースに転送します。

メディアをフィールドタイプとして入力すると機能しますが、ファイルに変更すると分解されます。私はnormaly

<?php 
$temp = explode(".", $_FILES["file"]["name"]); 
$extension = end($temp); 

if ($_FILES["file"]["error"] > 0) 
    { 
    echo "Return Code: " . $_FILES["file"]["error"] . "<br>"; 
    } 
    else 
    { 
    echo "Upload: " . $_FILES["file"]["name"] . "<br>"; 
    echo "Type: " . $_FILES["file"]["type"] . "<br>"; 
    echo "Size: " . ($_FILES["file"]["size"]/1024) . " kB<br>"; 
    echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>"; 

    if (file_exists("upload/" . $_FILES["file"]["name"])) 
     { 
     echo $_FILES["file"]["name"] . " already exists. "; 
     } 
    else 
     { 
     move_uploaded_file($_FILES["file"]["tmp_name"], 
     "upload/" . $_FILES["file"]["name"]); 
     echo "Stored in: " . "upload/" . $_FILES["file"]["name"]; 
     } 
    } 
    } 
else 
    { 
    echo "Invalid file"; 
    } 
?> 

使用しますが、どの部分がモデルになり、どの部分がコントローラに行く

XMLファイル

<?xml version="1.0" encoding="utf-8"?> 
<form> 
    <fieldset> 

    <field name="project_file" type="file" 

      label="Upload file" 
      description="Upload file" 
      directory="mysites" /> 


     <field name="main_image" type="media" 

      label="COM_MYSITES_FORM_LBL_PROJECT_MAIN_IMAGE" 
      description="COM_MYSITES_FORM_DESC_PROJECT_MAIN_IMAGE" 
      filter="raw" 
      directory="mysites" /> 

</fieldset> 

PHPファイルアップロードのスクリプト? とその呼び出し方法

全体ビューは、データベースやXML形式で新しいフィールドを配置

class MysitesControllerProject extends JControllerForm { 

    function __construct() { 
     $this->view_list = 'projects'; 
     $jinput = JFactory::getApplication()->input; 
     $files = $jinput->files->get('jform'); 
     $file = $files['project_file']; 
     $this->upload($file); 
     parent::__construct(); 
    } 

    public function upload($files) 
    { 
     $file_name = $files['name']; 
     $src = $files['tmp_name']; 
     $size = $files['size']; 
     $upload_error = $files['error']; 
     $type = $files['type']; 
     $dest = "/home/vol3/byethost33.com/b33_13467508/bim-portfolio.cu.cc/htdocs/tmp"; 

     if (isset($file_name)) { 
      // Move the uploaded file. 
      JFile::upload($src, $filepath); 
     } 
    } 

} 

答えて

6

は仕事の半分だけであるコントローラで呼ばれています。また、ファイルの保存/アップロード機能を記述する必要があります。あなたはそれを行うことができる2つの場所があります。コントローラー(例えば、タスク・プロシージャーを保存する)またはモデル(そこには2〜3の機能があります)があります。このファイル/administrator/components/com_media/controllers/upload.php(アップロード手順)を見てください。私はちょうどあなたのの関数を保存するように拡張する前に、データがデータベースファイルに保存される前にファイルシステムに格納されます。あなたは(他のバージョンのJoomlaの3.0.1、のためにそれを見つけるのは難しいことではありません)

/libraries/legacy/controller/legacy.phpで関数宣言を保存し、元のここで見つけることができセーブ機能のサンプルです:

public function save($key = null, $urlVar = null){ 
    // youre file upload code 

    return parent::save($key = null, $urlVar = null) 
} 
+0

私はコム・メディア・ファイルをチェックします上記のコントローラーコードを思いついた(編集されたメインポスト)。しかし今、私に警告JFolder :: create:無限ループが検出されました警告:ファイルの移動に失敗しました! ---と私のtmp /ログとグローバル設定はwritbleです。 $ dest変数を変更するとどちらもうまくいきません – user2617187

+0

私は2つのことをする必要があると思います。まず、 '$ filepath'を宣言していなくても、PHP学習に戻りましょう。その後、文字列変数を 'upload'関数に渡し、配列として使用しようとします。第二の問題は、あなたが構築でタスクを実行すべきではないということです。データをデータベースに格納する前に保存機能をオーバーライドしてファイルを移動することをお勧めしました。私はあなたがPHPでオブジェクト指向プログラミングについてもっと学ぶ必要があると思います。 Joomlaのシステムを修正したり、拡張機能を作成しようとすると、シンプルなコードのように、ほとんどの場合に邪魔になることがあります。 –

+0

私はモデルにメソッドを呼び出すことができないので、私はそれを構造体を置く理由です。私はちょうどCLassを行うことができます#varible = new Class(); varible.calltoMethod()を実行できますが、PHPのClass :: calltoMethodは機能していないようです。私はジョムラで特定のコントローラーが呼び出されていることを知っているので、そこをリンクしてテストします。 – user2617187

関連する問題