/** * Get the cache of Users and User Groups from the Discuss database * @return boolean */ protected function collectUserCaches() { $this->log('Collecting User cache...'); $userTable = $this->modx->getTableName('disUser'); $stmt = $this->modx->query('SELECT id,username,integrated_id FROM ' . $userTable . ' ORDER BY username ASC'); if ($stmt) { while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { $this->memberCache[$row['integrated_id']] = $row['id']; $this->memberNameCache[$row['integrated_id']] = $row['username']; } $stmt->closeCursor(); } $this->log('Collecting User Group cache...'); $userGroupTable = $this->modx->getTableName('disUserGroupProfile'); $stmt = $this->modx->query('SELECT id,name,integrated_id FROM ' . $userGroupTable . ' ORDER BY name ASC'); if ($stmt) { while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { $this->memberGroupCache[$row['integrated_id']] = $row['id']; } $stmt->closeCursor(); } return true; }
/** * Return current number of order * * @return string */ public function getnum() { $table = $this->modx->getTableName('msOrder'); $cur = date('ym'); $sql = $this->modx->query("SELECT `num` FROM {$table} WHERE `num` LIKE '{$cur}%' ORDER BY `id` DESC LIMIT 1"); $num = $sql->fetch(PDO::FETCH_COLUMN); if (empty($num)) { $num = date('ym') . '/0'; } $num = explode('/', $num); $num = $cur . '/' . ($num[1] + 1); return $num; }
/** Create tree */ public static function createTree($total, $lvls = 3) { self::$modx->query("DELETE FROM " . self::$ClientTable); self::$modx->query("ALTER TABLE " . self::$ClientTable . " AUTO_INCREMENT=1"); // distribution of elements on the levels of nesting $num = $total; $lvlsArr = array(); for ($i = $lvls; $i > 0; $i--) { if ($i == 1) { $limit = $num; } else { $limit = ceil($num * 0.6); $num -= $limit; } $lvlsArr[$i] = $limit; } $sql = "INSERT INTO " . self::$ClientTable . " (`id`, `parent`) VALUES (:id, :parent)"; $stmt = self::$modx->prepare($sql); $pArr = array(); $k = 0; for ($i = 1; $i <= $lvls; $i++) { $limit = $lvlsArr[$i]; echo $i . ' level: ' . $limit . ' pcs.<br>'; while ($limit--) { $k = $k + 1; $prev = NULL; if ($i > 1) { $c = count($pArr[$i - 1]) - 1; $prev = $pArr[$i - 1][mt_rand(0, $c)]; } else { $c = 0; $prev = 0; } if ($stmt instanceof PDOStatement) { $stmt->bindValue(':id', $k); $stmt->bindValue(':parent', $prev); if ($stmt->execute()) { $pArr[$i][] = $k; //$this->modx->lastInsertId(); } else { throw new Exception('Error add'); } } } } }
function getResourceBypass(modX &$modx, $criteria) { $resource = null; $c = $modx->newQuery('modResource'); $c->select(array('id', 'published')); $c->where($criteria); $c->prepare(); $sql = $c->toSql(); $stmt = $modx->query($sql); if ($stmt && $stmt instanceof PDOStatement) { $row = $stmt->fetch(PDO::FETCH_ASSOC); if ($row) { $resource = $row; } $stmt->closeCursor(); } return $resource; }
/** * Process bindings assigned to a template variable. * * @access public * @param string $value The value specified from the binding. * @param integer $resourceId The resource in which the TV is assigned. * @param boolean $preProcess Whether or not to process certain bindings. * @return string The processed value. */ public function processBindings($value = '', $resourceId = 0, $preProcess = true) { $bdata = $this->getBindingDataFromValue($value); if (empty($bdata['cmd'])) { return $value; } $modx =& $this->xpdo; if (empty($modx->resource)) { if (!empty($resourceId)) { $modx->resource = $modx->getObject('modResource', $resourceId); } if (empty($modx->resource) || empty($resourceId)) { $modx->resource = $modx->newObject('modResource'); $modx->resource->set('id', 0); } } $cmd = $bdata['cmd']; $param = !empty($bdata['param']) ? $bdata['param'] : null; switch ($cmd) { case 'FILE': if ($preProcess) { $output = $this->processFileBinding($param); } break; case 'CHUNK': /* retrieve a chunk and process it's content */ if ($preProcess) { $output = $this->xpdo->getChunk($param); } break; case 'RESOURCE': case 'DOCUMENT': /* retrieve a document and process it's content */ if ($preProcess) { $query = $this->xpdo->newQuery('modResource', array('id' => (int) $param, 'deleted' => false)); $query->select('content'); if ($query->prepare() && $query->stmt->execute()) { $output = $query->stmt->fetch(PDO::FETCH_COLUMN); } else { $output = 'Unable to locate resource ' . $param; } } break; case 'SELECT': /* selects a record from the cms database */ if ($preProcess) { $dbtags = array(); if ($modx->resource && $modx->resource instanceof modResource) { $dbtags = $modx->resource->toArray(); } $dbtags['DBASE'] = $this->xpdo->getOption('dbname'); $dbtags['PREFIX'] = $this->xpdo->getOption('table_prefix'); foreach ($dbtags as $key => $pValue) { $param = str_replace('[[+' . $key . ']]', $pValue, $param); } $stmt = $this->xpdo->query('SELECT ' . $param); if ($stmt && $stmt instanceof PDOStatement) { $data = ''; while ($row = $stmt->fetch(PDO::FETCH_NUM)) { $col = ''; if (isset($row[1])) { $col = $row[0] . '==' . $row[1]; } else { $col = $row[0]; } $data .= (!empty($data) ? '||' : '') . $col; } $stmt->closeCursor(); } $output = $data; } break; case 'EVAL': /* evaluates text as php codes return the results */ if ($preProcess) { $output = eval($param); } break; case 'INHERIT': if ($preProcess) { $output = $this->processInheritBinding($param, $resourceId); } else { $output = $value; } break; case 'DIRECTORY': $path = $this->xpdo->getOption('base_path') . $param; if (substr($path, -1, 1) != '/') { $path .= '/'; } if (!is_dir($path)) { break; } $files = array(); $invalid = array('.', '..', '.svn', '.git', '.DS_Store'); foreach (new DirectoryIterator($path) as $file) { if (!$file->isReadable()) { continue; } $basename = $file->getFilename(); if (!in_array($basename, $invalid)) { $files[] = "{$basename}=={$param}/{$basename}"; } } asort($files); $output = implode('||', $files); break; default: $output = $value; break; } /* support for nested bindings */ return is_string($output) && $output != $value ? $this->processBindings($output) : $output; }
/** @var xPDOObject $object */ foreach ($modx->getIterator($class, $classCriteria) as $object) { if ($package->put($object, $classAttributes)) { $instances++; } else { $modx->log(modX::LOG_LEVEL_WARN, "Could not package {$class} instance with pk: " . print_r($object->getPrimaryKey())); } } $modx->log(modX::LOG_LEVEL_INFO, "Packaged {$instances} of {$class}"); } /* collect table names from classes and grab any additional tables/data not listed */ $coreTables = array(); foreach ($classes as $class) { $coreTables[$class] = $modx->quote($modx->literal($modx->getTableName($class))); } $stmt = $modx->query("SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = '{$modxDatabase}' AND TABLE_NAME NOT IN (" . implode(',', $coreTables) . ")"); $extraTables = $stmt->fetchAll(PDO::FETCH_COLUMN); if (is_array($extraTables) && !empty($extraTables)) { $modx->loadClass('vapor.vaporVehicle', VAPOR_DIR . 'model/', true, true); $excludeExtraTablePrefix = isset($vaporOptions['excludeExtraTablePrefix']) && is_array($vaporOptions['excludeExtraTablePrefix']) ? $vaporOptions['excludeExtraTablePrefix'] : array(); $excludeExtraTables = isset($vaporOptions['excludeExtraTables']) && is_array($vaporOptions['excludeExtraTables']) ? $vaporOptions['excludeExtraTables'] : array(); foreach ($extraTables as $extraTable) { if (in_array($extraTable, $excludeExtraTables)) { continue; } if (!XPDO_CLI_MODE && !ini_get('safe_mode')) { set_time_limit(0); } $instances = 0; $object = array(); $attributes = array('vehicle_package' => 'vapor', 'vehicle_class' => 'vaporVehicle');
/** * Merge another user into this account * * @param disUser $oldUser * @return boolean */ public function merge(disUser &$oldUser) { $success = true; $user = $this->getOne('User'); if (empty($user)) { return false; } $oldModxUser = $oldUser->getOne('User'); if (empty($oldModxUser)) { return false; } $this->xpdo->beginTransaction(); /* merge post count */ $posts = $user->get('posts'); $posts = $posts + $oldUser->get('posts'); $this->set('posts', $posts); /* merge ignore boards */ $ibs = $this->get('ignore_boards'); $ibs = explode(',', $ibs); $oldIbs = $oldUser->get('ignore_boards'); $oldIbs = explode(',', $oldIbs); $ibs = array_merge($oldIbs, $ibs); $this->set('ignore_boards', implode(',', $ibs)); /* merge signature if needed */ $signature = $this->get('signature'); $oldSignature = $oldUser->get('signature'); if (empty($signature) && !empty($oldSignature)) { $this->set('signature', $oldSignature); } /* merge title if needed */ $title = $this->get('title'); $oldTitle = $oldUser->get('title'); if (empty($title) && !empty($oldTitle)) { $this->set('title', $oldTitle); } /* merge primary_group if needed */ $pg = $this->get('primary_group'); $oldPg = $oldUser->get('primary_group'); if (empty($pg) && !empty($oldPg)) { $this->set('primary_group', $oldPg); } $this->set('integrated_id', $oldUser->get('integrated_id')); $this->set('synced', true); $this->set('syncedat', $this->xpdo->discuss->now()); $this->save(); /* grant old usergroups to this user */ $oldUserGroups = $this->xpdo->getCollection('modUserGroupMember', array('member' => $oldModxUser->get('id'))); $ugs = array(); foreach ($oldUserGroups as $oldUserGroup) { $ugs[] = $oldUserGroup->get('user_group'); } $ugs = array_unique($ugs); foreach ($ugs as $ug) { $user->joinGroup($ug); } /* merge in posts, change authors */ $sql = 'UPDATE ' . $this->xpdo->getTableName('disPost') . ' SET `author` = ' . $this->get('id') . ' WHERE `author` = ' . $oldUser->get('id') . ' '; $this->xpdo->query($sql); $sql = 'UPDATE ' . $this->xpdo->getTableName('disThread') . ' SET `author_first` = ' . $this->get('id') . ' WHERE `author_first` = ' . $oldUser->get('id') . ' '; $this->xpdo->query($sql); $sql = 'UPDATE ' . $this->xpdo->getTableName('disThread') . ' SET `author_last` = ' . $this->get('id') . ' WHERE `author_last` = ' . $oldUser->get('id') . ' '; $this->xpdo->query($sql); /* merge in disThreadRead */ $sql = 'UPDATE ' . $this->xpdo->getTableName('disThreadRead') . ' SET `user` = ' . $this->get('id') . ' WHERE `user` = ' . $oldUser->get('id') . ' '; $this->xpdo->query($sql); /* merge in disThreadUser */ $sql = 'UPDATE ' . $this->xpdo->getTableName('disThreadUser') . ' SET `user` = ' . $this->get('id') . ' WHERE `user` = ' . $oldUser->get('id') . ' '; $this->xpdo->query($sql); /* merge in disUserFriend */ $sql = 'UPDATE ' . $this->xpdo->getTableName('disUserFriend') . ' SET `user` = ' . $this->get('id') . ' WHERE `user` = ' . $oldUser->get('id') . ' '; $this->xpdo->query($sql); $sql = 'UPDATE ' . $this->xpdo->getTableName('disUserFriend') . ' SET `friend` = ' . $this->get('id') . ' WHERE `friend` = ' . $oldUser->get('id') . ' '; $this->xpdo->query($sql); /* merge in disUserNotification */ $sql = 'UPDATE ' . $this->xpdo->getTableName('disUserNotification') . ' SET `user` = ' . $this->get('id') . ' WHERE `user` = ' . $oldUser->get('id') . ' '; $this->xpdo->query($sql); /* merge in disModerator */ $sql = 'UPDATE ' . $this->xpdo->getTableName('disModerator') . ' SET `user` = ' . $this->get('id') . ' WHERE `user` = ' . $oldUser->get('id') . ' '; $this->xpdo->query($sql); /* remove old user sessions */ $sql = 'DELETE FROM ' . $this->xpdo->getTableName('disUserFriend') . ' WHERE `user` = ' . $oldUser->get('id') . ' '; $this->xpdo->query($sql); /* merge all PMs users fields for user */ $c = $this->xpdo->newQuery('disThread'); $c->innerJoin('disThreadUser', 'Users'); $c->leftJoin('disThreadRead', 'Reads', 'Reads.user = '******'id') . ' AND disThread.id = Reads.thread'); $c->where(array('disThread.private' => true, 'Users.user' => $oldUser->get('id'))); $pms = $this->xpdo->getCollection('disThread', $c); foreach ($pms as $pm) { $users = $pm->get('users'); $users = explode(',', $users); $users = array_diff($users, array($oldUser->get('id'))); $users[] = $this->get('id'); $pm->set('users', implode(',', $users)); $pm->save(); } /* remove old users */ $oldUser->remove(); $oldModxUser->remove(); /* check for post group advance */ $this->checkForPostGroupAdvance(); $this->xpdo->commit(); return $success; }
/** * Logout all users, clear the cache, make sure config file is writable * */ function prepare_modx_upgrade($data) { $core_path = $data['core_path']; chmod($core_path . 'config/config.inc.php', DIR_PERMS); // This might brick if the install isn't working. require_once $data['base_path'] . 'index.php'; $modx = new modX(); $modx->initialize('mgr'); // See http://tracker.modx.com/issues/9916 $sessionTable = $modx->getTableName('modSession'); $modx->query("TRUNCATE TABLE {$sessionTable}"); @$modx->cacheManager->refresh(); }
{ $cc = 0; foreach ($_SESSION as $key => $value) { if (substr($key, 0, 3) == 'pro') { $cc = $cc + $value; } //echo $key." ".$value." ".substr($key,0,3); } return $cc; } if (isset($_GET['action'])) { if ($_GET['action'] == 'product_photo') { ?> <img src="<?php $sql_img = "select * from s_prices pr\n\njoin s_images i\n on i.price_id=pr.id\n\nwhere (pr.id=" . mysql_escape_string($_GET['id']) . ")and(i.mainimg=1);\n\n"; foreach ($modx->query($sql_img) as $rowIMain) { echo upload_dir . $rowIMain['filename']; } ?> "> <div class="product_photo_small"> <?php $sql_img = "select * from s_prices pr\n\njoin s_images i\n on i.price_id=pr.id\n\nwhere (pr.id=" . mysql_escape_string($_GET['id']) . ")and(i.mainimg=0);\n\n"; foreach ($modx->query($sql_img) as $rowIMain) { ?> <div> <img src="<?php echo upload_dir . $rowIMain['filename']; ?>
ini_set('memory_limit', '1024M'); set_time_limit(0); @ob_end_clean(); echo '<pre>'; /* fix num_topics */ $sql = 'SELECT disBoard.id, disBoard.name, disBoard.num_topics, ( SELECT COUNT(`Threads`.`id`) FROM ' . $modx->getTableName('disThread') . ' AS `Threads` WHERE `Threads`.`board` = `disBoard`.`id` ) AS `real_count` FROM ' . $modx->getTableName('disBoard') . ' `disBoard` ORDER BY `disBoard`.`map` ASC'; $stmt = $modx->query($sql); if ($stmt) { while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { if (!empty($row['real_count']) && $row['real_count'] != $row['num_topics']) { $modx->log(modX::LOG_LEVEL_ERROR, 'Setting "' . $row['name'] . '" to ' . $row['real_count'] . ' from ' . $row['num_topics']); $modx->exec('UPDATE ' . $modx->getTableName('disBoard') . ' SET `num_topics` = ' . $row['real_count'] . ' WHERE `id` = ' . $row['id']); } } $stmt->closeCursor(); } /* fix num_replies */ /* fix total_posts */ $mtime = microtime(); $mtime = explode(" ", $mtime);
$user->set('active', 1); $user->set('password', $password); $profile->set('email', $email); $profile->set('internalKey', 0); $user->addOne($profile, 'Profile'); // save user if (!$user->save()) { print 'ERROR: Could not save user.'; } } // Add User to a User Group $Member = $modx->newObject('modUserGroupMember'); $Member->set('user_group', $usergroup->get('id')); $Member->set('member', $user->get('id')); // Grant the user a role within that group $Member->set('role', 1); $Member->set('rank', 0); if (!$Member->save()) { print 'ERROR: Could not add User to User Group'; exit; } } } // Flush Permissions ?? // Clear Cache $modx->query("TRUNCATE TABLE " . $modx->getTableName("modSession")); $modx->cacheManager->refresh(); $login_id = $page1->get('id'); $url = $modx->makeUrl($login_id, '', '', 'full'); print 'SUCCESS. You can log in at <a href="' . $url . '">Login Page</a>'; /*EOF*/
public function process() { //$startTime = microtime(true); try { $vaporOptions = array('excludeExtraTablePrefix' => array(), 'excludeExtraTables' => array(), 'excludeFiles' => array(MODX_BASE_PATH . 'vapor', MODX_BASE_PATH . 'phpmyadmin', MODX_BASE_PATH . 'assets', MODX_BASE_PATH . 'core')); if (is_readable(VAPOR_DIR . 'config.php')) { $vaporConfigOptions = @(include VAPOR_DIR . 'config.php'); if (is_array($vaporConfigOptions)) { $vaporOptions = array_merge($vaporOptions, $vaporConfigOptions); } } if (!XPDO_CLI_MODE && !ini_get('safe_mode')) { set_time_limit(0); } $options = array('log_level' => xPDO::LOG_LEVEL_INFO, 'log_target' => array('target' => 'FILE', 'options' => array('filename' => 'vapor-' . strftime('%Y%m%dT%H%M%S', $this->getProperty('startTime')) . '.log')), xPDO::OPT_CACHE_DB => false, xPDO::OPT_SETUP => true); $modx = new modX('', $options); $modx->setLogTarget($options['log_target']); $modx->setLogLevel($options['log_level']); $modx->setOption(xPDO::OPT_CACHE_DB, false); $modx->setOption(xPDO::OPT_SETUP, true); $modx->setDebug(-1); $modx->startTime = $this->getProperty('startTime'); $modx->getVersionData(); $modxVersion = $modx->version['full_version']; if (version_compare($modxVersion, '2.2.1-pl', '>=')) { $modx->initialize('mgr', $options); } else { $modx->initialize('mgr'); } /*$modx->setLogTarget($options['log_target']); $modx->setLogLevel($options['log_level']);*/ $modx->setOption(xPDO::OPT_CACHE_DB, false); $modx->setOption(xPDO::OPT_SETUP, true); $modx->setDebug(-1); $modxDatabase = $modx->getOption('dbname', $options, $modx->getOption('database', $options)); $modxTablePrefix = $modx->getOption('table_prefix', $options, ''); $core_path = realpath($modx->getOption('core_path', $options, MODX_CORE_PATH)) . '/'; $assets_path = realpath($modx->getOption('assets_path', $options, MODX_ASSETS_PATH)) . '/'; $manager_path = realpath($modx->getOption('manager_path', $options, MODX_MANAGER_PATH)) . '/'; $base_path = realpath($modx->getOption('base_path', $options, MODX_BASE_PATH)) . '/'; $modx->log(modX::LOG_LEVEL_INFO, "core_path=" . $core_path); $modx->log(modX::LOG_LEVEL_INFO, "assets_path=" . $assets_path); $modx->log(modX::LOG_LEVEL_INFO, "manager_path=" . $manager_path); $modx->log(modX::LOG_LEVEL_INFO, "base_path=" . $base_path); $modx->loadClass('transport.modPackageBuilder', '', false, true); $builder = new modPackageBuilder($modx); /** @var modWorkspace $workspace */ $workspace = $modx->getObject('modWorkspace', 1); if (!$workspace) { $modx->log(modX::LOG_LEVEL_FATAL, "no workspace!"); } $package = $builder->createPackage(PKG_NAME, PKG_VERSION, PKG_RELEASE); /* Defines the classes to extract (also used for truncation) */ $classes = $this->getClassesList(); $attributes = array('vehicle_class' => 'xPDOFileVehicle'); /* get all files from the components directory */ /*$modx->log(modX::LOG_LEVEL_INFO, "Packaging " . MODX_CORE_PATH . 'components'); $package->put( array( 'source' => MODX_CORE_PATH . 'components', 'target' => 'return MODX_CORE_PATH;' ), array( 'vehicle_class' => 'xPDOFileVehicle' ) );*/ /* get all files from the assets directory */ /*$modx->log(modX::LOG_LEVEL_INFO, "Packaging " . MODX_BASE_PATH . 'assets'); $package->put( array( 'source' => MODX_BASE_PATH . 'assets', 'target' => 'return MODX_BASE_PATH;' ), array( 'vehicle_class' => 'xPDOFileVehicle' ) );*/ /* get all files from the manager/components directory */ /*$modx->log(modX::LOG_LEVEL_INFO, "Packaging " . MODX_MANAGER_PATH . 'components'); $package->put( array( 'source' => MODX_MANAGER_PATH . 'components', 'target' => 'return MODX_MANAGER_PATH;' ), array( 'vehicle_class' => 'xPDOFileVehicle' ) );*/ /* find other files/directories in the MODX_BASE_PATH */ $excludes = array('_build', 'setup', 'assets', 'ht.access', 'index.php', 'config.core.php', dirname(MODX_CORE_PATH) . '/' === MODX_BASE_PATH ? basename(MODX_CORE_PATH) : 'core', dirname(MODX_CONNECTORS_PATH) . '/' === MODX_BASE_PATH ? basename(MODX_CONNECTORS_PATH) : 'connectors', dirname(MODX_MANAGER_PATH) . '/' === MODX_BASE_PATH ? basename(MODX_MANAGER_PATH) : 'manager'); if (isset($vaporOptions['excludeFiles']) && is_array($vaporOptions['excludeFiles'])) { $excludes = array_unique($excludes + $vaporOptions['excludeFiles']); } /*if ($dh = opendir(MODX_BASE_PATH)) { $includes = array(); while (($file = readdir($dh)) !== false) { /* ignore files/dirs starting with . or matching an exclude */ /*if (strpos($file, '.') === 0 || in_array(strtolower($file), $excludes)) { continue; } $includes[] = array( 'source' => MODX_BASE_PATH . $file, 'target' => 'return MODX_BASE_PATH;' ); } closedir($dh); foreach ($includes as $include) { $modx->log(modX::LOG_LEVEL_INFO, "Packaging " . $include['source']); $package->put( $include, array( 'vehicle_class' => 'xPDOFileVehicle' ) ); } }*/ foreach ($this->getProperty('sources') as $source_id) { // Try to get mediaSource $loaded = $this->getSource($source_id); if ($loaded !== true) { return $this->failure($loaded); } /* Why for?? if (!$this->source->checkPolicy('delete')) { return $this->failure($this->modx->lexicon('permission_denied')); }*/ if ($properties = $this->source->getBases('') and $properties['pathIsRelative'] and $path = $properties['path']) { if ($dh = opendir(MODX_BASE_PATH . $path)) { $includes = array(); while (($file = readdir($dh)) !== false) { /* ignore files/dirs starting with . or matching an exclude */ if (strpos($file, '.') === 0 || in_array(strtolower($file), $excludes)) { continue; } $includes[] = array('source' => MODX_BASE_PATH . $path . $file, 'target' => "return MODX_BASE_PATH . '{$path}/';"); } closedir($dh); foreach ($includes as $include) { $modx->log(modX::LOG_LEVEL_INFO, "Packaging " . $include['source']); $package->put($include, array('vehicle_class' => 'xPDOFileVehicle')); } } } } if (!XPDO_CLI_MODE && !ini_get('safe_mode')) { set_time_limit(0); } /* package up the vapor model for use on install */ $modx->log(modX::LOG_LEVEL_INFO, "Packaging vaporVehicle class"); /*$package->put( array( 'source' => VAPOR_DIR . 'model/vapor', 'target' => "return MODX_CORE_PATH . 'components/vapor/model/';" ), array( 'vehicle_class' => 'xPDOFileVehicle', 'validate' => array( array( 'type' => 'php', 'source' => VAPOR_DIR . 'scripts/validate.truncate_tables.php', 'classes' => $classes ), ), 'resolve' => array( array( 'type' => 'php', 'source' => VAPOR_DIR . 'scripts/resolve.vapor_model.php' ) ) ) );*/ $attributes = array('preserve_keys' => true, 'update_object' => true); /* get the extension_packages and resolver */ if ($this->getProperty('includeExtensionPackages')) { $object = $modx->getObject('modSystemSetting', array('key' => 'extension_packages')); if ($object) { $extPackages = $object->get('value'); $extPackages = $modx->fromJSON($extPackages); foreach ($extPackages as &$extPackage) { if (!is_array($extPackage)) { continue; } foreach ($extPackage as $pkgName => &$pkg) { if (!empty($pkg['path']) && strpos($pkg['path'], '[[++') === false) { if (substr($pkg['path'], 0, 1) !== '/' || strpos($pkg['path'], $base_path) !== 0 && strpos($pkg['path'], $core_path) !== 0) { $path = realpath($pkg['path']); if ($path === false) { $path = $pkg['path']; } else { $path = rtrim($path, '/') . '/'; } } else { $path = $pkg['path']; } if (strpos($path, $core_path) === 0) { $path = str_replace($core_path, '[[++core_path]]', $path); } elseif (strpos($path, $assets_path) === 0) { $path = str_replace($assets_path, '[[++assets_path]]', $path); } elseif (strpos($path, $manager_path) === 0) { $path = str_replace($manager_path, '[[++manager_path]]', $path); } elseif (strpos($path, $base_path) === 0) { $path = str_replace($base_path, '[[++base_path]]', $path); } $pkg['path'] = $path; } } } $modx->log(modX::LOG_LEVEL_INFO, "Setting extension packages to: " . print_r($extPackages, true)); $object->set('value', $modx->toJSON($extPackages)); $package->put($object, array_merge($attributes, array('resolve' => array(array('type' => 'php', 'source' => VAPOR_DIR . 'scripts/resolve.extension_packages.php'))))); } } /* loop through the classes and package the objects */ foreach ($classes as $class) { if (!XPDO_CLI_MODE && !ini_get('safe_mode')) { set_time_limit(0); } $instances = 0; $classCriteria = null; $classAttributes = $attributes; switch ($class) { case 'modSession': /* skip sessions */ continue 2; case 'modSystemSetting': $classCriteria = array('key:!=' => 'extension_packages'); break; case 'modWorkspace': /** @var modWorkspace $object */ foreach ($modx->getIterator('modWorkspace', $classCriteria) as $object) { if (strpos($object->path, $core_path) === 0) { $object->set('path', str_replace($core_path, '{core_path}', $object->path)); } elseif (strpos($object->path, $assets_path) === 0) { $object->set('path', str_replace($assets_path, '{assets_path}', $object->path)); } elseif (strpos($object->path, $manager_path) === 0) { $object->set('path', str_replace($manager_path, '{manager_path}', $object->path)); } elseif (strpos($object->path, $base_path) === 0) { $object->set('path', str_replace($base_path, '{base_path}', $object->path)); } if ($package->put($object, $classAttributes)) { $instances++; } else { $modx->log(modX::LOG_LEVEL_WARN, "Could not package {$class} instance with pk: " . print_r($object->getPrimaryKey(), true)); } } $modx->log(modX::LOG_LEVEL_INFO, "Packaged {$instances} of {$class}"); continue 2; case 'transport.modTransportPackage': $modx->loadClass($class); $response = $modx->call('modTransportPackage', 'listPackages', array(&$modx, $workspace->get('id'))); if (isset($response['collection'])) { foreach ($response['collection'] as $object) { $packagesDir = MODX_CORE_PATH . 'packages/'; if ($object->getOne('Workspace')) { $packagesDir = $object->Workspace->get('path') . 'packages/'; } $pkgSource = $object->get('source'); $folderPos = strrpos($pkgSource, '/'); $sourceDir = $folderPos > 1 ? substr($pkgSource, 0, $folderPos + 1) : ''; $source = realpath($packagesDir . $pkgSource); $target = 'MODX_CORE_PATH . "packages/' . $sourceDir . '"'; $classAttributes = array_merge($attributes, array('resolve' => array(array('type' => 'file', 'source' => $source, 'target' => "return {$target};")))); if ($package->put($object, $classAttributes)) { $instances++; } else { $modx->log(modX::LOG_LEVEL_WARN, "Could not package {$class} instance with pk: " . print_r($object->getPrimaryKey(), true)); } } } $modx->log(modX::LOG_LEVEL_INFO, "Packaged {$instances} of {$class}"); continue 2; case 'sources.modMediaSource': foreach ($modx->getIterator('sources.modMediaSource') as $object) { $classAttributes = $attributes; /** @var modMediaSource $object */ if ($object->get('is_stream') && $object->initialize()) { $sourceBases = $object->getBases(''); $source = $object->getBasePath(); if (!$sourceBases['pathIsRelative'] && strpos($source, '://') === false) { $sourceBasePath = $source; if (strpos($source, $base_path) === 0) { $sourceBasePath = str_replace($base_path, '', $sourceBasePath); $classAttributes['resolve'][] = array('type' => 'php', 'source' => VAPOR_DIR . 'scripts/resolve.media_source.php', 'target' => $sourceBasePath, 'targetRelative' => true); } else { /* when coming from Windows sources, remove "{volume}:" */ if (strpos($source, ':\\') !== false || strpos($source, ':/') !== false) { $sourceBasePath = str_replace('\\', '/', substr($source, strpos($source, ':') + 1)); } $target = 'dirname(MODX_BASE_PATH) . "/sources/' . ltrim(dirname($sourceBasePath), '/') . '/"'; $classAttributes['resolve'][] = array('type' => 'file', 'source' => $source, 'target' => "return {$target};"); $classAttributes['resolve'][] = array('type' => 'php', 'source' => VAPOR_DIR . 'scripts/resolve.media_source.php', 'target' => $sourceBasePath, 'targetRelative' => false, 'targetPrepend' => "return dirname(MODX_BASE_PATH) . '/sources/';"); } } } if ($package->put($object, $classAttributes)) { $instances++; } else { $modx->log(modX::LOG_LEVEL_WARN, "Could not package {$class} instance with pk: " . print_r($object->getPrimaryKey(), true)); } } $modx->log(modX::LOG_LEVEL_INFO, "Packaged {$instances} of {$class}"); continue 2; default: break; } /** @var xPDOObject $object */ foreach ($modx->getIterator($class, $classCriteria) as $object) { if ($package->put($object, $classAttributes)) { $instances++; } else { $modx->log(modX::LOG_LEVEL_WARN, "Could not package {$class} instance with pk: " . print_r($object->getPrimaryKey(), true)); } } $modx->log(modX::LOG_LEVEL_INFO, "Packaged {$instances} of {$class}"); } /* collect table names from classes and grab any additional tables/data not listed */ $coreTables = array(); $extraTables = array(); foreach ($classes as $class) { $coreTables[$class] = $modx->quote($modx->literal($modx->getTableName($class))); } if ($coreTables) { $stmt = $modx->query("SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = '{$modxDatabase}' AND TABLE_NAME NOT IN (" . implode(',', $coreTables) . ")"); $extraTables = $stmt->fetchAll(PDO::FETCH_COLUMN); } if (is_array($extraTables) && !empty($extraTables)) { //$modx->loadClass('vapor.vaporVehicle', VAPOR_DIR . 'model/', true, true); $modx->loadClass('vapor.vaporVehicle', VAPOR_DIR, true, true); $excludeExtraTablePrefix = isset($vaporOptions['excludeExtraTablePrefix']) && is_array($vaporOptions['excludeExtraTablePrefix']) ? $vaporOptions['excludeExtraTablePrefix'] : array(); $excludeExtraTables = isset($vaporOptions['excludeExtraTables']) && is_array($vaporOptions['excludeExtraTables']) ? $vaporOptions['excludeExtraTables'] : array(); foreach ($extraTables as $extraTable) { if (in_array($extraTable, $excludeExtraTables)) { continue; } if (!XPDO_CLI_MODE && !ini_get('safe_mode')) { set_time_limit(0); } $instances = 0; $object = array(); $attributes = array('vehicle_package' => 'vapor', 'vehicle_class' => 'vaporVehicle'); /* remove modx table_prefix if table starts with it */ $extraTableName = $extraTable; if (!empty($modxTablePrefix) && strpos($extraTableName, $modxTablePrefix) === 0) { $extraTableName = substr($extraTableName, strlen($modxTablePrefix)); $addTablePrefix = true; } elseif (!empty($modxTablePrefix) || in_array($extraTableName, $excludeExtraTablePrefix)) { $addTablePrefix = false; } else { $addTablePrefix = true; } $object['tableName'] = $extraTableName; $modx->log(modX::LOG_LEVEL_INFO, "Extracting non-core table {$extraTableName}"); /* generate the CREATE TABLE statement */ $stmt = $modx->query("SHOW CREATE TABLE {$modx->escape($extraTable)}"); $resultSet = $stmt->fetch(PDO::FETCH_NUM); $stmt->closeCursor(); if (isset($resultSet[1])) { if ($addTablePrefix) { $object['drop'] = "DROP TABLE IF EXISTS {$modx->escape('[[++table_prefix]]' . $extraTableName)}"; $object['table'] = str_replace("CREATE TABLE {$modx->escape($extraTable)}", "CREATE TABLE {$modx->escape('[[++table_prefix]]' . $extraTableName)}", $resultSet[1]); } else { $object['drop'] = "DROP TABLE IF EXISTS {$modx->escape($extraTableName)}"; $object['table'] = $resultSet[1]; } /* collect the rows and generate INSERT statements */ $object['data'] = array(); $stmt = $modx->query("SELECT * FROM {$modx->escape($extraTable)}"); while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { if ($instances === 0) { $fields = implode(', ', array_map(array($modx, 'escape'), array_keys($row))); } $values = array(); while (list($key, $value) = each($row)) { switch (gettype($value)) { case 'string': $values[] = $modx->quote($value); break; case 'NULL': case 'array': case 'object': case 'resource': case 'unknown type': $values[] = 'NULL'; break; default: $values[] = (string) $value; break; } } $values = implode(', ', $values); if ($addTablePrefix) { $object['data'][] = "INSERT INTO {$modx->escape('[[++table_prefix]]' . $extraTableName)} ({$fields}) VALUES ({$values})"; } else { $object['data'][] = "INSERT INTO {$modx->escape($extraTable)} ({$fields}) VALUES ({$values})"; } $instances++; } } if (!$package->put($object, $attributes)) { $modx->log(modX::LOG_LEVEL_WARN, "Could not package rows for table {$extraTable}: " . print_r($object, true)); } else { $modx->log(modX::LOG_LEVEL_INFO, "Packaged {$instances} rows for table {$extraTable}"); } } } if (!XPDO_CLI_MODE && !ini_get('safe_mode')) { set_time_limit(0); } if (!$package->pack()) { $message = "Error extracting package, could not pack transport: {$package->signature}"; $modx->log(modX::LOG_LEVEL_ERROR, $message); //echo "{$message}\n"; } else { $message = "Completed extracting package: {$package->signature}"; $modx->log(modX::LOG_LEVEL_INFO, $message); //echo "{$message}\n"; } $endTime = microtime(true); $msg = sprintf("Vapor execution completed without exception in %2.4fs", $endTime - $this->getProperty('startTime')); $modx->log(modX::LOG_LEVEL_INFO, $msg); return $this->success($msg, array('signature' => $package->signature)); } catch (Exception $e) { if (empty($endTime)) { $endTime = microtime(true); } if (!empty($modx)) { $modx->log(modX::LOG_LEVEL_ERROR, $e->getMessage()); $msg = sprintf("Vapor execution completed with exception in %2.4fs", $endTime - $this->getProperty('startTime')); $modx->log(modX::LOG_LEVEL_INFO, $msg); return $this->failure($msg); } else { //echo $e->getMessage() . "\n"; } $msg = sprintf("Vapor execution completed with exception in %2.4fs\n", $endTime - $this->getProperty('startTime')); $modx->log(modX::LOG_LEVEL_INFO, $msg); return $this->failure($msg); } return $modx->success(printf("Vapor execution completed without exception in %2.4fs\n", $endTime - $this->getProperty('startTime'))); }