You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
253 lines
6.4 KiB
253 lines
6.4 KiB
11 years ago
|
<?php
|
||
|
class FreshRSS_CategoryDAO extends Minz_ModelPdo {
|
||
|
public function addCategory ($valuesTmp) {
|
||
|
$sql = 'INSERT INTO `' . $this->prefix . 'category` (name, color) VALUES(?, ?)';
|
||
|
$stm = $this->bd->prepare ($sql);
|
||
|
|
||
|
$values = array (
|
||
|
substr($valuesTmp['name'], 0, 255),
|
||
|
substr($valuesTmp['color'], 0, 7),
|
||
|
);
|
||
|
|
||
|
if ($stm && $stm->execute ($values)) {
|
||
|
return $this->bd->lastInsertId();
|
||
|
} else {
|
||
|
$info = $stm->errorInfo();
|
||
|
Minz_Log::record ('SQL error : ' . $info[2], Minz_Log::ERROR);
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function updateCategory ($id, $valuesTmp) {
|
||
|
$sql = 'UPDATE `' . $this->prefix . 'category` SET name=?, color=? WHERE id=?';
|
||
|
$stm = $this->bd->prepare ($sql);
|
||
|
|
||
|
$values = array (
|
||
|
$valuesTmp['name'],
|
||
|
$valuesTmp['color'],
|
||
|
$id
|
||
|
);
|
||
|
|
||
|
if ($stm && $stm->execute ($values)) {
|
||
|
return $stm->rowCount();
|
||
|
} else {
|
||
|
$info = $stm->errorInfo();
|
||
|
Minz_Log::record ('SQL error : ' . $info[2], Minz_Log::ERROR);
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function deleteCategory ($id) {
|
||
|
$sql = 'DELETE FROM `' . $this->prefix . 'category` WHERE id=?';
|
||
|
$stm = $this->bd->prepare ($sql);
|
||
|
|
||
|
$values = array ($id);
|
||
|
|
||
|
if ($stm && $stm->execute ($values)) {
|
||
|
return $stm->rowCount();
|
||
|
} else {
|
||
|
$info = $stm->errorInfo();
|
||
|
Minz_Log::record ('SQL error : ' . $info[2], Minz_Log::ERROR);
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function searchById ($id) {
|
||
|
$sql = 'SELECT * FROM `' . $this->prefix . 'category` WHERE id=?';
|
||
|
$stm = $this->bd->prepare ($sql);
|
||
|
|
||
|
$values = array ($id);
|
||
|
|
||
|
$stm->execute ($values);
|
||
|
$res = $stm->fetchAll (PDO::FETCH_ASSOC);
|
||
|
$cat = HelperCategory::daoToCategory ($res);
|
||
|
|
||
|
if (isset ($cat[0])) {
|
||
|
return $cat[0];
|
||
|
} else {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
public function searchByName ($name) {
|
||
|
$sql = 'SELECT * FROM `' . $this->prefix . 'category` WHERE name=?';
|
||
|
$stm = $this->bd->prepare ($sql);
|
||
|
|
||
|
$values = array ($name);
|
||
|
|
||
|
$stm->execute ($values);
|
||
|
$res = $stm->fetchAll (PDO::FETCH_ASSOC);
|
||
|
$cat = HelperCategory::daoToCategory ($res);
|
||
|
|
||
|
if (isset ($cat[0])) {
|
||
|
return $cat[0];
|
||
|
} else {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function listCategories ($prePopulateFeeds = true, $details = false) {
|
||
|
if ($prePopulateFeeds) {
|
||
|
$sql = 'SELECT c.id AS c_id, c.name AS c_name, '
|
||
|
. ($details ? 'c.color AS c_color, ' : '')
|
||
|
. ($details ? 'f.* ' : 'f.id, f.name, f.website, f.priority, f.error, f.cache_nbEntries, f.cache_nbUnreads ')
|
||
|
. 'FROM `' . $this->prefix . 'category` c '
|
||
|
. 'LEFT OUTER JOIN `' . $this->prefix . 'feed` f ON f.category = c.id '
|
||
|
. 'GROUP BY f.id '
|
||
|
. 'ORDER BY c.name, f.name';
|
||
|
$stm = $this->bd->prepare ($sql);
|
||
|
$stm->execute ();
|
||
|
return HelperCategory::daoToCategoryPrepopulated ($stm->fetchAll (PDO::FETCH_ASSOC));
|
||
|
} else {
|
||
|
$sql = 'SELECT * FROM `' . $this->prefix . 'category` ORDER BY name';
|
||
|
$stm = $this->bd->prepare ($sql);
|
||
|
$stm->execute ();
|
||
|
return HelperCategory::daoToCategory ($stm->fetchAll (PDO::FETCH_ASSOC));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function getDefault () {
|
||
|
$sql = 'SELECT * FROM `' . $this->prefix . 'category` WHERE id=1';
|
||
|
$stm = $this->bd->prepare ($sql);
|
||
|
|
||
|
$stm->execute ();
|
||
|
$res = $stm->fetchAll (PDO::FETCH_ASSOC);
|
||
|
$cat = HelperCategory::daoToCategory ($res);
|
||
|
|
||
|
if (isset ($cat[0])) {
|
||
|
return $cat[0];
|
||
|
} else {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
public function checkDefault () {
|
||
|
$def_cat = $this->searchById (1);
|
||
|
|
||
|
if ($def_cat === false) {
|
||
|
$cat = new FreshRSS_Category (Minz_Translate::t ('default_category'));
|
||
|
$cat->_id (1);
|
||
|
|
||
|
$values = array (
|
||
|
'id' => $cat->id (),
|
||
|
'name' => $cat->name (),
|
||
|
'color' => $cat->color ()
|
||
|
);
|
||
|
|
||
|
$this->addCategory ($values);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function count () {
|
||
|
$sql = 'SELECT COUNT(*) AS count FROM `' . $this->prefix . 'category`';
|
||
|
$stm = $this->bd->prepare ($sql);
|
||
|
$stm->execute ();
|
||
|
$res = $stm->fetchAll (PDO::FETCH_ASSOC);
|
||
|
|
||
|
return $res[0]['count'];
|
||
|
}
|
||
|
|
||
|
public function countFeed ($id) {
|
||
|
$sql = 'SELECT COUNT(*) AS count FROM `' . $this->prefix . 'feed` WHERE category=?';
|
||
|
$stm = $this->bd->prepare ($sql);
|
||
|
$values = array ($id);
|
||
|
$stm->execute ($values);
|
||
|
$res = $stm->fetchAll (PDO::FETCH_ASSOC);
|
||
|
|
||
|
return $res[0]['count'];
|
||
|
}
|
||
|
|
||
|
public function countNotRead ($id) {
|
||
|
$sql = 'SELECT COUNT(*) AS count FROM `' . $this->prefix . 'entry` e INNER JOIN `' . $this->prefix . 'feed` f ON e.id_feed = f.id WHERE category=? AND e.is_read=0';
|
||
|
$stm = $this->bd->prepare ($sql);
|
||
|
$values = array ($id);
|
||
|
$stm->execute ($values);
|
||
|
$res = $stm->fetchAll (PDO::FETCH_ASSOC);
|
||
|
|
||
|
return $res[0]['count'];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class HelperCategory {
|
||
|
public static function findFeed($categories, $feed_id) {
|
||
|
foreach ($categories as $category) {
|
||
|
foreach ($category->feeds () as $feed) {
|
||
|
if ($feed->id () === $feed_id) {
|
||
|
return $feed;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
public static function CountUnreads($categories, $minPriority = 0) {
|
||
|
$n = 0;
|
||
|
foreach ($categories as $category) {
|
||
|
foreach ($category->feeds () as $feed) {
|
||
|
if ($feed->priority () >= $minPriority) {
|
||
|
$n += $feed->nbNotRead();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return $n;
|
||
|
}
|
||
|
|
||
|
public static function daoToCategoryPrepopulated ($listDAO) {
|
||
|
$list = array ();
|
||
|
|
||
|
if (!is_array ($listDAO)) {
|
||
|
$listDAO = array ($listDAO);
|
||
|
}
|
||
|
|
||
|
$previousLine = null;
|
||
|
$feedsDao = array();
|
||
|
foreach ($listDAO as $line) {
|
||
|
if ($previousLine['c_id'] != null && $line['c_id'] !== $previousLine['c_id']) {
|
||
|
// End of the current category, we add it to the $list
|
||
|
$cat = new FreshRSS_Category (
|
||
|
$previousLine['c_name'],
|
||
|
isset($previousLine['c_color']) ? $previousLine['c_color'] : '',
|
||
|
HelperFeed::daoToFeed ($feedsDao, $previousLine['c_id'])
|
||
|
);
|
||
|
$cat->_id ($previousLine['c_id']);
|
||
|
$list[$previousLine['c_id']] = $cat;
|
||
|
|
||
|
$feedsDao = array(); //Prepare for next category
|
||
|
}
|
||
|
|
||
|
$previousLine = $line;
|
||
|
$feedsDao[] = $line;
|
||
|
}
|
||
|
|
||
|
// add the last category
|
||
|
if ($previousLine != null) {
|
||
|
$cat = new FreshRSS_Category (
|
||
|
$previousLine['c_name'],
|
||
|
isset($previousLine['c_color']) ? $previousLine['c_color'] : '',
|
||
|
HelperFeed::daoToFeed ($feedsDao, $previousLine['c_id'])
|
||
|
);
|
||
|
$cat->_id ($previousLine['c_id']);
|
||
|
$list[$previousLine['c_id']] = $cat;
|
||
|
}
|
||
|
|
||
|
return $list;
|
||
|
}
|
||
|
|
||
|
public static function daoToCategory ($listDAO) {
|
||
|
$list = array ();
|
||
|
|
||
|
if (!is_array ($listDAO)) {
|
||
|
$listDAO = array ($listDAO);
|
||
|
}
|
||
|
|
||
|
foreach ($listDAO as $key => $dao) {
|
||
|
$cat = new FreshRSS_Category (
|
||
|
$dao['name'],
|
||
|
$dao['color']
|
||
|
);
|
||
|
$cat->_id ($dao['id']);
|
||
|
$list[$key] = $cat;
|
||
|
}
|
||
|
|
||
|
return $list;
|
||
|
}
|
||
|
}
|