diff --git a/CRM/Case/BAO/CaseType.php b/CRM/Case/BAO/CaseType.php
index 9937c5627257..e10c70da07e0 100644
--- a/CRM/Case/BAO/CaseType.php
+++ b/CRM/Case/BAO/CaseType.php
@@ -96,50 +96,87 @@ protected function assignTestValue($fieldName, &$fieldDef, $counter) {
* XML
*/
public static function convertDefinitionToXML($name, $definition) {
- $xmlFile = '' . "\n\n\n";
- $xmlFile .= "" . self::encodeXmlString($name) . "\n";
+
+ $xw = new XMLWriter();
+ $xw->openMemory();
+ $xw->setIndent(TRUE);
+ $xw->setIndentString(' ');
+ $xw->startDocument("1.0", 'UTF-8');
+
+ $xw->startElement('CaseType');
+
+ $xw->startElement('name');
+ $xw->text($name);
+ $xw->fullEndElement();
if (array_key_exists('forkable', $definition)) {
- $xmlFile .= "" . ((int) $definition['forkable']) . "\n";
+ $xw->startElement('forkable');
+ $xw->text((int) $definition['forkable']);
+ $xw->fullEndElement();
}
if (isset($definition['activityTypes'])) {
- $xmlFile .= "\n";
+ $xw->startElement('ActivityTypes');
+
foreach ($definition['activityTypes'] as $values) {
- $xmlFile .= "\n";
+ $xw->startElement('ActivityType');
foreach ($values as $key => $value) {
- $xmlFile .= "<{$key}>" . self::encodeXmlString($value) . "{$key}>\n";
+ $xw->startElement($key);
+ $xw->text($value);
+ $xw->fullEndElement();
}
- $xmlFile .= "\n";
+ // ActivityType
+ $xw->fullEndElement();
}
- $xmlFile .= "\n";
+ // ActivityTypes
+ $xw->fullEndElement();
}
if (!empty($definition['statuses'])) {
- $xmlFile .= "\n";
+ $xw->startElement('Statuses');
+
foreach ($definition['statuses'] as $value) {
- $xmlFile .= "$value\n";
+ $xw->startElement('Status');
+ $xw->text($value);
+ $xw->fullEndElement();
}
- $xmlFile .= "\n";
+ // Statuses
+ $xw->fullEndElement();
}
if (isset($definition['activitySets'])) {
- $xmlFile .= "\n";
+
+ $xw->startElement('ActivitySets');
foreach ($definition['activitySets'] as $k => $val) {
- $xmlFile .= "\n";
+
+ $xw->startElement('ActivitySet');
foreach ($val as $index => $setVal) {
switch ($index) {
case 'activityTypes':
if (!empty($setVal)) {
- $xmlFile .= "\n";
+ $xw->startElement('ActivityTypes');
foreach ($setVal as $values) {
- $xmlFile .= "\n";
+ $xw->startElement('ActivityType');
foreach ($values as $key => $value) {
- $xmlFile .= "<{$key}>" . self::encodeXmlString($value) . "{$key}>\n";
+ // Some parameters here may be arrays of values.
+ // Also, the tests expect an empty array to be represented as an empty value.
+ $value = (array) $value;
+ if (count($value) === 0) {
+ // Create an empty value.
+ $value[] = '';
+ }
+
+ foreach ($value as $val) {
+ $xw->startElement($key);
+ $xw->text($val);
+ $xw->fullEndElement();
+ }
}
- $xmlFile .= "\n";
+ // ActivityType
+ $xw->fullEndElement();
}
- $xmlFile .= "\n";
+ // ActivityTypes
+ $xw->fullEndElement();
}
break;
@@ -147,68 +184,68 @@ public static function convertDefinitionToXML($name, $definition) {
case 'sequence':
case 'timeline':
if ($setVal) {
- $xmlFile .= "<{$index}>true{$index}>\n";
+ $xw->startElement($index);
+ $xw->text('true');
+ $xw->fullEndElement();
}
break;
default:
- $xmlFile .= "<{$index}>" . self::encodeXmlString($setVal) . "{$index}>\n";
+ $xw->startElement($index);
+ $xw->text($setVal);
+ $xw->fullEndElement();
}
}
-
- $xmlFile .= "\n";
+ // ActivitySet
+ $xw->fullEndElement();
}
-
- $xmlFile .= "\n";
+ // ActivitySets
+ $xw->fullEndElement();
}
if (isset($definition['caseRoles'])) {
- $xmlFile .= "\n";
+ $xw->startElement('CaseRoles');
foreach ($definition['caseRoles'] as $values) {
- $xmlFile .= "\n";
+ $xw->startElement('RelationshipType');
foreach ($values as $key => $value) {
- $xmlFile .= "<{$key}>" . ($key == 'groups' ? implode(',', array_map(['\CRM_Case_BAO_CaseType', 'encodeXmlString'], (array) $value)) : self::encodeXmlString($value)) . "{$key}>\n";
+ $xw->startElement($key);
+ if ($key == 'groups') {
+ $xw->text(implode(',', (array) $value));
+ }
+ else {
+ $xw->text($value);
+ }
+ // $key
+ $xw->fullEndElement();
}
- $xmlFile .= "\n";
+ // RelationshipType
+ $xw->fullEndElement();
}
- $xmlFile .= "\n";
+ // CaseRoles
+ $xw->fullEndElement();
}
if (array_key_exists('restrictActivityAsgmtToCmsUser', $definition)) {
- $xmlFile .= "" . $definition['restrictActivityAsgmtToCmsUser'] . "\n";
+ $xw->startElement('RestrictActivityAsgmtToCmsUser');
+ $xw->text($definition['restrictActivityAsgmtToCmsUser']);
+ $xw->fullEndElement();
}
-
if (!empty($definition['activityAsgmtGrps'])) {
- $xmlFile .= "\n";
+ $xw->startElement('ActivityAsgmtGrps');
foreach ((array) $definition['activityAsgmtGrps'] as $value) {
- $xmlFile .= "$value\n";
+ $xw->startElement('Group');
+ $xw->text($value);
+ $xw->fullEndElement();
}
- $xmlFile .= "\n";
+ // ActivityAsgmtGrps
+ $xw->fullEndElement();
}
- $xmlFile .= '';
-
- return $xmlFile;
- }
+ // CaseType
+ $xw->fullEndElement();
+ $xw->endDocument();
- /**
- * Ugh. This shouldn't exist. Use a real XML-encoder.
- *
- * Escape a string for use in XML.
- *
- * @param string $str
- * A string which should outputted to XML.
- * @return string
- * @deprecated
- */
- protected static function encodeXmlString($str) {
- // PHP 5.4: return htmlspecialchars($str, ENT_XML1, 'UTF-8')
- if (is_scalar($str)) {
- return htmlspecialchars($str);
- }
- else {
- return NULL;
- }
+ return $xw->outputMemory();
}
/**
diff --git a/tests/phpunit/CRM/Case/BAO/CaseTypeTest.php b/tests/phpunit/CRM/Case/BAO/CaseTypeTest.php
index 54514f9bbe34..b93ce0629cdc 100644
--- a/tests/phpunit/CRM/Case/BAO/CaseTypeTest.php
+++ b/tests/phpunit/CRM/Case/BAO/CaseTypeTest.php
@@ -28,6 +28,18 @@ public function definitionProvider() {
'xml' => file_get_contents(__DIR__ . '/xml/empty-lists.xml'),
];
+ $fixtures['statuses'] = [
+ 'json' => json_encode([
+ 'activitySets' => [],
+ 'activityTypes' => [],
+ 'caseRoles' => [],
+ 'statuses' => ['Ongoing', 'Completed', 'This & That'],
+ //'statuses' => ['Ongoing', 'Completed'],
+ 'timelineActivityTypes' => [],
+ ]),
+ 'xml' => file_get_contents(__DIR__ . '/xml/statuses.xml'),
+ ];
+
$fixtures['one-item-in-each'] = [
'json' => json_encode([
'activityTypes' => [
@@ -177,6 +189,7 @@ public function definitionProvider() {
'two-items-in-each',
'forkable-0',
'forkable-1',
+ 'statuses',
] as $key) {
$cases[] = [$key, $fixtures[$key]['json'], $fixtures[$key]['xml']];
}
diff --git a/tests/phpunit/CRM/Case/BAO/xml/empty-defn.xml b/tests/phpunit/CRM/Case/BAO/xml/empty-defn.xml
index 575aaa42269b..e94ac3542354 100644
--- a/tests/phpunit/CRM/Case/BAO/xml/empty-defn.xml
+++ b/tests/phpunit/CRM/Case/BAO/xml/empty-defn.xml
@@ -1,4 +1,4 @@
-
+
Housing Support
diff --git a/tests/phpunit/CRM/Case/BAO/xml/empty-lists.xml b/tests/phpunit/CRM/Case/BAO/xml/empty-lists.xml
index 768b6cdb2c38..9c671a37ba71 100644
--- a/tests/phpunit/CRM/Case/BAO/xml/empty-lists.xml
+++ b/tests/phpunit/CRM/Case/BAO/xml/empty-lists.xml
@@ -1,4 +1,4 @@
-
+
Housing Support
diff --git a/tests/phpunit/CRM/Case/BAO/xml/empty-node-text.xml b/tests/phpunit/CRM/Case/BAO/xml/empty-node-text.xml
index 48c116b52351..b36d991bd40c 100644
--- a/tests/phpunit/CRM/Case/BAO/xml/empty-node-text.xml
+++ b/tests/phpunit/CRM/Case/BAO/xml/empty-node-text.xml
@@ -1,4 +1,4 @@
-
+
Housing Support
diff --git a/tests/phpunit/CRM/Case/BAO/xml/forkable-0.xml b/tests/phpunit/CRM/Case/BAO/xml/forkable-0.xml
index a6e6ed1b36c8..49fb5126737f 100644
--- a/tests/phpunit/CRM/Case/BAO/xml/forkable-0.xml
+++ b/tests/phpunit/CRM/Case/BAO/xml/forkable-0.xml
@@ -1,4 +1,4 @@
-
+
Housing Support
0
diff --git a/tests/phpunit/CRM/Case/BAO/xml/forkable-1.xml b/tests/phpunit/CRM/Case/BAO/xml/forkable-1.xml
index e1427534a725..a483592ebfef 100644
--- a/tests/phpunit/CRM/Case/BAO/xml/forkable-1.xml
+++ b/tests/phpunit/CRM/Case/BAO/xml/forkable-1.xml
@@ -1,4 +1,4 @@
-
+
Housing Support
1
diff --git a/tests/phpunit/CRM/Case/BAO/xml/one-item-in-each.xml b/tests/phpunit/CRM/Case/BAO/xml/one-item-in-each.xml
index 24452737619d..1822f84645f7 100644
--- a/tests/phpunit/CRM/Case/BAO/xml/one-item-in-each.xml
+++ b/tests/phpunit/CRM/Case/BAO/xml/one-item-in-each.xml
@@ -1,4 +1,4 @@
-
+
Housing Support
diff --git a/tests/phpunit/CRM/Case/BAO/xml/statuses.xml b/tests/phpunit/CRM/Case/BAO/xml/statuses.xml
new file mode 100644
index 000000000000..d32b57db7bc4
--- /dev/null
+++ b/tests/phpunit/CRM/Case/BAO/xml/statuses.xml
@@ -0,0 +1,14 @@
+
+
+
+ Housing Support
+
+
+ Ongoing
+ Completed
+ This & That
+
+
+
+
+
diff --git a/tests/phpunit/CRM/Case/BAO/xml/two-items-in-each.xml b/tests/phpunit/CRM/Case/BAO/xml/two-items-in-each.xml
index 313c6652bf02..82f678636763 100644
--- a/tests/phpunit/CRM/Case/BAO/xml/two-items-in-each.xml
+++ b/tests/phpunit/CRM/Case/BAO/xml/two-items-in-each.xml
@@ -1,4 +1,4 @@
-
+
Housing Support