예제 #1
0
 function readSegments()
 {
     $specs = $this->getSpecs();
     /**
      * Premier segment/groupe dans le fichier de spec
      * 
      * @var CHL7v2DOMElement $current_node
      */
     $current_node = $specs->query("/message/segments/*")->item(0);
     /**
      * Groupe courant dans lequel on va placer les CHL7v2Segment créés
      * 
      * @var CHL7v2SegmentGroup $current_group
      */
     $current_group = $this;
     //$lines_count = count($this->lines);
     $n = 100000;
     // pour eviter les boucles infinies !
     while ($n-- && trim($this->getCurrentLine())) {
         if (!$current_node) {
             $segment_error = new CHL7v2Segment($current_group);
             $segment_error->name = $this->getCurrentLineHeader();
             $this->error(CHL7v2Exception::UNEXPECTED_SEGMENT, $this->getCurrentLine(), $segment_error);
             break;
         }
         switch ($current_node->nodeName) {
             // SEGMENT //
             case "segment":
                 CHL7v2::d($current_node->getSegmentHeader() . " " . $current_node->state(), "red");
                 $handled = false;
                 if ($this->getCurrentLineHeader() == "") {
                     break 2;
                 }
                 $seg_schema = $this->getSchema(self::PREFIX_SEGMENT_NAME, $this->getCurrentLineHeader(), $this->getMessage()->extension);
                 if ($seg_schema == false) {
                     $segment_error = new CHL7v2Segment($current_group);
                     $segment_error->name = $this->getCurrentLineHeader();
                     $this->error(CHL7v2Exception::UNKOWN_SEGMENT_TYPE, $this->getCurrentLine(), $segment_error);
                     break 2;
                 }
                 // Si la spec correspond a la ligne courante
                 if ($this->getCurrentLineHeader() == $current_node->getSegmentHeader()) {
                     $this->handleLine($current_node, $current_group);
                     $current_node->markNotEmpty();
                     $handled = true;
                 } elseif (!$current_node->isRequired()) {
                     CHL7v2::d(" --> Segment non présent et non requis");
                     list($current_node, $current_group) = self::getNext($current_node, $current_group);
                     break;
                 } else {
                     if (!$current_node->getParent() || $current_node->getParent()->isOpen()) {
                         CHL7v2::d(" --> !!!!!!!!!!!!!!!!! Segment non present et groupe requis");
                         $this->error(CHL7v2Exception::SEGMENT_MISSING, $current_node->nodeValue);
                     }
                 }
                 // le segment est multiple, on reste sur lui
                 if ($handled && $current_node->isUnbounded()) {
                     CHL7v2::d(" --> Segment multiple");
                 } else {
                     CHL7v2::d(" --> Segment unique, passage au suivant");
                     list($current_node, $current_group) = self::getNext($current_node, $current_group);
                 }
                 break;
                 // GROUP //
             // GROUP //
             case "group":
                 CHL7v2::d($current_group->name . " " . $current_node->state(), "red");
                 $current_node->markEmpty();
                 if ($current_node->isUnbounded() || !$current_node->isUsed()) {
                     $current_node->setAttribute("mbOpen", 0);
                     CHL7v2::d(" --> Groupe multiple ou pas encore utilisé, on entre dedans");
                     $current_group = new CHL7v2SegmentGroup($current_group, $current_node);
                     $current_node = $current_node->getFirstChild();
                 } else {
                     CHL7v2::d(" --> Groupe utilisé ou pas multiple, on prend le parent ou frere");
                     list($current_node, $current_group) = self::getNext($current_node, $current_group);
                 }
                 break;
                 // custom attributes, should never get there
             // custom attributes, should never get there
             default:
                 CHL7v2::d($current_node->getName());
                 $current_node = $current_node->getNextSibling();
                 break;
         }
     }
     $this->purgeEmptyGroups();
     // pas forcément utile : mais ceci donne tous les segments dans
     // l'ordre de parcours, comme si on le faisait recursivement
     // $c = $specs->xpath("//segment | //group");
 }