X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=mod%2Fnetwork.php;h=6ba353d7e51c75dbf080ba8c465ec0c844792e41;hb=a09273802ef0b790c0374a2fece6cded5686ebc2;hp=b697cb3a63ae706b44d5df36e2757de31cd8a84f;hpb=9c9ebfc7c97016881d9ad2bb3c3b54a5640d2f08;p=friendica.git diff --git a/mod/network.php b/mod/network.php index b697cb3a63..6ba353d7e5 100644 --- a/mod/network.php +++ b/mod/network.php @@ -8,14 +8,16 @@ use Friendica\App; use Friendica\Content\Feature; use Friendica\Content\ForumManager; use Friendica\Content\Nav; +use Friendica\Content\Pager; use Friendica\Content\Widget; use Friendica\Core\ACL; use Friendica\Core\Addon; use Friendica\Core\Config; +use Friendica\Core\Hook; use Friendica\Core\L10n; +use Friendica\Core\Logger; use Friendica\Core\PConfig; use Friendica\Core\Protocol; -use Friendica\Core\System; use Friendica\Database\DBA; use Friendica\Model\Contact; use Friendica\Model\Group; @@ -35,6 +37,8 @@ function network_init(App $a) return; } + Hook::add('head', __FILE__, 'network_infinite_scroll_head'); + $search = (x($_GET, 'search') ? escape_tags($_GET['search']) : ''); if (($search != '') && !empty($_GET['submit'])) { @@ -279,7 +283,7 @@ function network_query_get_sel_group(App $a) * @param integer $update Used for the automatic reloading * @return string SQL with the appropriate LIMIT clause */ -function networkPager($a, $update) +function networkPager(App $a, Pager $pager, $update) { if ($update) { // only setup pagination on initial page view @@ -302,9 +306,9 @@ function networkPager($a, $update) $itemspage_network = $a->force_max_items; } - $a->setPagerItemsPage($itemspage_network); + $pager->setItemsPerPage($itemspage_network); - return sprintf(" LIMIT %d, %d ", intval($a->pager['start']), intval($a->pager['itemspage'])); + return sprintf(" LIMIT %d, %d ", $pager->getStart(), $pager->getItemsPerPage()); } /** @@ -328,24 +332,24 @@ function networkSetSeen($condition) /** * @brief Create the conversation HTML * - * @param App $a The global App - * @param array $items Items of the conversation - * @param string $mode Display mode for the conversation + * @param App $a The global App + * @param array $items Items of the conversation + * @param string $mode Display mode for the conversation * @param integer $update Used for the automatic reloading * @return string HTML of the conversation */ -function networkConversation($a, $items, $mode, $update, $ordering = '') +function networkConversation(App $a, $items, Pager $pager, $mode, $update, $ordering = '') { // Set this so that the conversation function can find out contact info for our wall-wall items $a->page_contact = $a->contact; - $o = conversation($a, $items, $mode, $update, false, $ordering, local_user()); + $o = conversation($a, $items, $pager, $mode, $update, false, $ordering, local_user()); if (!$update) { if (PConfig::get(local_user(), 'system', 'infinite_scroll')) { $o .= scroll_loader(); } else { - $o .= alt_pager($a, count($items)); + $o .= $pager->renderMinimal(count($items)); } } @@ -372,7 +376,7 @@ function network_content(App $a, $update = 0, $parent = 0) } } - if (x($_GET, 'file')) { + if (!empty($_GET['file'])) { $flat_mode = true; } @@ -388,12 +392,14 @@ function network_content(App $a, $update = 0, $parent = 0) /** * @brief Get the network content in flat view * - * @param App $a The global App + * @param Pager $pager + * @param App $a The global App * @param integer $update Used for the automatic reloading * @return string HTML of the network content in flat view */ function networkFlatView(App $a, $update = 0) { + global $pager; // Rawmode is used for fetching new content at the end of the page $rawmode = (isset($_GET['mode']) && ($_GET['mode'] == 'raw')); @@ -405,7 +411,7 @@ function networkFlatView(App $a, $update = 0) $o = ''; - $file = ((x($_GET, 'file')) ? $_GET['file'] : ''); + $file = defaults($_GET, 'file', ''); if (!$update && !$rawmode) { $tabs = network_tabs($a); @@ -437,12 +443,15 @@ function networkFlatView(App $a, $update = 0) } } - $pager_sql = networkPager($a, $update); + $pager = new Pager($a->query_string); + + /// @TODO Figure out why this variable is unused + $pager_sql = networkPager($a, $pager, $update); if (strlen($file)) { $condition = ["`term` = ? AND `otype` = ? AND `type` = ? AND `uid` = ?", $file, TERM_OBJ_POST, TERM_FILE, local_user()]; - $params = ['order' => ['tid' => true], 'limit' => [$a->pager['start'], $a->pager['itemspage']]]; + $params = ['order' => ['tid' => true], 'limit' => [$pager->getStart(), $pager->getItemsPerPage()]]; $result = DBA::select('term', ['oid'], $condition); $posts = []; @@ -456,14 +465,14 @@ function networkFlatView(App $a, $update = 0) $condition = ['uid' => local_user()]; } - $params = ['order' => ['id' => true], 'limit' => [$a->pager['start'], $a->pager['itemspage']]]; + $params = ['order' => ['id' => true], 'limit' => [$pager->getStart(), $pager->getItemsPerPage()]]; $result = Item::selectForUser(local_user(), [], $condition, $params); $items = Item::inArray($result); $condition = ['unseen' => true, 'uid' => local_user()]; networkSetSeen($condition); - $o .= networkConversation($a, $items, 'network-new', $update); + $o .= networkConversation($a, $items, $pager, 'network-new', $update); return $o; } @@ -471,12 +480,17 @@ function networkFlatView(App $a, $update = 0) /** * @brief Get the network content in threaded view * - * @param App $a The global App - * @param integer $update Used for the automatic reloading + * @global Pager $pager + * @param App $a The global App + * @param integer $update Used for the automatic reloading + * @param integer $parent * @return string HTML of the network content in flat view */ function networkThreadedView(App $a, $update, $parent) { + /// @TODO this will have to be converted to a static property of the converted Module\Network class + global $pager; + // Rawmode is used for fetching new content at the end of the page $rawmode = (isset($_GET['mode']) AND ( $_GET['mode'] == 'raw')); @@ -543,13 +557,11 @@ function networkThreadedView(App $a, $update, $parent) $tabs = network_tabs($a); $o .= $tabs; - if ($gid) { - if (($t = Contact::getOStatusCountByGroupId($gid)) && !PConfig::get(local_user(), 'system', 'nowarn_insecure')) { - notice(L10n::tt("Warning: This group contains %s member from a network that doesn't allow non public messages.", - "Warning: This group contains %s members from a network that doesn't allow non public messages.", - $t) . EOL); - notice(L10n::t("Messages in this group won't be send to these receivers.").EOL); - } + if ($gid && ($t = Contact::getOStatusCountByGroupId($gid)) && !PConfig::get(local_user(), 'system', 'nowarn_insecure')) { + notice(L10n::tt("Warning: This group contains %s member from a network that doesn't allow non public messages.", + "Warning: This group contains %s members from a network that doesn't allow non public messages.", + $t) . EOL); + notice(L10n::t("Messages in this group won't be send to these receivers.").EOL); } Nav::setSelected('network'); @@ -706,13 +718,15 @@ function networkThreadedView(App $a, $update, $parent) $sql_order = "$sql_table.$ordering"; - if (x($_GET, 'offset')) { + if (!empty($_GET['offset'])) { $sql_range = sprintf(" AND $sql_order <= '%s'", DBA::escape($_GET['offset'])); } else { $sql_range = ''; } - $pager_sql = networkPager($a, $update); + $pager = new Pager($a->query_string); + + $pager_sql = networkPager($a, $pager, $update); $last_date = ''; @@ -721,31 +735,31 @@ function networkThreadedView(App $a, $update, $parent) if ($last_received != '') { $last_date = $last_received; $sql_range .= sprintf(" AND $sql_table.`received` < '%s'", DBA::escape($last_received)); - $a->setPagerPage(1); - $pager_sql = sprintf(" LIMIT %d, %d ", intval($a->pager['start']), intval($a->pager['itemspage'])); + $pager->setPage(1); + $pager_sql = sprintf(" LIMIT %d, %d ", $pager->getStart(), $pager->getItemsPerPage()); } break; case 'commented': if ($last_commented != '') { $last_date = $last_commented; $sql_range .= sprintf(" AND $sql_table.`commented` < '%s'", DBA::escape($last_commented)); - $a->setPagerPage(1); - $pager_sql = sprintf(" LIMIT %d, %d ", intval($a->pager['start']), intval($a->pager['itemspage'])); + $pager->setPage(1); + $pager_sql = sprintf(" LIMIT %d, %d ", $pager->getStart(), $pager->getItemsPerPage()); } break; case 'created': if ($last_created != '') { $last_date = $last_created; $sql_range .= sprintf(" AND $sql_table.`created` < '%s'", DBA::escape($last_created)); - $a->setPagerPage(1); - $pager_sql = sprintf(" LIMIT %d, %d ", intval($a->pager['start']), intval($a->pager['itemspage'])); + $pager->setPage(1); + $pager_sql = sprintf(" LIMIT %d, %d ", $pager->getStart(), $pager->getItemsPerPage()); } break; case 'id': if (($last_id > 0) && ($sql_table == '`thread`')) { $sql_range .= sprintf(" AND $sql_table.`iid` < '%s'", DBA::escape($last_id)); - $a->setPagerPage(1); - $pager_sql = sprintf(" LIMIT %d, %d ", intval($a->pager['start']), intval($a->pager['itemspage'])); + $pager->setPage(1); + $pager_sql = sprintf(" LIMIT %d, %d ", $pager->getStart(), $pager->getItemsPerPage()); } break; } @@ -835,7 +849,7 @@ function networkThreadedView(App $a, $update, $parent) if ($last_date > $top_limit) { $top_limit = $last_date; - } elseif ($a->pager['page'] == 1) { + } elseif ($pager->getPage() == 1) { // Highest possible top limit when we are on the first page $top_limit = DateTimeFormat::utcNow(); } @@ -858,7 +872,7 @@ function networkThreadedView(App $a, $update, $parent) $_SESSION['network_last_date'] = $tag_top_limit; } - logger('Tagged items: ' . count($data) . ' - ' . $bottom_limit . ' - ' . $top_limit . ' - ' . local_user().' - '.(int)$update); + Logger::log('Tagged items: ' . count($data) . ' - ' . $bottom_limit . ' - ' . $top_limit . ' - ' . local_user().' - '.(int)$update); $s = []; foreach ($r as $item) { $s[$item['uri']] = $item; @@ -898,7 +912,12 @@ function networkThreadedView(App $a, $update, $parent) $date_offset = $_GET['offset']; } - $a->page_offset = $date_offset; + $query_string = $a->query_string; + if ($date_offset && !preg_match('/[?&].offset=/', $query_string)) { + $query_string .= '&offset=' . urlencode($date_offset); + } + + $pager->setQueryString($query_string); // We aren't going to try and figure out at the item, group, and page // level which items you've seen and which you haven't. If you're looking @@ -914,7 +933,7 @@ function networkThreadedView(App $a, $update, $parent) $mode = 'network'; - $o .= networkConversation($a, $items, $mode, $update, $ordering); + $o .= networkConversation($a, $items, $pager, $mode, $update, $ordering); return $o; } @@ -1019,3 +1038,30 @@ function network_tabs(App $a) // --- end item filter tabs } + +/** + * Network hook into the HTML head to enable infinite scroll. + * + * Since the HTML head is built after the module content has been generated, we need to retrieve the base query string + * of the page to make the correct asynchronous call. This is obtained through the Pager that was instantiated in + * networkThreadedView or networkFlatView. + * + * @global Pager $pager + * @param App $a + * @param string $htmlhead The head tag HTML string + */ +function network_infinite_scroll_head(App $a, &$htmlhead) +{ + /// @TODO this will have to be converted to a static property of the converted Module\Network class + global $pager; + + if (PConfig::get(local_user(), 'system', 'infinite_scroll') + && defaults($_GET, 'mode', '') != 'minimal' + ) { + $tpl = get_markup_template('infinite_scroll_head.tpl'); + $htmlhead .= replace_macros($tpl, [ + '$pageno' => $pager->getPage(), + '$reload_uri' => $pager->getBaseQueryString() + ]); + } +} \ No newline at end of file