/** * Constructor * * @param array elFinder and roots configurations * @return void * @author Dmitry (dio) Levashov **/ public function __construct($opts) { if (session_id() == '') { session_start(); } $sessionUseCmds = array('netmount', 'netunmount'); if (isset($opts['sessionUseCmds']) && is_array($opts['sessionUseCmds'])) { $sessionUseCmds = array_merge($sessionUseCmds, $opts['sessionUseCmds']); } // set self::$volumesCnt by HTTP header "X-elFinder-VolumesCntStart" if (isset($_SERVER['HTTP_X_ELFINDER_VOLUMESCNTSTART']) && ($volumesCntStart = intval($_SERVER['HTTP_X_ELFINDER_VOLUMESCNTSTART']))) { self::$volumesCnt = $volumesCntStart; } $this->time = $this->utime(); $this->debug = isset($opts['debug']) && $opts['debug'] ? true : false; $this->sessionCloseEarlier = isset($opts['sessionCloseEarlier']) ? (bool) $opts['sessionCloseEarlier'] : true; $this->sessionUseCmds = array_flip($sessionUseCmds); $this->timeout = isset($opts['timeout']) ? $opts['timeout'] : 0; $this->uploadTempPath = isset($opts['uploadTempPath']) ? $opts['uploadTempPath'] : ''; $this->netVolumesSessionKey = !empty($opts['netVolumesSessionKey']) ? $opts['netVolumesSessionKey'] : 'elFinderNetVolumes'; $this->callbackWindowURL = isset($opts['callbackWindowURL']) ? $opts['callbackWindowURL'] : ''; self::$sessionCacheKey = !empty($opts['sessionCacheKey']) ? $opts['sessionCacheKey'] : 'elFinderCaches'; // check session cache $_optsMD5 = md5(json_encode($opts['roots'])); if (!isset($_SESSION[self::$sessionCacheKey]) || $_SESSION[self::$sessionCacheKey]['_optsMD5'] !== $_optsMD5) { $_SESSION[self::$sessionCacheKey] = array('_optsMD5' => $_optsMD5); } self::$base64encodeSessionData = !empty($opts['base64encodeSessionData']); // setlocale and global locale regists to elFinder::locale self::$locale = !empty($opts['locale']) ? $opts['locale'] : 'en_US.UTF-8'; if (false === @setlocale(LC_ALL, self::$locale)) { self::$locale = setlocale(LC_ALL, ''); } // bind events listeners if (!empty($opts['bind']) && is_array($opts['bind'])) { $_req = $_SERVER["REQUEST_METHOD"] == 'POST' ? $_POST : $_GET; $_reqCmd = isset($_req['cmd']) ? $_req['cmd'] : ''; foreach ($opts['bind'] as $cmd => $handlers) { $doRegist = strpos($cmd, '*') !== false; if (!$doRegist) { $_getcmd = create_function('$cmd', 'list($ret) = explode(\'.\', $cmd);return trim($ret);'); $doRegist = $_reqCmd && in_array($_reqCmd, array_map($_getcmd, explode(' ', $cmd))); } if ($doRegist) { if (!is_array($handlers) || is_object($handlers[0])) { $handlers = array($handlers); } foreach ($handlers as $handler) { if ($handler) { if (is_string($handler) && strpos($handler, '.')) { list($_domain, $_name, $_method) = array_pad(explode('.', $handler), 3, ''); if (strcasecmp($_domain, 'plugin') === 0) { if ($plugin = $this->getPluginInstance($_name, isset($opts['plugin'][$_name]) ? $opts['plugin'][$_name] : array()) and method_exists($plugin, $_method)) { $this->bind($cmd, array($plugin, $_method)); } } } else { $this->bind($cmd, $handler); } } } } } } if (!isset($opts['roots']) || !is_array($opts['roots'])) { $opts['roots'] = array(); } // check for net volumes stored in session foreach ($this->getNetVolumes() as $key => $root) { $opts['roots'][$key] = $root; } // "mount" volumes foreach ($opts['roots'] as $i => $o) { $class = 'elFinderVolume' . (isset($o['driver']) ? $o['driver'] : ''); if (class_exists($class)) { $volume = new $class(); try { if ($volume->mount($o)) { // unique volume id (ends on "_") - used as prefix to files hash $id = $volume->id(); $this->volumes[$id] = $volume; if (!$this->default && $volume->isReadable()) { $this->default = $this->volumes[$id]; } } else { $this->removeNetVolume($i); $this->mountErrors[] = 'Driver "' . $class . '" : ' . implode(' ', $volume->error()); } } catch (Exception $e) { $this->removeNetVolume($i); $this->mountErrors[] = 'Driver "' . $class . '" : ' . $e->getMessage(); } } else { $this->mountErrors[] = 'Driver "' . $class . '" does not exists'; } } // if at least one readable volume - ii desu >_< $this->loaded = !empty($this->default); }