авторизация для elfinder

Мне тут простая вещь в голову пришла, может кому надо.

Кто не знает, есть такой RTE - elRte, неплохой визивиг редактор. Для него есть отличный файлменеджер, называется elfinder.

Сам по себе он не имеет авторизации, а пилить для него авторизацию было лень. Ведь как правило такого рода функционал нужен для авторизированных пользователей. Так вот, вместо костыля с авторизацией, я создал экшен который содержит в себе код из коннектора.

Чуток подпиленный под свои нужды конечно )

А сам экшен закрыт стандартными yii средствами, т.е. через accessRules

ну и не забываем в js коде указать корректную ссылку на коннектор

выложил бы какие нибудь примеры кода, или скриншоты, а то новичкам нифига не понятно.

ммм, ну все довольно просто. Про accessRules писать не буду, все есть в документации.

Сам elrte/elfinder подключаю как экстеншен

EditorWidget.php


<?php 

class EditorWidget extends CWidget {	

	public $selector;

	public $id;


    public function run() {

		$this->render('editor', array('selector' => $this->selector, 'id' => $this->id));

    }


}

editor.php - вьюшка




<?

$baseUrl = Yii::app()->baseUrl; 

$cs = Yii::app()->getClientScript();

$cs->registerScriptFile($baseUrl.'/js/elrte.min.js');

$cs->registerScriptFile($baseUrl.'/js/elfinder.min.js');

$cs->registerScriptFile($baseUrl.'/js/i18n/elrte.ru.js');

$cs->registerScriptFile($baseUrl.'/js/i18n/elfinder.ru.js');


$cs->registerCssFile($baseUrl.'/css/elfinder.css');

$cs->registerCssFile($baseUrl.'/css/elrte.full.css');

	

if(!file_exists(Yii::app()->params['paths']['editor'] . '/' . $id))

	mkdir(Yii::app()->params['paths']['editor'] . '/' . $id, 0777);


?>


<script type="text/javascript">

	$(function() {

		var opts = {

			cssClass : 'el-rte',

			lang     : 'ru',

			height   : 450,

			toolbar  : 'complete',

			absoluteURLs: false,

			cssfiles : ['/css/elrte-inner.css'],

			fmOpen : function(callback) {

		       $('<div id="myelfinder" />').elfinder({

		          url : '<? echo Yii::app()->createUrl('site/connector', array('id' => $id)); ?>',

		          fileURL: false,

		          lang : 'ru',

		          dialog : { width : 900, modal : true, title : 'Files' }, // открываем в диалоговом окне

		          closeOnEditorCallback : true, // закрываем после выбора файла

		          editorCallback : callback // передаем callback файловому менеджеру

		       });

		    }

		}

		$('<? echo $selector; ?>').elrte(opts);	

	});

</script>

в скрипте есть такая строчка




url : '<? echo Yii::app()->createUrl('site/connector', array('id' => $id)); ?>',



она создает корректную ссылку на мой коннектор, который я засунул в экшен

потом в конфиге прописываем правило для пути коннектора




BACKEND . '/connector/<id:\d+>'	=> 'site/connector',



далее пишем экшен для коннектора

SiteController.php




	public function actionConnector() {

		if (function_exists('date_default_timezone_set')) {

			date_default_timezone_set('Europe/Kiev');

		}

		

		$opts = array(

			'root'            => Yii::app()->params['paths']['editor'] . '/' . $_GET['id'] ,                       // path to root directory

			'URL'             => '/images/goods/' . $_GET['id'] . '/', // root directory URL

			'rootAlias'       => 'Корень',       // display this instead of root directory name

		);

			

		$fm = new elFinder($opts); 

		$fm->run();

	}



так же надо взять файл с классом elfinder и скопировать в папку /protected/extensions/, оригинальный файл выглядит так elFinder.class.php, что бы этот класс подхватился автоматом стоит переименовать его в elFinder.php

что еще, столкнулся с маленьким глюком, часть скриптов elfinder падали из-за попытки определить каким методом можно получать информацию о файлах. фиксить эту штуку не хотелось, по этому я просто закомментировал часть проверки в классе elFinder.

В методе _getMimeDetect()

вот кусок кода который закомментировал




		/*if (class_exists('finfo')) {

			return 'finfo';

		} else*/if (function_exists('mime_content_type') && (mime_content_type(__FILE__) == 'text/x-php' || mime_content_type(__FILE__) == 'text/x-c++')) {



ну и самое главное, как подключать RTE.




<?php $this->widget('EditorWidget', array('selector' => '#description', 'id' => $form->id)); ?>



где

selector - jquery css селектор того поля которое вам надо сделать визивигом

id - это фича для моего сайта, в принципе сделана для того что бы все картинки не в одну кашу собирались, а что бы у своего типа контента была своя папка с картинками.

что еще, там есть по коду константа BACKEND, это тоже фича сайта, что бы админку можно было одним махом перенести например с /admin в /today-admin-folder-is-here

так же по коду используется Yii::app()->params[‘paths’][‘editor’], там находится абсолютный путь к папке куда складируются картинки, путь файловой системы!

ну и что бы экстеншены работали стоит проверить есть ли у вас в конфиге в секции import вот такой параметр ‘application.extensions.*’

вроде все, если что забыл, спрашивайте

Саша - решпект тебе :)

всегда пожалуйста )

В методе _getMimeDetect()

вот кусок кода который закомментировал




		/*if (class_exists('finfo')) {

			return 'finfo';

		} else*/if (function_exists('mime_content_type') && (mime_content_type(__FILE__) == 'text/x-php' || mime_content_type(__FILE__) == 'text/x-c++')) {



Саша, седня это делал, дебаггером посмотрел, всё просто. class_exists(‘finfo’) запускает Yii __autoload, а если такого класса нету, то кряк… поэтому class_exists(‘finfo’,false) отключает вызов переопределенного autoload… и всё работает :-*

вот хреново что надо сорцы править. надо посмотреть как бы заглушку просто сделать.

Если вас не затруднит, можете сделать всё это в одном файле со всеми папками. Чтобы осталось только скопировать их и отредактировать? А то новичкам не понятно. где лежит EditorWidget? где папки js и css - в корне сайта?

не недельке постараюсь все собрать.

Круто, работает! Спасиб!