2011-12-13 05:29:22 +00:00
< ? php
2012-08-17 10:20:55 +00:00
class Pref_Feeds extends Handler_Protected {
2021-03-06 08:17:15 +00:00
const E_ICON_FILE_TOO_LARGE = 'E_ICON_FILE_TOO_LARGE' ;
const E_ICON_RENAME_FAILED = 'E_ICON_RENAME_FAILED' ;
const E_ICON_UPLOAD_FAILED = 'E_ICON_UPLOAD_FAILED' ;
const E_ICON_UPLOAD_SUCCESS = 'E_ICON_UPLOAD_SUCCESS' ;
2011-12-26 08:02:52 +00:00
function csrf_ignore ( $method ) {
2021-02-20 10:32:09 +00:00
$csrf_ignored = array ( " index " , " getfeedtree " , " savefeedorder " );
2011-12-26 08:02:52 +00:00
return array_search ( $method , $csrf_ignored ) !== false ;
}
2019-02-20 12:12:37 +00:00
public static function get_ts_languages () {
$rv = [];
2021-02-22 18:47:48 +00:00
if ( Config :: get ( Config :: DB_TYPE ) == " pgsql " ) {
2019-02-20 12:12:37 +00:00
$dbh = Db :: pdo ();
$res = $dbh -> query ( " SELECT cfgname FROM pg_ts_config " );
while ( $row = $res -> fetch ()) {
array_push ( $rv , ucfirst ( $row [ 'cfgname' ]));
}
}
return $rv ;
}
2021-03-01 17:25:53 +00:00
function renameCat () {
$cat = ORM :: for_table ( " ttrss_feed_categories " )
-> where ( " owner_uid " , $_SESSION [ " uid " ])
-> find_one ( $_REQUEST [ 'id' ]);
2017-12-03 20:35:38 +00:00
$title = clean ( $_REQUEST [ 'title' ]);
2011-12-13 05:29:22 +00:00
2021-03-01 17:25:53 +00:00
if ( $cat && $title ) {
$cat -> title = $title ;
$cat -> save ();
2011-12-13 05:29:22 +00:00
}
}
2012-08-13 10:47:43 +00:00
private function get_category_items ( $cat_id ) {
2012-09-15 12:24:00 +00:00
2021-02-05 20:41:32 +00:00
if ( clean ( $_REQUEST [ 'mode' ] ? ? 0 ) != 2 )
$search = $_SESSION [ " prefs_feed_search " ] ? ? " " ;
2012-09-15 12:24:00 +00:00
else
$search = " " ;
2012-09-13 08:47:09 +00:00
2013-03-28 11:28:37 +00:00
// first one is set by API
2021-02-05 20:41:32 +00:00
$show_empty_cats = clean ( $_REQUEST [ 'force_show_empty' ] ? ? false ) ||
( clean ( $_REQUEST [ 'mode' ] ? ? 0 ) != 2 && ! $search );
2012-08-13 10:47:43 +00:00
$items = array ();
2017-12-02 10:49:35 +00:00
$sth = $this -> pdo -> prepare ( " SELECT id, title FROM ttrss_feed_categories
WHERE owner_uid = ? AND parent_cat = ? ORDER BY order_id , title " );
$sth -> execute ([ $_SESSION [ 'uid' ], $cat_id ]);
2012-08-13 10:47:43 +00:00
2017-12-02 10:49:35 +00:00
while ( $line = $sth -> fetch ()) {
2012-08-13 10:47:43 +00:00
$cat = array ();
$cat [ 'id' ] = 'CAT:' . $line [ 'id' ];
2012-08-13 14:56:55 +00:00
$cat [ 'bare_id' ] = ( int ) $line [ 'id' ];
2012-08-13 10:47:43 +00:00
$cat [ 'name' ] = $line [ 'title' ];
$cat [ 'items' ] = array ();
$cat [ 'checkbox' ] = false ;
$cat [ 'type' ] = 'category' ;
2019-05-06 06:32:08 +00:00
$cat [ 'unread' ] = - 1 ;
$cat [ 'child_unread' ] = - 1 ;
$cat [ 'auxcounter' ] = - 1 ;
2014-06-14 10:37:05 +00:00
$cat [ 'parent_id' ] = $cat_id ;
2012-08-13 10:47:43 +00:00
$cat [ 'items' ] = $this -> get_category_items ( $line [ 'id' ]);
2013-06-07 11:31:43 +00:00
$num_children = $this -> calculate_children_count ( $cat );
2020-12-16 13:55:32 +00:00
$cat [ 'param' ] = sprintf ( _ngettext ( '(%d feed)' , '(%d feeds)' , ( int ) $num_children ), $num_children );
2012-08-13 10:47:43 +00:00
2013-06-07 11:31:43 +00:00
if ( $num_children > 0 || $show_empty_cats )
2012-08-13 10:47:43 +00:00
array_push ( $items , $cat );
}
2017-12-02 10:49:35 +00:00
$fsth = $this -> pdo -> prepare ( " SELECT id, title, last_error,
2018-02-08 10:54:06 +00:00
" .SUBSTRING_FOR_DATE. " ( last_updated , 1 , 19 ) AS last_updated , update_interval
2012-08-13 10:47:43 +00:00
FROM ttrss_feeds
2018-11-03 12:08:43 +00:00
WHERE cat_id = : cat AND
2017-12-02 10:49:35 +00:00
owner_uid = : uid AND
( : search = '' OR ( LOWER ( title ) LIKE : search OR LOWER ( feed_url ) LIKE : search ))
ORDER BY order_id , title " );
$fsth -> execute ([ " :cat " => $cat_id , " :uid " => $_SESSION [ 'uid' ], " :search " => $search ? " % $search % " : " " ]);
2012-08-13 10:47:43 +00:00
2017-12-02 10:49:35 +00:00
while ( $feed_line = $fsth -> fetch ()) {
2012-08-13 10:47:43 +00:00
$feed = array ();
$feed [ 'id' ] = 'FEED:' . $feed_line [ 'id' ];
2012-08-13 14:56:55 +00:00
$feed [ 'bare_id' ] = ( int ) $feed_line [ 'id' ];
2019-05-06 06:32:08 +00:00
$feed [ 'auxcounter' ] = - 1 ;
2012-08-13 10:47:43 +00:00
$feed [ 'name' ] = $feed_line [ 'title' ];
$feed [ 'checkbox' ] = false ;
2019-05-06 06:32:08 +00:00
$feed [ 'unread' ] = - 1 ;
2012-08-13 10:47:43 +00:00
$feed [ 'error' ] = $feed_line [ 'last_error' ];
2021-02-15 12:43:07 +00:00
$feed [ 'icon' ] = Feeds :: _get_icon ( $feed_line [ 'id' ]);
2020-09-23 10:04:26 +00:00
$feed [ 'param' ] = TimeHelper :: make_local_datetime (
2012-08-13 10:47:43 +00:00
$feed_line [ 'last_updated' ], true );
2018-02-08 10:54:06 +00:00
$feed [ 'updates_disabled' ] = ( int )( $feed_line [ 'update_interval' ] < 0 );
2012-08-13 10:47:43 +00:00
array_push ( $items , $feed );
}
return $items ;
}
2011-12-13 05:29:22 +00:00
function getfeedtree () {
2021-02-20 10:32:09 +00:00
print json_encode ( $this -> _makefeedtree ());
2013-03-28 07:04:15 +00:00
}
2021-02-20 10:32:09 +00:00
function _makefeedtree () {
2011-12-13 05:29:22 +00:00
2021-02-05 20:41:32 +00:00
if ( clean ( $_REQUEST [ 'mode' ] ? ? 0 ) != 2 )
$search = $_SESSION [ " prefs_feed_search " ] ? ? " " ;
2012-09-15 12:24:00 +00:00
else
$search = " " ;
2011-12-13 05:29:22 +00:00
$root = array ();
$root [ 'id' ] = 'root' ;
$root [ 'name' ] = __ ( 'Feeds' );
$root [ 'items' ] = array ();
2020-12-12 16:18:50 +00:00
$root [ 'param' ] = 0 ;
2011-12-13 05:29:22 +00:00
$root [ 'type' ] = 'category' ;
2021-02-25 11:49:58 +00:00
$enable_cats = get_pref ( Prefs :: ENABLE_FEED_CATS );
2012-08-13 14:56:55 +00:00
2021-02-05 20:41:32 +00:00
if ( clean ( $_REQUEST [ 'mode' ] ? ? 0 ) == 2 ) {
2012-08-13 14:56:55 +00:00
if ( $enable_cats ) {
2013-02-27 11:34:13 +00:00
$cat = $this -> feedlist_init_cat ( - 1 );
2012-08-13 14:56:55 +00:00
} else {
$cat [ 'items' ] = array ();
}
2012-08-27 06:08:11 +00:00
foreach ( array ( - 4 , - 3 , - 1 , - 2 , 0 , - 6 ) as $i ) {
2012-08-13 14:56:55 +00:00
array_push ( $cat [ 'items' ], $this -> feedlist_init_feed ( $i ));
}
2013-03-27 12:14:27 +00:00
/* Plugin feeds for -1 */
2013-04-18 08:27:34 +00:00
$feeds = PluginHost :: getInstance () -> get_feeds ( - 1 );
2013-03-27 12:14:27 +00:00
if ( $feeds ) {
foreach ( $feeds as $feed ) {
$feed_id = PluginHost :: pfeed_to_feed_id ( $feed [ 'id' ]);
$item = array ();
$item [ 'id' ] = 'FEED:' . $feed_id ;
$item [ 'bare_id' ] = ( int ) $feed_id ;
2019-05-06 06:32:08 +00:00
$item [ 'auxcounter' ] = - 1 ;
2013-03-27 12:14:27 +00:00
$item [ 'name' ] = $feed [ 'title' ];
$item [ 'checkbox' ] = false ;
$item [ 'error' ] = '' ;
$item [ 'icon' ] = $feed [ 'icon' ];
$item [ 'param' ] = '' ;
2019-05-06 06:32:08 +00:00
$item [ 'unread' ] = - 1 ;
2013-03-27 12:14:27 +00:00
$item [ 'type' ] = 'feed' ;
array_push ( $cat [ 'items' ], $item );
}
}
2012-08-13 14:56:55 +00:00
if ( $enable_cats ) {
array_push ( $root [ 'items' ], $cat );
} else {
$root [ 'items' ] = array_merge ( $root [ 'items' ], $cat [ 'items' ]);
}
2011-12-13 05:29:22 +00:00
2017-12-02 12:04:11 +00:00
$sth = $this -> pdo -> prepare ( " SELECT * FROM
ttrss_labels2 WHERE owner_uid = ? ORDER by caption " );
$sth -> execute ([ $_SESSION [ 'uid' ]]);
2012-08-13 14:56:55 +00:00
2021-02-25 11:49:58 +00:00
if ( get_pref ( Prefs :: ENABLE_FEED_CATS )) {
2017-12-02 12:04:11 +00:00
$cat = $this -> feedlist_init_cat ( - 2 );
} else {
$cat [ 'items' ] = array ();
}
2012-08-13 14:56:55 +00:00
2017-12-02 12:04:11 +00:00
$num_labels = 0 ;
while ( $line = $sth -> fetch ()) {
++ $num_labels ;
2012-08-13 14:56:55 +00:00
2017-12-02 12:04:11 +00:00
$label_id = Labels :: label_to_feed_id ( $line [ 'id' ]);
2012-08-13 14:56:55 +00:00
2017-12-02 12:04:11 +00:00
$feed = $this -> feedlist_init_feed ( $label_id , false , 0 );
2012-08-13 14:56:55 +00:00
2017-12-02 12:04:11 +00:00
$feed [ 'fg_color' ] = $line [ 'fg_color' ];
$feed [ 'bg_color' ] = $line [ 'bg_color' ];
2012-08-13 14:56:55 +00:00
2017-12-02 12:04:11 +00:00
array_push ( $cat [ 'items' ], $feed );
}
2012-08-13 14:56:55 +00:00
2017-12-02 12:04:11 +00:00
if ( $num_labels ) {
2012-08-13 14:56:55 +00:00
if ( $enable_cats ) {
array_push ( $root [ 'items' ], $cat );
} else {
$root [ 'items' ] = array_merge ( $root [ 'items' ], $cat [ 'items' ]);
}
}
}
if ( $enable_cats ) {
2021-02-05 20:41:32 +00:00
$show_empty_cats = clean ( $_REQUEST [ 'force_show_empty' ] ? ? false ) ||
( clean ( $_REQUEST [ 'mode' ] ? ? 0 ) != 2 && ! $search );
2012-08-13 14:56:55 +00:00
2017-12-02 12:04:11 +00:00
$sth = $this -> pdo -> prepare ( " SELECT id, title FROM ttrss_feed_categories
WHERE owner_uid = ? AND parent_cat IS NULL ORDER BY order_id , title " );
$sth -> execute ([ $_SESSION [ 'uid' ]]);
2011-12-13 05:29:22 +00:00
2017-12-02 12:04:11 +00:00
while ( $line = $sth -> fetch ()) {
2011-12-13 05:29:22 +00:00
$cat = array ();
$cat [ 'id' ] = 'CAT:' . $line [ 'id' ];
2012-08-13 14:56:55 +00:00
$cat [ 'bare_id' ] = ( int ) $line [ 'id' ];
2019-05-06 06:32:08 +00:00
$cat [ 'auxcounter' ] = - 1 ;
2011-12-13 05:29:22 +00:00
$cat [ 'name' ] = $line [ 'title' ];
$cat [ 'items' ] = array ();
$cat [ 'checkbox' ] = false ;
$cat [ 'type' ] = 'category' ;
2019-05-06 06:32:08 +00:00
$cat [ 'unread' ] = - 1 ;
$cat [ 'child_unread' ] = - 1 ;
2011-12-13 05:29:22 +00:00
2012-08-13 10:47:43 +00:00
$cat [ 'items' ] = $this -> get_category_items ( $line [ 'id' ]);
2011-12-13 05:29:22 +00:00
2013-06-07 11:31:43 +00:00
$num_children = $this -> calculate_children_count ( $cat );
2020-12-12 16:18:50 +00:00
$cat [ 'param' ] = sprintf ( _ngettext ( '(%d feed)' , '(%d feeds)' , ( int ) $num_children ), $num_children );
2011-12-13 05:29:22 +00:00
2013-06-07 11:31:43 +00:00
if ( $num_children > 0 || $show_empty_cats )
2011-12-13 05:29:22 +00:00
array_push ( $root [ 'items' ], $cat );
$root [ 'param' ] += count ( $cat [ 'items' ]);
}
/* Uncategorized is a special case */
$cat = array ();
$cat [ 'id' ] = 'CAT:0' ;
$cat [ 'bare_id' ] = 0 ;
2019-05-06 06:32:08 +00:00
$cat [ 'auxcounter' ] = - 1 ;
2011-12-13 05:29:22 +00:00
$cat [ 'name' ] = __ ( " Uncategorized " );
$cat [ 'items' ] = array ();
$cat [ 'type' ] = 'category' ;
$cat [ 'checkbox' ] = false ;
2019-05-06 06:32:08 +00:00
$cat [ 'unread' ] = - 1 ;
$cat [ 'child_unread' ] = - 1 ;
2011-12-13 05:29:22 +00:00
2017-12-02 12:04:11 +00:00
$fsth = $this -> pdo -> prepare ( " SELECT id, title,last_error,
2018-11-03 12:08:43 +00:00
" .SUBSTRING_FOR_DATE. " ( last_updated , 1 , 19 ) AS last_updated , update_interval
2011-12-13 05:29:22 +00:00
FROM ttrss_feeds
2018-11-03 12:08:43 +00:00
WHERE cat_id IS NULL AND
2017-12-02 12:04:11 +00:00
owner_uid = : uid AND
( : search = '' OR ( LOWER ( title ) LIKE : search OR LOWER ( feed_url ) LIKE : search ))
ORDER BY order_id , title " );
$fsth -> execute ([ " :uid " => $_SESSION [ 'uid' ], " :search " => $search ? " % $search % " : " " ]);
2011-12-13 05:29:22 +00:00
2017-12-02 12:04:11 +00:00
while ( $feed_line = $fsth -> fetch ()) {
2011-12-13 05:29:22 +00:00
$feed = array ();
$feed [ 'id' ] = 'FEED:' . $feed_line [ 'id' ];
2012-08-13 14:56:55 +00:00
$feed [ 'bare_id' ] = ( int ) $feed_line [ 'id' ];
2019-05-06 06:32:08 +00:00
$feed [ 'auxcounter' ] = - 1 ;
2011-12-13 05:29:22 +00:00
$feed [ 'name' ] = $feed_line [ 'title' ];
$feed [ 'checkbox' ] = false ;
$feed [ 'error' ] = $feed_line [ 'last_error' ];
2021-02-15 12:43:07 +00:00
$feed [ 'icon' ] = Feeds :: _get_icon ( $feed_line [ 'id' ]);
2020-09-23 10:04:26 +00:00
$feed [ 'param' ] = TimeHelper :: make_local_datetime (
2011-12-13 05:29:22 +00:00
$feed_line [ 'last_updated' ], true );
2019-05-06 06:32:08 +00:00
$feed [ 'unread' ] = - 1 ;
2012-08-13 14:56:55 +00:00
$feed [ 'type' ] = 'feed' ;
2018-02-08 10:54:06 +00:00
$feed [ 'updates_disabled' ] = ( int )( $feed_line [ 'update_interval' ] < 0 );
2011-12-13 05:29:22 +00:00
array_push ( $cat [ 'items' ], $feed );
}
2020-12-12 16:18:50 +00:00
$cat [ 'param' ] = sprintf ( _ngettext ( '(%d feed)' , '(%d feeds)' , count ( $cat [ 'items' ])), count ( $cat [ 'items' ]));
2011-12-13 05:29:22 +00:00
2012-03-05 08:08:39 +00:00
if ( count ( $cat [ 'items' ]) > 0 || $show_empty_cats )
2011-12-13 05:29:22 +00:00
array_push ( $root [ 'items' ], $cat );
2013-06-07 11:31:43 +00:00
$num_children = $this -> calculate_children_count ( $root );
2020-12-12 16:18:50 +00:00
$root [ 'param' ] = sprintf ( _ngettext ( '(%d feed)' , '(%d feeds)' , ( int ) $num_children ), $num_children );
2011-12-13 05:29:22 +00:00
} else {
2017-12-02 12:04:11 +00:00
$fsth = $this -> pdo -> prepare ( " SELECT id, title, last_error,
2018-02-08 10:54:06 +00:00
" .SUBSTRING_FOR_DATE. " ( last_updated , 1 , 19 ) AS last_updated , update_interval
2011-12-13 05:29:22 +00:00
FROM ttrss_feeds
2017-12-02 12:04:11 +00:00
WHERE owner_uid = : uid AND
( : search = '' OR ( LOWER ( title ) LIKE : search OR LOWER ( feed_url ) LIKE : search ))
ORDER BY order_id , title " );
$fsth -> execute ([ " :uid " => $_SESSION [ 'uid' ], " :search " => $search ? " % $search % " : " " ]);
2011-12-13 05:29:22 +00:00
2017-12-02 12:04:11 +00:00
while ( $feed_line = $fsth -> fetch ()) {
2011-12-13 05:29:22 +00:00
$feed = array ();
$feed [ 'id' ] = 'FEED:' . $feed_line [ 'id' ];
2012-08-13 14:56:55 +00:00
$feed [ 'bare_id' ] = ( int ) $feed_line [ 'id' ];
2019-05-06 06:32:08 +00:00
$feed [ 'auxcounter' ] = - 1 ;
2011-12-13 05:29:22 +00:00
$feed [ 'name' ] = $feed_line [ 'title' ];
$feed [ 'checkbox' ] = false ;
$feed [ 'error' ] = $feed_line [ 'last_error' ];
2021-02-15 12:43:07 +00:00
$feed [ 'icon' ] = Feeds :: _get_icon ( $feed_line [ 'id' ]);
2020-09-23 10:04:26 +00:00
$feed [ 'param' ] = TimeHelper :: make_local_datetime (
2011-12-13 05:29:22 +00:00
$feed_line [ 'last_updated' ], true );
2019-05-06 06:32:08 +00:00
$feed [ 'unread' ] = - 1 ;
2012-08-13 14:56:55 +00:00
$feed [ 'type' ] = 'feed' ;
2018-02-08 10:54:06 +00:00
$feed [ 'updates_disabled' ] = ( int )( $feed_line [ 'update_interval' ] < 0 );
2011-12-13 05:29:22 +00:00
array_push ( $root [ 'items' ], $feed );
}
2020-12-12 16:18:50 +00:00
$root [ 'param' ] = sprintf ( _ngettext ( '(%d feed)' , '(%d feeds)' , count ( $root [ 'items' ])), count ( $root [ 'items' ]));
2011-12-13 05:29:22 +00:00
}
$fl = array ();
$fl [ 'identifier' ] = 'id' ;
$fl [ 'label' ] = 'name' ;
2012-08-13 14:56:55 +00:00
2021-02-05 20:41:32 +00:00
if ( clean ( $_REQUEST [ 'mode' ] ? ? 0 ) != 2 ) {
2012-08-13 14:56:55 +00:00
$fl [ 'items' ] = array ( $root );
} else {
2015-12-04 06:29:58 +00:00
$fl [ 'items' ] = $root [ 'items' ];
2012-08-13 14:56:55 +00:00
}
2011-12-13 05:29:22 +00:00
2013-03-28 07:04:15 +00:00
return $fl ;
2011-12-13 05:29:22 +00:00
}
function catsortreset () {
2017-12-02 12:04:11 +00:00
$sth = $this -> pdo -> prepare ( " UPDATE ttrss_feed_categories
SET order_id = 0 WHERE owner_uid = ? " );
$sth -> execute ([ $_SESSION [ 'uid' ]]);
2011-12-13 05:29:22 +00:00
}
function feedsortreset () {
2017-12-02 12:04:11 +00:00
$sth = $this -> pdo -> prepare ( " UPDATE ttrss_feeds
SET order_id = 0 WHERE owner_uid = ? " );
$sth -> execute ([ $_SESSION [ 'uid' ]]);
2011-12-13 05:29:22 +00:00
}
2012-08-15 06:10:24 +00:00
private function process_category_order ( & $data_map , $item_id , $parent_id = false , $nest_level = 0 ) {
$prefix = " " ;
for ( $i = 0 ; $i < $nest_level ; $i ++ )
$prefix .= " " ;
2018-11-30 05:34:29 +00:00
Debug :: log ( " $prefix C: $item_id P: $parent_id " );
2012-08-15 06:10:24 +00:00
2017-12-02 10:49:35 +00:00
$bare_item_id = substr ( $item_id , strpos ( $item_id , ':' ) + 1 );
2012-08-13 10:47:43 +00:00
if ( $item_id != 'root' ) {
if ( $parent_id && $parent_id != 'root' ) {
$parent_bare_id = substr ( $parent_id , strpos ( $parent_id , ':' ) + 1 );
2017-12-02 10:49:35 +00:00
$parent_qpart = $parent_bare_id ;
2012-08-13 10:47:43 +00:00
} else {
2017-12-02 12:04:11 +00:00
$parent_qpart = null ;
2012-08-13 10:47:43 +00:00
}
2017-12-02 12:04:11 +00:00
$sth = $this -> pdo -> prepare ( " UPDATE ttrss_feed_categories
SET parent_cat = ? WHERE id = ? AND
owner_uid = ? " );
$sth -> execute ([ $parent_qpart , $bare_item_id , $_SESSION [ 'uid' ]]);
2012-08-13 10:47:43 +00:00
}
2017-06-26 13:29:57 +00:00
$order_id = 1 ;
2012-08-13 10:47:43 +00:00
$cat = $data_map [ $item_id ];
if ( $cat && is_array ( $cat )) {
foreach ( $cat as $item ) {
$id = $item [ '_reference' ];
2017-12-02 10:49:35 +00:00
$bare_id = substr ( $id , strpos ( $id , ':' ) + 1 );
2012-08-13 10:47:43 +00:00
2018-11-30 05:34:29 +00:00
Debug :: log ( " $prefix [ $order_id ] $id / $bare_id " );
2012-08-13 10:47:43 +00:00
if ( $item [ '_reference' ]) {
if ( strpos ( $id , " FEED " ) === 0 ) {
2017-12-02 12:04:11 +00:00
$cat_id = ( $item_id != " root " ) ? $bare_item_id : null ;
2012-08-15 06:10:24 +00:00
2017-12-02 12:04:11 +00:00
$sth = $this -> pdo -> prepare ( " UPDATE ttrss_feeds
SET order_id = ? , cat_id = ?
WHERE id = ? AND owner_uid = ? " );
2012-11-06 11:48:47 +00:00
2017-12-02 12:04:11 +00:00
$sth -> execute ([ $order_id , $cat_id ? $cat_id : null , $bare_id , $_SESSION [ 'uid' ]]);
2012-08-13 10:47:43 +00:00
} else if ( strpos ( $id , " CAT: " ) === 0 ) {
2012-08-15 06:10:24 +00:00
$this -> process_category_order ( $data_map , $item [ '_reference' ], $item_id ,
$nest_level + 1 );
2012-08-13 10:47:43 +00:00
2017-12-02 12:04:11 +00:00
$sth = $this -> pdo -> prepare ( " UPDATE ttrss_feed_categories
SET order_id = ? WHERE id = ? AND
owner_uid = ? " );
$sth -> execute ([ $order_id , $bare_id , $_SESSION [ 'uid' ]]);
2012-08-13 10:47:43 +00:00
}
}
++ $order_id ;
}
}
}
2011-12-13 05:29:22 +00:00
function savefeedorder () {
2018-02-04 06:33:28 +00:00
$data = json_decode ( $_POST [ 'payload' ], true );
2011-12-13 05:29:22 +00:00
2017-12-03 20:35:38 +00:00
#file_put_contents("/tmp/saveorder.json", clean($_POST['payload']));
2012-08-13 10:47:43 +00:00
#$data = json_decode(file_get_contents("/tmp/saveorder.json"), true);
2012-08-14 15:37:31 +00:00
2012-08-15 06:10:24 +00:00
if ( ! is_array ( $data [ 'items' ]))
$data [ 'items' ] = json_decode ( $data [ 'items' ], true );
# print_r($data['items']);
2012-08-13 10:47:43 +00:00
2011-12-13 05:29:22 +00:00
if ( is_array ( $data ) && is_array ( $data [ 'items' ])) {
2014-02-19 11:42:52 +00:00
# $cat_order_id = 0;
2011-12-13 05:29:22 +00:00
$data_map = array ();
2012-08-13 10:47:43 +00:00
$root_item = false ;
2011-12-13 05:29:22 +00:00
foreach ( $data [ 'items' ] as $item ) {
2012-08-13 10:47:43 +00:00
# if ($item['id'] != 'root') {
2011-12-13 05:29:22 +00:00
if ( is_array ( $item [ 'items' ])) {
if ( isset ( $item [ 'items' ][ '_reference' ])) {
$data_map [ $item [ 'id' ]] = array ( $item [ 'items' ]);
} else {
2015-12-04 06:29:58 +00:00
$data_map [ $item [ 'id' ]] = $item [ 'items' ];
2011-12-13 05:29:22 +00:00
}
}
2012-08-13 10:47:43 +00:00
if ( $item [ 'id' ] == 'root' ) {
$root_item = $item [ 'id' ];
2011-12-13 05:29:22 +00:00
}
}
2012-08-14 08:18:52 +00:00
$this -> process_category_order ( $data_map , $root_item );
2011-12-13 05:29:22 +00:00
}
}
2021-03-06 08:17:15 +00:00
function removeIcon () {
$feed_id = ( int ) $_REQUEST [ " feed_id " ];
$icon_file = Config :: get ( Config :: ICONS_DIR ) . " / $feed_id .ico " ;
$feed = ORM :: for_table ( 'ttrss_feeds' )
-> where ( 'owner_uid' , $_SESSION [ 'uid' ])
-> find_one ( $feed_id );
if ( $feed && file_exists ( $icon_file )) {
if ( unlink ( $icon_file )) {
$feed -> set ([
'favicon_avg_color' => null ,
'favicon_last_checked' => '1970-01-01' ,
'favicon_is_custom' => false ,
]);
$feed -> save ();
}
2011-12-13 05:29:22 +00:00
}
}
2021-03-06 08:17:15 +00:00
function uploadIcon () {
$feed_id = ( int ) $_REQUEST [ 'feed_id' ];
$tmp_file = tempnam ( Config :: get ( Config :: CACHE_DIR ) . '/upload' , 'icon' );
2013-02-28 05:17:17 +00:00
2021-03-06 08:17:15 +00:00
// default value
$rc = self :: E_ICON_UPLOAD_FAILED ;
2013-04-11 15:12:00 +00:00
2021-03-06 08:17:15 +00:00
$feed = ORM :: for_table ( 'ttrss_feeds' )
-> where ( 'owner_uid' , $_SESSION [ 'uid' ])
-> find_one ( $feed_id );
2021-02-20 07:26:09 +00:00
2021-03-06 08:17:15 +00:00
if ( $feed && $tmp_file && move_uploaded_file ( $_FILES [ 'icon_file' ][ 'tmp_name' ], $tmp_file )) {
if ( filesize ( $tmp_file ) < Config :: get ( Config :: MAX_FAVICON_FILE_SIZE )) {
2013-04-11 15:12:00 +00:00
2021-03-06 08:17:15 +00:00
$new_filename = Config :: get ( Config :: ICONS_DIR ) . " / $feed_id .ico " ;
2013-04-11 15:12:00 +00:00
2021-03-06 08:17:15 +00:00
if ( file_exists ( $new_filename )) unlink ( $new_filename );
if ( rename ( $tmp_file , $new_filename )) {
chmod ( $new_filename , 0644 );
2011-12-13 05:29:22 +00:00
2021-03-06 08:17:15 +00:00
$feed -> set ([
'favicon_avg_color' => null ,
'favicon_is_custom' => true ,
]);
2011-12-13 05:29:22 +00:00
2021-03-06 08:17:15 +00:00
if ( $feed -> save ()) {
$rc = self :: E_ICON_UPLOAD_SUCCESS ;
}
2013-04-15 14:22:48 +00:00
2021-03-06 08:17:15 +00:00
} else {
$rc = self :: E_ICON_RENAME_FAILED ;
2013-04-15 14:22:48 +00:00
}
2011-12-13 05:29:22 +00:00
} else {
2021-03-06 08:17:15 +00:00
$rc = self :: E_ICON_FILE_TOO_LARGE ;
2011-12-13 05:29:22 +00:00
}
}
2021-03-06 08:17:15 +00:00
if ( file_exists ( $tmp_file ))
unlink ( $tmp_file );
2013-04-11 15:12:00 +00:00
2021-03-06 08:17:15 +00:00
print json_encode ([ 'rc' => $rc , 'icon_url' => Feeds :: _get_icon ( $feed_id )]);
2011-12-13 05:29:22 +00:00
}
function editfeed () {
global $purge_intervals ;
global $update_intervals ;
2021-02-20 07:26:09 +00:00
$feed_id = ( int ) clean ( $_REQUEST [ " id " ]);
2011-12-13 05:29:22 +00:00
2021-03-01 17:25:53 +00:00
$row = ORM :: for_table ( 'ttrss_feeds' )
-> where ( " owner_uid " , $_SESSION [ " uid " ])
-> find_one ( $feed_id ) -> as_array ();
2011-12-13 05:29:22 +00:00
2021-03-01 17:25:53 +00:00
if ( $row ) {
2021-02-20 07:26:09 +00:00
ob_start ();
PluginHost :: getInstance () -> run_hooks ( PluginHost :: HOOK_PREFS_EDIT_FEED , $feed_id );
$plugin_data = trim (( string ) ob_get_contents ());
ob_end_clean ();
$row [ " icon " ] = Feeds :: _get_icon ( $feed_id );
$local_update_intervals = $update_intervals ;
2021-02-25 11:49:58 +00:00
$local_update_intervals [ 0 ] .= sprintf ( " (%s) " , $update_intervals [ get_pref ( Prefs :: DEFAULT_UPDATE_INTERVAL )]);
2021-02-20 07:26:09 +00:00
2021-02-22 18:47:48 +00:00
if ( Config :: get ( Config :: FORCE_ARTICLE_PURGE ) == 0 ) {
2021-02-20 07:26:09 +00:00
$local_purge_intervals = $purge_intervals ;
2021-02-25 11:49:58 +00:00
$default_purge_interval = get_pref ( Prefs :: PURGE_OLD_DAYS );
2021-02-20 07:26:09 +00:00
if ( $default_purge_interval > 0 )
$local_purge_intervals [ 0 ] .= " " . T_nsprintf ( '(%d day)' , '(%d days)' , $default_purge_interval , $default_purge_interval );
else
$local_purge_intervals [ 0 ] .= " " . sprintf ( " (%s) " , __ ( " Disabled " ));
} else {
2021-02-22 18:47:48 +00:00
$purge_interval = Config :: get ( Config :: FORCE_ARTICLE_PURGE );
2021-02-20 07:26:09 +00:00
$local_purge_intervals = [ T_nsprintf ( '%d day' , '%d days' , $purge_interval , $purge_interval ) ];
}
print json_encode ([
" feed " => $row ,
" cats " => [
2021-02-25 11:49:58 +00:00
" enabled " => get_pref ( Prefs :: ENABLE_FEED_CATS ),
2021-02-20 07:26:09 +00:00
" select " => \Controls\select_feeds_cats ( " cat_id " , $row [ " cat_id " ]),
],
" plugin_data " => $plugin_data ,
2021-02-22 18:47:48 +00:00
" force_purge " => ( int ) Config :: get ( Config :: FORCE_ARTICLE_PURGE ),
2021-02-20 07:26:09 +00:00
" intervals " => [
" update " => $local_update_intervals ,
" purge " => $local_purge_intervals ,
],
" lang " => [
2021-02-22 18:47:48 +00:00
" enabled " => Config :: get ( Config :: DB_TYPE ) == " pgsql " ,
2021-02-25 11:49:58 +00:00
" default " => get_pref ( Prefs :: DEFAULT_SEARCH_LANGUAGE ),
2021-02-20 07:26:09 +00:00
" all " => $this :: get_ts_languages (),
]
]);
}
2011-12-13 05:29:22 +00:00
}
2021-02-21 13:02:57 +00:00
private function _batch_toggle_checkbox ( $name ) {
return \Controls\checkbox_tag ( " " , false , " " ,
[ " data-control-for " => $name , " title " => __ ( " Check to enable field " ), " onchange " => " App.dialogOf(this).toggleField(this) " ]);
}
2011-12-13 05:29:22 +00:00
function editfeeds () {
global $purge_intervals ;
global $update_intervals ;
2011-12-13 10:15:42 +00:00
2017-12-03 20:35:38 +00:00
$feed_ids = clean ( $_REQUEST [ " ids " ]);
2011-12-13 05:29:22 +00:00
2020-11-30 12:29:22 +00:00
$local_update_intervals = $update_intervals ;
2021-02-25 11:49:58 +00:00
$local_update_intervals [ 0 ] .= sprintf ( " (%s) " , $update_intervals [ get_pref ( Prefs :: DEFAULT_UPDATE_INTERVAL )]);
2020-11-30 12:29:22 +00:00
2021-02-21 13:02:57 +00:00
$local_purge_intervals = $purge_intervals ;
2021-02-25 11:49:58 +00:00
$default_purge_interval = get_pref ( Prefs :: PURGE_OLD_DAYS );
2020-12-15 05:49:43 +00:00
2021-02-21 13:02:57 +00:00
if ( $default_purge_interval > 0 )
$local_purge_intervals [ 0 ] .= " " . T_sprintf ( " (%d days) " , $default_purge_interval );
else
$local_purge_intervals [ 0 ] .= " " . sprintf ( " (%s) " , __ ( " Disabled " ));
$options = [
" include_in_digest " => __ ( 'Include in e-mail digest' ),
" always_display_enclosures " => __ ( 'Always display image attachments' ),
" hide_images " => __ ( 'Do not embed media' ),
" cache_images " => __ ( 'Cache media' ),
" mark_unread_on_update " => __ ( 'Mark updated articles as unread' )
];
print_notice ( " Enable the options you wish to apply using checkboxes on the right. " );
?>
< ? = \Controls\hidden_tag ( " ids " , $feed_ids ) ?>
< ? = \Controls\hidden_tag ( " op " , " pref-feeds " ) ?>
< ? = \Controls\hidden_tag ( " method " , " batchEditSave " ) ?>
< div dojoType = " dijit.layout.TabContainer " style = " height : 450px " >
< div dojoType = " dijit.layout.ContentPane " title = " <?= __('General') ?> " >
< section >
2021-02-25 11:49:58 +00:00
< ? php if ( get_pref ( Prefs :: ENABLE_FEED_CATS )) { ?>
2021-02-21 13:02:57 +00:00
< fieldset >
< label >< ? = __ ( 'Place in category:' ) ?> </label>
< ? = \Controls\select_feeds_cats ( " cat_id " , null , [ 'disabled' => '1' ]) ?>
< ? = $this -> _batch_toggle_checkbox ( " cat_id " ) ?>
</ fieldset >
< ? php } ?>
2021-02-22 18:47:48 +00:00
< ? php if ( Config :: get ( Config :: DB_TYPE ) == " pgsql " ) { ?>
2021-02-21 13:02:57 +00:00
< fieldset >
< label >< ? = __ ( 'Language:' ) ?> </label>
< ? = \Controls\select_tag ( " feed_language " , " " , $this :: get_ts_languages (), [ " disabled " => 1 ]) ?>
< ? = $this -> _batch_toggle_checkbox ( " feed_language " ) ?>
</ fieldset >
< ? php } ?>
</ section >
< hr />
< section >
< fieldset >
< label >< ? = __ ( " Update interval: " ) ?> </label>
< ? = \Controls\select_hash ( " update_interval " , " " , $local_update_intervals , [ " disabled " => 1 ]) ?>
< ? = $this -> _batch_toggle_checkbox ( " update_interval " ) ?>
</ fieldset >
2021-02-22 18:47:48 +00:00
< ? php if ( Config :: get ( Config :: FORCE_ARTICLE_PURGE ) == 0 ) { ?>
2021-02-21 13:02:57 +00:00
< fieldset >
< label >< ? = __ ( 'Article purging:' ) ?> </label>
< ? = \Controls\select_hash ( " purge_interval " , " " , $local_purge_intervals , [ " disabled " => 1 ]) ?>
< ? = $this -> _batch_toggle_checkbox ( " purge_interval " ) ?>
</ fieldset >
< ? php } ?>
</ section >
</ div >
< div dojoType = " dijit.layout.ContentPane " title = " <?= __('Authentication') ?> " >
< section >
< fieldset >
< label >< ? = __ ( " Login: " ) ?> </label>
< input dojoType = 'dijit.form.TextBox'
disabled = '1' autocomplete = 'new-password' name = 'auth_login' value = '' >
< ? = $this -> _batch_toggle_checkbox ( " auth_login " ) ?>
</ fieldset >
< fieldset >
< label >< ? = __ ( " Password: " ) ?> </label>
< input dojoType = 'dijit.form.TextBox' type = 'password' name = 'auth_pass'
autocomplete = 'new-password' disabled = '1' value = '' >
< ? = $this -> _batch_toggle_checkbox ( " auth_pass " ) ?>
</ fieldset >
</ section >
</ div >
< div dojoType = " dijit.layout.ContentPane " title = " <?= __('Options') ?> " >
< ? php
foreach ( $options as $name => $caption ) {
?>
< fieldset class = 'narrow' >
< label class = " checkbox text-muted " >
< ? = \Controls\checkbox_tag ( $name , false , " " , [ " disabled " => " 1 " ]) ?>
< ? = $caption ?>
< ? = $this -> _batch_toggle_checkbox ( $name ) ?>
</ label >
</ fieldset >
< ? php } ?>
</ div >
</ div >
< footer >
< ? = \Controls\submit_tag ( __ ( " Save " )) ?>
< ? = \Controls\cancel_dialog_tag ( __ ( " Cancel " )) ?>
</ footer >
< ? php
2011-12-13 05:29:22 +00:00
}
function batchEditSave () {
2011-12-14 08:04:52 +00:00
return $this -> editsaveops ( true );
2011-12-13 05:29:22 +00:00
}
2011-12-13 10:15:42 +00:00
2011-12-13 05:29:22 +00:00
function editSave () {
2011-12-14 08:04:52 +00:00
return $this -> editsaveops ( false );
2011-12-13 05:29:22 +00:00
}
2011-12-13 10:15:42 +00:00
2021-02-20 10:32:09 +00:00
private function editsaveops ( $batch ) {
2011-12-13 10:15:42 +00:00
2021-02-05 20:41:32 +00:00
$feed_title = clean ( $_POST [ " title " ]);
$feed_url = clean ( $_POST [ " feed_url " ]);
$site_url = clean ( $_POST [ " site_url " ]);
2021-02-09 12:04:01 +00:00
$upd_intl = ( int ) clean ( $_POST [ " update_interval " ] ? ? 0 );
$purge_intl = ( int ) clean ( $_POST [ " purge_interval " ] ? ? 0 );
2021-02-08 08:46:43 +00:00
$feed_id = ( int ) clean ( $_POST [ " id " ] ? ? 0 ); /* editSave */
$feed_ids = explode ( " , " , clean ( $_POST [ " ids " ] ? ? " " )); /* batchEditSave */
2021-03-08 08:16:32 +00:00
$cat_id = ( int ) clean ( $_POST [ " cat_id " ] ? ? 0 );
2021-02-05 20:41:32 +00:00
$auth_login = clean ( $_POST [ " auth_login " ]);
$auth_pass = clean ( $_POST [ " auth_pass " ]);
2021-02-08 08:46:43 +00:00
$private = checkbox_to_sql_bool ( clean ( $_POST [ " private " ] ? ? " " ));
2011-12-13 05:29:22 +00:00
$include_in_digest = checkbox_to_sql_bool (
2021-02-08 08:46:43 +00:00
clean ( $_POST [ " include_in_digest " ] ? ? " " ));
2011-12-13 05:29:22 +00:00
$cache_images = checkbox_to_sql_bool (
2021-02-08 08:46:43 +00:00
clean ( $_POST [ " cache_images " ] ? ? " " ));
2013-03-19 18:41:10 +00:00
$hide_images = checkbox_to_sql_bool (
2021-02-08 08:46:43 +00:00
clean ( $_POST [ " hide_images " ] ? ? " " ));
2011-12-13 05:29:22 +00:00
$always_display_enclosures = checkbox_to_sql_bool (
2021-02-08 08:46:43 +00:00
clean ( $_POST [ " always_display_enclosures " ] ? ? " " ));
2011-12-13 05:29:22 +00:00
$mark_unread_on_update = checkbox_to_sql_bool (
2021-02-08 08:46:43 +00:00
clean ( $_POST [ " mark_unread_on_update " ] ? ? " " ));
2011-12-13 05:29:22 +00:00
2021-02-25 11:06:25 +00:00
$feed_language = clean ( $_POST [ " feed_language " ] ? ? " " );
2015-08-04 10:32:52 +00:00
2011-12-14 08:04:52 +00:00
if ( ! $batch ) {
2011-12-13 05:29:22 +00:00
2018-03-01 12:43:40 +00:00
/* $sth = $this -> pdo -> prepare ( " SELECT feed_url FROM ttrss_feeds WHERE id = ? " );
2017-12-02 12:04:11 +00:00
$sth -> execute ([ $feed_id ]);
2018-03-01 12:43:40 +00:00
$row = $sth -> fetch (); $orig_feed_url = $row [ " feed_url " ];
2017-12-02 12:04:11 +00:00
2018-03-01 12:43:40 +00:00
$reset_basic_info = $orig_feed_url != $feed_url ; */
2017-12-02 12:04:11 +00:00
2021-03-01 17:25:53 +00:00
$feed = ORM :: for_table ( 'ttrss_feeds' )
-> where ( 'owner_uid' , $_SESSION [ 'uid' ])
-> find_one ( $feed_id );
if ( $feed ) {
$feed -> title = $feed_title ;
$feed -> cat_id = $cat_id ? $cat_id : null ;
$feed -> feed_url = $feed_url ;
$feed -> site_url = $site_url ;
$feed -> update_interval = $upd_intl ;
$feed -> purge_interval = $purge_intl ;
$feed -> auth_login = $auth_login ;
$feed -> auth_pass = $auth_pass ;
$feed -> private = ( int ) $private ;
$feed -> cache_images = ( int ) $cache_images ;
$feed -> hide_images = ( int ) $hide_images ;
$feed -> feed_language = $feed_language ;
$feed -> include_in_digest = ( int ) $include_in_digest ;
$feed -> always_display_enclosures = ( int ) $always_display_enclosures ;
$feed -> mark_unread_on_update = ( int ) $mark_unread_on_update ;
$feed -> save ();
PluginHost :: getInstance () -> run_hooks ( PluginHost :: HOOK_PREFS_SAVE_FEED , $feed_id );
}
2013-04-26 10:23:18 +00:00
2011-12-14 08:04:52 +00:00
} else {
2011-12-13 05:29:22 +00:00
$feed_data = array ();
foreach ( array_keys ( $_POST ) as $k ) {
if ( $k != " op " && $k != " method " && $k != " ids " ) {
2017-12-03 20:35:38 +00:00
$feed_data [ $k ] = clean ( $_POST [ $k ]);
2011-12-13 05:29:22 +00:00
}
}
2017-12-02 12:04:11 +00:00
$this -> pdo -> beginTransaction ();
$feed_ids_qmarks = arr_qmarks ( $feed_ids );
2011-12-13 05:29:22 +00:00
foreach ( array_keys ( $feed_data ) as $k ) {
$qpart = " " ;
switch ( $k ) {
case " title " :
2017-12-02 12:04:11 +00:00
$qpart = " title = " . $this -> pdo -> quote ( $feed_title );
2011-12-13 05:29:22 +00:00
break ;
case " feed_url " :
2017-12-02 12:04:11 +00:00
$qpart = " feed_url = " . $this -> pdo -> quote ( $feed_url );
2011-12-13 05:29:22 +00:00
break ;
case " update_interval " :
2017-12-02 12:04:11 +00:00
$qpart = " update_interval = " . $this -> pdo -> quote ( $upd_intl );
2011-12-13 05:29:22 +00:00
break ;
case " purge_interval " :
2017-12-02 12:04:11 +00:00
$qpart = " purge_interval = " . $this -> pdo -> quote ( $purge_intl );
2011-12-13 05:29:22 +00:00
break ;
case " auth_login " :
2017-12-02 12:04:11 +00:00
$qpart = " auth_login = " . $this -> pdo -> quote ( $auth_login );
2011-12-13 05:29:22 +00:00
break ;
case " auth_pass " :
2017-12-02 12:04:11 +00:00
$qpart = " auth_pass = " . $this -> pdo -> quote ( $auth_pass ) . " , auth_pass_encrypted = false " ;
2011-12-13 05:29:22 +00:00
break ;
case " private " :
2017-12-02 12:04:11 +00:00
$qpart = " private = " . $this -> pdo -> quote ( $private );
2011-12-13 05:29:22 +00:00
break ;
case " include_in_digest " :
2017-12-02 12:04:11 +00:00
$qpart = " include_in_digest = " . $this -> pdo -> quote ( $include_in_digest );
2011-12-13 05:29:22 +00:00
break ;
case " always_display_enclosures " :
2017-12-02 12:04:11 +00:00
$qpart = " always_display_enclosures = " . $this -> pdo -> quote ( $always_display_enclosures );
2011-12-13 05:29:22 +00:00
break ;
case " mark_unread_on_update " :
2017-12-02 12:04:11 +00:00
$qpart = " mark_unread_on_update = " . $this -> pdo -> quote ( $mark_unread_on_update );
2011-12-13 05:29:22 +00:00
break ;
case " cache_images " :
2017-12-02 12:04:11 +00:00
$qpart = " cache_images = " . $this -> pdo -> quote ( $cache_images );
2011-12-13 05:29:22 +00:00
break ;
2013-03-19 18:41:10 +00:00
case " hide_images " :
2017-12-02 12:04:11 +00:00
$qpart = " hide_images = " . $this -> pdo -> quote ( $hide_images );
2013-03-19 18:41:10 +00:00
break ;
2011-12-13 05:29:22 +00:00
case " cat_id " :
2021-02-25 11:49:58 +00:00
if ( get_pref ( Prefs :: ENABLE_FEED_CATS )) {
2017-12-02 12:04:11 +00:00
if ( $cat_id ) {
$qpart = " cat_id = " . $this -> pdo -> quote ( $cat_id );
} else {
$qpart = 'cat_id = NULL' ;
}
} else {
$qpart = " " ;
}
2011-12-13 05:29:22 +00:00
break ;
2015-08-04 10:32:52 +00:00
case " feed_language " :
2017-12-02 12:04:11 +00:00
$qpart = " feed_language = " . $this -> pdo -> quote ( $feed_language );
2015-08-04 10:32:52 +00:00
break ;
2011-12-13 05:29:22 +00:00
}
if ( $qpart ) {
2017-12-02 12:04:11 +00:00
$sth = $this -> pdo -> prepare ( " UPDATE ttrss_feeds SET $qpart WHERE id IN ( $feed_ids_qmarks )
AND owner_uid = ? " );
$sth -> execute ( array_merge ( $feed_ids , [ $_SESSION [ 'uid' ]]));
2011-12-13 05:29:22 +00:00
}
}
2017-12-02 12:04:11 +00:00
$this -> pdo -> commit ();
2011-12-13 05:29:22 +00:00
}
return ;
}
function remove () {
2017-12-03 20:35:38 +00:00
$ids = explode ( " , " , clean ( $_REQUEST [ " ids " ]));
2011-12-13 05:29:22 +00:00
foreach ( $ids as $id ) {
2020-09-22 11:54:15 +00:00
self :: remove_feed ( $id , $_SESSION [ " uid " ]);
2011-12-13 05:29:22 +00:00
}
return ;
}
2012-08-15 05:59:08 +00:00
function removeCat () {
2017-12-03 20:35:38 +00:00
$ids = explode ( " , " , clean ( $_REQUEST [ " ids " ]));
2012-08-15 05:59:08 +00:00
foreach ( $ids as $id ) {
2021-03-01 17:25:53 +00:00
Feeds :: _remove_cat (( int ) $id , $_SESSION [ " uid " ]);
2012-08-15 05:59:08 +00:00
}
}
function addCat () {
2021-02-05 20:41:32 +00:00
$feed_cat = clean ( $_REQUEST [ " cat " ]);
2012-08-15 05:59:08 +00:00
2021-03-02 07:24:15 +00:00
Feeds :: _add_cat ( $feed_cat , $_SESSION [ 'uid' ]);
2012-08-15 05:59:08 +00:00
}
2021-02-12 05:22:00 +00:00
function importOpml () {
$opml = new OPML ( $_REQUEST );
$opml -> opml_import ( $_SESSION [ " uid " ]);
}
2021-02-13 15:32:02 +00:00
private function index_feeds () {
2021-02-13 20:12:49 +00:00
$error_button = " <button dojoType='dijit.form.Button'
id = 'pref_feeds_errors_btn' style = 'display : none'
onclick = 'CommonDialogs.showFeedsWithErrors()' > " .
__ ( " Feeds with errors " ) . " </button> " ;
2011-12-13 05:29:22 +00:00
2021-02-13 15:32:02 +00:00
$inactive_button = " <button dojoType='dijit.form.Button'
id = 'pref_feeds_inactive_btn'
style = 'display : none'
2018-12-02 12:30:07 +00:00
onclick = \ " dijit.byId('feedTree').showInactiveFeeds() \" > " .
2015-08-12 13:19:42 +00:00
__ ( " Inactive feeds " ) . " </button> " ;
2011-12-13 05:29:22 +00:00
2021-02-05 20:41:32 +00:00
$feed_search = clean ( $_REQUEST [ " search " ] ? ? " " );
2011-12-13 05:29:22 +00:00
if ( array_key_exists ( " search " , $_REQUEST )) {
$_SESSION [ " prefs_feed_search " ] = $feed_search ;
} else {
2021-02-05 20:41:32 +00:00
$feed_search = $_SESSION [ " prefs_feed_search " ] ? ? " " ;
2011-12-13 05:29:22 +00:00
}
2021-02-13 15:32:02 +00:00
?>
< div dojoType = " dijit.layout.BorderContainer " gutters = " false " >
< div region = 'top' dojoType = " fox.Toolbar " >
< div style = 'float : right' >
< input dojoType = " dijit.form.TextBox " id = " feed_search " size = " 20 " type = " search "
2021-02-14 06:15:51 +00:00
value = " <?= htmlspecialchars( $feed_search ) ?> " >
2021-02-13 15:32:02 +00:00
< button dojoType = " dijit.form.Button " onclick = " dijit.byId('feedTree').reload() " >
2021-02-14 06:15:51 +00:00
< ? = __ ( 'Search' ) ?> </button>
2021-02-13 15:32:02 +00:00
</ div >
< div dojoType = " fox.form.DropDownButton " >
2021-02-14 06:15:51 +00:00
< span >< ? = __ ( 'Select' ) ?> </span>
2021-02-13 15:32:02 +00:00
< div dojoType = " dijit.Menu " style = " display: none; " >
< div onclick = " dijit.byId('feedTree').model.setAllChecked(true) "
2021-02-14 06:15:51 +00:00
dojoType = " dijit.MenuItem " >< ? = __ ( 'All' ) ?> </div>
2021-02-13 15:32:02 +00:00
< div onclick = " dijit.byId('feedTree').model.setAllChecked(false) "
2021-02-14 06:15:51 +00:00
dojoType = " dijit.MenuItem " >< ? = __ ( 'None' ) ?> </div>
2021-02-13 15:32:02 +00:00
</ div >
</ div >
< div dojoType = " fox.form.DropDownButton " >
2021-02-14 06:15:51 +00:00
< span >< ? = __ ( 'Feeds' ) ?> </span>
2021-02-13 15:32:02 +00:00
< div dojoType = " dijit.Menu " style = " display: none " >
2021-02-15 12:21:25 +00:00
< div onclick = " CommonDialogs.subscribeToFeed() "
2021-02-14 06:15:51 +00:00
dojoType = " dijit.MenuItem " >< ? = __ ( 'Subscribe to feed' ) ?> </div>
2021-02-13 15:32:02 +00:00
< div onclick = " dijit.byId('feedTree').editSelectedFeed() "
2021-02-14 06:15:51 +00:00
dojoType = " dijit.MenuItem " >< ? = __ ( 'Edit selected feeds' ) ?> </div>
2021-02-13 15:32:02 +00:00
< div onclick = " dijit.byId('feedTree').resetFeedOrder() "
2021-02-14 06:15:51 +00:00
dojoType = " dijit.MenuItem " >< ? = __ ( 'Reset sort order' ) ?> </div>
2021-02-13 15:32:02 +00:00
< div onclick = " dijit.byId('feedTree').batchSubscribe() "
2021-02-14 06:15:51 +00:00
dojoType = " dijit.MenuItem " >< ? = __ ( 'Batch subscribe' ) ?> </div>
2021-02-13 15:32:02 +00:00
< div dojoType = " dijit.MenuItem " onclick = " dijit.byId('feedTree').removeSelectedFeeds() " >
2021-02-14 06:15:51 +00:00
< ? = __ ( 'Unsubscribe' ) ?> </div>
2021-02-13 15:32:02 +00:00
</ div >
</ div >
2021-02-25 11:49:58 +00:00
< ? php if ( get_pref ( Prefs :: ENABLE_FEED_CATS )) { ?>
2021-02-13 15:32:02 +00:00
< div dojoType = " fox.form.DropDownButton " >
2021-02-14 06:15:51 +00:00
< span >< ? = __ ( 'Categories' ) ?> </span>
2021-02-13 15:32:02 +00:00
< div dojoType = " dijit.Menu " style = " display: none " >
< div onclick = " dijit.byId('feedTree').createCategory() "
2021-02-14 06:15:51 +00:00
dojoType = " dijit.MenuItem " >< ? = __ ( 'Add category' ) ?> </div>
2021-02-13 15:32:02 +00:00
< div onclick = " dijit.byId('feedTree').resetCatOrder() "
2021-02-14 06:15:51 +00:00
dojoType = " dijit.MenuItem " >< ? = __ ( 'Reset sort order' ) ?> </div>
2021-02-13 15:32:02 +00:00
< div onclick = " dijit.byId('feedTree').removeSelectedCategories() "
2021-02-14 06:15:51 +00:00
dojoType = " dijit.MenuItem " >< ? = __ ( 'Remove selected' ) ?> </div>
2021-02-13 15:32:02 +00:00
</ div >
</ div >
< ? php } ?>
2021-02-14 06:15:51 +00:00
< ? = $error_button ?>
< ? = $inactive_button ?>
2021-02-13 15:32:02 +00:00
</ div >
< div style = " padding : 0px " dojoType = " dijit.layout.ContentPane " region = " center " >
< div dojoType = " fox.PrefFeedStore " jsId = " feedStore "
url = " backend.php?op=pref-feeds&method=getfeedtree " >
</ div >
< div dojoType = " lib.CheckBoxStoreModel " jsId = " feedModel " store = " feedStore "
query = " { id:'root'} " rootId = " root " rootLabel = " Feeds " childrenAttrs = " items "
checkboxStrict = " false " checkboxAll = " false " >
</ div >
< div dojoType = " fox.PrefFeedTree " id = " feedTree "
dndController = " dijit.tree.dndSource "
betweenThreshold = " 5 "
2021-02-14 06:15:51 +00:00
autoExpand = " <?= (!empty( $feed_search ) ? " true " : " false " ) ?> "
2021-02-13 15:32:02 +00:00
persist = " true "
model = " feedModel "
openOnClick = " false " >
< script type = " dojo/method " event = " onClick " args = " item " >
var id = String ( item . id );
var bare_id = id . substr ( id . indexOf ( ':' ) + 1 );
if ( id . match ( 'FEED:' )) {
CommonDialogs . editFeed ( bare_id );
} else if ( id . match ( 'CAT:' )) {
dijit . byId ( 'feedTree' ) . editCategory ( bare_id , item );
}
</ script >
< script type = " dojo/method " event = " onLoad " args = " item " >
dijit . byId ( 'feedTree' ) . checkInactiveFeeds ();
2021-02-13 20:12:49 +00:00
dijit . byId ( 'feedTree' ) . checkErrorFeeds ();
2021-02-13 15:32:02 +00:00
</ script >
</ div >
</ div >
2011-12-13 05:29:22 +00:00
</ div >
2021-02-13 15:32:02 +00:00
< ? php
2011-12-13 05:29:22 +00:00
2021-02-13 15:32:02 +00:00
}
2011-12-13 05:29:22 +00:00
2021-02-13 15:32:02 +00:00
private function index_opml () {
?>
2011-12-13 05:29:22 +00:00
2021-02-13 15:32:02 +00:00
< form id = 'opml_import_form' method = 'post' enctype = 'multipart/form-data' >
2021-02-14 06:15:51 +00:00
< label class = 'dijitButton' >< ? = __ ( " Choose file... " ) ?>
2021-02-13 15:32:02 +00:00
< input style = 'display : none' id = 'opml_file' name = 'opml_file' type = 'file' >
2017-12-03 19:35:12 +00:00
</ label >
2021-02-12 05:22:00 +00:00
< input type = 'hidden' name = 'op' value = 'pref-feeds' >
2021-02-14 06:15:51 +00:00
< input type = 'hidden' name = 'csrf_token' value = " <?= $_SESSION['csrf_token'] ?> " >
2019-02-21 13:21:16 +00:00
< input type = 'hidden' name = 'method' value = 'importOpml' >
2021-02-13 15:32:02 +00:00
< button dojoType = 'dijit.form.Button' class = 'alt-primary' onclick = " return Helpers.OPML.import() " type = " submit " >
2021-03-06 20:51:48 +00:00
< ? = \Controls\icon ( " file_upload " ) ?>
2021-02-14 06:15:51 +00:00
< ? = __ ( 'Import OPML' ) ?>
2021-02-13 15:32:02 +00:00
</ button >
</ form >
2011-12-13 05:29:22 +00:00
2021-02-13 15:32:02 +00:00
< hr />
2018-12-03 09:26:49 +00:00
2021-03-06 20:51:48 +00:00
< ? php print_notice ( " Only main settings profile can be migrated using OPML. " ) ?>
2021-02-13 15:32:02 +00:00
< form dojoType = 'dijit.form.Form' id = 'opmlExportForm' style = 'display : inline-block' >
< button dojoType = 'dijit.form.Button' onclick = 'Helpers.OPML.export()' >
2021-03-06 20:51:48 +00:00
< ? = \Controls\icon ( " file_download " ) ?>
2021-02-14 06:15:51 +00:00
< ? = __ ( 'Export OPML' ) ?>
2021-02-13 15:32:02 +00:00
</ button >
2018-12-03 09:26:49 +00:00
2021-02-13 15:32:02 +00:00
< label class = 'checkbox' >
2021-02-16 15:50:18 +00:00
< ? = \Controls\checkbox_tag ( " include_settings " , true , " 1 " ) ?>
2021-03-06 20:51:48 +00:00
< ? = __ ( " Include tt-rss settings " ) ?>
2021-02-13 15:32:02 +00:00
</ label >
</ form >
2011-12-13 05:29:22 +00:00
2021-02-13 15:32:02 +00:00
< hr />
2011-12-13 05:29:22 +00:00
2021-02-14 06:15:51 +00:00
< h2 >< ? = __ ( " Published OPML " ) ?> </h2>
2011-12-13 05:29:22 +00:00
2021-03-06 20:51:48 +00:00
< ? = format_notice ( " Your OPML can be published and then subscribed by anyone who knows the URL below. This won't include your settings nor authenticated feeds. " ) ?>
2011-12-13 05:29:22 +00:00
2021-02-21 15:04:44 +00:00
< button dojoType = 'dijit.form.Button' class = 'alt-primary' onclick = " return Helpers.OPML.publish() " >
2021-03-06 20:51:48 +00:00
< ? = \Controls\icon ( " share " ) ?>
2021-02-14 06:15:51 +00:00
< ? = __ ( 'Display published OPML URL' ) ?>
2021-02-13 15:32:02 +00:00
</ button >
2011-12-13 05:29:22 +00:00
2021-02-13 15:32:02 +00:00
< ? php
2021-02-08 11:24:45 +00:00
PluginHost :: getInstance () -> run_hooks ( PluginHost :: HOOK_PREFS_TAB_SECTION , " prefFeedsOPML " );
2021-02-13 15:32:02 +00:00
}
2012-12-26 21:12:28 +00:00
2021-02-13 15:32:02 +00:00
private function index_shared () {
?>
2011-12-13 05:29:22 +00:00
2021-03-06 20:51:48 +00:00
< ? = format_notice ( 'Published articles can be subscribed by anyone who knows the following URL:' ) ?> </h3>
2011-12-13 05:29:22 +00:00
2021-02-13 15:32:02 +00:00
< button dojoType = 'dijit.form.Button' class = 'alt-primary'
2021-02-14 19:17:13 +00:00
onclick = " CommonDialogs.generatedFeed(-2, false) " >
2021-03-06 20:51:48 +00:00
< ? = \Controls\icon ( 'share' ) ?>
2021-02-14 06:15:51 +00:00
< ? = __ ( 'Display URL' ) ?>
2021-02-13 15:32:02 +00:00
</ button >
2012-12-26 21:12:28 +00:00
2021-02-13 15:32:02 +00:00
< button class = 'alt-danger' dojoType = 'dijit.form.Button' onclick = 'return Helpers.Feeds.clearFeedAccessKeys()' >
2021-03-06 20:51:48 +00:00
< ? = \Controls\icon ( 'delete' ) ?>
2021-02-14 06:15:51 +00:00
< ? = __ ( 'Clear all generated URLs' ) ?>
2021-02-13 15:32:02 +00:00
</ button >
2011-12-13 05:29:22 +00:00
2021-02-13 15:32:02 +00:00
< ? php
PluginHost :: getInstance () -> run_hooks ( PluginHost :: HOOK_PREFS_TAB_SECTION , " prefFeedsPublishedGenerated " );
}
2012-12-23 12:15:34 +00:00
2021-02-13 15:32:02 +00:00
function index () {
?>
< div dojoType = 'dijit.layout.TabContainer' tabPosition = 'left-h' >
< div style = 'padding : 0px' dojoType = 'dijit.layout.ContentPane'
2021-02-14 06:15:51 +00:00
title = " <i class='material-icons'>rss_feed</i> <?= __('My feeds') ?> " >
2021-02-13 15:32:02 +00:00
< ? php $this -> index_feeds () ?>
</ div >
< div dojoType = 'dijit.layout.ContentPane'
2021-02-14 06:15:51 +00:00
title = " <i class='material-icons'>import_export</i> <?= __('OPML') ?> " >
2021-02-13 15:32:02 +00:00
< ? php $this -> index_opml () ?>
</ div >
< div dojoType = " dijit.layout.ContentPane "
2021-02-14 06:15:51 +00:00
title = " <i class='material-icons'>share</i> <?= __('Sharing') ?> " >
2021-02-13 15:32:02 +00:00
< ? php $this -> index_shared () ?>
</ div >
< ? php
ob_start ();
PluginHost :: getInstance () -> run_hooks ( PluginHost :: HOOK_PREFS_TAB , " prefFeeds " );
$plugin_data = trim (( string ) ob_get_contents ());
ob_end_clean ();
?>
< ? php if ( $plugin_data ) { ?>
< div dojoType = 'dijit.layout.ContentPane'
2021-02-14 06:15:51 +00:00
title = " <i class='material-icons'>extension</i> <?= __('Plugins') ?> " >
2021-02-13 15:32:02 +00:00
< div dojoType = 'dijit.layout.AccordionContainer' region = 'center' >
2021-02-14 06:15:51 +00:00
< ? = $plugin_data ?>
2021-02-13 15:32:02 +00:00
</ div >
</ div >
< ? php } ?>
</ div >
< ? php
2011-12-13 05:29:22 +00:00
}
2012-08-13 14:56:55 +00:00
2013-02-27 11:34:13 +00:00
private function feedlist_init_cat ( $cat_id ) {
2012-08-13 14:56:55 +00:00
$obj = array ();
$cat_id = ( int ) $cat_id ;
$obj [ 'id' ] = 'CAT:' . $cat_id ;
$obj [ 'items' ] = array ();
2021-02-15 12:43:07 +00:00
$obj [ 'name' ] = Feeds :: _get_cat_title ( $cat_id );
2012-08-13 14:56:55 +00:00
$obj [ 'type' ] = 'category' ;
2021-02-15 12:43:07 +00:00
$obj [ 'unread' ] = - 1 ; //(int) Feeds::_get_cat_unread($cat_id);
2012-08-13 14:56:55 +00:00
$obj [ 'bare_id' ] = $cat_id ;
return $obj ;
}
private function feedlist_init_feed ( $feed_id , $title = false , $unread = false , $error = '' , $updated = '' ) {
$obj = array ();
$feed_id = ( int ) $feed_id ;
if ( ! $title )
2021-02-15 12:43:07 +00:00
$title = Feeds :: _get_title ( $feed_id , false );
2012-08-13 14:56:55 +00:00
if ( $unread === false )
2013-04-17 14:34:18 +00:00
$unread = getFeedUnread ( $feed_id , false );
2012-08-13 14:56:55 +00:00
$obj [ 'id' ] = 'FEED:' . $feed_id ;
$obj [ 'name' ] = $title ;
$obj [ 'unread' ] = ( int ) $unread ;
$obj [ 'type' ] = 'feed' ;
$obj [ 'error' ] = $error ;
$obj [ 'updated' ] = $updated ;
2021-02-15 12:43:07 +00:00
$obj [ 'icon' ] = Feeds :: _get_icon ( $feed_id );
2012-08-13 14:56:55 +00:00
$obj [ 'bare_id' ] = $feed_id ;
2013-05-15 21:08:04 +00:00
$obj [ 'auxcounter' ] = 0 ;
2012-08-13 14:56:55 +00:00
return $obj ;
}
2012-09-14 08:30:04 +00:00
function inactiveFeeds () {
2021-02-22 18:47:48 +00:00
if ( Config :: get ( Config :: DB_TYPE ) == " pgsql " ) {
2012-09-14 08:30:04 +00:00
$interval_qpart = " NOW() - INTERVAL '3 months' " ;
} else {
$interval_qpart = " DATE_SUB(NOW(), INTERVAL 3 MONTH) " ;
}
2017-12-02 12:36:32 +00:00
$sth = $this -> pdo -> prepare ( " SELECT ttrss_feeds.title, ttrss_feeds.site_url,
2012-09-14 08:30:04 +00:00
ttrss_feeds . feed_url , ttrss_feeds . id , MAX ( updated ) AS last_article
FROM ttrss_feeds , ttrss_entries , ttrss_user_entries WHERE
( SELECT MAX ( updated ) FROM ttrss_entries , ttrss_user_entries WHERE
ttrss_entries . id = ref_id AND
ttrss_user_entries . feed_id = ttrss_feeds . id ) < $interval_qpart
2017-12-02 12:36:32 +00:00
AND ttrss_feeds . owner_uid = ? AND
2012-09-14 08:30:04 +00:00
ttrss_user_entries . feed_id = ttrss_feeds . id AND
ttrss_entries . id = ref_id
GROUP BY ttrss_feeds . title , ttrss_feeds . id , ttrss_feeds . site_url , ttrss_feeds . feed_url
ORDER BY last_article " );
2017-12-02 12:36:32 +00:00
$sth -> execute ([ $_SESSION [ 'uid' ]]);
2012-09-14 08:30:04 +00:00
2021-02-13 18:41:38 +00:00
$rv = [];
2012-09-14 08:30:04 +00:00
2021-02-13 18:41:38 +00:00
while ( $row = $sth -> fetch ( PDO :: FETCH_ASSOC )) {
$row [ 'last_article' ] = TimeHelper :: make_local_datetime ( $row [ 'last_article' ], false );
array_push ( $rv , $row );
2012-09-14 08:30:04 +00:00
}
2021-02-13 18:41:38 +00:00
print json_encode ( $rv );
2012-09-14 08:30:04 +00:00
}
function feedsWithErrors () {
2017-12-02 12:36:32 +00:00
$sth = $this -> pdo -> prepare ( " SELECT id,title,feed_url,last_error,site_url
FROM ttrss_feeds WHERE last_error != '' AND owner_uid = ? " );
$sth -> execute ([ $_SESSION [ 'uid' ]]);
2012-09-14 08:30:04 +00:00
2021-02-13 18:57:02 +00:00
$rv = [];
2012-09-14 08:30:04 +00:00
2021-02-13 18:57:02 +00:00
while ( $row = $sth -> fetch ()) {
array_push ( $rv , $row );
2012-09-14 08:30:04 +00:00
}
2021-02-13 18:57:02 +00:00
print json_encode ( $rv );
2012-09-14 08:30:04 +00:00
}
2013-04-17 14:34:18 +00:00
static function remove_feed ( $id , $owner_uid ) {
2021-02-08 19:46:01 +00:00
if ( PluginHost :: getInstance () -> run_hooks_until ( PluginHost :: HOOK_UNSUBSCRIBE_FEED , true , $id , $owner_uid ))
return ;
2013-01-22 18:38:18 +00:00
2017-12-02 12:36:32 +00:00
$pdo = Db :: pdo ();
2013-01-22 18:38:18 +00:00
if ( $id > 0 ) {
2017-12-02 12:36:32 +00:00
$pdo -> beginTransaction ();
2013-01-22 18:38:18 +00:00
/* save starred articles in Archived feed */
2021-01-17 11:55:11 +00:00
$sth = $pdo -> prepare ( " UPDATE ttrss_user_entries SET
feed_id = NULL , orig_feed_id = NULL
WHERE feed_id = ? AND marked = true AND owner_uid = ? " );
2013-01-22 18:38:18 +00:00
2017-12-02 12:36:32 +00:00
$sth -> execute ([ $id , $owner_uid ]);
2013-03-30 17:45:24 +00:00
2021-01-17 11:55:11 +00:00
/* Remove access key for the feed */
2013-03-30 17:45:24 +00:00
2021-01-17 11:55:11 +00:00
$sth = $pdo -> prepare ( " DELETE FROM ttrss_access_keys WHERE
feed_id = ? AND owner_uid = ? " );
$sth -> execute ([ $id , $owner_uid ]);
2013-01-22 18:38:18 +00:00
2021-01-17 11:55:11 +00:00
/* remove the feed */
2017-12-02 12:36:32 +00:00
2021-01-17 11:55:11 +00:00
$sth = $pdo -> prepare ( " DELETE FROM ttrss_feeds
WHERE id = ? AND owner_uid = ? " );
$sth -> execute ([ $id , $owner_uid ]);
2013-01-22 18:38:18 +00:00
2017-12-02 12:36:32 +00:00
$pdo -> commit ();
2013-01-22 18:38:18 +00:00
2021-02-22 19:35:27 +00:00
if ( file_exists ( Config :: get ( Config :: ICONS_DIR ) . " / $id .ico " )) {
unlink ( Config :: get ( Config :: ICONS_DIR ) . " / $id .ico " );
2013-01-22 18:38:18 +00:00
}
} else {
2017-05-04 12:57:40 +00:00
Labels :: remove ( Labels :: feed_to_label_id ( $id ), $owner_uid );
2013-01-22 18:38:18 +00:00
}
}
2013-01-22 18:32:17 +00:00
2013-04-01 08:36:57 +00:00
function batchSubscribe () {
2021-02-13 19:16:17 +00:00
print json_encode ([
2021-02-25 11:49:58 +00:00
" enable_cats " => ( int ) get_pref ( Prefs :: ENABLE_FEED_CATS ),
2021-02-16 11:23:00 +00:00
" cat_select " => \Controls\select_feeds_cats ( " cat " )
2021-02-13 19:16:17 +00:00
]);
2013-04-01 08:36:57 +00:00
}
2013-04-02 10:32:10 +00:00
function batchAddFeeds () {
2017-12-03 20:35:38 +00:00
$cat_id = clean ( $_REQUEST [ 'cat' ]);
$feeds = explode ( " \n " , clean ( $_REQUEST [ 'feeds' ]));
$login = clean ( $_REQUEST [ 'login' ]);
2021-02-05 20:41:32 +00:00
$pass = clean ( $_REQUEST [ 'pass' ]);
2013-04-02 10:32:10 +00:00
2019-03-10 06:20:46 +00:00
$csth = $this -> pdo -> prepare ( " SELECT id FROM ttrss_feeds
WHERE feed_url = ? AND owner_uid = ? " );
$isth = $this -> pdo -> prepare ( " INSERT INTO ttrss_feeds
( owner_uid , feed_url , title , cat_id , auth_login , auth_pass , update_method , auth_pass_encrypted )
VALUES ( ? , ? , '[Unknown]' , ? , ? , ? , 0 , false ) " );
2013-04-02 10:32:10 +00:00
foreach ( $feeds as $feed ) {
2017-12-02 10:49:35 +00:00
$feed = trim ( $feed );
2013-04-02 10:32:10 +00:00
2020-09-22 06:04:33 +00:00
if ( UrlHelper :: validate ( $feed )) {
2013-04-02 10:32:10 +00:00
2017-12-02 12:53:32 +00:00
$this -> pdo -> beginTransaction ();
2013-04-02 10:32:10 +00:00
2019-03-10 06:20:46 +00:00
$csth -> execute ([ $feed , $_SESSION [ 'uid' ]]);
2017-12-02 12:53:32 +00:00
2019-03-10 06:20:46 +00:00
if ( ! $csth -> fetch ()) {
$isth -> execute ([ $_SESSION [ 'uid' ], $feed , $cat_id ? $cat_id : null , $login , $pass ]);
2013-04-02 10:32:10 +00:00
}
2017-12-02 12:53:32 +00:00
$this -> pdo -> commit ();
2013-04-02 10:32:10 +00:00
}
}
}
2013-04-01 08:36:57 +00:00
2021-03-02 05:26:37 +00:00
function clearKeys () {
return Feeds :: _clear_access_keys ( $_SESSION [ 'uid' ]);
}
2021-02-11 18:42:38 +00:00
function getOPMLKey () {
2021-02-21 12:16:39 +00:00
print json_encode ([ " link " => OPML :: get_publish_url ()]);
2021-02-11 18:42:38 +00:00
}
2013-04-02 10:47:43 +00:00
function regenOPMLKey () {
2021-03-02 05:26:37 +00:00
Feeds :: _update_access_key ( 'OPML:Publish' ,
2021-02-11 18:42:38 +00:00
false , $_SESSION [ " uid " ]);
2013-04-02 10:47:43 +00:00
2021-02-21 12:16:39 +00:00
print json_encode ([ " link " => OPML :: get_publish_url ()]);
2013-04-02 10:47:43 +00:00
}
function regenFeedKey () {
2017-12-03 20:35:38 +00:00
$feed_id = clean ( $_REQUEST [ 'id' ]);
2018-11-30 06:23:51 +00:00
$is_cat = clean ( $_REQUEST [ 'is_cat' ]);
2013-04-02 10:47:43 +00:00
2021-03-02 05:26:37 +00:00
$new_key = Feeds :: _update_access_key ( $feed_id , $is_cat , $_SESSION [ " uid " ]);
2013-04-02 10:47:43 +00:00
2018-11-30 06:23:51 +00:00
print json_encode ([ " link " => $new_key ]);
2013-04-02 10:47:43 +00:00
}
2021-03-02 05:26:37 +00:00
function getSharedURL () {
2021-02-11 19:04:39 +00:00
$feed_id = clean ( $_REQUEST [ 'id' ]);
2021-02-14 19:17:13 +00:00
$is_cat = clean ( $_REQUEST [ 'is_cat' ]) == " true " ;
$search = clean ( $_REQUEST [ 'search' ]);
2021-03-02 05:16:41 +00:00
$link = Config :: get_self_url () . " /public.php? " . http_build_query ([
2021-02-14 19:17:13 +00:00
'op' => 'rss' ,
'id' => $feed_id ,
'is_cat' => ( int ) $is_cat ,
'q' => $search ,
2021-02-15 12:43:07 +00:00
'key' => Feeds :: _get_access_key ( $feed_id , $is_cat , $_SESSION [ " uid " ])
2021-02-14 19:17:13 +00:00
]);
2021-02-11 19:04:39 +00:00
2021-02-14 19:17:13 +00:00
print json_encode ([
2021-02-15 12:43:07 +00:00
" title " => Feeds :: _get_title ( $feed_id , $is_cat ),
2021-02-14 19:17:13 +00:00
" link " => $link
]);
2021-02-11 19:04:39 +00:00
}
2013-04-02 10:47:43 +00:00
2013-06-07 11:31:43 +00:00
private function calculate_children_count ( $cat ) {
$c = 0 ;
2021-02-05 20:41:32 +00:00
foreach ( $cat [ 'items' ] ? ? [] as $child ) {
if ( $child [ 'type' ] ? ? '' == 'category' ) {
2013-06-07 11:31:43 +00:00
$c += $this -> calculate_children_count ( $child );
} else {
$c += 1 ;
}
}
return $c ;
}
2013-04-02 10:47:43 +00:00
2017-11-27 10:46:46 +00:00
}