PageRenderTime 40ms CodeModel.GetById 11ms RepoModel.GetById 0ms app.codeStats 0ms

/concreteOLD/models/package.php

https://bitbucket.org/selfeky/xclusivescardwebsite
PHP | 729 lines | 569 code | 89 blank | 71 comment | 89 complexity | 3f6272e1949a2480a83ece942b87867c MD5 | raw file
  1. <?php
  2. defined('C5_EXECUTE') or die("Access Denied.");
  3. /**
  4. *
  5. * Package-related classes.
  6. * @package Utilities
  7. * @author Andrew Embler <andrew@concrete5.org>
  8. * @link http://www.concrete5.org
  9. * @license http://www.opensource.org/licenses/mit-license.php MIT
  10. *
  11. */
  12. /**
  13. *
  14. * @access private
  15. *
  16. */
  17. interface Installable {
  18. public function install();
  19. public function uninstall();
  20. }
  21. /**
  22. *
  23. * Groups and lists installed and available pages.
  24. * @package Utilities
  25. * @author Andrew Embler <andrew@concrete5.org>
  26. * @link http://www.concrete5.org
  27. * @license http://www.opensource.org/licenses/mit-license.php MIT
  28. *
  29. */
  30. class PackageList extends Object {
  31. protected $packages = array();
  32. public function add($pkg) {
  33. $this->packages[] = $pkg;
  34. }
  35. public function getPackages() {
  36. return $this->packages;
  37. }
  38. public static function export($xml) {
  39. $packages = PackageList::get()->getPackages();
  40. $pkgs = $xml->addChild("packages");
  41. foreach($packages as $pkg) {
  42. $node = $pkgs->addChild('package');
  43. $node->addAttribute('handle', $pkg->getPackageHandle());
  44. }
  45. }
  46. public static function getHandle($pkgID) {
  47. if ($pkgID < 1) {
  48. return false;
  49. }
  50. $packageList = Cache::get('packageHandleList', false);
  51. if (is_array($packageList)) {
  52. return $packageList[$pkgID];
  53. }
  54. $packageList = array();
  55. $db = Loader::db();
  56. $r = $db->Execute('select pkgID, pkgHandle from Packages where pkgIsInstalled = 1');
  57. while ($row = $r->FetchRow()) {
  58. $packageList[$row['pkgID']] = $row['pkgHandle'];
  59. }
  60. Cache::set('packageHandleList', false, $packageList);
  61. return $packageList[$pkgID];
  62. }
  63. public static function refreshCache() {
  64. Cache::delete('pkgList', 1);
  65. Cache::delete('pkgList', 0);
  66. Cache::delete('packageHandleList', false);
  67. }
  68. public static function get($pkgIsInstalled = 1) {
  69. $pkgList = Cache::get('pkgList', $pkgIsInstalled);
  70. if ($pkgList != false) {
  71. return $pkgList;
  72. }
  73. $db = Loader::db();
  74. $r = $db->query("select pkgID, pkgName, pkgIsInstalled, pkgDescription, pkgVersion, pkgHandle, pkgDateInstalled from Packages where pkgIsInstalled = ? order by pkgID asc", array($pkgIsInstalled));
  75. $list = new PackageList();
  76. while ($row = $r->fetchRow()) {
  77. $pkg = new Package;
  78. $pkg->setPropertiesFromArray($row);
  79. $list->add($pkg);
  80. }
  81. Cache::set('pkgList', $pkgIsInstalled, $list);
  82. return $list;
  83. }
  84. }
  85. /**
  86. *
  87. * Represents a package. A package is a grouping of Concrete functionality that can be "packaged" up and distributed
  88. * and easily installed in one spot.
  89. * @package Utilities
  90. * @author Andrew Embler <andrew@concrete5.org>
  91. * @link http://www.concrete5.org
  92. * @license http://www.opensource.org/licenses/mit-license.php MIT
  93. *
  94. */
  95. class Package extends Object {
  96. protected $DIR_PACKAGES_CORE = DIR_PACKAGES_CORE;
  97. protected $DIR_PACKAGES = DIR_PACKAGES;
  98. protected $REL_DIR_PACKAGES_CORE = REL_DIR_PACKAGES_CORE;
  99. protected $REL_DIR_PACKAGES = REL_DIR_PACKAGES;
  100. public function getRelativePath() {
  101. $dirp = (is_dir($this->DIR_PACKAGES . '/' . $this->getPackageHandle())) ? $this->REL_DIR_PACKAGES : $this->REL_DIR_PACKAGES_CORE;
  102. return $dirp . '/' . $this->pkgHandle;
  103. }
  104. public function getPackageID() {return $this->pkgID;}
  105. public function getPackageName() {return t($this->pkgName);}
  106. public function getPackageDescription() {return t($this->pkgDescription);}
  107. public function getPackageHandle() {return $this->pkgHandle;}
  108. /**
  109. * Gets the date the package was added to the system,
  110. * if user is specified, returns in the current user's timezone
  111. * @param string $type (system || user)
  112. * @return string date formated like: 2009-01-01 00:00:00
  113. */
  114. function getPackageDateInstalled($type = 'system') {
  115. if(ENABLE_USER_TIMEZONES && $type == 'user') {
  116. $dh = Loader::helper('date');
  117. return $dh->getLocalDateTime($this->pkgDateInstalled);
  118. } else {
  119. return $this->pkgDateInstalled;
  120. }
  121. }
  122. public function getPackageVersion() {return $this->pkgVersion;}
  123. public function getPackageVersionUpdateAvailable() {return $this->pkgAvailableVersion;}
  124. public function isPackageInstalled() { return $this->pkgIsInstalled;}
  125. public function getChangelogContents() {
  126. if (file_exists($this->getPackagePath() . '/CHANGELOG')) {
  127. $contents = Loader::helper('file')->getContents($this->getPackagePath() . '/CHANGELOG');
  128. return nl2br(Loader::helper('text')->entities($contents));
  129. }
  130. return '';
  131. }
  132. /**
  133. * Returns the currently installed package version.
  134. * NOTE: This function only returns a value if getLocalUpgradeablePackages() has been called first!
  135. */
  136. public function getPackageCurrentlyInstalledVersion() {
  137. return $this->pkgCurrentVersion;
  138. }
  139. protected $appVersionRequired = '5.0.0';
  140. protected $pkgAllowsFullContentSwap = false;
  141. const E_PACKAGE_NOT_FOUND = 1;
  142. const E_PACKAGE_INSTALLED = 2;
  143. const E_PACKAGE_VERSION = 3;
  144. const E_PACKAGE_DOWNLOAD = 4;
  145. const E_PACKAGE_SAVE = 5;
  146. const E_PACKAGE_UNZIP = 6;
  147. const E_PACKAGE_INSTALL = 7;
  148. const E_PACKAGE_MIGRATE_BACKUP = 8;
  149. const E_PACKAGE_INVALID_APP_VERSION = 20;
  150. protected $errorText = array();
  151. public function getApplicationVersionRequired() {
  152. return $this->appVersionRequired;
  153. }
  154. public function hasInstallNotes() {
  155. return file_exists($this->getPackagePath() . '/' . DIRNAME_ELEMENTS . '/' . DIRNAME_DASHBOARD . '/install.php');
  156. }
  157. public function allowsFullContentSwap() {
  158. return $this->pkgAllowsFullContentSwap;
  159. }
  160. public function showInstallOptionsScreen() {
  161. return $this->hasInstallNotes() || $this->allowsFullContentSwap();
  162. }
  163. public static function installDB($xmlFile) {
  164. if (!file_exists($xmlFile)) {
  165. return false;
  166. }
  167. // currently this is just done from xml
  168. $db = Loader::db();
  169. // this sucks - but adodb generates errors at the beginning because it attempts
  170. // to find a table that doesn't exist!
  171. $handler = $db->IgnoreErrors();
  172. if (Database::getDebug() == false) {
  173. ob_start();
  174. }
  175. $schema = Database::getADOSChema();
  176. $sql = $schema->ParseSchema($xmlFile);
  177. $db->IgnoreErrors($handler);
  178. if (!$sql) {
  179. $result->message = $db->ErrorMsg();
  180. return $result;
  181. }
  182. $r = $schema->ExecuteSchema();
  183. if (Database::getDebug() == false) {
  184. $dbLayerErrorMessage = ob_get_contents();
  185. ob_end_clean();
  186. }
  187. $result = new stdClass;
  188. $result->result = false;
  189. if ($dbLayerErrorMessage != '') {
  190. $result->message = $dbLayerErrorMessage;
  191. return $result;
  192. } if (!$r) {
  193. $result->message = $db->ErrorMsg();
  194. return $result;
  195. }
  196. $result->result = true;
  197. $db->CacheFlush();
  198. return $result;
  199. }
  200. /**
  201. * Loads package translation files into zend translate
  202. * @param string $locale
  203. * @param string $key
  204. * @return void
  205. */
  206. public function setupPackageLocalization($locale = NULL, $key = NULL) {
  207. $translate = Localization::getTranslate();
  208. if (is_object($translate)) {
  209. $path = $this->getPackagePath() . '/' . DIRNAME_LANGUAGES;
  210. if(!isset($locale) || !strlen($locale)) {
  211. $locale = ACTIVE_LOCALE;
  212. }
  213. if(!isset($key)) {
  214. $key = $locale;
  215. }
  216. if (file_exists($path . '/' . $locale . '/LC_MESSAGES/messages.mo')) {
  217. $translate->addTranslation($path . '/' . $locale . '/LC_MESSAGES/messages.mo', $key);
  218. }
  219. }
  220. }
  221. /**
  222. * Returns an array of package items (e.g. blocks, themes)
  223. */
  224. public function getPackageItems() {
  225. $items = array();
  226. Loader::model('single_page');
  227. Loader::library('mail/importer');
  228. Loader::model('job');
  229. Loader::model('collection_types');
  230. Loader::model('system/captcha/library');
  231. Loader::model('system/antispam/library');
  232. $items['attribute_categories'] = AttributeKeyCategory::getListByPackage($this);
  233. $items['attribute_keys'] = AttributeKey::getListByPackage($this);
  234. $items['attribute_sets'] = AttributeSet::getListByPackage($this);
  235. $items['page_types'] = CollectionType::getListByPackage($this);
  236. $items['mail_importers'] = MailImporter::getListByPackage($this);
  237. $items['configuration_values'] = Config::getListByPackage($this);
  238. $items['block_types'] = BlockTypeList::getByPackage($this);
  239. $items['page_themes'] = PageTheme::getListByPackage($this);
  240. $tp = new TaskPermissionList();
  241. $items['task_permissions'] = $tp->populatePackagePermissions($this);
  242. $items['single_pages'] = SinglePage::getListByPackage($this);
  243. $items['attribute_types'] = AttributeType::getListByPackage($this);
  244. $items['captcha_libraries'] = SystemCaptchaLibrary::getListByPackage($this);
  245. $items['antispam_libraries'] = SystemAntispamLibrary::getListByPackage($this);
  246. $items['jobs'] = Job::getListByPackage($this);
  247. ksort($items);
  248. return $items;
  249. }
  250. public static function getItemName($item) {
  251. $txt = Loader::helper('text');
  252. Loader::model('single_page');
  253. if ($item instanceof BlockType) {
  254. return $item->getBlockTypeName();
  255. } else if ($item instanceof PageTheme) {
  256. return $item->getThemeName();
  257. } else if ($item instanceof CollectionType) {
  258. return $item->getCollectionTypeName();
  259. } else if ($item instanceof MailImporter) {
  260. return $item->getMailImporterName();
  261. } else if ($item instanceof SinglePage) {
  262. return $item->getCollectionPath();
  263. } else if ($item instanceof AttributeType) {
  264. return $item->getAttributeTypeName();
  265. } else if ($item instanceof AttributeKeyCategory) {
  266. return $txt->unhandle($item->getAttributeKeyCategoryHandle());
  267. } else if ($item instanceof AttributeSet) {
  268. $at = AttributeKeyCategory::getByID($item->getAttributeSetKeyCategoryID());
  269. return t('%s (%s)', $item->getAttributeSetName(), $txt->unhandle($at->getAttributeKeyCategoryHandle()));
  270. } else if (is_a($item, 'AttributeKey')) {
  271. $akc = AttributeKeyCategory::getByID($item->getAttributeKeyCategoryID());
  272. return t(' %s (%s)', $txt->unhandle($item->getAttributeKeyHandle()), $txt->unhandle($akc->getAttributeKeyCategoryHandle()));
  273. } else if ($item instanceof ConfigValue) {
  274. return ucwords(strtolower($txt->unhandle($item->key)));
  275. } else if ($item instanceof SystemAntispamLibrary) {
  276. return $item->getSystemAntispamLibraryName();
  277. } else if (is_a($item, 'TaskPermission')) {
  278. return $item->getTaskPermissionName();
  279. } else if (is_a($item, 'Job')) {
  280. return $item->getJobName();
  281. }
  282. }
  283. /**
  284. * Uninstalls the package. Removes any blocks, themes, or pages associated with the package.
  285. */
  286. public function uninstall() {
  287. $db = Loader::db();
  288. $items = $this->getPackageItems();
  289. foreach($items as $k => $array) {
  290. foreach($array as $item) {
  291. if (is_a($item, 'Job')) {
  292. $item->uninstall();
  293. } else if (is_a($item, 'AttributeKey') || is_a($item, 'MailImporter')) {
  294. $item->delete();
  295. } else {
  296. switch(get_class($item)) {
  297. case 'BlockType':
  298. $item->delete();
  299. break;
  300. case 'PageTheme':
  301. $item->uninstall();
  302. break;
  303. case 'SinglePage':
  304. @$item->delete(); // we suppress errors because sometimes the wrapper pages can delete first.
  305. break;
  306. case 'SystemAntispamLibrary':
  307. $item->delete();
  308. break;
  309. case 'CollectionType':
  310. $item->delete();
  311. break;
  312. case 'MailImporter':
  313. $item->delete();
  314. break;
  315. case 'ConfigValue':
  316. $co = new Config();
  317. $co->setPackageObject($this);
  318. $co->clear($item->key);
  319. break;
  320. case 'AttributeKeyCategory':
  321. case 'AttributeSet':
  322. case 'AttributeType':
  323. case 'TaskPermission':
  324. $item->delete();
  325. break;
  326. default:
  327. if(method_exists($item, 'delete')) {
  328. $item->delete();
  329. } elseif(method_exists($item, 'uninstall')) {
  330. $item->uninstall();
  331. }
  332. break;
  333. }
  334. }
  335. }
  336. }
  337. $db->Execute("delete from Packages where pkgID = ?", array($this->pkgID));
  338. PackageList::refreshCache();
  339. }
  340. protected function validateClearSiteContents($options) {
  341. $u = new User();
  342. if ($u->isSuperUser()) {
  343. // this can ONLY be used through the post. We will use the token to ensure that
  344. $valt = Loader::helper('validation/token');
  345. if ($valt->validate('install_options_selected', $options['ccm_token'])) {
  346. return true;
  347. }
  348. }
  349. return false;
  350. }
  351. public function swapContent($options) {
  352. if ($this->validateClearSiteContents($options)) {
  353. Loader::model("page_list");
  354. Loader::model("file_list");
  355. Loader::model("stack/list");
  356. $pl = new PageList();
  357. $pages = $pl->get();
  358. foreach($pages as $c) {
  359. $c->delete();
  360. }
  361. $fl = new FileList();
  362. $files = $fl->get();
  363. foreach($files as $f) {
  364. $f->delete();
  365. }
  366. // clear stacks
  367. $sl = new StackList();
  368. foreach($sl->get() as $c) {
  369. $c->delete();
  370. }
  371. $home = Page::getByID(HOME_CID);
  372. $blocks = $home->getBlocks();
  373. foreach($blocks as $b) {
  374. $b->deleteBlock();
  375. }
  376. $pageTypes = CollectionType::getList();
  377. foreach($pageTypes as $ct) {
  378. $ct->delete();
  379. }
  380. // now we add in any files that this package has
  381. if (is_dir($this->getPackagePath() . '/content_files')) {
  382. Loader::library('file/importer');
  383. $fh = new FileImporter();
  384. $contents = Loader::helper('file')->getDirectoryContents($this->getPackagePath() . '/content_files');
  385. foreach($contents as $filename) {
  386. $f = $fh->import($this->getPackagePath() . '/content_files/' . $filename, $filename);
  387. }
  388. }
  389. // now we parse the content.xml if it exists.
  390. Loader::library('content/importer');
  391. $ci = new ContentImporter();
  392. $ci->importContentFile($this->getPackagePath() . '/content.xml');
  393. }
  394. }
  395. public function testForInstall($package, $testForAlreadyInstalled = true) {
  396. // this is the pre-test routine that packages run through before they are installed. Any errors that come here
  397. // are to be returned in the form of an array so we can show the user. If it's all good we return true
  398. $db = Loader::db();
  399. $errors = array();
  400. $pkg = Loader::package($package);
  401. // Step 1 does that package exist ?
  402. if ((!is_dir(DIR_PACKAGES . '/' . $package) && (!is_dir(DIR_PACKAGES_CORE . '/' . $package))) || $package == '') {
  403. $errors[] = Package::E_PACKAGE_NOT_FOUND;
  404. } else if (!is_object($pkg)) {
  405. $errors[] = Package::E_PACKAGE_NOT_FOUND;
  406. }
  407. // Step 2 - check to see if the user has already installed a package w/this handle
  408. if ($testForAlreadyInstalled) {
  409. $cnt = $db->getOne("select count(*) from Packages where pkgHandle = ?", array($package));
  410. if ($cnt > 0) {
  411. $errors[] = Package::E_PACKAGE_INSTALLED;
  412. }
  413. }
  414. if (count($errors) == 0) {
  415. // test minimum application version requirement
  416. if (version_compare(APP_VERSION, $pkg->getApplicationVersionRequired(), '<')) {
  417. $errors[] = array(Package::E_PACKAGE_VERSION, $pkg->getApplicationVersionRequired());
  418. }
  419. }
  420. if (count($errors) > 0) {
  421. return $errors;
  422. } else {
  423. return true;
  424. }
  425. }
  426. public function mapError($testResults) {
  427. $errorText[Package::E_PACKAGE_INSTALLED] = t("You've already installed that package.");
  428. $errorText[Package::E_PACKAGE_NOT_FOUND] = t("Invalid Package.");
  429. $errorText[Package::E_PACKAGE_VERSION] = t("This package requires Concrete version %s or greater.");
  430. $errorText[Package::E_PACKAGE_DOWNLOAD] = t("An error occurred while downloading the package.");
  431. $errorText[Package::E_PACKAGE_SAVE] = t("Concrete was not able to save the package after download.");
  432. $errorText[Package::E_PACKAGE_UNZIP] = t('An error occurred while trying to unzip the package.');
  433. $errorText[Package::E_PACKAGE_INSTALL] = t('An error occurred while trying to install the package.');
  434. $errorText[Package::E_PACKAGE_MIGRATE_BACKUP] = t('Unable to backup old package directory to %s', DIR_FILES_TRASH);
  435. $errorText[Package::E_PACKAGE_INVALID_APP_VERSION] = t('This package isn\'t currently available for this version of concrete5. Please contact the maintainer of this package for assistance.');
  436. $testResultsText = array();
  437. foreach($testResults as $result) {
  438. if (is_array($result)) {
  439. $et = $errorText[$result[0]];
  440. array_shift($result);
  441. $testResultsText[] = vsprintf($et, $result);
  442. } else if (is_int($result)) {
  443. $testResultsText[] = $errorText[$result];
  444. } else if (!empty($result)) {
  445. $testResultsText[] = $result;
  446. }
  447. }
  448. return $testResultsText;
  449. }
  450. /*
  451. * Returns a path to where the packages files are located.
  452. * @access public
  453. * @return string $path
  454. */
  455. public function getPackagePath() {
  456. $dirp = (is_dir($this->DIR_PACKAGES . '/' . $this->getPackageHandle())) ? $this->DIR_PACKAGES : $this->DIR_PACKAGES_CORE;
  457. $path = $dirp . '/' . $this->getPackageHandle();
  458. return $path;
  459. }
  460. /**
  461. * returns a Package object for the given package id, null if not found
  462. * @param int $pkgID
  463. * @return Package
  464. */
  465. public function getByID($pkgID) {
  466. $db = Loader::db();
  467. $row = $db->GetRow("select * from Packages where pkgID = ?", array($pkgID));
  468. if ($row) {
  469. $pkg = Loader::package($row['pkgHandle']);
  470. if (is_object($pkg)) {
  471. $pkg->setPropertiesFromArray($row);
  472. return $pkg;
  473. }
  474. }
  475. }
  476. /**
  477. * returns a Package object for the given package handle, null if not found
  478. * @param string $pkgHandle
  479. * @return Package
  480. */
  481. public function getByHandle($pkgHandle) {
  482. $db = Loader::db();
  483. $row = $db->GetRow("select * from Packages where pkgHandle = ?", array($pkgHandle));
  484. if ($row) {
  485. $pkg = Loader::package($row['pkgHandle']);
  486. if (is_object($pkg)) {
  487. $pkg->setPropertiesFromArray($row);
  488. }
  489. return $pkg;
  490. }
  491. }
  492. /**
  493. * @return Package
  494. */
  495. public function install() {
  496. $db = Loader::db();
  497. $dh = Loader::helper('date');
  498. $v = array($this->getPackageName(), $this->getPackageDescription(), $this->getPackageVersion(), $this->getPackageHandle(), 1, $dh->getSystemDateTime());
  499. $db->query("insert into Packages (pkgName, pkgDescription, pkgVersion, pkgHandle, pkgIsInstalled, pkgDateInstalled) values (?, ?, ?, ?, ?, ?)", $v);
  500. $pkg = Package::getByID($db->Insert_ID());
  501. Package::installDB($pkg->getPackagePath() . '/' . FILENAME_PACKAGE_DB);
  502. PackageList::refreshCache();
  503. return $pkg;
  504. }
  505. public function updateAvailableVersionNumber($vNum) {
  506. $db = Loader::db();
  507. $v = array($vNum, $this->getPackageID());
  508. $db->query("update Packages set pkgAvailableVersion = ? where pkgID = ?", $v);
  509. PackageList::refreshCache();
  510. }
  511. public function upgradeCoreData() {
  512. $db = Loader::db();
  513. $p1 = Loader::package($this->getPackageHandle());
  514. $v = array($p1->getPackageName(), $p1->getPackageDescription(), $p1->getPackageVersion(), $this->getPackageID());
  515. $db->query("update Packages set pkgName = ?, pkgDescription = ?, pkgVersion = ? where pkgID = ?", $v);
  516. PackageList::refreshCache();
  517. }
  518. public function upgrade() {
  519. Package::installDB($this->getPackagePath() . '/' . FILENAME_PACKAGE_DB);
  520. // now we refresh all blocks
  521. $items = $this->getPackageItems();
  522. if (is_array($items['block_types'])) {
  523. foreach($items['block_types'] as $item) {
  524. $item->refresh();
  525. }
  526. }
  527. }
  528. public static function getInstalledHandles() {
  529. $db = Loader::db();
  530. return $db->GetCol("select pkgHandle from Packages");
  531. }
  532. public static function getInstalledList() {
  533. $db = Loader::db();
  534. $r = $db->query("select * from Packages where pkgIsInstalled = 1 order by pkgDateInstalled asc");
  535. $pkgArray = array();
  536. while ($row = $r->fetchRow()) {
  537. $pkg = new Package;
  538. $pkg->setPropertiesFromArray($row);
  539. $pkgArray[] = $pkg;
  540. }
  541. return $pkgArray;
  542. }
  543. /**
  544. * Returns an array of packages that have newer versions in the local packages directory
  545. * than those which are in the Packages table. This means they're ready to be upgraded
  546. */
  547. public static function getLocalUpgradeablePackages() {
  548. $packages = Package::getAvailablePackages(false);
  549. $upgradeables = array();
  550. $db = Loader::db();
  551. foreach($packages as $p) {
  552. $row = $db->GetRow("select pkgID, pkgVersion from Packages where pkgHandle = ? and pkgIsInstalled = 1", array($p->getPackageHandle()));
  553. if ($row['pkgID'] > 0) {
  554. if (version_compare($p->getPackageVersion(), $row['pkgVersion'], '>')) {
  555. $p->pkgCurrentVersion = $row['pkgVersion'];
  556. $upgradeables[] = $p;
  557. }
  558. }
  559. }
  560. return $upgradeables;
  561. }
  562. public static function getRemotelyUpgradeablePackages() {
  563. $packages = Package::getInstalledList();
  564. $upgradeables = array();
  565. $db = Loader::db();
  566. foreach($packages as $p) {
  567. if (version_compare($p->getPackageVersion(), $p->getPackageVersionUpdateAvailable(), '<')) {
  568. $upgradeables[] = $p;
  569. }
  570. }
  571. return $upgradeables;
  572. }
  573. public function backup() {
  574. // you can only backup root level packages.
  575. // Need to figure something else out for core level
  576. if ($this->pkgHandle != '' && is_dir(DIR_PACKAGES . '/' . $this->pkgHandle)) {
  577. $ret = @rename(DIR_PACKAGES . '/' . $this->pkgHandle, DIR_FILES_TRASH . '/' . $this->pkgHandle . '_' . date('YmdHis'));
  578. if (!$ret) {
  579. return array(Package::E_PACKAGE_MIGRATE_BACKUP);
  580. }
  581. }
  582. }
  583. public function config($cfKey, $getFullObject = false) {
  584. $co = new Config();
  585. $co->setPackageObject($this);
  586. return $co->get($cfKey, $getFullObject);
  587. }
  588. public function saveConfig($cfKey, $value) {
  589. $co = new Config();
  590. $co->setPackageObject($this);
  591. return $co->save($cfKey, $value);
  592. }
  593. public function clearConfig($cfKey) {
  594. $co = new Config();
  595. $co->setPackageObject($this);
  596. return $co->clear($cfKey);
  597. }
  598. public static function getAvailablePackages($filterInstalled = true) {
  599. $dh = Loader::helper('file');
  600. $packages = $dh->getDirectoryContents(DIR_PACKAGES);
  601. if ($filterInstalled) {
  602. $handles = self::getInstalledHandles();
  603. // strip out packages we've already installed
  604. $packagesTemp = array();
  605. foreach($packages as $p) {
  606. if (!in_array($p, $handles)) {
  607. $packagesTemp[] = $p;
  608. }
  609. }
  610. $packages = $packagesTemp;
  611. }
  612. if (count($packages) > 0) {
  613. $packagesTemp = array();
  614. // get package objects from the file system
  615. foreach($packages as $p) {
  616. $pkg = Loader::package($p);
  617. if (!empty($pkg)) {
  618. $packagesTemp[] = $pkg;
  619. }
  620. }
  621. $packages = $packagesTemp;
  622. }
  623. return $packages;
  624. }
  625. }