HOW TO implement upload multiple files?

Discuss everything related to ApPHP Durecty CMF. All versions. Any questions related to the Directy CMF developing or using should be posted to this forum.

Moderators: alexandrleonenko, alexmst

administrator
Site Admin
Site Admin
Posts: 6169
Joined: Jan 7th, '09, 23:18
Contact:

HOW TO implement upload multiple files?

Postby administrator » Dec 15th, '15, 19:23

To implement upload multiple files, you have to create 3 methods in controller and 2 view files.
Lets see them on test controller, called ListingImages


1. ListingImagesController::manageAction() method:

Code: Select all

public function manageAction($listingId = '')
{
   if($this->_cSession->hasFlash('alert')){
      $alert = $this->_cSession->getFlash('alert');
      $alertType = $this->_cSession->getFlash('alertType');

      $this->_view->actionMessage = CWidget::create(
         'CMessage', array($alertType, $alert, array('button'=>true))
      );
   }

   $this->_view->render('listingImages/manage');       
}


2. ListingImagesController::addMultipleAction() method:

Code: Select all

public function addMultipleAction($listingId = 0)
{
   $maxImages = 20;

   if($this->_cRequest->getPost('act') == 'send'){         
      $fieldsImages = array();
      for($i = 1; $i <= $maxImages; $i++){
         $fieldsImages['listing_image'][] = array('title'=>A::t('my_module', 'Image').' #'.$i, 'validation'=>array('required'=>false, 'type'=>'image', 'targetPath'=>'images/modules/my_module/listings/gallery/', 'maxSize'=>'990k', 'fileName'=>'l'.$listingId.'_'.CHash::getRandomString(10), 'mimeType'=>'image/jpeg, image/jpg, image/png, image/gif'));
      }

      $result = CWidget::create('CFormValidation', array('fields'=>$fieldsImages, 'multiArray'=>true));
      if($result['error']){
         $alert     = $result['errorMessage'];
         $alertType = 'validation';
      }else{
         // Add images here
         if(!empty($result['uploadedFiles'])){
            $errorSave = false;
            $width     = '200px';
            $height    = '200px';
            $directory = 'thumbs'.DS;
            $maxOrder  = ListingImages::model()->max('sort_order', 'listing_id = :listing_id', array('i:listing_id'=>$listingId));

            foreach($result['uploadedFiles'] as $pathToImage){
               // Create thumbnail
               $imageName         = basename($pathToImage);
               $path              = APPHP_PATH.DS.str_ireplace($imageName, '', $pathToImage);
               $thumbFileExt      = substr(strrchr($imageName, '.'), 1);
               $thumbFileName     = str_replace('.'.$thumbFileExt, '', $imageName);
               $thumbFileFullName = $thumbFileName.'_thumb.'.$thumbFileExt;
               CFile::copyFile($path.$imageName, $path.$directory.$thumbFileFullName);
               $thumbFileRealName = CImage::resizeImage($path.$directory, $thumbFileFullName, $width, $height);

               if(!empty($thumbFileRealName)){
                  $listingImage = new ListingImages();
                  $listingImage->listing_id = $listingId;
                  $listingImage->image_file = $imageName;
                  $listingImage->image_file_thumb = $thumbFileRealName;
                  $listingImage->sort_order = ++$maxOrder;
                  $listingImage->is_active  = 1;

                  if(!$listingImage->save()){
                     $alert     = A::t('my_module', 'The error occurred while adding new record!');
                     $alertType = 'error';
                     $errorSave = true;
                     break;
                  }
               }
            }
            if(!$errorSave){
               $alertType = 'success';
               $alert = A::t('my_module', 'New {item_type} has been successfully added!', array('{item_type}'=>A::t('my_module', 'Images')));   
               $this->_cSession->setFlash('alert', $alert);
               $this->_cSession->setFlash('alertType', $alertType);   
               $this->redirect('listingImages/manage/listingId/'.$listingId);
            }
         }else if($this->_cRequest->getPost('act') == 'send'){
            $alertType = 'validation';
            $alert = A::t('my_module', 'You have to chose at least one image for uploading! Please re-enter.');
         }
      }

      if(!empty($alert)){
         $this->_view->actionMessage = CWidget::create('CMessage', array($alertType, $alert, array('button'=>true)));         
      }
   }

   $this->_view->maxImages = $maxImages;
   $this->_view->render('listingImages/addMultiple');
}


3. ListingImagesController::deleteAction() method:

Code: Select all

public function deleteAction($listingId = 0, $id = 0)
{
   $image = 'images/modules/my_module/listings/gallery/'.$listingImage->image_file;
   $imageThumb = 'images/modules/my_module/listings/gallery/thumbs/'.$listingImage->image_file_thumb;

   if($listingImage->delete()){
      $alert = A::t('my_module', 'Listing image record has been sucessfully deleted!');         
      // Delete the icon file
      if($listingImage->image_file == '' || (CFile::deleteFile($image) && CFile::deleteFile($imageThumb))){
         $alertType = 'success';   
      }else{
         $alert .= '<br>'.A::t('my_module', 'Listing image delete image warning');
         $alertType = 'warning';
      }         
   }else{
      $alert = A::t('my_module', 'Listing image deleting error');
      $alertType = 'error';
   }

   $this->_cSession->setFlash('alert', $alert);
   $this->_cSession->setFlash('alertType', $alertType);

   $this->redirect('listingImages/manage/listingId/'.$listingId);
}


----------

and 2 views

1. manage.php

Code: Select all

<?php
   $paramListingId = (!empty($listingId) ? '/listingId/'.(int)$listingId : '');

   echo CWidget::create('CGridView', array(
      'model'             => 'ListingImages',
      'actionPath'        => 'listingImages/manage'.$paramListingId,
      'condition'         => 'listing_id = '.(int)$listingId,
      'defaultOrder'      => array('sort_order'=>'ASC'),
      'passParameters'    => true,
      'pagination'        => array('enable'=>true, 'pageSize'=>20),
      'sorting'           => true,
      'filters'           => array(),
      'fields'         => array(
         'index'          => array('title'=>'', 'type'=>'index', 'align'=>'', 'width'=>'17px', 'class'=>'left', 'headerClass'=>'left', 'isSortable'=>false),
         'image_file_thumb'  => array('title'=>A::t('my_module', 'Image'), 'type'=>'image', 'width'=>'60px',  'align'=>'', 'imagePath'=>'images/modules/my_module/listings/gallery/thumbs/', 'defaultImage'=>'no_image.png', 'imageWidth'=>'50px', 'imageHeight'=>'35px', 'class'=>'center', 'headerClass'=>'center', 'isSortable'=>false, 'htmlOptions'=>array(), 'prependCode'=>'<a class="fancybox" rel="reference_picture" href="#">', 'appendCode'=>'</a>'),
         'title'          => array('title'=>A::t('my_module', 'Title'), 'type'=>'label', 'align'=>'', 'width'=>'', 'class'=>'left', 'headerClass'=>'left', 'isSortable'=>true, 'definedValues'=>'', 'stripTags'=>true),
         'sort_order'         => array('title'=>A::t('my_module', 'Sort Order'), 'type'=>'label', 'class'=>'center', 'headerClass'=>'center', 'width'=>'90px'),
         'is_active'        => $isActive
      ),
      'actions'          => array(
         'edit'    => array(
            'disabled'      => !Admins::hasPrivilege('modules', 'edit') || !Admins::hasPrivilege('listings', 'edit'),
            'link'         => 'listingImages/edit'.$paramListingId.'/id/{id}', 'imagePath'=>'templates/backend/images/edit.png', 'title'=>A::t('my_module', 'Edit this Image')
         ),
         'delete'  => array(
            'disabled'      => !Admins::hasPrivilege('modules', 'edit') || !Admins::hasPrivilege('listings', 'delete'),
            'link'         => 'listingImages/delete'.$paramListingId.'/id/{id}, 'imagePath'=>'templates/backend/images/delete.png', 'title'=>A::t('my_module', 'Delete this Image'), 'onDeleteAlert'=>true
         )
      ),
      'return'=>true,
   ));
?>


2. addmultiple.php

Code: Select all

<?php echo $actionMessage; ?>

<?php
   echo CWidget::create('CFormView', array(
      'action'      =>   'listingImages/addMultiple'.$paramListingId,
      'cancelUrl'      =>   'listingImages/manage'.$paramListingId,
      'method'      =>   'post',
      'htmlOptions'   =>   array(
         'name'         =>   'form-contact',
         'enctype'      =>   'multipart/form-data',
         'autoGenerateId'=>   false
      ),
      'requiredFieldsAlert'=>true,
      'fields'=>array(
         'act'         =>   array('type'=>'hidden', 'value'=>'send', 'htmlOptions'=>array()),
         'listing_image[]'=>   array('type'=>'file', 'title'=>'', 'tooltip'=>'', 'mandatoryStar'=>false, 'value'=>'', 'htmlOptions'=>array('multiple'=>'multiple', 'id'=>'listing_image')),
      ),
      'buttons'=>array(
         'submit'=>array('type'=>'submit', 'value'=>A::te('my_module', 'Start Upload'), 'htmlOptions'=>array('name'=>'')),
         'reset' =>array('type'=>'reset', 'value'=>A::te('my_module', 'Reset'), 'htmlOptions'=>array('class'=>'button white')),
         'cancel'=>array('type'=>'button', 'value'=>A::te('my_module', 'Cancel'), 'htmlOptions'=>array('name'=>'', 'class'=>'button white', 'onclick'=>"$(location).attr('href','listingImages/manage".$paramListingId."')")),
      ),
      'buttonsPosition'=>'bottom',
      'return'=>true
   ));      


   A::app()->getClientScript()->registerScript(
      'MultiUpload',
      '$(document).ready(function(){
         $("input:submit").click(function(){
            if (parseInt($("#listing_image").get(0).files.length) > '.(int)$maxImages.'){
               alert("'.A::te('my_module', 'You can only upload a maximum of {count} files!', array('{count}'=>(int)$maxImages)).'");   
               return false;
            }
            $(this).html("'.A::te('my_module', 'Uploading...').'");
            $(this).closest("form").submit();
            $(this).attr("disabled", true);
         });
      });
      ',
      4
   );
?>

Return to “ApPHP Directy CMF {developers/users}”