2015-12-06 2 views
-1

Je suis un yiibie et je travaille sur le téléchargement de vidéo. J'ai utilisé l'extension uploadmultifile et j'ai apporté des modifications en fonction de ce lien http://www.yiiframework.com/extension/uploadmultifiles/ dans mon fichier video view et mon videocontroller. La vidéo obtient avec succès dans le video folder(projectname/video) mais il ne vient pas la table de base de données nommée video. Je veux que quand je crée une vidéo via projectname/video/create il devrait être affiché lorsque je tape l'URL projectname/video/admin afin que je puisse gérer mes vidéos ici et après je peux simplement afficher toutes mes vidéos sur l'interface. Je l'ai cherché tout autour mais je n'ai pas trouvé de sloution, aidez-moi s'il vous plaît avec ceci. Voici le code pour mon Video ControllerYii: Comment gérer les vidéos lors de l'utilisation de l'extension multiuploadfiles

<?php 

class VideoController extends RController 
{ 
    /** 
    * @var string the default layout for the views. Defaults to '//layouts/column2', meaning 
    * using two-column layout. See 'protected/views/layouts/column2.php'. 
    */ 
    public $layout='//layouts/admin'; 

    /** 
    * @return array action filters 
    */ 
    public function filters() 
    { 
     return array(
//   'accessControl', // perform access control for CRUD operations 
//   'postOnly + delete', // we only allow deletion via POST request 
        'rights', 
     ); 
    } 

    /** 
    * Specifies the access control rules. 
    * This method is used by the 'accessControl' filter. 
    * @return array access control rules 
    */ 
    public function accessRules() 
    { 
     return array(
      array('allow', // allow all users to perform 'index' and 'view' actions 
       'actions'=>array('index','view'), 
       'users'=>array('*'), 
      ), 
      array('allow', // allow authenticated user to perform 'create' and 'update' actions 
       'actions'=>array('create','update'), 
       'users'=>array('@'), 
      ), 
      array('allow', // allow admin user to perform 'admin' and 'delete' actions 
       'actions'=>array('admin','delete'), 
       'users'=>array('admin'), 
      ), 
      array('deny', // deny all users 
       'users'=>array('*'), 
      ), 
     ); 
    } 

    /** 
    * Displays a particular model. 
    * @param integer $id the ID of the model to be displayed 
    */ 
    public function actionView($id) 
    { 
     $this->render('view',array(
      'model'=>$this->loadModel($id), 
     )); 
    } 

    /** 
    * Creates a new model. 
    * If creation is successful, the browser will be redirected to the 'view' page. 
    */ 

public function actionCreate() 
{ 
    $model=new Video; 

    // Uncomment the following line if AJAX validation is needed 
    // $this->performAjaxValidation($model); 
    if(isset($_POST)) 
     { 
     var_dump('ALL POST'); 
     var_dump($_POST); 
    } else { 
     var_dump('NO POST'); 
    } 

    if(isset($_POST['video'])) 
    { 
     var_dump('VIDEO POST'); 
     var_dump($_POST['video']); 

     $model->attributes=$_POST['video']; 
     $model->video = Video::getInstance($model, 'video'); 
     if($model->save(false)) 
      $this->redirect(array('view','id'=>$model->id)); 
    } 

    $this->render('create',array(
    'model'=>$model, 
    )); 
} 

    /** 
    * Updates a particular model. 
    * If update is successful, the browser will be redirected to the 'view' page. 
    * @param integer $id the ID of the model to be updated 
    */ 
    public function actionUpdate($id) 
    { 
     $model=$this->loadModel($id); 

     // Uncomment the following line if AJAX validation is needed 
     // $this->performAjaxValidation($model); 

     if(isset($_POST['Video'])) 
     { 

      $model->attributes=$_POST['Video']; 

      if($model->save()) 

       $this->redirect(array('view','id'=>$model->id)); 
     } 

     $this->render('update',array(
      'model'=>$model, 
     )); 
    } 

    /** 
    * Deletes a particular model. 
    * If deletion is successful, the browser will be redirected to the 'admin' page. 
    * @param integer $id the ID of the model to be deleted 
    */ 
    public function actionDelete($id) 
    { 
     if(Yii::app()->request->isPostRequest) 
     { 
      // we only allow deletion via POST request 
      $this->loadModel($id)->delete(); 

      // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser 
      if(!isset($_GET['ajax'])) 
       $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin')); 
     } 
     else 
      throw new CHttpException(400,'Invalid request. Please do not repeat this request again.'); 
    } 

    /** 
    * Lists all models. 
    */ 
    public function actionIndex() 
    { 
     $dataProvider=new CActiveDataProvider('Video'); 
     $this->render('index',array(
      'dataProvider'=>$dataProvider, 
     )); 
    } 

    /** 
    * Manages all models. 
    */ 
    public function actionAdmin() 
    { 
     $model=new Video('search'); 
     $model->unsetAttributes(); // clear any default values 
     if(isset($_GET['Video'])) 
      $model->attributes=$_GET['Video']; 

     $this->render('admin',array(
      'model'=>$model, 
     )); 
    } 
     public function actionUpload() 
{ 

     Yii::import("ext.EAjaxUpload.qqFileUploader"); 

     $folder=Yii::getPathOfAlias('webroot').'/video/';// folder for uploaded files 
     $allowedExtensions = array("3gp","mp4");//array("jpg","jpeg","gif","exe","mov" and etc... 
     $sizeLimit = 100 * 1024 * 1024;// maximum file size in bytes 
     $uploader = new qqFileUploader($allowedExtensions, $sizeLimit); 
     $result = $uploader->handleUpload($folder); 
     $return = htmlspecialchars(json_encode($result), ENT_NOQUOTES); 

     $fileSize=filesize($folder.$result['filename']);//GETTING FILE SIZE 
     $fileName=$result['filename'];//GETTING FILE NAME 
     //$img = CUploadedFile::getInstance($model,'image'); 

     echo $return;// it's array 
} 

    /** 
    * Returns the data model based on the primary key given in the GET variable. 
    * If the data model is not found, an HTTP exception will be raised. 
    * @param integer $id the ID of the model to be loaded 
    * @return Video the loaded model 
    * @throws CHttpException 
    */ 
    public function loadModel($id) 
    { 
     $model=Video::model()->findByPk($id); 
     if($model===null) 
      throw new CHttpException(404,'The requested page does not exist.'); 
     return $model; 
    } 


    /** 
    * Performs the AJAX validation. 
    * @param Video $model the model to be validated 
    */ 
    protected function performAjaxValidation($model) 
    { 
     if(isset($_POST['ajax']) && $_POST['ajax']==='video-form') 
     { 
      echo CActiveForm::validate($model); 
      Yii::app()->end(); 
     } 
    } 

} 

et voici mon view file

<?php 
/* @var $this VideoController */ 
/* @var $model Video */ 
/* @var $form BSActiveForm */ 
?> 

<?php $form=$this->beginWidget('bootstrap.widgets.BsActiveForm', array(
    'id'=>'video-form', 
    // Please note: When you enable ajax validation, make sure the corresponding 
    // controller action is handling ajax validation correctly. 
    // There is a call to performAjaxValidation() commented in generated controller code. 
    // See class documentation of CActiveForm for details on this. 
    'enableAjaxValidation'=>false, 
    'htmlOptions' => array(
     'enctype' => 'multipart/form-data', 
    ), 

     )); ?> 

    <p class="help-block">Fields with <span class="required">*</span> are required.</p> 
<?php echo $form->errorSummary($model); ?> 

<?php //echo $form->errorSummary($model); ?> 

    <?php echo $form->labelEx($model,'user_id'); ?> 
    <?php 

    $this->widget('ext.select2.ESelect2',array(
    'name'=>'video[user_id]', 
    'data'=>CHtml::listData(User::model()->findAll(), 'id', 'username'), //the whole available list 
    'htmlOptions'=>array(
     'placeholder'=>' search User name?', 
    //'options'=>$options, //the selected values 
    //'multiple'=>'multiple', 
    'style'=>'width:530px', 
), 
)); 
    ?> <br><br> 
    <?php echo $form->errorSummary($model); ?> 
<?php 
$this->widget('ext.EAjaxUpload.EAjaxUpload', 
array(
     'id'=>'uploadFile', 
     'config'=>array(
       'action'=>Yii::app()->createUrl('video/upload'), 
       'allowedExtensions'=>array("mp4","3gp"),//array("jpg","jpeg","gif","exe","mov" and etc... 
       'sizeLimit'=>1000*1024*1024,// maximum file size in bytes 
       'minSizeLimit'=>1*1024, 
       'auto'=>true, 
       'multiple' => true, 
       'onComplete'=>"js:function(id, fileName, responseJSON){ alert(fileName); }", 
       'messages'=>array(
           'typeError'=>"{file} has invalid extension. Only {extensions} are allowed.", 
           'sizeError'=>"{file} is too large, maximum file size is {sizeLimit}.", 
           'minSizeError'=>"{file} is too small, minimum file size is {minSizeLimit}.", 
           'emptyError'=>"{file} is empty, please select files again without it.", 
           'onLeave'=>"The files are being uploaded, if you leave now the upload will be cancelled." 
           ), 
       'showMessage'=>"js:function(message){ alert(message); }" 
       ) 

       )); 
?> 
    <?php //echo $form->textFieldControlGroup($model,'fileName',array('maxlength'=>45)); ?> 
    <?php //echo $form->textFieldControlGroup($model,'user_id'); ?> 

    <?php echo BsHtml::submitButton('Submit', array('color' => BsHtml::BUTTON_COLOR_PRIMARY)); ?> 

<?php $this->endWidget(); ?> 

Et c'est le modèle vidéo

<?php 

/** 
* This is the model class for table "video". 
* 
* The followings are the available columns in table 'video': 
* @property integer $id 
* @property string $video 
* @property integer $user_id 
* 
* The followings are the available model relations: 
* @property User $user 
*/ 
class Video extends CActiveRecord 
{ 
    /** 
    * Returns the static model of the specified AR class. 
    * @param string $className active record class name. 
    * @return Video the static model class 
    */ 
    public static function model($className=__CLASS__) 
    { 
     return parent::model($className); 
    } 

    /** 
    * @return string the associated database table name 
    */ 
    public function tableName() 
    { 
     return 'video'; 
    } 

    /** 
    * @return array validation rules for model attributes. 
    */ 
    public function rules() 
    { 
     // NOTE: you should only define rules for those attributes that 
     // will receive user inputs. 
     return array(
      array('video, user_id', 'required'), 
      array('user_id', 'numerical', 'integerOnly'=>true), 
      array('video', 'length', 'max'=>45), 
      // The following rule is used by search(). 
      // Please remove those attributes that should not be searched. 
      array('id, video, user_id', 'safe', 'on'=>'search'), 
     ); 
    } 

    /** 
    * @return array relational rules. 
    */ 
    public function relations() 
    { 
     // NOTE: you may need to adjust the relation name and the related 
     // class name for the relations automatically generated below. 
     return array(
      'user' => array(self::BELONGS_TO, 'User', 'user_id'), 
     ); 
    } 

    /** 
    * @return array customized attribute labels (name=>label) 
    */ 
    public function attributeLabels() 
    { 
     return array(
      'id' => 'ID', 
      'video' => 'Video', 
      'user_id' => 'User', 
     ); 
    } 

    /** 
    * Retrieves a list of models based on the current search/filter conditions. 
    * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions. 
    */ 
    public function search() 
    { 
     // Warning: Please modify the following code to remove attributes that 
     // should not be searched. 

     $criteria=new CDbCriteria; 

     $criteria->compare('id',$this->id); 
     $criteria->compare('video',$this->video,true); 
     $criteria->compare('user_id',$this->user_id); 

     return new CActiveDataProvider($this, array(
      'criteria'=>$criteria, 
     )); 
    } 
} 

est la vue de créer un fichier

<?php 
/* @var $this VideoController */ 
/* @var $model Video */ 
?> 

<?php 
$this->breadcrumbs=array(
    'Videos'=>array('index'), 
    'Create', 
); 

$this->menu=array(
    array('icon' => 'glyphicon glyphicon-list','label'=>'List Video', 'url'=>array('index')), 
    array('icon' => 'glyphicon glyphicon-tasks','label'=>'Manage Video', 'url'=>array('admin')), 
); 
?> 

<?php echo BsHtml::pageHeader('Create','Video') ?> 

<?php $this->renderPartial('_form', array('model'=>$model)); ?> 

Et c'est le fichier _form.php pour la vidéo

<?php 
/* @var $this VideoController */ 
/* @var $model Video */ 
/* @var $form BSActiveForm */ 
?> 

<?php $form=$this->beginWidget('bootstrap.widgets.BsActiveForm', array(
    'id'=>'video-form', 
    // Please note: When you enable ajax validation, make sure the corresponding 
    // controller action is handling ajax validation correctly. 
    // There is a call to performAjaxValidation() commented in generated controller code. 
    // See class documentation of CActiveForm for details on this. 
    'enableAjaxValidation'=>false, 
    'htmlOptions' => array(
     'enctype' => 'multipart/form-data', 
    ), 

     )); ?> 

    <p class="help-block">Fields with <span class="required">*</span> are required.</p> 
<?php echo $form->errorSummary($model); ?> 

<?php //echo $form->errorSummary($model); ?> 

    <?php echo $form->labelEx($model,'user_id'); ?> 
    <?php 

    $this->widget('ext.select2.ESelect2',array(
    'name'=>'video[user_id]', 
    'data'=>CHtml::listData(User::model()->findAll(), 'id', 'username'), //the whole available list 
    'htmlOptions'=>array(
     'placeholder'=>' search User name?', 
    //'options'=>$options, //the selected values 
    //'multiple'=>'multiple', 
    'style'=>'width:530px', 
), 
)); 
    ?> <br><br> 
    <?php echo $form->errorSummary($model); ?> 
<?php 
$this->widget('ext.EAjaxUpload.EAjaxUpload', 
array(
     'id'=>'uploadFile', 
     'config'=>array(
       'action'=>Yii::app()->createUrl('video/upload'), 
       'allowedExtensions'=>array("mp4","3gp"),//array("jpg","jpeg","gif","exe","mov" and etc... 
       'sizeLimit'=>1000*1024*1024,// maximum file size in bytes 
       'minSizeLimit'=>1*1024, 
       'auto'=>true, 
       'multiple' => true, 
       'onComplete'=>"js:function(id, fileName, responseJSON){ alert(fileName); }", 
       'messages'=>array(
           'typeError'=>"{file} has invalid extension. Only {extensions} are allowed.", 
           'sizeError'=>"{file} is too large, maximum file size is {sizeLimit}.", 
           'minSizeError'=>"{file} is too small, minimum file size is {minSizeLimit}.", 
           'emptyError'=>"{file} is empty, please select files again without it.", 
           'onLeave'=>"The files are being uploaded, if you leave now the upload will be cancelled." 
           ), 
       'showMessage'=>"js:function(message){ alert(message); }" 
       ) 

       )); 
?> 

    <?php //echo $form->textFieldControlGroup($model,'fileName',array('maxlength'=>45)); ?> 
    <?php //echo $form->textFieldControlGroup($model,'user_id'); ?> 

    <?php echo BsHtml::submitButton('Submit', array('color' => BsHtml::BUTTON_COLOR_PRIMARY)); ?> 

<?php $this->endWidget(); ?> 
+0

Salut @Salik quel est le problème? Si je comprends bien, vous ne pouvez pas enregistrer le nom de la vidéo dans la base de données? tandis que le fichier vidéo est enregistré dans le dossier correctement planifié. donc le manque de nom dans la base de données ne vous laissera pas voir le bon résultat dans la vue? – scaisEdge

+0

Exactement mate, le manque de nom dans la base de données ne me laisse pas voir la vidéo sur le localhost/projectname/video/create –

+0

Etes-vous sûr que les actionCreate sont invoqués lorsque vous appuyez sur submit? – scaisEdge

Répondre

0

Si vous ne sauvegardez pas le modèle dans la base de données, vérifiez d'abord si les données de présenter sont ce dont vous avez besoin et le modèle est enregistré sans validation du modèle.

public function actionCreate() 
{ 
    $model=new Video; 

    // Uncomment the following line if AJAX validation is needed 
    // $this->performAjaxValidation($model); 
    if(isset($_POST){ 
     var_dump('ALL POST'); 
     var_dump($_POST); 
    } else { 
     var_dump('NO POST'); 
    } 

    if(isset($_POST['video'])) 
    { 
     var_dump('VIDEO POST'); 
     var_dump($_POST['video']); 

     $model->attributes=$_POST['video']; 
     //$model->video = Video::getInstance($model, 'video'); 
     if($model->save(false)) 
      $this->redirect(array('view','id'=>$model->id)); 
    } 

    $this->render('create',array(
    'model'=>$model, 
    )); 
} 

Si la valeur appropriée show var_dump et en remplaçant la validation de la valeur est enregistrée dans db le problème est dans les règles de validation.

et dans la vue essayer

<?php 

    echo "<br /> Video = : ". $model->video ."<br />"; 
?> 
+0

Expliquez-moi. Qu'est-ce qui a montré le var_dump ($ _ POST ['video'])? – scaisEdge

+0

J'ai essayé le code exact que vous avez mentionné comme réponse mais il n'apporte aucun changement .. Il fonctionne comme avant. –

+0

@SalikAsad Je ne vous ai pas demandé si je travaillais ou non, mais seulement ce que l'instruction var_dump montre dans le navigateur. Les var_dump montrent quelque chose ou non. Soyez clair s'il vous plaît .. – scaisEdge