diff --git a/CRM/Utils/Migrate/Export.php b/CRM/Utils/Migrate/Export.php index e1f5105f56bafbdb106beed6539f6af71e589d7a..9045c95d89038d0017a8ed8e54ec6996101c3635 100644 --- a/CRM/Utils/Migrate/Export.php +++ b/CRM/Utils/Migrate/Export.php @@ -263,6 +263,59 @@ class CRM_Utils_Migrate_Export { $this->fetch('mappingField', 'CRM_Core_DAO_MappingField'); } + /** + * @param array $customGroupIds list of custom groups to export + * @return void + */ + function buildCustomGroups($customGroupIds) { + $customGroupIdsSql = implode(',', array_filter($customGroupIds, 'is_numeric')); + if (empty($customGroupIdsSql)) { + return; + } + + $sql = " + SELECT distinct(g.id), g.* + FROM civicrm_option_group g, + civicrm_custom_field f, + civicrm_custom_group cg + WHERE f.option_group_id = g.id + AND f.custom_group_id = cg.id + AND cg.id in ($customGroupIdsSql) + "; + $this->fetch('optionGroup', 'CRM_Core_DAO_OptionGroup', $sql); + + $sql = " + SELECT distinct(v.id), v.*, g.name as prefix + FROM civicrm_option_value v, + civicrm_option_group g, + civicrm_custom_field f, + civicrm_custom_group cg + WHERE v.option_group_id = g.id + AND f.option_group_id = g.id + AND f.custom_group_id = cg.id + AND cg.id in ($customGroupIdsSql) + "; + + $this->fetch('optionValue', 'CRM_Core_DAO_OptionValue', $sql); + + $sql = " + SELECT cg.* + FROM civicrm_custom_group cg + WHERE cg.id in ($customGroupIdsSql) + + "; + $this->fetch('customGroup', 'CRM_Core_DAO_CustomGroup', $sql); + + $sql = " + SELECT f.* + FROM civicrm_custom_field f, + civicrm_custom_group cg + WHERE f.custom_group_id = cg.id + AND cg.id in ($customGroupIdsSql) + "; + $this->fetch('customField', 'CRM_Core_DAO_CustomField', $sql); + } + /** * Render the in-memory representation as XML * @@ -296,7 +349,7 @@ class CRM_Utils_Migrate_Export { $result = array(); foreach (array_keys($this->_xml) as $key) { if (!empty($this->_xml[$key]['data'])) { - $result[ $this->_xml[$key]['name'] ] = $this->_xml[$key]['data']; + $result[ $this->_xml[$key]['name'] ] = array_values($this->_xml[$key]['data']); } } return $result; @@ -315,7 +368,7 @@ class CRM_Utils_Migrate_Export { } while ($dao->fetch()) { - $this->_xml[$groupName]['data'][] = $this->exportDAO($this->_xml[$groupName]['name'], $dao, $mappedFields); + $this->_xml[$groupName]['data'][$dao->id] = $this->exportDAO($this->_xml[$groupName]['name'], $dao, $mappedFields); if ($idNameFields) { // index the id/name fields so that we can translate from FK ids to FK names if (isset($idNameFields[2])) { diff --git a/CRM/Utils/Migrate/Import.php b/CRM/Utils/Migrate/Import.php index d2c312d65aac10310b0acbcd676b747a7013128c..b43c38a6d55efa39be72f86aea06582bfc72c9b3 100644 --- a/CRM/Utils/Migrate/Import.php +++ b/CRM/Utils/Migrate/Import.php @@ -36,13 +36,31 @@ class CRM_Utils_Migrate_Import { function __construct() { } + /** + * Import custom-data from an XML file + * + * @param string $file path to an XML file + * @throws CRM_Core_Exception + * @return void; + */ function run($file) { - // read xml file - $dom = DomDocument::load($file); + $dom = new DomDocument(); + if (! $dom->load($file)) { + throw new CRM_Core_Exception("Failed to parse XML file \"$file\""); + } $dom->xinclude(); $xml = simplexml_import_dom($dom); + return $this->runXmlElement($xml); + } + /** + * Import custom-data from an XML element + * + * @param SimpleXMLElement $xml + * @return void + */ + function runXmlElement($xml) { $idMap = array( 'custom_group' => array(), 'option_group' => array(),