CMS  Version 3.9
UpgradeManager Class Reference

Inherited by APIUpgradeManager, ActivityTrackerUpgradeManager, ArticleUpgradeManager, AttachmentUpgradeManager, AutoLoginUpgradeManager, BlogUpgradeManager, BookmarkUpgradeManager, CalendarUpgradeManager, ClassificationUpgradeManager, CommentUpgradeManager, ComponentUpgradeManager, ConnectableUpgradeManager, ContextHelpUpgradeManager, DataSyncUpgradeManager, DocumentUpgradeManager, EmailUpgradeManager, ErrorLogUpgradeManager, FileshareUpgradeManager, ForumUpgradeManager, GlossaryUpgradeManager, HtmlEditorUpgradeManager, ImageUpgradeManager, LinkLibraryUpgradeManager, LoginUpgradeManager, MenuUpgradeManager, ModuleUpgradeManager, OnlineHelpUpgradeManager, OpenDataUpgradeManager, PageUpgradeManager, ProcessUpgradeManager, QuestionnaireUpgradeManager, RatingUpgradeManager, RedirectUpgradeManager, ReportManagerUpgradeManager, RoleUpgradeManager, RssFeedUpgradeManager, ScheduledTaskUpgradeManager, ScrollUpgradeManager, SectionUpgradeManager, SessionPersistenceUpgradeManager, SettingsUpgradeManager, SharingUpgradeManager, SiteMapUpgradeManager, SiteUpgradeManager, SurveyUpgradeManager, SvgChartsUpgradeManager, TaxonomyUpgradeManager, TextLookupUpgradeManager, ToolHintsUpgradeManager, UserUpgradeManager, VersionedContentUpgradeManager, and VideoUpgradeManager.

Public Member Functions

 UpgradeManager ()
 
 upgrade ($upgrade_to="")
 
 upgradeOneVersion ($version_number, $function)
 
 executeVersionSql ($version_number)
 
 parseSQLStatements ($lines)
 
 executeSQLStatements ($sqlStatements)
 
 log ($text)
 
 executeVersionXML ($version)
 
 recordUpdate ($version, $description)
 
 saveLogFile ($version)
 
 addSectionContent ($items, $section_name="/", $role="", $template="", $permissions="")
 Utility function for use by calling classes to add an array of items of class Page, ComponentPage, Blog, ImageGallery, DocumentLibrary, Calendar to a section. More...
 
 addModuleToPages ($items, $module_name, $position='right', $sort_order=1)
 Given an array of either identifiers that must be either CMS Page or ComponentPage identifiers or items that are of obj CMSPage, Blog, Calendar, etc., link each to the specified module. More...
 
 searchByIdentifier ($identifier)
 
 addMenuItem ($item, $menu_identifier, $parent_identifier="", $title="", $section_name="", $sort_order=0)
 
 reformatPhone (&$item, $field)
 
 executeSQLFile ($sqlFile, $version_number)
 
 dependsOn ($component, $version)
 

Static Public Member Functions

static upgradeComponentToVersion ($component, $version)
 

Public Attributes

 $sqlFile
 
 $xmlDir
 
 $component_name
 
 $log
 

Detailed Description

Definition at line 191 of file upgrade_manager.inc.

Member Function Documentation

◆ addMenuItem()

UpgradeManager::addMenuItem (   $item,
  $menu_identifier,
  $parent_identifier = "",
  $title = "",
  $section_name = "",
  $sort_order = 0 
)

Definition at line 693 of file upgrade_manager.inc.

694  {
695  // Find the menu
696  $menus = Query::create(Menu, "WHERE identifier=:identifier")
697  ->bind(":identifier", $menu_identifier)
698  ->execute();
699 
700  if(count($menus) == 0)
701  return false;
702  else
703  $menu = $menus[0];
704 
705  if(!is_object($item))
706  {
707  $page = $this->searchByIdentifier($item);
708  if(!$page) return false;
709  }
710  else
711  $page = $item;
712 
713  $found = Query::create(MenuItem, "WHERE (identifier=:identifier OR url like '%{$page->identifier}') AND menu_id=:menu_id")
714  ->bind(":identifier", $page->identifier, ":menu_id", $menu->menu_id)
715  ->executeValue("COUNT(1)");
716 
717  if($found)
718  {
719  $this->log .= "Page identifier {$page->identifier} already linked to menu {$menu_identifier}\r\n";
720  return true;
721  }
722 
723  $parent_id = 0;
724 
725  if($parent_identifier)
726  {
727  $parents = Query::create(MenuItem, "WHERE identifier=:identifier")
728  ->bind(":identifier", $parent_identifier)
729  ->execute();
730 
731  if(count($parents) > 0)
732  $parent_id = $parents[0]->menu_item_id;
733  }
734 
735  if(!$sort_order)
736  {
737  $sort_order = (Query::create(MenuItem, "WHERE menu_id=:menu_id AND parent_id=:parent_id")
738  ->bind(":menu_id", $menu->menu_id, ":parent_id", $parent_id)
739  ->executeValue("MAX(sort_order)") + 1);
740  }
741 
742  if(!$section_name)
743  {
744  $sections = Query::create(SectionContent, "WHERE identifier=:identifier")
745  ->bind(":identifier", $page->identifier)
746  ->execute();
747 
748  if(count($sections) == 0)
749  {
750  trace("UpgradeManager error: page {$page->identifier} is not in section content", 3);
751  return false;
752  }
753 
754  $section_name = $sections[0]->Section()->section;
755  }
756 
757  $menuItem = new MenuItem();
758  $menuItem->title = ($title) ? $title : prettify($page->identifier);
759  $menuItem->menu_id = $menu->menu_id;
760  $menuItem->parent_id = $parent_id;
761  $menuItem->published = 1;
762  $menuItem->url = "/" . $section_name . "/" . $page->identifier;
763  $menuItem->role = $page->role;
764  $menuItem->identifier = $page->identifier;
765  $menuItem->sort_order = $sort_order;
766  $menuItem->page_id = 0;
767  $menuItem->save();
768 
769  $this->log .= $page->format("Adding menu item {identifier} to menu {$menu->name}\r\n");
770 
771  return true;
772  }
$page
Definition: help.inc:39
$menu
Definition: menu_form.inc:47
$menuItem
Definition: menus.inc:41
searchByIdentifier($identifier)

◆ addModuleToPages()

UpgradeManager::addModuleToPages (   $items,
  $module_name,
  $position = 'right',
  $sort_order = 1 
)

Given an array of either identifiers that must be either CMS Page or ComponentPage identifiers or items that are of obj CMSPage, Blog, Calendar, etc., link each to the specified module.

Definition at line 588 of file upgrade_manager.inc.

589  {
590  if($items && !is_array($items))
591  $items = array($items);
592 
593  if(count($items) == 0)
594  return true;
595 
596  $modules = Query::create(Module, "WHERE title=:title")
597  ->bind(":title", $module_name)
598  ->execute();
599 
600  if(count($modules) == 0)
601  return false;
602  else
603  $module = $modules[0];
604 
605  foreach($items as $item)
606  {
607  if(!is_object($item))
608  {
609  $page = $this->searchByIdentifier($item);
610  if(!$page) return false;
611  }
612  else
613  $page = $item;
614 
615  $xref_class = (preg_match("/component/i", (get_class($page)))) ? ComponentPageModuleXref : PageModuleXref;
616  $xref = new $xref_class();
617  $pk = $page->getPrimaryKey();
618 
619  $found = Query::create($xref_class, "WHERE $pk=:$pk AND module_id=:module_id")
620  ->bind(":$pk", $page->$pk, ":module_id", $module->module_id)
621  ->executeValue("COUNT(1)");
622 
623  if(!$found)
624  {
625  $xref->$pk = $page->$pk;
626  $xref->module_id = $module->module_id;
627  $xref->position = $position;
628  $xref->sort_order = $sort_order;
629  $xref->save();
630  $this->log .= $page->format("Adding $xref_class record for page {identifier} to module {$module->title}\r\n");
631  }
632  else
633  {
634  $this->log .= "Page identifier $identifier already linked to module {$module->title}\r\n";
635  }
636  }
637 
638  return true;
639  }
Defines the Module class.
Definition: module.inc:57
$xref_class

◆ addSectionContent()

UpgradeManager::addSectionContent (   $items,
  $section_name = "/",
  $role = "",
  $template = "",
  $permissions = "" 
)

Utility function for use by calling classes to add an array of items of class Page, ComponentPage, Blog, ImageGallery, DocumentLibrary, Calendar to a section.

@items can be any of the following: 1) array of CMS Page, Component Page, Blog, ImageGallery, DocumentLibrary, or Calendar DataItem objects 2) a single DataItem obj of any of the above types 3) array of CMS Page or Component page identifiers 4) a single CMS Page or Component Page identifier

Alternatively, $items can be an array of identifiers or a single identifier as long as the identifiers are a CMS Page or Component Page.

We find the section based on the section name, and query the existing content to avoid adding the identifier twice.

If the page is found, its role and template, are updated, if an update is provided.

Definition at line 514 of file upgrade_manager.inc.

515  {
516  if($items && !is_array($items))
517  $items = array($items);
518 
519  if(count($items) == 0)
520  {
521  trace("No items found to add to section", 2);
522  return true;
523  }
524 
525  $sections = Query::create(Section, "WHERE section=:section")
526  ->bind(":section", $section_name)
527  ->execute();
528 
529  if(count($sections) == 0)
530  {
531  trace("UpgradeManager::addSectionContent - section $section_name not found", 3);
532  return false;
533  }
534  else
535  $section = $sections[0];
536 
537  foreach($items as $item)
538  {
539  if (is_object($item))
540  {
541  $ident = $item->identifier;
542  }
543  else
544  {
545  $ident = $item;
546  }
547 
548  // should be only one or none
549  $contents = Query::create(SectionContent, "WHERE identifier=:identifier AND section_id=:section_id")
550  ->bind(":identifier", $ident, ":section_id", $section->section_id)
551  ->execute();
552 
553  $content = (count($contents) > 0) ? $contents[0] : null;
554 
555  if(!$content)
556  {
557  $content = new SectionContent();
558  $content->section_id = $section->section_id;
559  $content->identifier = $ident;
560  }
561  else
562  {
563  $content->filter = new InclusionFilter("template", "role");
564  }
565 
566  if($section->default_template != $template)
567  $content->template = $template;
568  if($section->default_role != $role)
569  $content->role = $role;
570  if ($section->default_permissions != $permissions)
571  $content->permissions = $permissions;
572 
573  $content->save();
574 
575  trace("Added $item to $section_name", 3);
576  }
577 
578  return true;
579  }
$section
Definition: event_form.inc:44
Section DataItem, defining the data model for sections within a site.
Definition: section.inc:45
$role
Definition: role_form.inc:41
if(array_key_exists("HTTP_IF_MODIFIED_SINCE", $_SERVER)) $content
Definition: styles.css.inc:24

◆ dependsOn()

UpgradeManager::dependsOn (   $component,
  $version 
)

Definition at line 860 of file upgrade_manager.inc.

861  {
863  }
$component
Definition: help.inc:38
static upgradeComponentToVersion($component, $version)

◆ executeSQLFile()

UpgradeManager::executeSQLFile (   $sqlFile,
  $version_number 
)

Definition at line 816 of file upgrade_manager.inc.

817  {
818  trace("** Upgrade {$this->component_name} to version $version_number by executing file {$sqlFile}", 3);
819 
820  if(!file_exists($sqlFile))
821  {
822  trace("UpgradeManager:: sql file does not exists {$sqlFile}", 2);
823  return;
824  }
825 
826  $fp = fopen($sqlFile, 'r');
827 
828  if(!$fp)
829  {
830  trace("Error: executeVersionSql failed to open file", 3);
831  return;
832  }
833 
834  $lines = array();
835  while(($buffer = fgets($fp)) !== false)
836  {
837  // Omit blank lines and comments
838  if(trim($buffer) == "" || preg_match("/^--(.*?)\s/", $buffer))
839  continue;
840  $lines[] = $buffer;
841  }
842 
843  if(count($lines) == 0)
844  {
845  trace("UpgradeManager:: no lines parsed in file {$sqlFile}", 3);
846  return true;
847  }
848 
849  $sqlStatements = $this->parseSQLStatements($lines);
850 
851  if(count($sqlStatements) == 0)
852  {
853  trace("UpgradeManager:: no query statements found in sql file {$sqlFile} for version $version_number", 3);
854  return true;
855  }
856 
857  return $this->executeSQLStatements($sqlStatements);
858  }
parseSQLStatements($lines)
executeSQLStatements($sqlStatements)

◆ executeSQLStatements()

UpgradeManager::executeSQLStatements (   $sqlStatements)

Definition at line 404 of file upgrade_manager.inc.

405  {
406  try
407  {
408  trace("Executing SQL Statements", 2);
409 
410  $db = ConnectionManager::getConnection();
411  $db->beginTransaction();
412 
413  foreach($sqlStatements as $sqlStatement)
414  {
415  trace($sqlStatement, 2);
416  $db->exec($sqlStatement);
417  }
418 
419  $db->commit();
420  fclose($fp);
421  }
422  catch(PDOException $e)
423  {
424  $db->rollBack();
425  fclose($fp);
426  throw $e;
427  }
428 
429  return true;
430  }
$db

◆ executeVersionSql()

UpgradeManager::executeVersionSql (   $version_number)

Definition at line 300 of file upgrade_manager.inc.

301  {
302  ComponentManager::scanTrace("** Upgrade {$this->component_name} to Version $version_number", 2);
303 
304  $lines = array();
305  if(!file_exists($this->sqlFile))
306  {
307  ComponentManager::scanTrace("UpgradeManager:: sql file does not exists {$this->sqlFile}", 2);
308  return;
309  }
310 
311  $fp = fopen($this->sqlFile, 'r');
312  $version_id = str_ireplace(".", "\\.", "version " . $version_number); // case insensitive
313  trace("UpgradeManager::version id: $version_id file $this->sqlFile", 3);
314 
315  if(!$fp)
316  {
317  ComponentManager::scanTrace("Error: executeVersionSql failed to open file", 2);
318  return;
319  }
320 
321  while (($buffer = fgets($fp)) !== false && !preg_match("/^--.*?\s+$version_id/i", $buffer))
322  continue;
323 
324  // Found start of this verson's update section in the sql file
325  if(preg_match("/^--\s*START\s*$version_id/i", $buffer))
326  {
327  while(($buffer = fgets($fp)) !== false && !preg_match("/^--\s*END\s*$version_id/i", $buffer))
328  {
329  $depends = array();
330  if (preg_match('/^--\s*Depends\s+On\s+([\w_]+)\s+(.*)/i', $buffer, $depends))
331  {
332  ComponentManager::scanTrace("{$this->component_name} $version_id is dependent on {$depends[1]} {$depends[2]}", 2);
333 
334  UpgradeManager::upgradeComponentToVersion($depends[1], trim($depends[2]));
335  }
336 
337  // Omit blank lines and comments
338  if(trim($buffer) == "" || preg_match("/^--(.*?)\s/", $buffer))
339  continue;
340  $lines[] = $buffer;
341  }
342 
343  trace("** Upgrade has ".count($lines)." lines", 3);
344  }
345 
346  $sqlStatements = $this->parseSQLStatements($lines);
347 
348  if(count($sqlStatements) == 0)
349  {
350  ComponentManager::scanTrace("UpgradeManager:: no query statements found for version $version_number", 3);
351  return true;
352  }
353 
354  try
355  {
356  $rtn = $this->executeSQLStatements($sqlStatements);
357  return rtn;
358  }
359  catch(Exception $e)
360  {
361  ComponentManager::scanTrace("Failed to upgrade {$this->component_name} to version $version_number - ". $e->getMessage(), 2);
362  throw new FakoliException("Failed to upgrade {$this->component_name} to version $version_number - ". $e->getMessage());
363  }
364  }
static scanTrace($message, $level)
FakoliException is the base exception class for all Fakoli errors.
Definition: core.inc:53

◆ executeVersionXML()

UpgradeManager::executeVersionXML (   $version)

Definition at line 440 of file upgrade_manager.inc.

441  {
442  global $config;
443 
444  ComponentManager::scanTrace("** Upgrade {$this->component_name} to Version $version_number", 3);
445 
446  if (preg_match("/\\b{$this->component_name}\\b/", $config["ignore_xml_updates"]))
447  {
448  ComponentManager::scanTrace("** Ignoring this upgrade as specified in config", 3);
449  return true;
450  }
451 
452  if (!is_dir($this->xmlDir))
453  {
454  throw new FakoliException("XML update directory does not exists for {$this->component_name}");
455  }
456 
457  $file = $this->xmlDir . DIRECTORY_SEPARATOR . $this->component_name ."_" . $version . ".xml";
458 
459  if (!file_exists($file))
460  {
461  throw new FakoliException("No XML update for version $version of $this->component_name");
462  }
463 
464  $xml = file_get_contents($file);
465  $mgr = new SerializationManager();
466  $mgr->importAll($xml);
467 
468  return true;
469  }
$file
Definition: delete.inc:47
SerializationManager handles import/export of DataItems via an XML file.
global $config
Definition: import.inc:4

◆ log()

UpgradeManager::log (   $text)

Definition at line 432 of file upgrade_manager.inc.

433  {
434  if(preg_match("/(<br>|<br\/>)$/i", $text))
435  $this->log .= preg_replace(array("/<br>$/i", "/<br\/>$/i"), "\r\n", $text);
436  else
437  $this->log .= $text . "\r\n";
438  }

◆ parseSQLStatements()

UpgradeManager::parseSQLStatements (   $lines)

Definition at line 370 of file upgrade_manager.inc.

371  {
372  if(count($lines) == 0)
373  return;
374 
375  $delimiter = ";";
376  foreach($lines as $line)
377  {
378  $d = array();
379 
380  ComponentManager::scanTrace("UpgradeManager:: processing update schema line $line", 4);
381  if (preg_match("/^\s*DELIMITER\s+(.*?)$/i", $line, $d))
382  {
383  $delimiter = preg_quote($d[1]);
384  //$sqlStatement .= $line."\n";
385  }
386  else
387  {
388  if(preg_match("/{$delimiter}\s*$/", $line))
389  {
390  $sqlStatement .= preg_replace("/{$delimiter}\s*$/", "", $line);
391  $sqlStatements[] = $sqlStatement;
392  $sqlStatement = "";
393  }
394  else
395  {
396  $sqlStatement .= $line;
397  }
398  }
399  }
400  trace(print_r($sqlStatements, true), 3);
401  return $sqlStatements;
402  }
if(!checkRole($library->allow_access) &&! $library->allowAccess()) if(!checkRole($document->allow_access)) $d
Definition: download.inc:66

◆ recordUpdate()

UpgradeManager::recordUpdate (   $version,
  $description 
)

Definition at line 471 of file upgrade_manager.inc.

472  {
473  if($this->log)
474  $fileName = $this->saveLogFile($version);
475  ComponentUpdateLog::recordUpdate($this->component_name, $version, $description, $fileName);
476  }
static recordUpdate($component, $version_number, $description="", $fileName)
saveLogFile($version)

◆ reformatPhone()

UpgradeManager::reformatPhone ( $item,
  $field 
)

Definition at line 782 of file upgrade_manager.inc.

783  {
784  $oldPhone = $item->$field;
785  if(!$oldPhone)
786  return;
787 
788  // remove the 1 before 800 or 888
789  $phone = preg_replace("/^1-/","", $oldPhone);
790  // remove all nondigits
791  $phone = preg_replace("/\D/","", $phone);
792 
793  if($phone != $oldPhone)
794  {
795  $item->$field = $phone;
796  $table = $item->table;
797  $pk = $item->getPrimaryKey();
798  $this->log($item->format("Setting {$item->table} {$pk} $field from {$oldPhone} to {$phone}"));
799  $item->filter = new InclusionFilter($field);
800  $item->save();
801  }
802  }

◆ saveLogFile()

UpgradeManager::saveLogFile (   $version)

Definition at line 478 of file upgrade_manager.inc.

479  {
480  $upgradePath = Settings::getValue("component", "upgrade_output_path");
481 
482  $fileName = $this->component_name . "_" . $version . ".txt";
483  $fp = fopen($upgradePath . DIRECTORY_SEPARATOR . $fileName, 'w');
484  fwrite($fp, $this->log);
485  fclose($fp);
486  return $fileName;
487  }
static getValue($component, $name)
Retrieve the value of the specified Setting.
Definition: settings.inc:104

◆ searchByIdentifier()

UpgradeManager::searchByIdentifier (   $identifier)

Definition at line 645 of file upgrade_manager.inc.

646  {
647  $pages = Query::create(Page, "WHERE identifier=:identifier")
648  ->bind(":identifier", $identifier)
649  ->execute();
650 
651  if(count($pages) == 0)
652  {
653  $pages = Query::create(ComponentPage, "WHERE identifier=:identifier")
654  ->bind(":identifier", $identifier)
655  ->execute();
656  }
657 
658  if(count($pages) == 0)
659  {
660  $this->log .= "Page identifier $identifier not found in Page or ComponentPage tables\r\n";
661  }
662 
663  return (count($pages) > 0) ? $pages[0] : null;
664  }
Definition: page.inc:43
$pages
Definition: export.inc:38
$identifier
Definition: rss.inc:37

◆ upgrade()

UpgradeManager::upgrade (   $upgrade_to = "")

Definition at line 226 of file upgrade_manager.inc.

227  {
228  if ($upgrade_to)
229  {
230  ComponentManager::scanTrace("Upgrading {$this->component_name} to version $upgrade_to", 2);
231  }
232 
233  $latest_version = ComponentUpdateLog::getLatestVersion($this->component_name);
234  ComponentManager::scanTrace("UpgradeManager:: upgrade: latest version in db for component {$this->component_name} is $latest_version", 3);
235 
236  if(count($this->updateMap) > 0)
237  {
238  foreach($this->updateMap as $version_number => $handler)
239  {
240  // remove any contents from a previous upgraded version
241  $this->log = "";
242  if($latest_version < $version_number)
243  {
244  list($function, $description) = explode(":", $handler);
245  if($this->upgradeOneVersion($version_number, $function))
246  $this->recordUpdate($version_number, $description);
247  else
248  break;
249  }
250 
251  if ($upgrade_to != "" && $upgrade_to == $version_number) break;
252  }
253  }
254 
255  // Save the latest version number to the version
256  // field of the component record
257  ComponentManager::setComponentVersion($this->component_name);
258  }
$handler
Definition: event_form.inc:62
static setComponentVersion($component_name)
static getLatestVersion($component)
recordUpdate($version, $description)
upgradeOneVersion($version_number, $function)

◆ upgradeComponentToVersion()

static UpgradeManager::upgradeComponentToVersion (   $component,
  $version 
)
static

Definition at line 865 of file upgrade_manager.inc.

866  {
867  trace("Firing upgrade event to $component, target version $version", 3);
868  ComponentManager::fireEventTo("upgradeComponent", $component, $version);
869  }
static fireEventTo($event, $component, $parameter=null)
Fire an event to the specificed component.

◆ UpgradeManager()

UpgradeManager::UpgradeManager ( )

Definition at line 204 of file upgrade_manager.inc.

205  {
206  global $config;
207 
208  $path = ComponentManager::findComponentPath($this->component_name);
209  $this->sqlFile = $path . DIRECTORY_SEPARATOR . $this->component_name . "_schema.sql";
210  $this->xmlDir = $path . DIRECTORY_SEPARATOR . "updates";
211  }
if(! $page) $path
Definition: page.inc:57
static findComponentPath($name)
Locate the component path for the named component using the standard precedence rules.

◆ upgradeOneVersion()

UpgradeManager::upgradeOneVersion (   $version_number,
  $function 
)

Definition at line 271 of file upgrade_manager.inc.

272  {
273  if($function == "sql")
274  return $this->executeVersionSql($version_number);
275  else if ($function == "xml")
276  return $this->executeVersionXML($version_number);
277  elseif($function != "done")
278  {
279  $updater = array($this, $function);
280  return call_user_func($updater, $version_number);
281  }
282  else // sql update done in local copy
283  return true;
284  }
executeVersionSql($version_number)
executeVersionXML($version)

Member Data Documentation

◆ $component_name

UpgradeManager::$component_name

Definition at line 195 of file upgrade_manager.inc.

◆ $log

UpgradeManager::$log

Definition at line 196 of file upgrade_manager.inc.

◆ $sqlFile

UpgradeManager::$sqlFile

Definition at line 193 of file upgrade_manager.inc.

◆ $xmlDir

UpgradeManager::$xmlDir

Definition at line 194 of file upgrade_manager.inc.


The documentation for this class was generated from the following file: