I have been trying to find information on how to sync the sessions between Yii and KCFinder so that the two applications can "communicate" with each other. I managed to find some bits and pieces on the correct approach to use, but not a definite guide or concrete code.
So... if you are using Yii with CDbHttpSession and also want KCFinder to share the same session as Yii, you must create your own SESSION SAVE HANDLER as described here.
This handler must be placed inside file core/autoload.php of KCFinder.
class SessionSaveHandler { protected $savePath; protected $sessionName; public $db; public $sessionTableName; public function __construct() { $this->loadConfig(); session_name($this->sessionName); session_set_save_handler( array($this, "open"), array($this, "close"), array($this, "read"), array($this, "write"), array($this, "destroy"), array($this, "gc") ); } public function loadConfig() { // application configuration file $config_file = dirname(__FILE__) . '/../../../protected/config/main.php'; $find = array('<?php', '?>'); $replace = array('', ''); $configuration = eval(str_replace($find, $replace, file_get_contents($config_file))); $this->sessionName = $configuration['components']['session']['sessionName']; $this->db = $configuration['components']['db']; $this->sessionTableName = $configuration['components']['session']['sessionTableName']; } public function open($savePath, $sessionName) { return true; } public function close() { return true; } public function read($id) { try { $dbh = new PDO($this->db['connectionString'], $this->db['username'], $this->db['password']); $statement = $dbh->prepare("SELECT data FROM $this->sessionTableName WHERE id = :id AND expire > :expire"); $statement->bindParam(':id', $id, PDO::PARAM_STR); $statement->bindParam(':expire', time(), PDO::PARAM_INT); $statement->setFetchMode(PDO::FETCH_ASSOC); $result = $statement->execute(); if ($result) { $row = $statement->fetch(); return $row['data']; } } catch (PDOException $e) { // } return ''; } public function write($id, $data) { return true; } public function destroy($id) { return true; } public function gc($maxlifetime) { return true; } } new SessionSaveHandler();
That's It!
Feel free to comment on the approach used and suggest any other tips.
Total 5 comments
@Dayak Ngoding I came upon your approach while i was searching for this topic, and i did give it a try. But unfortunately it didn't work for my installation and also i wanted a solution that i could configure the session parameters by using a yii extension. ezzeelfinder looks nice, i didn't know about it.
I used my own approach like what I've write in this link:
http://www.yiiframework.com/forum/index.php/topic/28561-integrating-yii-ckeditor-and-kcfinder/
Unfortunately kcfinder needs safe mode ON and it usually doesn't implemented by Web Hosting Provider, beside Suhosin enabled issue. So I give up and currently use ezzeelfinder ...
ok. I haven't tried this approach by myself but it seemed correct.
@redguy i tried this approach at first, but i couldn't get it to work. at first i tried creating a Yii app using my main configuration but it was giving many errors regarding paths. i then tried a stripped down version of the configuration file with only the bare minimum, but it gave errors also, later in the process. so, i gave up this approach and tried the one that is described here. Maybe i will give it another go when i find some time. If anyone else succeeds in creating a Yii app inside kcfinder/core/autoload.php, please share it.
why can't you just use session handler provided with Yii? you could create Yii application without calling 'run()', then fetch 'session' component which should initialise session handling in Yii way:
just put it in same place where you put your custom handler... it will give you some overhead initialising whole application but you will have exactly same session handling as in main application.
Leave a comment
Please login to leave your comment.