diff --git a/CRM/TwingleCampaign/Upgrader.php b/CRM/TwingleCampaign/Upgrader.php index 10d1e1f..f103551 100644 --- a/CRM/TwingleCampaign/Upgrader.php +++ b/CRM/TwingleCampaign/Upgrader.php @@ -11,7 +11,7 @@ use CRM_TwingleCampaign_ExtensionUtil as E; /** * Collection of upgrade steps. */ -class CRM_TwingleCampaign_Upgrader extends CRM_Extension_Upgrader_Base { +class CRM_TwingleCampaign_Upgrader extends CRM_TwingleCampaign_Upgrader_Base { /** * This update function checks whether all custom fields defined in diff --git a/CRM/TwingleCampaign/Upgrader/Base.php b/CRM/TwingleCampaign/Upgrader/Base.php new file mode 100644 index 0000000..c5e6ef0 --- /dev/null +++ b/CRM/TwingleCampaign/Upgrader/Base.php @@ -0,0 +1,376 @@ +ctx = array_shift($args); + $instance->queue = $instance->ctx->queue; + $method = array_shift($args); + return call_user_func_array(array($instance, $method), $args); + } + + public function __construct($extensionName, $extensionDir) { + $this->extensionName = $extensionName; + $this->extensionDir = $extensionDir; + } + + // ******** Task helpers ******** + + /** + * Run a CustomData file. + * + * @param string $relativePath the CustomData XML file path (relative to this extension's dir) + * @return bool + */ + public function executeCustomDataFile($relativePath) { + $xml_file = $this->extensionDir . '/' . $relativePath; + return $this->executeCustomDataFileByAbsPath($xml_file); + } + + /** + * Run a CustomData file + * + * @param string $xml_file the CustomData XML file path (absolute path) + * + * @return bool + */ + protected static function executeCustomDataFileByAbsPath($xml_file) { + $import = new CRM_Utils_Migrate_Import(); + $import->run($xml_file); + return TRUE; + } + + /** + * Run a SQL file. + * + * @param string $relativePath the SQL file path (relative to this extension's dir) + * + * @return bool + */ + public function executeSqlFile($relativePath) { + CRM_Utils_File::sourceSQLFile( + CIVICRM_DSN, + $this->extensionDir . DIRECTORY_SEPARATOR . $relativePath + ); + return TRUE; + } + + /** + * @param string $tplFile + * The SQL file path (relative to this extension's dir). + * Ex: "sql/mydata.mysql.tpl". + * @return bool + */ + public function executeSqlTemplate($tplFile) { + // Assign multilingual variable to Smarty. + $upgrade = new CRM_Upgrade_Form(); + + $tplFile = CRM_Utils_File::isAbsolute($tplFile) ? $tplFile : $this->extensionDir . DIRECTORY_SEPARATOR . $tplFile; + $smarty = CRM_Core_Smarty::singleton(); + $smarty->assign('domainID', CRM_Core_Config::domainID()); + CRM_Utils_File::sourceSQLFile( + CIVICRM_DSN, $smarty->fetch($tplFile), NULL, TRUE + ); + return TRUE; + } + + /** + * Run one SQL query. + * + * This is just a wrapper for CRM_Core_DAO::executeSql, but it + * provides syntatic sugar for queueing several tasks that + * run different queries + */ + public function executeSql($query, $params = array()) { + // FIXME verify that we raise an exception on error + CRM_Core_DAO::executeQuery($query, $params); + return TRUE; + } + + /** + * Syntatic sugar for enqueuing a task which calls a function in this class. + * + * The task is weighted so that it is processed + * as part of the currently-pending revision. + * + * After passing the $funcName, you can also pass parameters that will go to + * the function. Note that all params must be serializable. + */ + public function addTask($title) { + $args = func_get_args(); + $title = array_shift($args); + $task = new CRM_Queue_Task( + array(get_class($this), '_queueAdapter'), + $args, + $title + ); + return $this->queue->createItem($task, array('weight' => -1)); + } + + // ******** Revision-tracking helpers ******** + + /** + * Determine if there are any pending revisions. + * + * @return bool + */ + public function hasPendingRevisions() { + $revisions = $this->getRevisions(); + $currentRevision = $this->getCurrentRevision(); + + if (empty($revisions)) { + return FALSE; + } + if (empty($currentRevision)) { + return TRUE; + } + + return ($currentRevision < max($revisions)); + } + + /** + * Add any pending revisions to the queue. + */ + public function enqueuePendingRevisions(CRM_Queue_Queue $queue) { + $this->queue = $queue; + + $currentRevision = $this->getCurrentRevision(); + foreach ($this->getRevisions() as $revision) { + if ($revision > $currentRevision) { + $title = ts('Upgrade %1 to revision %2', array( + 1 => $this->extensionName, + 2 => $revision, + )); + + // note: don't use addTask() because it sets weight=-1 + + $task = new CRM_Queue_Task( + array(get_class($this), '_queueAdapter'), + array('upgrade_' . $revision), + $title + ); + $this->queue->createItem($task); + + $task = new CRM_Queue_Task( + array(get_class($this), '_queueAdapter'), + array('setCurrentRevision', $revision), + $title + ); + $this->queue->createItem($task); + } + } + } + + /** + * Get a list of revisions. + * + * @return array(revisionNumbers) sorted numerically + */ + public function getRevisions() { + if (!is_array($this->revisions)) { + $this->revisions = array(); + + $clazz = new ReflectionClass(get_class($this)); + $methods = $clazz->getMethods(); + foreach ($methods as $method) { + if (preg_match('/^upgrade_(.*)/', $method->name, $matches)) { + $this->revisions[] = $matches[1]; + } + } + sort($this->revisions, SORT_NUMERIC); + } + + return $this->revisions; + } + + public function getCurrentRevision() { + $revision = CRM_Core_BAO_Extension::getSchemaVersion($this->extensionName); + if (!$revision) { + $revision = $this->getCurrentRevisionDeprecated(); + } + return $revision; + } + + private function getCurrentRevisionDeprecated() { + $key = $this->extensionName . ':version'; + if ($revision = CRM_Core_BAO_Setting::getItem('Extension', $key)) { + $this->revisionStorageIsDeprecated = TRUE; + } + return $revision; + } + + public function setCurrentRevision($revision) { + CRM_Core_BAO_Extension::setSchemaVersion($this->extensionName, $revision); + // clean up legacy schema version store (CRM-19252) + $this->deleteDeprecatedRevision(); + return TRUE; + } + + private function deleteDeprecatedRevision() { + if ($this->revisionStorageIsDeprecated) { + $setting = new CRM_Core_BAO_Setting(); + $setting->name = $this->extensionName . ':version'; + $setting->delete(); + CRM_Core_Error::debug_log_message("Migrated extension schema revision ID for {$this->extensionName} from civicrm_setting (deprecated) to civicrm_extension.\n"); + } + } + + // ******** Hook delegates ******** + + /** + * @see https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_install + */ + public function onInstall() { + $files = glob($this->extensionDir . '/sql/*_install.sql'); + if (is_array($files)) { + foreach ($files as $file) { + CRM_Utils_File::sourceSQLFile(CIVICRM_DSN, $file); + } + } + $files = glob($this->extensionDir . '/sql/*_install.mysql.tpl'); + if (is_array($files)) { + foreach ($files as $file) { + $this->executeSqlTemplate($file); + } + } + $files = glob($this->extensionDir . '/xml/*_install.xml'); + if (is_array($files)) { + foreach ($files as $file) { + $this->executeCustomDataFileByAbsPath($file); + } + } + if (is_callable(array($this, 'install'))) { + $this->install(); + } + } + + /** + * @see https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_postInstall + */ + public function onPostInstall() { + $revisions = $this->getRevisions(); + if (!empty($revisions)) { + $this->setCurrentRevision(max($revisions)); + } + if (is_callable(array($this, 'postInstall'))) { + $this->postInstall(); + } + } + + /** + * @see https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_uninstall + */ + public function onUninstall() { + $files = glob($this->extensionDir . '/sql/*_uninstall.mysql.tpl'); + if (is_array($files)) { + foreach ($files as $file) { + $this->executeSqlTemplate($file); + } + } + if (is_callable(array($this, 'uninstall'))) { + $this->uninstall(); + } + $files = glob($this->extensionDir . '/sql/*_uninstall.sql'); + if (is_array($files)) { + foreach ($files as $file) { + CRM_Utils_File::sourceSQLFile(CIVICRM_DSN, $file); + } + } + } + + /** + * @see https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_enable + */ + public function onEnable() { + // stub for possible future use + if (is_callable(array($this, 'enable'))) { + $this->enable(); + } + } + + /** + * @see https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_disable + */ + public function onDisable() { + // stub for possible future use + if (is_callable(array($this, 'disable'))) { + $this->disable(); + } + } + + public function onUpgrade($op, CRM_Queue_Queue $queue = NULL) { + switch ($op) { + case 'check': + return array($this->hasPendingRevisions()); + + case 'enqueue': + return $this->enqueuePendingRevisions($queue); + + default: + } + } + +} diff --git a/info.xml b/info.xml index c94db40..7971b85 100644 --- a/info.xml +++ b/info.xml @@ -5,36 +5,30 @@ Manage Twingle projects and events as campaigns in CiviCRM AGPL-3.0 - Marc Koch - marc.koch@propeace.de + Marc Michalsky + michalsky@forumzfd.de - https://lab.civicrm.org/Marc_Koch/de-forumzfd-twinglecampaign - https://lab.civicrm.org/Marc_Koch/de-forumzfd-twinglecampaign - https://lab.civicrm.org/Marc_Koch/de-forumzfd-twinglecampaign/-/issues + https://lab.civicrm.org/Marc_Michalsky/de-forumzfd-twinglecampaign + https://lab.civicrm.org/Marc_Michalsky/de-forumzfd-twinglecampaign + https://lab.civicrm.org/Marc_Michalsky/de-forumzfd-twinglecampaign/-/issues http://www.gnu.org/licenses/agpl-3.0.html 2024-06-15 - 1.1.0-beta - beta + 1.0.8 + stable 5.74 de.systopia.xcm + de.systopia.campaign de.systopia.twingle - CRM/TwingleCampaign - 24.09.1 - - menu-xml@1.0.0 - smarty@1.0.3 - - CRM_TwingleCampaign_Upgrader diff --git a/mixin/lib/civimix-schema@5.78.beta1.phar b/mixin/lib/civimix-schema@5.78.beta1.phar deleted file mode 100644 index 079ec36..0000000 Binary files a/mixin/lib/civimix-schema@5.78.beta1.phar and /dev/null differ diff --git a/phpunit.xml.dist b/phpunit.xml.dist index c983bb5..af5fa8c 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,5 +1,5 @@ - + ./tests/phpunit diff --git a/twinglecampaign.civix.php b/twinglecampaign.civix.php index 31e9480..575f31e 100644 --- a/twinglecampaign.civix.php +++ b/twinglecampaign.civix.php @@ -24,7 +24,7 @@ class CRM_TwingleCampaign_ExtensionUtil { * Translated text. * @see ts */ - public static function ts($text, $params = []): string { + public static function ts($text, $params = []) { if (!array_key_exists('domain', $params)) { $params['domain'] = [self::LONG_NAME, NULL]; } @@ -41,7 +41,7 @@ class CRM_TwingleCampaign_ExtensionUtil { * Ex: 'http://example.org/sites/default/ext/org.example.foo'. * Ex: 'http://example.org/sites/default/ext/org.example.foo/css/foo.css'. */ - public static function url($file = NULL): string { + public static function url($file = NULL) { if ($file === NULL) { return rtrim(CRM_Core_Resources::singleton()->getUrl(self::LONG_NAME), '/'); } @@ -75,62 +75,49 @@ class CRM_TwingleCampaign_ExtensionUtil { return self::CLASS_PREFIX . '_' . str_replace('\\', '_', $suffix); } - /** - * @return \CiviMix\Schema\SchemaHelperInterface - */ - public static function schema() { - if (!isset($GLOBALS['CiviMixSchema'])) { - pathload()->loadPackage('civimix-schema@5', TRUE); - } - return $GLOBALS['CiviMixSchema']->getHelper(static::LONG_NAME); - } - } use CRM_TwingleCampaign_ExtensionUtil as E; -pathload()->addSearchDir(__DIR__ . '/mixin/lib'); -spl_autoload_register('_twinglecampaign_civix_class_loader', TRUE, TRUE); - -function _twinglecampaign_civix_class_loader($class) { - if ($class === 'CRM_TwingleCampaign_DAO_Base') { - if (version_compare(CRM_Utils_System::version(), '5.74.beta', '>=')) { - class_alias('CRM_Core_DAO_Base', 'CRM_TwingleCampaign_DAO_Base'); - // ^^ Materialize concrete names -- encourage IDE's to pick up on this association. - } - else { - $realClass = 'CiviMix\\Schema\\Twinglecampaign\\DAO'; - class_alias($realClass, $class); - // ^^ Abstract names -- discourage IDE's from picking up on this association. - } - return; - } - - // This allows us to tap-in to the installation process (without incurring real file-reads on typical requests). - if (strpos($class, 'CiviMix\\Schema\\Twinglecampaign\\') === 0) { - // civimix-schema@5 is designed for backported use in download/activation workflows, - // where new revisions may become dynamically available. - pathload()->loadPackage('civimix-schema@5', TRUE); - CiviMix\Schema\loadClass($class); - } -} - /** * (Delegated) Implements hook_civicrm_config(). * * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_config */ -function _twinglecampaign_civix_civicrm_config($config = NULL) { +function _twinglecampaign_civix_civicrm_config(&$config = NULL) { static $configured = FALSE; if ($configured) { return; } $configured = TRUE; - $extRoot = __DIR__ . DIRECTORY_SEPARATOR; + $template =& CRM_Core_Smarty::singleton(); + + $extRoot = dirname(__FILE__) . DIRECTORY_SEPARATOR; + $extDir = $extRoot . 'templates'; + + if (is_array($template->template_dir)) { + array_unshift($template->template_dir, $extDir); + } + else { + $template->template_dir = [$extDir, $template->template_dir]; + } + $include_path = $extRoot . PATH_SEPARATOR . get_include_path(); set_include_path($include_path); - // Based on , this does not currently require mixin/polyfill.php. +} + +/** + * (Delegated) Implements hook_civicrm_xmlMenu(). + * + * @param $files array(string) + * + * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_xmlMenu + */ +function _twinglecampaign_civix_civicrm_xmlMenu(&$files) { + foreach (_twinglecampaign_civix_glob(__DIR__ . '/xml/Menu/*.xml') as $file) { + $files[] = $file; + } } /** @@ -140,7 +127,35 @@ function _twinglecampaign_civix_civicrm_config($config = NULL) { */ function _twinglecampaign_civix_civicrm_install() { _twinglecampaign_civix_civicrm_config(); - // Based on , this does not currently require mixin/polyfill.php. + if ($upgrader = _twinglecampaign_civix_upgrader()) { + $upgrader->onInstall(); + } +} + +/** + * Implements hook_civicrm_postInstall(). + * + * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_postInstall + */ +function _twinglecampaign_civix_civicrm_postInstall() { + _twinglecampaign_civix_civicrm_config(); + if ($upgrader = _twinglecampaign_civix_upgrader()) { + if (is_callable([$upgrader, 'onPostInstall'])) { + $upgrader->onPostInstall(); + } + } +} + +/** + * Implements hook_civicrm_uninstall(). + * + * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_uninstall + */ +function _twinglecampaign_civix_civicrm_uninstall() { + _twinglecampaign_civix_civicrm_config(); + if ($upgrader = _twinglecampaign_civix_upgrader()) { + $upgrader->onUninstall(); + } } /** @@ -148,9 +163,188 @@ function _twinglecampaign_civix_civicrm_install() { * * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_enable */ -function _twinglecampaign_civix_civicrm_enable(): void { +function _twinglecampaign_civix_civicrm_enable() { _twinglecampaign_civix_civicrm_config(); - // Based on , this does not currently require mixin/polyfill.php. + if ($upgrader = _twinglecampaign_civix_upgrader()) { + if (is_callable([$upgrader, 'onEnable'])) { + $upgrader->onEnable(); + } + } +} + +/** + * (Delegated) Implements hook_civicrm_disable(). + * + * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_disable + * @return mixed + */ +function _twinglecampaign_civix_civicrm_disable() { + _twinglecampaign_civix_civicrm_config(); + if ($upgrader = _twinglecampaign_civix_upgrader()) { + if (is_callable([$upgrader, 'onDisable'])) { + $upgrader->onDisable(); + } + } +} + +/** + * (Delegated) Implements hook_civicrm_upgrade(). + * + * @param $op string, the type of operation being performed; 'check' or 'enqueue' + * @param $queue CRM_Queue_Queue, (for 'enqueue') the modifiable list of pending up upgrade tasks + * + * @return mixed + * based on op. for 'check', returns array(boolean) (TRUE if upgrades are pending) + * for 'enqueue', returns void + * + * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_upgrade + */ +function _twinglecampaign_civix_civicrm_upgrade($op, CRM_Queue_Queue $queue = NULL) { + if ($upgrader = _twinglecampaign_civix_upgrader()) { + return $upgrader->onUpgrade($op, $queue); + } +} + +/** + * @return CRM_TwingleCampaign_Upgrader + */ +function _twinglecampaign_civix_upgrader() { + if (!file_exists(__DIR__ . '/CRM/TwingleCampaign/Upgrader.php')) { + return NULL; + } + else { + return CRM_TwingleCampaign_Upgrader_Base::instance(); + } +} + +/** + * Search directory tree for files which match a glob pattern. + * + * Note: Dot-directories (like "..", ".git", or ".svn") will be ignored. + * Note: Delegate to CRM_Utils_File::findFiles(), this function kept only + * for backward compatibility of extension code that uses it. + * + * @param string $dir base dir + * @param string $pattern , glob pattern, eg "*.txt" + * + * @return array + */ +function _twinglecampaign_civix_find_files($dir, $pattern) { + return CRM_Utils_File::findFiles($dir, $pattern); +} + +/** + * (Delegated) Implements hook_civicrm_managed(). + * + * Find any *.mgd.php files, merge their content, and return. + * + * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_managed + */ +function _twinglecampaign_civix_civicrm_managed(&$entities) { + $mgdFiles = _twinglecampaign_civix_find_files(__DIR__, '*.mgd.php'); + sort($mgdFiles); + foreach ($mgdFiles as $file) { + $es = include $file; + foreach ($es as $e) { + if (empty($e['module'])) { + $e['module'] = E::LONG_NAME; + } + if (empty($e['params']['version'])) { + $e['params']['version'] = '3'; + } + $entities[] = $e; + } + } +} + +/** + * (Delegated) Implements hook_civicrm_caseTypes(). + * + * Find any and return any files matching "xml/case/*.xml" + * + * Note: This hook only runs in CiviCRM 4.4+. + * + * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_caseTypes + */ +function _twinglecampaign_civix_civicrm_caseTypes(&$caseTypes) { + if (!is_dir(__DIR__ . '/xml/case')) { + return; + } + + foreach (_twinglecampaign_civix_glob(__DIR__ . '/xml/case/*.xml') as $file) { + $name = preg_replace('/\.xml$/', '', basename($file)); + if ($name != CRM_Case_XMLProcessor::mungeCaseType($name)) { + $errorMessage = sprintf("Case-type file name is malformed (%s vs %s)", $name, CRM_Case_XMLProcessor::mungeCaseType($name)); + throw new CRM_Core_Exception($errorMessage); + } + $caseTypes[$name] = [ + 'module' => E::LONG_NAME, + 'name' => $name, + 'file' => $file, + ]; + } +} + +/** + * (Delegated) Implements hook_civicrm_angularModules(). + * + * Find any and return any files matching "ang/*.ang.php" + * + * Note: This hook only runs in CiviCRM 4.5+. + * + * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_angularModules + */ +function _twinglecampaign_civix_civicrm_angularModules(&$angularModules) { + if (!is_dir(__DIR__ . '/ang')) { + return; + } + + $files = _twinglecampaign_civix_glob(__DIR__ . '/ang/*.ang.php'); + foreach ($files as $file) { + $name = preg_replace(':\.ang\.php$:', '', basename($file)); + $module = include $file; + if (empty($module['ext'])) { + $module['ext'] = E::LONG_NAME; + } + $angularModules[$name] = $module; + } +} + +/** + * (Delegated) Implements hook_civicrm_themes(). + * + * Find any and return any files matching "*.theme.php" + */ +function _twinglecampaign_civix_civicrm_themes(&$themes) { + $files = _twinglecampaign_civix_glob(__DIR__ . '/*.theme.php'); + foreach ($files as $file) { + $themeMeta = include $file; + if (empty($themeMeta['name'])) { + $themeMeta['name'] = preg_replace(':\.theme\.php$:', '', basename($file)); + } + if (empty($themeMeta['ext'])) { + $themeMeta['ext'] = E::LONG_NAME; + } + $themes[$themeMeta['name']] = $themeMeta; + } +} + +/** + * Glob wrapper which is guaranteed to return an array. + * + * The documentation for glob() says, "On some systems it is impossible to + * distinguish between empty match and an error." Anecdotally, the return + * result for an empty match is sometimes array() and sometimes FALSE. + * This wrapper provides consistency. + * + * @link http://php.net/glob + * @param string $pattern + * + * @return array + */ +function _twinglecampaign_civix_glob($pattern) { + $result = glob($pattern); + return is_array($result) ? $result : []; } /** @@ -169,8 +363,8 @@ function _twinglecampaign_civix_insert_navigation_menu(&$menu, $path, $item) { if (empty($path)) { $menu[] = [ 'attributes' => array_merge([ - 'label' => $item['name'] ?? NULL, - 'active' => 1, + 'label' => CRM_Utils_Array::value('name', $item), + 'active' => 1, ], $item), ]; return TRUE; @@ -234,3 +428,26 @@ function _twinglecampaign_civix_fixNavigationMenuItems(&$nodes, &$maxNavID, $par } } } + +/** + * (Delegated) Implements hook_civicrm_alterSettingsFolders(). + * + * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_alterSettingsFolders + */ +function _twinglecampaign_civix_civicrm_alterSettingsFolders(&$metaDataFolders = NULL) { + $settingsDir = __DIR__ . DIRECTORY_SEPARATOR . 'settings'; + if (!in_array($settingsDir, $metaDataFolders) && is_dir($settingsDir)) { + $metaDataFolders[] = $settingsDir; + } +} + +/** + * (Delegated) Implements hook_civicrm_entityTypes(). + * + * Find any *.entityType.php files, merge their content, and return. + * + * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_entityTypes + */ +function _twinglecampaign_civix_civicrm_entityTypes(&$entityTypes) { + $entityTypes = array_merge($entityTypes, []); +} diff --git a/twinglecampaign.php b/twinglecampaign.php index 282f7cb..04ff8ca 100644 --- a/twinglecampaign.php +++ b/twinglecampaign.php @@ -422,6 +422,7 @@ function _validateAndSendInput($id, $campaign_type_id): bool { return TRUE; } + ///** // * ## Implements hook_civicrm_post(). // * @@ -457,7 +458,14 @@ function _validateAndSendInput($id, $campaign_type_id): bool { // } //} - +/** + * Implements hook_civicrm_xmlMenu(). + * + * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_xmlMenu + */ +function twinglecampaign_civicrm_xmlMenu(&$files) { + _twinglecampaign_civix_civicrm_xmlMenu($files); +} /** * Implements hook_civicrm_install(). @@ -468,6 +476,24 @@ function twinglecampaign_civicrm_install() { _twinglecampaign_civix_civicrm_install(); } +/** + * Implements hook_civicrm_postInstall(). + * + * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_postInstall + */ +function twinglecampaign_civicrm_postInstall() { + _twinglecampaign_civix_civicrm_postInstall(); +} + +/** + * Implements hook_civicrm_uninstall(). + * + * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_uninstall + */ +function twinglecampaign_civicrm_uninstall() { + _twinglecampaign_civix_civicrm_uninstall(); +} + /** * Implements hook_civicrm_enable(). * @@ -477,6 +503,90 @@ function twinglecampaign_civicrm_enable() { _twinglecampaign_civix_civicrm_enable(); } +/** + * Implements hook_civicrm_disable(). + * + * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_disable + */ +function twinglecampaign_civicrm_disable() { + _twinglecampaign_civix_civicrm_disable(); +} + +/** + * Implements hook_civicrm_upgrade(). + * + * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_upgrade + */ +function twinglecampaign_civicrm_upgrade($op, CRM_Queue_Queue $queue = NULL) { + return _twinglecampaign_civix_civicrm_upgrade($op, $queue); +} + +/** + * Implements hook_civicrm_managed(). + * + * Generate a list of entities to create/deactivate/delete when this module + * is installed, disabled, uninstalled. + * + * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_managed + */ +function twinglecampaign_civicrm_managed(&$entities) { + _twinglecampaign_civix_civicrm_managed($entities); +} + +/** + * Implements hook_civicrm_caseTypes(). + * + * Generate a list of case-types. + * + * Note: This hook only runs in CiviCRM 4.4+. + * + * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_caseTypes + */ +function twinglecampaign_civicrm_caseTypes(&$caseTypes) { + _twinglecampaign_civix_civicrm_caseTypes($caseTypes); +} + +/** + * Implements hook_civicrm_angularModules(). + * + * Generate a list of Angular modules. + * + * Note: This hook only runs in CiviCRM 4.5+. It may + * use features only available in v4.6+. + * + * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_angularModules + */ +function twinglecampaign_civicrm_angularModules(&$angularModules) { + _twinglecampaign_civix_civicrm_angularModules($angularModules); +} + +/** + * Implements hook_civicrm_alterSettingsFolders(). + * + * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_alterSettingsFolders + */ +function twinglecampaign_civicrm_alterSettingsFolders(&$metaDataFolders = NULL) { + _twinglecampaign_civix_civicrm_alterSettingsFolders($metaDataFolders); +} + +/** + * Implements hook_civicrm_entityTypes(). + * + * Declare entity types provided by this module. + * + * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_entityTypes + */ +function twinglecampaign_civicrm_entityTypes(&$entityTypes) { + _twinglecampaign_civix_civicrm_entityTypes($entityTypes); +} + +/** + * Implements hook_civicrm_thems(). + */ +function twinglecampaign_civicrm_themes(&$themes) { + _twinglecampaign_civix_civicrm_themes($themes); +} + // --- Functions below this ship commented out. Uncomment as required. --- /**