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.
226 lines
4.6 KiB
226 lines
4.6 KiB
<?php |
|
|
|
/** |
|
* Contains the description of a user query |
|
* |
|
* It allows to extract the meaningful bits of the query to be manipulated in an |
|
* easy way. |
|
*/ |
|
class FreshRSS_UserQuery { |
|
|
|
private $deprecated = false; |
|
private $get; |
|
private $get_name; |
|
private $get_type; |
|
private $name; |
|
private $order; |
|
private $search; |
|
private $state; |
|
private $url; |
|
private $feed_dao; |
|
private $category_dao; |
|
|
|
/** |
|
* @param array $query |
|
* @param FreshRSS_Searchable $feed_dao |
|
* @param FreshRSS_Searchable $category_dao |
|
*/ |
|
public function __construct($query, FreshRSS_Searchable $feed_dao = null, FreshRSS_Searchable $category_dao = null) { |
|
$this->category_dao = $category_dao; |
|
$this->feed_dao = $feed_dao; |
|
if (isset($query['get'])) { |
|
$this->parseGet($query['get']); |
|
} |
|
if (isset($query['name'])) { |
|
$this->name = $query['name']; |
|
} |
|
if (isset($query['order'])) { |
|
$this->order = $query['order']; |
|
} |
|
if (!isset($query['search'])) { |
|
$query['search'] = ''; |
|
} |
|
// linked to deeply with the search object, need to use dependency injection |
|
$this->search = new FreshRSS_Search($query['search']); |
|
if (isset($query['state'])) { |
|
$this->state = $query['state']; |
|
} |
|
if (isset($query['url'])) { |
|
$this->url = $query['url']; |
|
} |
|
} |
|
|
|
/** |
|
* Convert the current object to an array. |
|
* |
|
* @return array |
|
*/ |
|
public function toArray() { |
|
return array_filter(array( |
|
'get' => $this->get, |
|
'name' => $this->name, |
|
'order' => $this->order, |
|
'search' => $this->search->__toString(), |
|
'state' => $this->state, |
|
'url' => $this->url, |
|
)); |
|
} |
|
|
|
/** |
|
* Parse the get parameter in the query string to extract its name and |
|
* type |
|
* |
|
* @param string $get |
|
*/ |
|
private function parseGet($get) { |
|
$this->get = $get; |
|
if (preg_match('/(?P<type>[acfs])(_(?P<id>\d+))?/', $get, $matches)) { |
|
switch ($matches['type']) { |
|
case 'a': |
|
$this->parseAll(); |
|
break; |
|
case 'c': |
|
$this->parseCategory($matches['id']); |
|
break; |
|
case 'f': |
|
$this->parseFeed($matches['id']); |
|
break; |
|
case 's': |
|
$this->parseFavorite(); |
|
break; |
|
} |
|
} |
|
} |
|
|
|
/** |
|
* Parse the query string when it is an "all" query |
|
*/ |
|
private function parseAll() { |
|
$this->get_name = 'all'; |
|
$this->get_type = 'all'; |
|
} |
|
|
|
/** |
|
* Parse the query string when it is a "category" query |
|
* |
|
* @param integer $id |
|
* @throws FreshRSS_DAO_Exception |
|
*/ |
|
private function parseCategory($id) { |
|
if (is_null($this->category_dao)) { |
|
throw new FreshRSS_DAO_Exception('Category DAO is not loaded in UserQuery'); |
|
} |
|
$category = $this->category_dao->searchById($id); |
|
if ($category) { |
|
$this->get_name = $category->name(); |
|
} else { |
|
$this->deprecated = true; |
|
} |
|
$this->get_type = 'category'; |
|
} |
|
|
|
/** |
|
* Parse the query string when it is a "feed" query |
|
* |
|
* @param integer $id |
|
* @throws FreshRSS_DAO_Exception |
|
*/ |
|
private function parseFeed($id) { |
|
if (is_null($this->feed_dao)) { |
|
throw new FreshRSS_DAO_Exception('Feed DAO is not loaded in UserQuery'); |
|
} |
|
$feed = $this->feed_dao->searchById($id); |
|
if ($feed) { |
|
$this->get_name = $feed->name(); |
|
} else { |
|
$this->deprecated = true; |
|
} |
|
$this->get_type = 'feed'; |
|
} |
|
|
|
/** |
|
* Parse the query string when it is a "favorite" query |
|
*/ |
|
private function parseFavorite() { |
|
$this->get_name = 'favorite'; |
|
$this->get_type = 'favorite'; |
|
} |
|
|
|
/** |
|
* Check if the current user query is deprecated. |
|
* It is deprecated if the category or the feed used in the query are |
|
* not existing. |
|
* |
|
* @return boolean |
|
*/ |
|
public function isDeprecated() { |
|
return $this->deprecated; |
|
} |
|
|
|
/** |
|
* Check if the user query has parameters. |
|
* If the type is 'all', it is considered equal to no parameters |
|
* |
|
* @return boolean |
|
*/ |
|
public function hasParameters() { |
|
if ($this->get_type === 'all') { |
|
return false; |
|
} |
|
if ($this->hasSearch()) { |
|
return true; |
|
} |
|
if ($this->state) { |
|
return true; |
|
} |
|
if ($this->order) { |
|
return true; |
|
} |
|
if ($this->get) { |
|
return true; |
|
} |
|
return false; |
|
} |
|
|
|
/** |
|
* Check if there is a search in the search object |
|
* |
|
* @return boolean |
|
*/ |
|
public function hasSearch() { |
|
return $this->search->getRawInput() != ""; |
|
} |
|
|
|
public function getGet() { |
|
return $this->get; |
|
} |
|
|
|
public function getGetName() { |
|
return $this->get_name; |
|
} |
|
|
|
public function getGetType() { |
|
return $this->get_type; |
|
} |
|
|
|
public function getName() { |
|
return $this->name; |
|
} |
|
|
|
public function getOrder() { |
|
return $this->order; |
|
} |
|
|
|
public function getSearch() { |
|
return $this->search; |
|
} |
|
|
|
public function getState() { |
|
return $this->state; |
|
} |
|
|
|
public function getUrl() { |
|
return $this->url; |
|
} |
|
|
|
}
|
|
|