public static function parse($node, $parent, $key = null)
 {
     $nodes = self::$parser->fetch("./i:by", $node);
     $it = new nodeListIterator($nodes);
     if ($it->getListLength() > 0) {
         foreach ($it as $n) {
             self::add("grouping/" . self::$parser->get($n, "ref"), self::$parser->get($n, "callback"));
         }
     } else {
         self::$parser->createFieldSets();
         return -1;
     }
     return true;
 }
 public static function parse($node, $parent, $key = null)
 {
     $element = self::$parser->any("datasource");
     self::$parser->enumCheck("i:valueType", self::$parser->get($element, "type"));
     self::add("datasource/type", self::$parser->get($element, "type"));
     self::add("datasource/lister", self::$parser->get($element, "lister"));
     if (self::$parser->has($node, "className")) {
         self::add("datasource/className", self::$parser->get($element, "className"));
     }
     if (self::$parser->has($node, "dataLoadedHandler")) {
         self::add("datasource/dataLoadedHandler", self::$parser->get($element, "dataLoadedHandler"));
     }
     if (self::$parser->has($node, null, "statement")) {
         return true;
     }
     $class = self::$parser->get(self::$parser->getnode("class", $element));
     self::add("datasource/class", $class);
     $element = self::$parser->getnode("method", $element);
     $method = self::$parser->get($element, "name");
     $type = self::$parser->get($element, "type");
     if ($method != '') {
         self::$parser->enumCheck("i:fetchType", $type);
     }
     $nodes = self::$parser->fetch("./i:param", $element);
     $it = new nodeListIterator($nodes);
     if ($method != '') {
         self::add("datasource/method/name", $method);
         self::add("datasource/method/type", $type);
     }
     if ($it->getListLength() > 0) {
         self::parseValues($it);
         $it->rewind();
         $it->setMode(VALUES);
     }
     $i = 0;
     foreach ($it as $v) {
         if (substr($v, 0, 1) == "[") {
             $v = explode(",", preg_replace("/[\\[\\]]+/", "", $v));
         }
         self::add("datasource/method/params/" . $i, $v);
         $i++;
     }
     return true;
 }
 public static function parse($node, $parent, $key = null)
 {
     $nodes = self::$parser->fetch("./i:param", $node);
     foreach ($nodes as $node) {
         $value = self::$parser->get($node);
         if (strstr($value, "\n")) {
             self::$parser->set(null, str_replace("\n", "<br />", $value), $node);
         }
     }
     $it = new nodeListIterator($nodes);
     $tmp = self::$parser->getProcess();
     $iteration = self::$parser->getIteration();
     if ($parent) {
         $pid = self::$parser->name($parent);
         if ($pid == "component") {
             $name = self::$parser->get($parent, "name");
             foreach ($tmp["parses"][$iteration]["areas"] as $aname => $area) {
                 if (!isset($area["tabs"])) {
                     $area["tabs"][0] = array("attributes" => array(), "components" => $area["components"]);
                 }
                 foreach ($area["tabs"] as $tk => $tab) {
                     foreach ($tab["components"] as $cname => $component) {
                         if ($name == $cname) {
                             $area_name = $aname;
                             $tabid = $tk;
                             break;
                         }
                     }
                 }
             }
             foreach ($nodes as $var) {
                 $v = self::$parser->get($var);
                 if (substr($v, 0, 1) == "[") {
                     $v = explode(",", preg_replace("/[\\[\\]]+/", "", $v));
                 }
                 if (isset($tmp["parses"][$iteration]["areas"][$area_name]["tabs"])) {
                     self::add("areas/" . $area_name . "/tabs/" . $tabid . "/components/" . $name . "/params/" . self::$parser->get($var, "name"), $v);
                 } else {
                     self::add("areas/" . $area_name . "/components/" . $name . "/params/" . self::$parser->get($var, "name"), $v);
                 }
             }
         } else {
             if ($pid == "area") {
                 $name = self::$parser->get($parent, "type");
                 $it->setMode(VALUES);
                 $i = 0;
                 foreach ($it as $v) {
                     if (substr($v, 0, 1) == "[") {
                         $v = explode(",", preg_replace("/[\\[\\]]+/", "", $v));
                     }
                     self::add("areas/" . $name . "/params/" . $i, $v);
                     $i++;
                 }
             }
         }
     } else {
         if ($it->getListLength() > 0) {
             self::parseValues($it);
             $it->rewind();
         }
         $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("params/" . $i, $val);
             //Params with key also
             self::add("params/" . self::$parser->get($v, "name"), $val);
             $i++;
         }
     }
     return true;
 }
 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;
 }