KCFinder

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
kwasti
Сообщения: 262
Зарегистрирован: 2016.01.28, 16:14

KCFinder

Сообщение kwasti »

Добрый день!

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

Код: Выделить всё

$kcfOptions = array_merge(KCFinder::$kcfDefaultOptions, [

            'uploadDir' => Yii::getAlias('@backend/web/uploads/'),
            'uploadURL' => Yii::$app->getUrlManager()->createUrl('uploads'),
            'access' => [
                'files' => [
                    'upload' => true,
                    'delete' => true,
                    'copy' => true,
                    'move' => true,
                    'rename' => true,
                ],
                'dirs' => [
                    'create' => true,
                    'delete' => true,
                    'rename' => true,
                ],
            ],
        ]);

// Set kcfinder session options
        Yii::$app->getSession()->set('KCFINDER', $kcfOptions);
вроде бы все замечательно, но не тут то было.
оказалось, что при вызове KCFinder (вызываю из CKEditor и напрямую из формы)
сессия создается заново и конечно же никаких ключей KCFINDER в ней нет.
я добавил свой код для записи процесса выполненния кода KCFinder, вот кусок кода

Код: Выделить всё

class session {

    const SESSION_VAR = "_sessionVar";
    public $values;
    protected $config;

    protected $fd;
    protected function log($str){
        fwrite($this->fd, $str.PHP_EOL);
    }
    public function __construct($configFile) {
        $this->fd = fopen("kcfinder.txt", 'a') or die("не удалось создать файл");
        $this->log('open session');

        // Start session if it is not already started
        if (!session_id()) {
            $this->log('session start');
            session_start();
        }
        $this->log('read config');
        ....  и т.д.
и лог трассировки

Код: Выделить всё

open session
session start
read config
исходя из трассировки видно, что session_id() не определено.

Чего не хватает?
Почему открывает новую сессию?
kwasti
Сообщения: 262
Зарегистрирован: 2016.01.28, 16:14

Re: KCFinder

Сообщение kwasti »

помогите разобраться..
исходя из дальнейшего изучения этого вопроса.
я так понял, что когда обращение идет из CKFinder
то не подгружаются данные сессии, т.к. обращение идет в обход классов Yii
данные подгружаются где-то в методе runAcion()
по крайней мере после выполнения этого вызова, данные сессии загружаются..

теперь вот ищу как бы эти данные подгрузить открыть/найти в вызове кода CKFinder

Я никогда не работал с сессиями и не могу найти куда копать дальше.

P.S.
Блин, таких проблем не было когда я ставил KCFinder на 2.0.6
не знаю толи в yii что-то поменялось, толи в KCFinder
kwasti
Сообщения: 262
Зарегистрирован: 2016.01.28, 16:14

Re: KCFinder

Сообщение kwasti »

победить сессию мне не удалось и после 2-х дней исследований, перенес код KСFinder в виджет Yii который умеет делать запросы через контроллер Yii
пока запросы касались get, все было замечательно.
Но вот появился запрос post
и yii стал ругаться.
запрос отправляется из скрипта вот его код:

Код: Выделить всё

       $.ajax({
            type: "post",
            dataType: "json",
            url: _.getURL("chDir"),
            data: {dir: dir.data('path')},
            async: false,
            success: function(data) {
            // тут обработка
            },
            error: function() {
                $('#files').html(_.label("Unknown error."));
            }
        }); 
в отладчике браузера вижу ошибку:

Код: Выделить всё

HTTP400: BAD REQUEST — серверу не удалось обработать запрос из-за недопустимого синтаксиса. 
есть подозрение на отсутствие "_csrf" в post запросе.
тогда тоже прошу помочь как мне его туда добавлять?
страница которая открывается для работы с файлами - формируется динамически.
на странице есть

Код: Выделить всё

<?= Html::csrfMetaTags() ?>
как мне дальше действовать, чтобы передать _csrf?
1. нужно ли передать в скрипт из Yii при формировании страницы?
2. найти скриптом на самой странице?
3. как правильно передавать это csrf?
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: KCFinder

Сообщение Loveorigami »

Посмотрите, как сделано в elfinder
https://github.com/MihailDev/yii2-elfin ... %93&q=csrf
kwasti
Сообщения: 262
Зарегистрирован: 2016.01.28, 16:14

Re: KCFinder

Сообщение kwasti »

нашел вариант, но он не совсем рабочий..

Код: Выделить всё

var csrfParam = $('meta[name="csrf-param"]').attr("content");
var csrfToken = $('meta[name="csrf-token"]').attr("content");


 $.ajax({
            type: "post",
            dataType: "json",
            url: _.getURL("chDir"),
            data: {dir: dir.data('path'),csrfParam : csrfToken},
            
увидел в post Передается
dir=>files
csrfParam=>X0VPekxLQncMdy41LngpJRh9KREIIi1ANDQFM389NkIUPBdCAiBwMw==
csrfParam - передается как есть, а нужно передать его содержимое.

пока сделал через ассоциативный массив, и все заработало

Код: Выделить всё

var dt = {dir: dir.data('path')};
        dt[csrfParam]=csrfToken;
        

 $.ajax({
            type: "post",
            dataType: "json",
            url: _.getURL("chDir"),
            data: dt,
            async: false, 
как сделать в одной строке, чтобы не создавать предварительно массивы?

Код: Выделить всё

data: {dir: dir.data('path'),
csrfParam : csrfToken    -тут нужно чтобы вместо csrfParam подставлялось ее значение
},
countryman
Сообщения: 143
Зарегистрирован: 2015.12.15, 02:05

Re: KCFinder

Сообщение countryman »

Вот такая же проблема спустя год. Решения очевидного не вижу. В куче мест люди задают один и тот же вопрос и никто так и не ответил нормально.
В сессии данные есть, но при вызове берутся по умолчанию будто в сессии пусто.
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: KCFinder

Сообщение maleks »

А вы это расширение используете?
countryman
Сообщения: 143
Зарегистрирован: 2015.12.15, 02:05

Re: KCFinder

Сообщение countryman »

Да, это. Других вроде и нету
countryman
Сообщения: 143
Зарегистрирован: 2015.12.15, 02:05

Re: KCFinder

Сообщение countryman »

Что-то туплю в очередной раз.
В инструкции написано:

Код: Выделить всё

You should then set KCFinder options using session var, e.g. :

// kcfinder options
// http://kcfinder.sunhater.com/install#dynamic
$kcfOptions = array_merge(KCFinder::$kcfDefaultOptions, [
	'uploadURL' => Yii::getAlias('@web').'/upload',
	'access' => [
		'files' => [
			'upload' => true,
			'delete' => false,
			'copy' => false,
			'move' => false,
			'rename' => false,
		],
		'dirs' => [
			'create' => true,
			'delete' => false,
			'rename' => false,
		],
	],
]);

// Set kcfinder session options
Yii::$app->session->set('KCFINDER', $kcfOptions);
Где этот код нужно вызывать? Где бы я не вызвал, я вижу данные KCFINDER в сессии, но перейдя на другую страницу они исчезают или перетираются другими. Какое-то непонятное поведение.
Как всетаки правильно пользоваться?
countryman
Сообщения: 143
Зарегистрирован: 2015.12.15, 02:05

Re: KCFinder

Сообщение countryman »

Хм...еще больше странностей. Если пытаюсь вывести на странице сессию $_SESSION то выдается ошибка Undefined variable: _SESSION
Если делаю session_start(); то в сессии KCFINDER есть но только [KCFINDER] => Array ( [stamp] => Array ( [ip] => 127.0.0.1 [agent] => c9cefbf5aa6348b8d5d6296880886db9 ) [self] => Array ( ) )
Тоесть нужны данных нет. НО если не выводить так и смотреть через дебаггер, то данные есть. В коде самого плагина тоже есть вызов session_start(); может быть проблема в этом? Я ничего не понимаю в сессиях yii, а тут похоже множество нюансов.
countryman
Сообщения: 143
Зарегистрирован: 2015.12.15, 02:05

Re: KCFinder

Сообщение countryman »

Нашел таки проблему. Настройка проекта делалась по рекомендации по ссылке https://github.com/yiisoft/yii2-app-adv ... hosting.md
Получилось

Код: Выделить всё

'session' => [
            'name' => 'advanced-backend',
            'cookieParams' => [
                'path' => '/admin',
            ],
        ],
Получается при таком конфиге в куках не создаются записи по KCFINDER. Если удалить name и cookieParams, то все работает.
Может теперь кто-то подскажет что я делаю не так?)
ablsdu
Сообщения: 1
Зарегистрирован: 2017.04.02, 22:18

Re: KCFinder

Сообщение ablsdu »

countryman писал(а): 2017.03.31, 15:44 Нашел таки проблему. Настройка проекта делалась по рекомендации по ссылке https://github.com/yiisoft/yii2-app-adv ... hosting.md
Получилось

Код: Выделить всё

'session' => [
            'name' => 'advanced-backend',
            'cookieParams' => [
                'path' => '/admin',
            ],
        ],
Получается при таком конфиге в куках не создаются записи по KCFINDER. Если удалить name и cookieParams, то все работает.
Может теперь кто-то подскажет что я делаю не так?)
я удалил 'session' в конфигах, в бэкенд и фронтэнд, он у меня корректно заработал, но не знаю на сколько это корректно
countryman
Сообщения: 143
Зарегистрирован: 2015.12.15, 02:05

Re: KCFinder

Сообщение countryman »

Насколько я понимаю там конфликт какой-то с именем. Если удалить name то все работает как надо. Не уверен что это где-то нужно, поэтому оставил так. Как решить правильней так и не понял. А вообще в файлах нашел что-то про сессии у KCFINDER но так и не разобрался. Возможно в следующий раз когда буду им заниматься разберусь
Ответить