Browse Source

Termine la refonte de l'importation des flux. Reste à examiner le
téléchargement des flux.
* L'abonnement se fait rapidement.
* Le téléchargement des flux est à faire en mise à jour manuelle.
* Les erreurs dans les fichiers OPML sont remontées à l'utilisateur.
* Les flux déjà abonnés sont signalés.

Christophe HENRY 6 years ago
parent
commit
076e9b8364
2 changed files with 44 additions and 18 deletions
  1. 15 11
      Opml.class.php
  2. 29 7
      action.php

+ 15 - 11
Opml.class.php

@@ -10,6 +10,9 @@ require_once("common.php");
  
 class Opml  {
 
+	/** liens déjà connus, déjà abonnés, au moment de l'importation. */
+	public $déjàConnus = array();
+
 	/**
 	 * Met à jour les données des flux.
 	 */
@@ -105,10 +108,12 @@ class Opml  {
 					$newFeed->setWebsite($item[0]['htmlUrl']);
 					$newFeed->setFolder($folderId);
 					$newFeed->save();
-					/* $newFeed->parse();
-					   À faire plus tard : c'est lent, peut lever des erreurs
-					   et c'est à factoriser avec la mise à jour manuelle.
-					*/
+					// $newFeed->parse();
+				} else {
+					$this->déjàConnus[]= (object) array(
+						'description' => $item[0]['description'],
+						'xmlUrl' => $item[0]['xmlUrl']
+					);
 				}
 			}
 		}
@@ -122,17 +127,16 @@ class Opml  {
 		$fichier = $_FILES['newImport']['tmp_name'];
 		$internalErrors = libxml_use_internal_errors(true);
 		$xml = @simplexml_load_file($fichier);
-		libxml_use_internal_errors($internalErrors);
-		$sortie = '';
+		$sortieErreur = array();
 		foreach (libxml_get_errors() as $error) {
-			$sortie.="<p>$error</p>\n";
+			$sortieErreur []= "{$error->message} (line {$error->line})";
 		}
-		Controler le contenu du XML ensuite !
 		libxml_clear_errors();
-		if (empty($xml)) {
-			throw new RuntimeException("Fichier invalide! $sortie");
+		libxml_use_internal_errors($internalErrors);
+		if (!empty($xml) && empty($sortieErreur)) {
+			$this->_import($xml->body->outline);
 		}
-		$this->_import($xml->body->outline);
+		return $sortieErreur;
 	}
 
 }

+ 29 - 7
action.php

@@ -189,14 +189,36 @@ switch ($_['action']){
 	case 'importFeed':
 		if($myUser==false) exit('Vous devez vous connecter pour cette action.');
 		if(!isset($_POST['importButton'])) break;
-		$réponse = "L'import s'est déroulé sans problème.";
-		try {
-			$opml = new Opml();
-			$opml->import($_FILES['newImport']['tmp_name']);
-		} catch (Exception $e) {
-			$réponse = $e->getMessage();
+		$opml = new Opml();
+		$sortieErreurs = $opml->import($_FILES['newImport']['tmp_name']);
+		if (empty($sortieErreurs)) {
+			echo "<h3>L'import s'est déroulé sans problème.</h3>\n";
+		} else {
+			echo "<h3>Erreurs à l'importation!</h3>\n";
+			foreach($sortieErreurs as $ligne) {
+				echo "<p>$ligne</p>\n";
+			}
+		}
+		if (!empty($opml->déjàConnus)) {
+			echo "<p>Certains flux étaient déjà connus, ils n'ont pas été réimportés ni mis à jour :</p>\n<ul>\n";
+			foreach($opml->déjàConnus as $déjàConnu) {
+				foreach($déjàConnu as &$elt) $elt = htmlspecialchars($elt);
+				$maxLength = 80;
+				$délimiteur = '...';
+				if (strlen($déjàConnu->description)>$maxLength) {
+					$déjàConnu->description =
+						substr($déjàConnu->description, 0,
+							$maxLength-strlen($délimiteur)
+						).$délimiteur;
+				}
+				echo "<li><a target='_parent' href='{$déjàConnu->xmlUrl}'>{$déjàConnu->description}</a></li>\n";
+			}
+			echo "</ul>\n";
+		}
+		if (empty($sortieErreurs)) {
+			echo "<p>Vous pouvez maintenant mettre à jour manuellement les flux.</p>\n";
 		}
-		echo "<a href='settings.php' target='_parent'>$réponse</a>";
+		echo "<a href='settings.php' target='_parent'>Retour au menu.</a>\n";
 	break;