/** * Creates CFPropertyList object, filled with provided array * @param array $array * @return static */ public function createPlistFromArray(array $array) { $typeDetector = new CFTypeDetector(); $guessedStructure = $typeDetector->toCFType($array); $this->plist->add($guessedStructure); return $this; }
/** * Encode the given data in plist format * * @param array $data * resulting data that needs to * be encoded in plist format * @param boolean $humanReadable * set to true when restler * is not running in production mode. Formatter has to * make the encoded output more human readable * * @return string encoded string */ public function encode($data, $humanReadable = false) { //require_once 'CFPropertyList.php'; if (!isset(self::$compact)) { self::$compact = !$humanReadable; } /** * * @var CFPropertyList */ $plist = new CFPropertyList(); $td = new CFTypeDetector(); $guessedStructure = $td->toCFType(Object::toArray($data)); $plist->add($guessedStructure); return self::$compact ? $plist->toBinary() : $plist->toXML(true); }
/** * Convert a DOMNode into a CFType. * @param DOMNode $node Node to import children of * @param CFDictionary|CFArray|CFPropertyList $parent * @return void */ protected function import(DOMNode $node, $parent) { // abort if there are no children if (!$node->childNodes->length) { return; } foreach ($node->childNodes as $n) { // skip if we can't handle the element if (!isset(self::$types[$n->nodeName])) { continue; } $class = 'CFPropertyList\\' . self::$types[$n->nodeName]; $key = null; // find previous <key> if possible $ps = $n->previousSibling; while ($ps && $ps->nodeName == '#text' && $ps->previousSibling) { $ps = $ps->previousSibling; } // read <key> if possible if ($ps && $ps->nodeName == 'key') { $key = $ps->firstChild->nodeValue; } switch ($n->nodeName) { case 'date': $value = new $class(CFDate::dateValue($n->nodeValue)); break; case 'data': $value = new $class($n->nodeValue, true); break; case 'string': $value = new $class($n->nodeValue); break; case 'real': case 'integer': $value = new $class($n->nodeName == 'real' ? floatval($n->nodeValue) : intval($n->nodeValue)); break; case 'true': case 'false': $value = new $class($n->nodeName == 'true'); break; case 'array': case 'dict': $value = new $class(); $this->import($n, $value); if ($value instanceof CFDictionary) { $hsh = $value->getValue(); if (isset($hsh['CF$UID']) && count($hsh) == 1) { $value = new CFUid($hsh['CF$UID']->getValue()); } } break; } // Dictionaries need a key if ($parent instanceof CFDictionary) { $parent->add($key, $value); } else { $parent->add($value); } } }
*/ namespace CFPropertyList; use DateTime, DateTimeZone; // just in case... error_reporting(E_ALL); ini_set('display_errors', 'on'); /** * Require CFPropertyList */ require_once __DIR__ . '/../classes/CFPropertyList/CFPropertyList.php'; /* * create a new CFPropertyList instance without loading any content */ $plist = new CFPropertyList(); /* * import the array structure to create the sample.xml.plist * We make use of CFTypeDetector, which truly is not almighty! */ $structure = array('Year Of Birth' => 1965, 'Date Of Graduation' => gmmktime(19, 23, 43, 06, 22, 2004), 'Date Of Birth' => new DateTime('1984-09-07 08:15:23', new DateTimeZone('Europe/Berlin')), 'Pets Names' => array(), 'Picture' => 'PEKBpYGlmYFCPA==', 'City Of Birth' => 'Springfield', 'Name' => 'John Doe', 'Kids Names' => array('John', 'Kyra')); $td = new CFTypeDetector(); $guessedStructure = $td->toCFType($structure); $plist->add($guessedStructure); /* * Save PList as XML */ $plist->saveXML(__DIR__ . '/example-create-02.xml.plist'); /* * Save PList as Binary */ $plist->saveBinary(__DIR__ . '/example-create-02.binary.plist');