public static function parse($node, $parent, $key = null) { $type = self::$parser->get($node, "type"); $name = self::$parser->get($parent, "name"); $process = self::$parser->getProcess(); $iteration = self::$parser->getIteration(); $default = self::$parser->fetch("./i:default|./i:static", $node); $defvalue = $selected = ""; if ($default->length) { $default = $default->item(0); $kname = self::$parser->name($default, true); $children = self::$parser->fetch("./i:node", $default); if ($children->length) { parent::parseNodes($children, $defvalue, $selected); if ($selected) { self::add("fields/" . $name . "/value/" . $kname . "/selected", $selected); } } else { $defvalue = self::$parser->get($default); } self::add("fields/" . $name . "/value/" . $kname . "/value", $defvalue); } if (self::$parser->find($node, "source")) { self::add("fields/" . $name . "/value/type", "1"); self::add("fields/" . $name . "/value/class", $process["parses"][$iteration]["datasource"]["class"]); self::add("fields/" . $name . "/value/method", self::$parser->get(self::$parser->getnode("source", $node), "name")); } else { if (self::$parser->find($node, "item")) { self::add("fields/" . $name . "/value/type", "3"); $nodes = self::$parser->fetch("./i:item", $node); $it = new nodeListIterator($nodes, PAIRS); $ls = $it->getList(); $ls_arr = array(); foreach ($ls as $node) { $ls_arr[$node->getAttribute("value")] = $node->nodeValue; } $it->setList($ls); self::add("fields/" . $name . "/value/default/value", $ls_arr); //$it->setAttribute("value"); //self::add("fields/".$name."/value/items",$it); } else { if ($node) { $class = self::$parser->get(self::$parser->getnode("class", $node)); if ($class) { self::add("fields/" . $name . "/value/type", "2"); self::add("fields/" . $name . "/value/class", $class); $method = self::$parser->getnode("method", $node); if ($method) { self::add("fields/" . $name . "/value/method/name", self::$parser->get($method, "name")); $nodes = self::$parser->fetch("./i:param", $method); $it = new nodeListIterator($nodes); if ($it->getListLength() > 0) { self::parseValues($it); $it->rewind(); //$it->setMode(VALUES); } $i = 0; foreach ($it as $v) { $val = self::$parser->get($v); if (!property_exists($v, "non_convertable") && substr($val, 0, 1) == "[") { $val = explode(",", preg_replace("/[\\[\\]]+/", "", $val)); } self::add("fields/" . $name . "/value/method/params/" . $i, $val); $i++; } } } else { if ($type == 'orm') { // falling back to class defined in datasource node with guessed getter method name self::add("fields/" . $name . "/value/type", "1"); self::add("fields/" . $name . "/value/class", $process["parses"][$iteration]["datasource"]["class"]); $nameParts = explode('[', $name); $nameParts = array_reverse($nameParts); $originalName = str_replace(']', '', $nameParts[0]); $originalNameGetterMethod = 'get' . sfInflector::camelize($originalName); self::add("fields/" . $name . "/value/method", $originalNameGetterMethod); } } } } } return true; }