Yii Framework. Загрузка изображений/файлов для Imperavi Redactor WYSIWYG widget

Yii Framework. Загрузка изображений/файлов для Imperavi Redactor WYSIWYG widget

Постер - Yii Framework. Загрузка изображений/файлов для Imperavi Redactor WYSIWYG widget

Скачать последнюю версию виждета WYSIWYG редактора Imperavi Redactor и узнать о нем подробней можно на imperavi-redactor-widget.

Также мы будем использовать Yii расширение file-upload-action, это action для загрузки/обработки файлов.

1. Загружаем скачанную папку file-upload-action в папку protected/extensions.

2. Создаем папку uploads в корне сайта, ставим права 777.

3. Создаем файл FileController.php в папке protected/controllers вставляем код:

<?php
class FileController extends Controller
{
    /**
     * @return array action filters
     */
    public function filters()
    {
        return array(
            'accessControl', // perform access control for CRUD operations
        );
    }
    /**
     * 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
                'users'=>array('@'),
            ),
            array('deny',  // deny all users
                'users'=>array('*'),
            ),
        );
    }
    /**
     * Загрузка файлов
     */
    public function actions()
    {
        return array(
            'upload' => array(
                'class' => 'ext.file-upload-action.EFileUploadAction',
                'name' => 'file',
                'createDirectory' => true,
                'createDirectoryMode' => 0777,
                'createDirectoryRecursive' => true,
                'filenameRule'=>'date("d.m.Y-H.i.s")."_".md5(date("m-d-H-i-s")).".".$file->extensionName',
                'path' => realpath(Yii::app()->basePath.'/..').'/uploads/',
                'onAfterUpload' => create_function('$event', '
                    if ($event->sender->hasErrors()) {
                        $result = CJSON::encode($event->sender->getErrors());
                    } else {
                        $file = array(
                            "filelink" => "/uploads/".$event->sender->filename,
                            "filename" => $event->sender->filename,
                        );
                        if($type = Yii::app()->request->getQuery("type", "file") == "image") {}
                        $result = CJSON::encode($file);
                    }
                    echo stripcslashes($result);
                    exit;
                '),
                // for php 5.3+
                /*'onAfterUpload' => function($event)
                {
                    if ($event->sender->hasErrors()) {
                        $result = CJSON::encode($event->sender->getErrors());
                    } else {
                        $file = array(
                            'filelink' => '/uploads/'.$event->sender->filename,
                            'filename' => $event->sender->filename,
                        );
                        if($type = Yii::app()->request->getQuery('type', 'file') == 'image') {}
                        $result = CJSON::encode($file);
                    }
                    echo stripcslashes($result);
                    exit;
                }*/
            ),
        );
    }
    /**
     * Просмотр списка файлов
     */
    public function actionList()
    {
        $pdirectory = realpath(Yii::app()->basePath.'/..').'/uploads/';
        $directory = '/uploads/';
        $allowed_types=array('jpg','jpeg','gif','png'); // добавляем расширения для других файлов
        $file_parts=array();
        $ext='';
        $title='';
        $i=0;
        $dir_handle = opendir($pdirectory) or die("There is an error with your image directory!");
        while (false !== ($file = readdir($dir_handle)))
        {
            if($file=='.' || $file == '..') continue;
            $file_parts = explode('.',$file);
            $ext = strtolower(array_pop($file_parts));
            $title = implode('.',$file_parts);
            $title = htmlspecialchars($title);
            if(in_array($ext,$allowed_types))
            {
                $array[] = array('thumb'=>$directory.$file,'image'=>$directory.$file,'title'=>$title);
                $i++;
            }
        }
        closedir($dir_handle);
        //echo '<pre>';
        //print_r($array);
        //echo '<\/pre>';
        echo CJSON::encode($array);
        exit;
    }
}

4. Ну и в views в нужный вам файл где выводиться сам редактор добавляем:

<?php
Yii::import('ext.imperavi-redactor-widget.ImperaviRedactorWidget');
$this->widget('ImperaviRedactorWidget', array(
     // You can either use it for model attribute
     //'model' => $my_model,
     //'attribute' => 'my_field',
     // Селектор для textarea
     'selector' => '#Post_content',
     'options' => array(
          'lang' => 'ru',
          //'toolbar' => false,
          //'iframe' => true,
          //'css' => 'wym.css',
          //'fileUpload'=>Yii::app()->createUrl('file/uploadFile'),
          //'fileUploadErrorCallback'=>'js:function(obj, json){ alert(json.error); }',
          'imageUpload'=>Yii::app()->createUrl('file/upload'),
          'imageGetJson'=>Yii::app()->createUrl('file/list'),
          'imageUploadErrorCallback'=>'js:function(obj, json){ alert(json.error); }', // function to show upload error to user
          // if you are using CSRF protection – add following:
          'uploadFields'=>array(
               Yii::app()->request->csrfTokenName => Yii::app()->request->csrfToken,
          ),
     ),
));
echo $form->textAreaRow($model,'content',array('rows'=>12, 'cols'=>50));
?>

Сохрани, чтобы не потерять