/** * Loads all system settings that start with the configured namespace. * * @return array */ public function loadSettingsFromNamespace() { $ns = $this->namespace; $config = array(); $corePath = $this->modx->getOption($ns . '.core_path', null, MODX_CORE_PATH . 'components/' . $ns . '/'); $config['core_path'] = $corePath; $config['templates_path'] = $corePath . 'templates/'; $config['controllers_path'] = $corePath . 'controllers/'; $config['model_path'] = $corePath . 'model/'; $config['processors_path'] = $corePath . 'processors/'; $config['elements_path'] = $corePath . 'elements/'; $assetsUrl = $this->modx->getOption($ns . '.assets_url', null, MODX_ASSETS_URL . 'components/' . $ns . '/'); $config['assets_url'] = $assetsUrl; $config['connector_url'] = $assetsUrl . ' connector.php'; $c = $this->modx->newQuery('modSystemSetting'); $c->where(array('key:LIKE' => $ns . '.%')); $c->limit(0); /** @var \modSystemSetting[] $iterator */ $iterator = $this->modx->getIterator('modSystemSetting', $c); foreach ($iterator as $setting) { $key = $setting->get('key'); $key = substr($key, strlen($ns) + 1); $config[$key] = $setting->get('value'); } return $config; }
/** * Refresh Resource URI fields for children of the specified parent. * * @static * @param modX &$modx A reference to a valid modX instance. * @param int $parent The id of a Resource parent to start from (default is 0, the root) * @param array $options An array of various options for the method: * - resetOverrides: if true, Resources with uri_override set to true will be included * - contexts: an optional array of context keys to limit the refresh scope * @return void */ public static function refreshURIs(modX &$modx, $parent = 0, array $options = array()) { $resetOverrides = array_key_exists('resetOverrides', $options) ? (bool) $options['resetOverrides'] : false; $contexts = array_key_exists('contexts', $options) ? explode(',', $options['contexts']) : null; $criteria = $modx->newQuery('linguaSiteContent'); $criteria->where(array('lang_id' => $options['lang_id'], 'parent' => $parent)); if (!$resetOverrides) { $criteria->where(array('uri_override' => false)); } if (!empty($contexts)) { $criteria->where(array('context_key:IN' => $contexts)); } /** @var Resource $resource */ $resources = $modx->getIterator('linguaSiteContent', $criteria); foreach ($resources as $resource) { $resource->set('refreshURIs', true); if ($resetOverrides) { $resource->set('uri_override', false); } if (!$resource->get('uri_override')) { $resource->set('uri', ''); } $resource->save(); } }
/** * Grabs context specific settings from the current namespace, and loads them into $this->config. * Also returns the newly overridden values in an array. * * @param $contextKey * @return array */ public function loadContextSettingsFromNamespace($contextKey) { $config = array(); $c = $this->modx->newQuery('modContextSetting'); $c->where(array('context_key' => $contextKey, 'key:LIKE' => $this->namespace . '.%')); $c->limit(0); /** @var \modSystemSetting[] $iterator */ $iterator = $this->modx->getIterator('modContextSetting', $c); foreach ($iterator as $setting) { $key = $setting->get('key'); $key = substr($key, strlen($this->namespace) + 1); $config[$key] = $setting->get('value'); } $this->config = array_merge($this->config, $config); return $config; }
/** * @param bool|string $link_type * @param bool|int $parent */ public function clearLinks($link_type = false, $parent = false) { $c = $this->modx->newQuery('modDevToolsLink'); if ($link_type) { $c->where(array('link_type:LIKE' => $link_type . '-%')); } if ($parent) { $c->where(array('parent' => $parent)); } $links = $this->modx->getIterator('modDevToolsLink', $c); /** * @var modDevToolsLink $link */ foreach ($links as $link) { $link->remove(); } }
/** * Search for package to satisfy a dependency. * * @param string $package The name of the dependent package. * @param string $constraint The version constraint the package must satisfy. * @param modTransportProvider|null $provider A reference which is set to the * modTransportProvider which satisfies the dependency. * * @return array|bool The metadata for the package version which satisfies the dependency, or FALSE. */ public function findResolution($package, $constraint, &$provider = null) { $resolution = false; $conditions = array('active' => true); switch (strtolower($package)) { case 'php': /* you must resolve php dependencies manually */ $this->xpdo->log(xPDO::LOG_LEVEL_WARN, "PHP version dependencies must be resolved manually", '', __METHOD__, __FILE__, __LINE__); break; case 'modx': case 'revo': case 'revolution': /* resolve core dependencies manually for now */ $this->xpdo->log(xPDO::LOG_LEVEL_ERROR, "MODX core version dependencies must be resolved manually", '', __METHOD__, __FILE__, __LINE__); break; default: /* TODO: scan for local packages to satisfy dependency */ /* see if current provider can satisfy dependency */ /** @var modTransportProvider $provider */ $provider = $this->Provider; if ($provider) { $resolution = $provider->latest($package, $constraint); } /* loop through active providers if all else fails */ if ($resolution === false) { $query = $this->xpdo->newQuery('transport.modTransportProvider', $conditions); $query->sortby('priority', 'ASC'); /** @var modTransportProvider $p */ foreach ($this->xpdo->getIterator('transport.modTransportProvider', $query) as $p) { $resolution = $p->latest($package, $constraint); if ($resolution) { $provider = $p; break; } } } if ($resolution === false) { $this->xpdo->log(xPDO::LOG_LEVEL_ERROR, "Could not find package to satisfy dependency {$package} @ {$constraint} from your currently active providers", '', __METHOD__, __FILE__, __LINE__); } break; } return $resolution; }
/** * Refresh Resource URI fields for children of the specified parent. * * @static * @param modX &$modx A reference to a valid modX instance. * @param int $parent The id of a Resource parent to start from (default is 0, the root) * @param array $options An array of various options for the method: * - resetOverrides: if true, Resources with uri_override set to true will be included * - contexts: an optional array of context keys to limit the refresh scope * @return void */ public static function refreshURIs(modX &$modx, $parent = 0, array $options = array()) { $resetOverrides = array_key_exists('resetOverrides', $options) ? (boolean) $options['resetOverrides'] : false; $contexts = array_key_exists('contexts', $options) ? explode(',', $options['contexts']) : null; $criteria = $modx->newQuery('modResource', array('parent' => $parent)); if (!$resetOverrides) { $criteria->where(array('uri_override' => false)); } if (!empty($contexts)) { $criteria->where(array('context_key:IN' => $contexts)); } $criteria->sortby('menuindex', 'ASC'); foreach ($modx->getIterator('modResource', $criteria) as $resource) { $resource->set('refreshURIs', true); if ($resetOverrides) { $resource->set('uri_override', false); } if (!$resource->get('uri_override')) { $resource->set('uri', ''); } $resource->save(); } }
/* load Discuss */ $discuss = $modx->getService('discuss', 'Discuss', $modx->getOption('discuss.core_path', null, $modx->getOption('core_path') . 'components/discuss/') . 'model/discuss/'); if (!$discuss instanceof Discuss) { return ''; } /* setup mem limits */ ini_set('memory_limit', '1024M'); set_time_limit(0); @ob_end_clean(); echo '<pre>'; /* load and run importer */ if ($discuss->loadImporter('disSmfImport')) { $c = $modx->newQuery('disPost'); $total = $modx->getCount('disPost', $c); $c->sortby('thread', 'DESC'); $posts = $modx->getIterator('disPost', $c); $discuss->import->log('Found ' . $total . ' threads: ' . $total); /** @var disThread $thread */ $thread = null; /** @var disPost $post */ foreach ($posts as $post) { if (!$thread || $post->get('thread') != $thread->get('id')) { $thread = $post->getOne('Thread'); } if ($thread) { $thread->addParticipant($post->get('author')); $discuss->import->log('Fixing participants for: ' . $thread->get('title')); } } } else { $modx->log(xPDO::LOG_LEVEL_ERROR, 'Failed to load Import 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())); } }
} if ($params['debug']) { print message("Debug SQL query.", 'HELP'); $c->prepare(); print $c->toSQL(); print "\n"; exit; } // see http://www.webhostingtalk.com/showthread.php?t=1043707 // http://www.webdeveloper.com/forum/showthread.php?208676-Remote-site-loading-time print "STARTING " . date('Y-m-d H:i:s') . "\n"; $mtime = explode(" ", microtime()); $tstart = $mtime[1] + $mtime[0]; $pg_cnt = 0; $e_cnt = 0; $collection = $modx->getIterator('modResource', $c); foreach ($collection as $obj) { $url = $modx->makeUrl($obj->get('id'), '', '', 'full'); if (!$url) { print 'ERROR empty URL for page ' . $obj->get('id') . "\n"; continue; } if (!($loadtime = request_url($url))) { print 'ERROR requesting ' . $url . "\n"; $e_cnt++; } else { print $url . ' Load Time: ' . $loadtime . "s\n"; $pg_cnt++; } wait($params['sleep']); }
$discuss = $modx->getService('discuss', 'Discuss', $modx->getOption('discuss.core_path', null, $modx->getOption('core_path') . 'components/discuss/') . 'model/discuss/'); if (!$discuss instanceof Discuss) { return ''; } /* setup mem limits */ ini_set('memory_limit', '1024M'); set_time_limit(0); @ob_end_clean(); echo '<pre>'; /* load and run importer */ if ($discuss->loadImporter('disSmfImport')) { $c = $modx->newQuery('disThread'); $c->innerJoin('disPost', 'FirstPost'); $c->select(array('disThread.*', 'FirstPost.title AS post_title')); $c->sortby('disThread.id', 'DESC'); $threads = $modx->getIterator('disThread', $c); foreach ($threads as $thread) { $pt = $thread->get('post_title'); if (!empty($pt)) { $thread->set('title', $pt); $discuss->import->log('Setting title to: ' . $pt); $thread->save(); } } } else { $modx->log(xPDO::LOG_LEVEL_ERROR, 'Failed to load Import class.'); } $mtime = microtime(); $mtime = explode(" ", $mtime); $mtime = $mtime[1] + $mtime[0]; $tend = $mtime;
if (!$discuss instanceof Discuss) { return ''; } /* setup mem limits */ ini_set('memory_limit', '1024M'); set_time_limit(0); @ob_end_clean(); echo '<pre>'; /* load and run importer */ if ($discuss->loadImporter('disSmfImport')) { $modx->getCacheManager(); $sourceAttachmentsPath = $discuss->import->config['attachments_path']; $discuss->import->getConnection(); $c = $modx->newQuery('disPostAttachment'); $c->sortby('post', 'DESC'); $attachments = $modx->getIterator('disPostAttachment', $c); /** @var disPostAttachment $attachment */ foreach ($attachments as $attachment) { $found = false; $target = $attachment->getPath(); $source = $sourceAttachmentsPath . $attachment->get('filename'); $discuss->import->log('Looking for: ' . $source); if (file_exists($source)) { $found = true; } else { $cleanName = $attachment->get('filename'); $cleanName = strtr($cleanName, '�����ְֱֲֳִֵַָֹ�ֻּֽ־ֿׁׂ׃װױײ״�����אבגדהוחטיךכלםמןסעףפץצרשת���', 'SZszYAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy'); $cleanName = strtr($cleanName, array('�' => 'TH', '' => 'th', '׀' => 'DH', 'נ' => 'dh', '�' => 'ss', '�' => 'OE', '�' => 'oe', 'ֶ' => 'AE', 'ז' => 'ae', 'µ' => 'u')); $cleanName = preg_replace(array('/\\s/', '/[^\\w_\\.\\-]/'), array('_', ''), $cleanName); $hash = md5($cleanName); $cleanName = strtr($cleanName, '.', '_');
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'))); }