Kaynağa Gözat

Fix issue #85 : la récupération des flux tronqués vérifie d'abord si l'article n'est pas déjà en BDD pour éviter énormément de requêtes inutiles

Marien Fressinaud 12 yıl önce
ebeveyn
işleme
9e0af957d4
2 değiştirilmiş dosya ile 47 ekleme ve 12 silme
  1. 44 0
      app/models/Entry.php
  2. 3 12
      app/models/Feed.php

+ 44 - 0
app/models/Entry.php

@@ -194,6 +194,29 @@ class Entry extends Model {
 		}
 	}
 
+	public function loadCompleteContent($pathEntries) {
+		// Gestion du contenu
+		// On cherche à récupérer les articles en entier... même si le flux ne le propose pas
+		if ($pathEntries) {
+			$entryDAO = new EntryDAO();
+			$entry = $entryDAO->searchByGuid($this->feed, $this->guid);
+
+			if($entry) {
+				// l'article existe déjà en BDD, en se contente de recharger ce contenu
+				$this->content = $entry->content();
+			} else {
+				try {
+					// l'article n'est pas en BDD, on va le chercher sur le site
+					$this->content = get_content_by_parsing(
+						$this->link(), $pathEntries
+					);
+				} catch (Exception $e) {
+					// rien à faire, on garde l'ancien contenu (requête a échoué)
+				}
+			}
+		}
+	}
+
 	public function toArray () {
 		return array (
 			'id' => $this->id (),
@@ -360,6 +383,27 @@ class EntryDAO extends Model_pdo {
 		}
 	}
 
+	public function searchByGuid ($feed_id, $id) {
+		// un guid est unique pour un flux donné
+		$sql = 'SELECT * FROM entry WHERE id_feed=? AND guid=?';
+		$stm = $this->bd->prepare ($sql);
+
+		$values = array (
+			$feed_id,
+			$id
+		);
+
+		$stm->execute ($values);
+		$res = $stm->fetchAll (PDO::FETCH_ASSOC);
+		list ($entry, $next) = HelperEntry::daoToEntry ($res);
+
+		if (isset ($entry[0])) {
+			return $entry[0];
+		} else {
+			return false;
+		}
+	}
+
 	public function searchById ($id) {
 		$sql = 'SELECT * FROM entry WHERE id=?';
 		$stm = $this->bd->prepare ($sql);

+ 3 - 12
app/models/Feed.php

@@ -216,18 +216,7 @@ class Feed extends Model {
 				}
 			}
 
-			// Gestion du contenu
-			// On cherche à récupérer les articles en entier... même si le flux ne le propose pas
-			$path = $this->pathEntries ();
-			if ($path) {
-				try {
-					$content = get_content_by_parsing ($item->get_permalink (), $path);
-				} catch (Exception $e) {
-					$content = $item->get_content ();
-				}
-			} else {
-				$content = $item->get_content ();
-			}
+			$content = $item->get_content ();
 
 			$entry = new Entry (
 				$this->id (),
@@ -239,6 +228,8 @@ class Feed extends Model {
 				$date ? $date : time ()
 			);
 			$entry->_tags ($tags);
+			// permet de récupérer le contenu des flux tronqués
+			$entry->loadCompleteContent($this->pathEntries());
 
 			$entries[$entry->id ()] = $entry;
 		}