0

Yii フレームワークを使用して CSV ファイルをアップロードしようとしています。以下のコードを追加しました:

モデル

<?php
    class Import extends CModel
    {
        public $name,$email,$doctor = 0,$hospital = 0,$diagnostic = 0;
        public function rules()
        {
            return array(
                array('name,email,doctor,hospital,diagnostic','required')
            );
        }

        public function  attributeNames()
        {
            return array(); 
        }
    }
?>

見る(index.php)

<div class="form">
    <?php echo CHtml::beginForm('site/import',$method='post',$htmlOptions =array('enctype'=>'multipart/form-data')); ?>
        <div class="row">
            <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
            <input type="file" name="filename" value="file">
            <?php echo CHtml::submitButton('Submit', array('name'=>'submitCSV')); ?>
            <?php 
                if(is_array($buffer))
                {
                    foreach($buffer as $line){ 
                        echo '<div class="clear"></div>';
                        echo CHtml::activeTextField($buffer[0],'name',array('value',$line['name']));
                        echo CHtml::activeTextField($buffer[0],'email',array('value',$line['email']));
                        echo CHtml::activeTextField($buffer[0],'doctor',array('value',$line['doctor']));
                        echo CHtml::activeTextField($buffer[0],'hospital',array('value',$line['hospital']));
                        echo CHtml::activeTextField($buffer[0],'diagnostic',array('value',$line['diagnostic']));
            }}?>
        </div>
    <?php echo CHtml::endForm(); ?>
</div>

コントローラ

public function actionImport()
{
    $model = new Import;
    $buffer = array($model);
    if(isset($_POST['submitCSV'])){
        $filename=$_FILES['filename']['tmp_name'];
        $fp = fopen("$filename","r");
        if($fp){
            $i =0;
            while(($buffer[$i] = fgetcsv($fp,1000,",")) !== false)
            {
                $model = new Import;
                $model->name = $buffer[$i][0];
                $model->email = $buffer[$i][1];
                $model->doctor = $buffer[$i][2];
                $model->hospital = $buffer[$i][3];
                $model->diagnostic = $buffer[$i][4];
                $buffer[$i++] = $model;
            }
            if(!feof($fp))
                echo "Echo: Unexpected fgets() fail\n";
        }
        fclose($fp);
        unset($_POST['submitCSV']);
    }
    $this->render('index',array('buffer'=>$buffer));
}

このコードで直面している問題:

  1. $lineのインスタンスであるためImport、オブジェクトの要素を使用できるはず$lineですが、それができません。私はこれを使用$line->'name'しましたが、次のエラーが発生しました: 解析エラー: 構文エラー、予期しない ''名前'' (T_CONSTANT_ENCAPSED_STRING)、識別子 (T_STRING) または変数 (T_VARIABLE) または '{' または '$' が必要です

  2. $lineはここにあるので、ステートメントmodelの最初の引数として配置できるはずです。activeTextFieldこのエラーが発生します: get_class() は、パラメーター 1 がオブジェクトであると想定しています。

  3. 第三に、このコードはテキスト フィールドの同じ行を 5 回生成するため、コード内の代わりに をactiveTextField配置し、ループ内でインクリメントすることで実験することを考えました。これにより、2 と同じエラーが発生します。$i0foreach

よろしく

4

1 に答える 1

1

まず、 のCFormModel代わりに使用しCModelます。attributeNames()関数も削除したい場合があります。

問題 1:$label->'name'正しくありません。使用して$label->nameください。

上記のように変更すると、問題2と3が機能するはずです

于 2013-01-28T14:25:52.313 に答える