私は yii が初めてで、ファイルのアップロードに問題があります。ファイルをアップロードすると、検証されません-すべてのタイプが許可されます(許可されるべきではありません)、空が許可されます(許可されるべきではありません)などです。もちろん、モデルに適切なルール(と思います)を含めました。何らかの理由で fileField が検証されていないようです。
[送信] ボタンをクリックしたときに、エラー メッセージ (間違った型または空) を書き込みたい。おかしなところが見つからない場合は、ぜひご覧ください。
ここに私のフォームがあります:
<?php class UploadSolutionForm extends CFormModel
{
public $sourceCode;
public function rules()
{
return array(
array('sourceCode', 'file', 'types'=>'java, zip', 'allowEmpty'=>false, 'wrongType'=>'Only .java and .zip files.'),
);
}
/**
* Declares attribute labels.
*/
public function attributeLabels()
{
return array(
'sourceCode' => 'Source code',
);
}}
コントローラーでの私のアクションは次のとおりです。
public function actionSolveProblem()
{
//gets id from url
$id = Yii::app()->request->getQuery('id');
//guests can't work with problems in any way
if (Yii::app()->user->isGuest)
{
$this->redirect(array('site/index'));
return;
}
if(isset($id))
{
$model = new UploadSolutionForm();
if(isset($_POST['UploadSolutionForm']))
{
$model->attributes=$_POST['UploadSolutionForm'];
$newFile = CUploadedFile::getInstance($model, 'sourceCode');
$problem = Problems::model()->findByAttributes(array('id'=>$id));
$version = Solutions::model()->countByAttributes(array('id_problem'=>$id))+1;
$pathUser = Yii::app()->basePath.'\\SubjectFolder\\'.$problem->id_subject.'\\'.$id.'\\'.Yii::app()->user->getName();
$path = $pathUser.'\\'.$version;
if (!is_dir($pathUser)) {
mkdir($pathUser);
}
if (!is_dir($path)) {
mkdir($path);
}
$uploadPath = $path.'\\'.$newFile->name;
$solution = new Solutions();
$solution->id_problem = $id;
$solution->id_user = Yii::app()->user->getId();
$solution->submit_time = date("Y-m-d H:i:s",time());
$solution->path_to_file = $uploadPath;
$solution->version = $version;
if($newFile->saveAs($uploadPath))
{
if($solution->save())
{
Yii::app()->user->setFlash('new_problem','Solution uploaded');
$this->redirect(array('site/problems'));
}
else
{
Yii::app()->user->setFlash('new_problem','Error! Could not save into db');
$this->redirect(array('site/problems'));
}
}
}
//part bellow is not really important in this case
$auth = Problems::model()->with(array('subject','subject.currentUserSubject' => array('alias'=>'currentUserSubject')))->findByAttributes(array('id'=>$id));
// user with proper role cannot upload solutions to problems
if($auth!=null)
{
$this->render('solve',array('model'=>$model));
}
else
{
Yii::app()->user->setFlash('new_problem','You are not authorized to upload a solution for this problem');
$this->redirect(array('site/problems'));
}
}
}
そして、これが私の見解です(solve.php):
<?php
$form = $this->beginWidget(
'CActiveForm',
array(
'id' => 'upload-form',
'htmlOptions' => array('enctype' => 'multipart/form-data'),
'enableClientValidation'=>true,
'clientOptions'=>array(
'validateOnSubmit'=>true,
),));
?>
<div class="row">
<?php echo $form->labelEx($model, 'sourceCode');?>
<br><?php echo $form->fileField($model, 'sourceCode');?>
<?php echo $form->error($model, 'sourceCode');?>
</div>
<div class="row buttons">
<?php echo CHtml::submitButton('Submit'); ?>
</div>
<?php
// ...
$this->endWidget();?>
いろいろ調べたのですが、何も問題がないように見えるので、誰かが助けてくれることを願っています。
編集: 私は主に、クライアント側の検証がファイルのアップロードで正しく機能しない理由を理解したい (テキスト フィールドで機能する) と、もちろんそれを修正したい...