KCFinder с CKEditor – настройка динамических папок для загрузки файлов

Я использую CKEditor с KCFinder – мне бы хотелось иметь личные файлы для загрузки на основе динамического значения.

Я хотел бы динамически изменять папку, которую пользователи могут загружать, на основе значения SESSION после входа в систему.

После входа в систему я хотел бы ограничить папку, доступ к которой пользователь может получить через плагин KCFinder. Например, например.

User abc their path would be abc/images User foo their path would be foo/images User abc cannot see foo's images & vice-versa 

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

    Конечно, я включил его в TinyMCE, но я думаю, что принципы одинаковы

    Вот мое решение проблемы

    Моя структура папок

     /my_uploads/media /my_uploads/media/member_folder 
    1. Инициализировать сеанс php в верхней части файла config.php

      session_start ()

    2. Отредактируйте массив 'types' => и закомментируйте все разные типы,

       // CKEditor & FCKEditor types // 'files' => "", // 'flash' => "swf", // 'images' => "*img", // TinyMCE types // 'files' => "", // 'media' => "swf flv avi mpg mpeg qt mov wmv asf rm", // 'image' => "*img", 
    3. Добавьте в массив следующий тип:

      $ _SESSION ['fold_type'] => "* img swf flv avi mpg mpeg qt mov wmv asf rm",

    4. Сохраните файл config.php

    5. Откройте страницу приложения, где вы инициализируете свой редактор и вызываете KCFinder

    6. Перед инициализацией вашего редактора добавьте следующие строки, объявляющие различные переменные KCFinder

       $_SESSION['KCFINDER'] = array(); $_SESSION['KCFINDER']['disabled'] = false; // Activate the uploader, $_SESSION['KCFINDER']['uploadURL'] = "/uploads"; $_SESSION['fold_type'] = "media"; 

    или

      $_SESSION['KCFINDER'] = array(); $_SESSION['KCFINDER']['disabled'] = false; // Activate the uploader, $_SESSION['KCFINDER']['uploadURL'] = "/my_uploads/media/Members"; $_SESSION['fold_type'] = "member_account_number_pulled_from_secure_session_variable"; 

    7 Оставьте строку, в которой вы вызываете загрузчика, например:

      file: '../tiny_mce/plugins/kcfinder/browse.php?opener=tinymce', 

    Динамически загружать папку для KCFinder

    Это можно сделать разными способами. Я объясняю процесс, который я применял в соответствии со структурой кода моего php-приложения. Такая же структура кода / структура, которую я придерживался для разных приложений, с каждым приложением в качестве подпапки на моем сервере. Таким образом, существует логическая необходимость использовать один CKeditor с KCfinder и каким-то образом настроить его, чтобы он работал правильно для всех приложений. Контентная часть CKeditor в порядке. Его можно легко повторно использовать разными приложениями или проектами из одного компонента CKeditor. Но проблема возникает при загрузке файлов, таких как изображение, видео или любой другой документ. Чтобы сделать его применимым для разных проектов, файлы должны быть загружены в разделяемые папки для разных проектов. И для этого $ _CONFIG ['uploadURL'] должен быть настроен с использованием динамического пути к папке, означает другой путь к папке для каждого проекта, но вызывает тот же компонент CKeditor KCfinder в том же месте. Я поэтапно объясняю некоторые разные процессы вместе. Они отлично работали с KCfinder версии 2.51, и я надеюсь, что они будут работать и для других. Если это не сработает для других разработчиков, возможно, им необходимо внести некоторые изменения в этот процесс в соответствии с их структурой кода проекта и разрешением на запись в папку, а также версией CKeditor и KCfinder.

    1) В файле CKeditor \ filemanagers \ kcfinder_2_51 \ config.php

    a) В определении массива $ _CONFIG найдите эту строку «disabled» => false, и если вы найдете какую-либо замену на «disabled» => true, в конце этого файла поместите следующий код. Код сам объясняет логикой и деталями, прокомментированными внутри нее. Код:

     //Code to assign $_CONFIG['uploadURL'] dynamic value: different for different projects or sites: added by Mrinal Nandi on 5 oct, 2013: start //session dependent dynamic $_CONFIG['uploadURL'] setting :start ////session dependent secure method: only for single site setting: ie one CKeditor KCfinder for each one project domain or subdomain, not one CKeditor KCfinder for multiple project:start // session_start(); //if(isset($_SESSION['KCFINDER']['uploadURL']) && $_SESSION['KCFINDER']['uploadURL']!="") { //$_SESSION['SESSION_SERVER_RELATIVEPATH']: relative folder path of the project corresponding to the webroot; should be like "/project/folder/path/" //set this session variable in a common file in your project where the session started // $file_upload_relative_path=$_SESSION['KCFINDER']['uploadURL']; //} ////session dependent secure method: only for single site setting: ie one CKeditor KCfinder for each one project domain or subdomain, not one CKeditor KCfinder for multiple project:start //Using a single CKeditor KCfinder component for different projects or sites (multisite): start //session dependent settings a single CKeditor KCfinder component for different projects or sites (multisite): start //Assuming different session_name for different projects, if represented as different sub-folders, but not work if represented as sub-domains or different domains //Secure and deny access for unauthorized users without any session, thus restrict access via direct link //but not work if projects represented as sub-domains or different domains, then have to use the session independent way provided bellow (though it is insecure), or have to implement some session related way as per the project flow and structure session_name(base64_decode($_REQUEST['param_project'])); session_start(); if(isset($_SESSION['KCFINDER']['uploadURL']) && $_SESSION['KCFINDER']['uploadURL']!="") { //$_SESSION['SESSION_SERVER_RELATIVEPATH']: relative folder path of the project corresponding to the webroot; should be like "/project/folder/path/" //set this session variable in a common file in your project where the session started $file_upload_relative_path=$_SESSION['KCFINDER']['uploadURL']; } //session dependent settings a single CKeditor KCfinder component for different projects or sites (multisite): end //session dependent dynamic $_CONFIG['uploadURL'] setting :end ////session independent dynamic $_CONFIG['uploadURL'] setting: without using session :start //if(isset($_REQUEST['param_project']) && $_REQUEST['param_project']!=""){ //base64 encoded relative folder path for file upload in the project, corresponding to the webroot; should be like "/project/folder/file/upload/path/" before encoding // $file_upload_relative_path=base64_decode($_REQUEST['param_project']); // //} ////session independent dynamic $_CONFIG['uploadURL'] setting: without using session :end if(isset($file_upload_relative_path) && trim($file_upload_relative_path)!="" ){ if(isset($_SESSION['KCFINDER']['uploadURL'])){ $_CONFIG['disabled']=false; } else if(is_dir($file_upload_relative_path)) { //to make it relatively secure so that hackers can not create any upload folder automatcally in the server, using a direct link and can not upload files there $_CONFIG['disabled']=false; } } // Path to user files relative to the document root. $_CONFIG['uploadURL']= $file_upload_relative_path; $_CONFIG['param_project'] = $_REQUEST['param_project']; //Using a single CKeditor KCfinder component for different projects or sites (multisite): end //Code to assign $_CONFIG['uploadURL'] dynamic value: different for different projects or sites: added by Mrinal Nandi on 5 oct, 2013: end 

    2) В ckeditor \ filemanagers \ kcfinder_2_51 \ js \ browser \ misc.js

    Найдите эту строку: var data = 'browse.php? Type =' + encodeURIComponent (this.type) + '& lng =' + this.lang;

    Замените его на эту строку:

     var data = 'browse.php?type=' + encodeURIComponent(this.type) + '&lng=' + this.lang + '&param_project=' + this.param_project; 

    3) В ckeditor \ filemanagers \ kcfinder_2_51 \ tpl \ tpl_javascript.php

    Найдите эту строку: browser.type = "type)?>";

    Поместите эти команды после этой строки:

     browser.param_project = "<?php echo text::jsValue($this->config['param_project']) ?>"; 

    4) В ckeditor \ filemanagers \ kcfinder_2_51 \ core \ uploader.php Поиск этих строк в функции __construct ():

     if (isset($this->config['_check4htaccess']) && $this->config['_check4htaccess'] ) { $htaccess = "{$this->config['uploadDir']}/.htaccess"; if (!file_exists($htaccess)) { if (!@file_put_contents($htaccess, $this->get_htaccess())) $this->backMsg("Cannot write to upload folder. {$this->config['uploadDir']}"); } else { if (false === ($data = @file_get_contents($htaccess))) $this->backMsg("Cannot read .htaccess"); if (($data != $this->get_htaccess()) && !@file_put_contents($htaccess, $data)) $this->backMsg("Incorrect .htaccess file. Cannot rewrite it!"); } } 

    И прокомментируйте, что полный раздел

    4) Теперь, когда вы хотите показать CKeditor в своем проекте, вы должны поместить эти строки в соответствующий файл / страницу php, очевидно, с измененными значениями переменных, соответствующих вашему проекту / приложению. Но сначала прочитайте комментарии, чтобы решить, какие строки вы должны сохранить, и что должно быть прокомментировано в соответствии с вашим потоком:

     include_once(Absolute/Folder/path/for/CKeditor/."ckeditor/ckeditor.php") ; //If you did not want a session oriented way, cooment out the session related lines $_SESSION['KCFINDER'] = array(); $_SESSION['KCFINDER']['uploadURL']=$SERVER_RELATIVEPATH."userfiles/"; $CKEditor = new CKEditor(); $CKEditor->basePath = HTTP_COMPONENTPATH."ckeditor_3.6.2/ckeditor/"; //$_SESSION['KCFINDER']['uploadURL']="/userfiles/fashion_qr/"; $CKEditor->config["filebrowserBrowseUrl"] = ($CKEditor->basePath)."filemanagers/kcfinder_2_51/browse.php?type=files&param_project=".base64_encode(session_name()); $CKEditor->config["filebrowserImageBrowseUrl"] = ($CKEditor->basePath)."filemanagers/kcfinder_2_51/browse.php?type=images&param_project=".base64_encode(session_name()); $CKEditor->config["filebrowserFlashBrowseUrl"] = ($CKEditor->basePath)."filemanagers/kcfinder_2_51/browse.php?type=flash&param_project=".base64_encode(session_name()); $CKEditor->editor("Content", getIfSet($data['Content'])); //if you did not want a session oriented way, then in the above code code segment, just replace all the texts: base64_encode(session_name()) with this one: base64_encode(session_name($SERVER_RELATIVEPATH."userfiles/")) 

    И все готово.