/** * Création des fichiers .xsl & .xml pour une fonction ou une tâche donnée. * * @param EiEnvironnementEiProfil $environnement Environnement sur lequel se base la tâche et/ou la fonction. * @param EiProfil $profil Profil utilisé. * @param array $commands Liste des séquences/fonctions à inclure. * @param EiTache|EiFunction $objet Fonction ou Tâche à exporter. */ public static function creerXSL(sfWebRequest $request, EiProjet $ei_project, EiUser $ei_user, EiProfil $profil = null, $commands = null) { //Récupération des paramètres de profil $profileParams = $profil->getParamsWithName($ei_user); /*************************************/ /***** Définition du XSL *****/ /*************************************/ // On définit le document. $dom = new DomDocument("1.0", "UTF-8"); $dom->formatOutput = true; // On définit les spécificités xsl. //-> Feuille de Style $css = $dom->createElement('xsl:stylesheet'); $css->setAttribute("xmlns:xsl", "http://www.w3.org/1999/XSL/Transform"); $css->setAttribute("version", "1.0"); $dom->appendChild($css); //-> Fichier de sortie $ps = $dom->createElement('xsl:preserve-space'); $ps->setAttribute("elements", "xsl:text"); $css->appendChild($ps); //-> Fichier de sortie $pi = $dom->createElement('xsl:output'); $pi->setAttribute("method", "xml"); $css->appendChild($pi); //-> Template à matcher. $tpl = $dom->createElement('xsl:template'); $tpl->setAttribute("match", "/"); $css = $css->appendChild($tpl); // On définit le jeu de test. $test = $dom->createElement("TestCase"); $test->setAttribute("seleniumIDEVersion", sfConfig::get("app_xml_seleniumIDEVersion")); if ($profil != null) { $test->setAttribute("baseURL", $profil->getBaseUrl()); } else { $test->setAttribute("baseURL", "default"); } // Puis on l'ajoute. $tpl = $tpl->appendChild($test); /************************************************ */ /***** Séquences/Fonctions/Commandes **** */ /************************************************ */ if ($commands != null) { foreach ($commands as $index => $command) { /******************************************** */ /***** Chargement des paramètres **** */ /******************************************** */ // en créant la racine selense. $o = $dom->createElement("selenese"); // Puis ses trois noeuds: commande, target, value. $cmd = $o->appendChild($dom->createElement("command")); $texte = $cmd->appendChild($dom->createTextNode($command->getName())); // Cible dynamique/statique $cible = $o->appendChild($dom->createElement("target")); $pattern = "#(?<!\\#)\\#\\{[\\w./]*}#"; /* On commence par interpréter tous les paramètres de profil sur la cible de la commande */ //$ch1=self::parseAndExtractProfileParamsValue($command->getCommandTarget(), $profileParams); $ch1 = self::replaceProfileParamWithValue($command->getCommandTarget(), $profileParams); $nbMatched = preg_match_all($pattern, $ch1, $matches); if (isset($matches) && $nbMatched > 0) { $toReplace = array(); //$ch1 = $command->getCommandTarget(); // pour chaque élément qui a matché le pattern foreach ($matches[0] as $m => $param) { //on protège notre expression afin que celle-ci ne soit pas considérer comme un pattern de regex $matches[0][$m] = '#\\' . preg_quote($param) . '#'; //puis l'on créer la chaine de remplacement correspondante $dompar = $dom->createElement("xsl:value-of"); $dompar->setAttribute("select", "user/fonction-" . $command->getFunctionId() . "_" . $command->getFunctionRef() . "/parameter[@name='" . substr($param, 2, -1) . "']/value"); //On récupère la sous chaine de $ch à partir de $param $sous_chaine_restante = strstr($ch1, $param); $cible->appendChild($dom->createCDATASection(substr($ch1, 0, stripos($ch1, $sous_chaine_restante)))); //stripos recherche la première occurence de $sous_chaine_restante dans $ch $cible->appendChild($dompar); //on ajoute la section <xsl:value-of> au CDATA //On extrait à la sous chaine restante le paramètre variable trouvé $ch1 = substr($sous_chaine_restante, strlen($param)); } /* Si c'est le dernier paramètre à interpreter ou si on trouvé aucun paramètre à interpreter alors on ajoute le reste de texte */ $cible->appendChild($dom->createCDATASection($ch1)); } else { $cible->appendChild($dom->createCDATASection($ch1)); } //Interprétation de la valeur de la commande $valeur = $o->appendChild($dom->createElement("value")); /* On commence par interpréter tous les paramètres de profil sur la valeur de la commande */ //$ch2=self::parseAndExtractProfileParamsValue($command->getCommandValue(), $profileParams); $ch2 = self::replaceProfileParamWithValue($command->getCommandValue(), $profileParams); $nbMatched = preg_match_all($pattern, $ch2, $matches); if (isset($matches) && $nbMatched > 0) { $toReplace = array(); //$ch = $command->getCommandValue(); // pour chaque élément qui a matché le pattern foreach ($matches[0] as $m => $param) { //on protège notre expression afin que celle-ci ne soit pas considérer comme un pattern de regex $matches[0][$m] = '#\\' . preg_quote($param) . '#'; //puis l'on créer la chaine de remplacement correspondante $dompar = $dom->createElement("xsl:value-of"); $dompar->setAttribute("select", "user/fonction-" . $command->getFunctionId() . "_" . $command->getFunctionRef() . "/parameter[@name='" . substr($param, 2, -1) . "']/value"); //$toReplace[$m]=$dompar; //Méthode 2 $sous_chaine_restante = strstr($ch2, $param); $sous_chaine_restante_debut = substr($ch2, 0, stripos($ch2, $sous_chaine_restante)); // Si que des caractères vides, on place cela dans une balise texte. if (preg_match("/^([[:space:]]+)\$/", $sous_chaine_restante_debut)) { $valeur->appendChild($dom->createElement("xsl:text", "" . $sous_chaine_restante_debut . "")); } else { $valeur->appendChild($dom->createCDATASection($sous_chaine_restante_debut)); } $valeur->appendChild($dompar); // //On extrait à la sous chaine restante le paramètre variable trouvé $ch2 = substr($sous_chaine_restante, strlen($param)); } /* Si c'est le dernier paramètre à interpreter ou si on trouvé aucun paramètre à interpreter alors on ajoute le reste de texte */ $valeur->appendChild($dom->createCDATASection($ch2)); } else { $valeur->appendChild($dom->createCDATASection($ch2)); } $tpl->appendChild($o); } } return $dom->saveXML(); }