use Friendica\Content\Feature;
use Friendica\Content\ForumManager;
use Friendica\Content\Text\BBCode;
-use Friendica\Core\Addon;
+use Friendica\Content\Text\HTML;
+use Friendica\Content\Widget\ContactBlock;
use Friendica\Core\Cache;
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\Renderer;
use Friendica\Core\System;
use Friendica\Core\Worker;
use Friendica\Database\DBA;
-use Friendica\Model\Contact;
use Friendica\Protocol\Diaspora;
use Friendica\Util\DateTimeFormat;
use Friendica\Util\Network;
use Friendica\Util\Proxy as ProxyUtils;
+use Friendica\Util\Strings;
use Friendica\Util\Temporal;
-require_once 'include/dba.php';
-
class Profile
{
/**
* @param integer User ID
*
* @return array Profile data
+ * @throws \Exception
*/
public static function getByUID($uid)
{
* load a lot of theme-specific content
*
* @brief Loads a profile into the page sidebar.
- * @param object $a App
+ * @param App $a
* @param string $nickname string
* @param int $profile int
* @param array $profiledata array
* @param boolean $show_connect Show connect link
+ * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+ * @throws \ImagickException
*/
public static function load(App $a, $nickname, $profile = 0, array $profiledata = [], $show_connect = true)
{
$user = DBA::selectFirst('user', ['uid'], ['nickname' => $nickname, 'account_removed' => false]);
if (!DBA::isResult($user) && empty($profiledata)) {
- logger('profile error: ' . $a->query_string, LOGGER_DEBUG);
+ Logger::log('profile error: ' . $a->query_string, Logger::DEBUG);
notice(L10n::t('Requested account is not available.') . EOL);
$a->error = 404;
return;
$pdata = self::getByNickname($nickname, $user['uid'], $profile);
if (empty($pdata) && empty($profiledata)) {
- logger('profile error: ' . $a->query_string, LOGGER_DEBUG);
+ Logger::log('profile error: ' . $a->query_string, Logger::DEBUG);
notice(L10n::t('Requested profile is not available.') . EOL);
$a->error = 404;
return;
* load/reload current theme info
*/
- $a->setActiveTemplateEngine(); // reset the template engine to the default in case the user's theme doesn't specify one
+ Renderer::setActiveTemplateEngine(); // reset the template engine to the default in case the user's theme doesn't specify one
$theme_info_file = 'view/theme/' . $a->getCurrentTheme() . '/theme.php';
if (file_exists($theme_info_file)) {
}
if (local_user() && local_user() == $a->profile['uid'] && $profiledata) {
- $a->page['aside'] .= replace_macros(
- get_markup_template('profile_edlink.tpl'),
+ $a->page['aside'] .= Renderer::replaceMacros(
+ Renderer::getMarkupTemplate('profile_edlink.tpl'),
[
'$editprofile' => L10n::t('Edit profile'),
'$profid' => $a->profile['id']
* Includes all available profile data
*
* @brief Get all profile data of a local user
- * @param string $nickname nick
- * @param int $uid uid
- * @param int $profile_id ID of the profile
+ * @param string $nickname nick
+ * @param int $uid uid
+ * @param int $profile_id ID of the profile
* @return array
+ * @throws \Exception
*/
public static function getByNickname($nickname, $uid = 0, $profile_id = 0)
{
* because of all the conditional logic.
*
* @brief Formats a profile for display in the sidebar.
- * @param array $profile
- * @param int $block
+ * @param array $profile
+ * @param int $block
* @param boolean $show_connect Show connect link
*
* @return string HTML sidebar module
*
- * @note Returns empty string if passed $profile is wrong type or not populated
+ * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+ * @throws \ImagickException
+ * @note Returns empty string if passed $profile is wrong type or not populated
*
* @hooks 'profile_sidebar_enter'
* array $profile - profile data
*/
private static function sidebar($profile, $block = 0, $show_connect = true)
{
- $a = get_app();
+ $a = \get_app();
$o = '';
$location = false;
// This function can also use contact information in $profile
- $is_contact = x($profile, 'cid');
+ $is_contact = !empty($profile['cid']);
if (!is_array($profile) && !count($profile)) {
return $o;
$profile['picdate'] = urlencode(defaults($profile, 'picdate', ''));
if (($profile['network'] != '') && ($profile['network'] != Protocol::DFRN)) {
- $profile['network_name'] = format_network_name($profile['network'], $profile['url']);
+ $profile['network_link'] = Strings::formatNetworkName($profile['network'], $profile['url']);
} else {
- $profile['network_name'] = '';
+ $profile['network_link'] = '';
}
- Addon::callHooks('profile_sidebar_enter', $profile);
+ Hook::callAll('profile_sidebar_enter', $profile);
// don't show connect link to yourself
// Is the local user already connected to that user?
if ($connect && local_user()) {
if (isset($profile['url'])) {
- $profile_url = normalise_link($profile['url']);
+ $profile_url = Strings::normaliseLink($profile['url']);
} else {
- $profile_url = normalise_link(System::baseUrl() . '/profile/' . $profile['nickname']);
+ $profile_url = Strings::normaliseLink(System::baseUrl() . '/profile/' . $profile['nickname']);
}
if (DBA::exists('contact', ['pending' => false, 'uid' => local_user(), 'nurl' => $profile_url])) {
}
}
+ // Is the remote user already connected to that user?
+ if ($connect && Contact::isFollower(remote_user(), $profile['uid'])) {
+ $connect = false;
+ }
+
if ($connect && ($profile['network'] != Protocol::DFRN) && !isset($profile['remoteconnect'])) {
$connect = false;
}
// See issue https://github.com/friendica/friendica/issues/3838
// Either we remove the message link for remote users or we enable creating messages from remote users
- if (remote_user() || (self::getMyURL() && x($profile, 'unkmail') && ($profile['uid'] != local_user()))) {
+ if (remote_user() || (self::getMyURL() && !empty($profile['unkmail']) && ($profile['uid'] != local_user()))) {
$wallmessage = L10n::t('Message');
if (remote_user()) {
$r = q(
"SELECT `url` FROM `contact` WHERE `uid` = %d AND `nurl` = '%s' AND `rel` = %d",
intval($profile['uid']),
- DBA::escape(normalise_link(self::getMyURL())),
+ DBA::escape(Strings::normaliseLink(self::getMyURL())),
intval(Contact::FRIEND)
);
}
// Fetch the account type
$account_type = Contact::getAccountType($profile);
- if (x($profile, 'address')
- || x($profile, 'location')
- || x($profile, 'locality')
- || x($profile, 'region')
- || x($profile, 'postal-code')
- || x($profile, 'country-name')
+ if (!empty($profile['address'])
+ || !empty($profile['location'])
+ || !empty($profile['locality'])
+ || !empty($profile['region'])
+ || !empty($profile['postal-code'])
+ || !empty($profile['country-name'])
) {
$location = L10n::t('Location:');
}
- $gender = x($profile, 'gender') ? L10n::t('Gender:') : false;
- $marital = x($profile, 'marital') ? L10n::t('Status:') : false;
- $homepage = x($profile, 'homepage') ? L10n::t('Homepage:') : false;
- $about = x($profile, 'about') ? L10n::t('About:') : false;
- $xmpp = x($profile, 'xmpp') ? L10n::t('XMPP:') : false;
+ $gender = !empty($profile['gender']) ? L10n::t('Gender:') : false;
+ $marital = !empty($profile['marital']) ? L10n::t('Status:') : false;
+ $homepage = !empty($profile['homepage']) ? L10n::t('Homepage:') : false;
+ $about = !empty($profile['about']) ? L10n::t('About:') : false;
+ $xmpp = !empty($profile['xmpp']) ? L10n::t('XMPP:') : false;
- if ((x($profile, 'hidewall') || $block) && !local_user() && !remote_user()) {
+ if ((!empty($profile['hidewall']) || $block) && !local_user() && !remote_user()) {
$location = $gender = $marital = $homepage = $about = false;
}
$firstname = $split_name['first'];
$lastname = $split_name['last'];
- if (x($profile, 'guid')) {
+ if (!empty($profile['guid'])) {
$diaspora = [
'guid' => $profile['guid'],
'podloc' => System::baseUrl(),
$contact_block = '';
$updated = '';
- $contacts = 0;
+ $contact_count = 0;
if (!$block) {
- $contact_block = contact_block();
+ $contact_block = ContactBlock::getHTML($a->profile);
if (is_array($a->profile) && !$a->profile['hide-friends']) {
$r = q(
$updated = date('c', strtotime($r[0]['updated']));
}
- $r = q(
- "SELECT COUNT(*) AS `total` FROM `contact`
- WHERE `uid` = %d
- AND NOT `self` AND NOT `blocked` AND NOT `pending`
- AND NOT `hidden` AND NOT `archive`
- AND `network` IN ('%s', '%s', '%s', '')",
- intval($profile['uid']),
- DBA::escape(Protocol::DFRN),
- DBA::escape(Protocol::DIASPORA),
- DBA::escape(Protocol::OSTATUS)
- );
- if (DBA::isResult($r)) {
- $contacts = intval($r[0]['total']);
- }
+ $contact_count = DBA::count('contact', [
+ 'uid' => $profile['uid'],
+ 'self' => false,
+ 'blocked' => false,
+ 'pending' => false,
+ 'hidden' => false,
+ 'archive' => false,
+ 'network' => [Protocol::DFRN, Protocol::ACTIVITYPUB, Protocol::OSTATUS, Protocol::DIASPORA],
+ ]);
}
}
$p['about'] = BBCode::convert($p['about']);
}
+ if (empty($p['address']) && !empty($p['location'])) {
+ $p['address'] = $p['location'];
+ }
+
if (isset($p['address'])) {
$p['address'] = BBCode::convert($p['address']);
- } elseif (isset($p['location'])) {
- $p['address'] = BBCode::convert($p['location']);
}
if (isset($p['photo'])) {
$p['url'] = Contact::magicLink(defaults($p, 'url', $profile_url));
- $tpl = get_markup_template('profile_vcard.tpl');
- $o .= replace_macros($tpl, [
+ $tpl = Renderer::getMarkupTemplate('profile_vcard.tpl');
+ $o .= Renderer::replaceMacros($tpl, [
'$profile' => $p,
'$xmpp' => $xmpp,
'$connect' => $connect,
'$homepage' => $homepage,
'$about' => $about,
'$network' => L10n::t('Network:'),
- '$contacts' => $contacts,
+ '$contacts' => $contact_count,
'$updated' => $updated,
'$diaspora' => $diaspora,
'$contact_block' => $contact_block,
$arr = ['profile' => &$profile, 'entry' => &$o];
- Addon::callHooks('profile_sidebar', $arr);
+ Hook::callAll('profile_sidebar', $arr);
return $o;
}
public static function getBirthdays()
{
- $a = get_app();
+ $a = \get_app();
$o = '';
if (!local_user() || $a->is_mobile || $a->is_tablet) {
if (is_null($r)) {
$s = DBA::p(
"SELECT `event`.*, `event`.`id` AS `eid`, `contact`.* FROM `event`
- INNER JOIN `contact` ON `contact`.`id` = `event`.`cid`
+ INNER JOIN `contact`
+ ON `contact`.`id` = `event`.`cid`
+ AND (`contact`.`rel` = ? OR `contact`.`rel` = ?)
+ AND NOT `contact`.`pending`
+ AND NOT `contact`.`hidden`
+ AND NOT `contact`.`blocked`
+ AND NOT `contact`.`archive`
+ AND NOT `contact`.`deleted`
WHERE `event`.`uid` = ? AND `type` = 'birthday' AND `start` < ? AND `finish` > ?
ORDER BY `start` ASC ",
+ Contact::SHARING,
+ Contact::FRIEND,
local_user(),
DateTimeFormat::utc('now + 6 days'),
DateTimeFormat::utcNow()
$rr['link'] = Contact::magicLink($rr['url']);
$rr['title'] = $rr['name'];
- $rr['date'] = day_translate(DateTimeFormat::convert($rr['start'], $a->timezone, 'UTC', $rr['adjust'] ? $bd_format : $bd_short)) . (($today) ? ' ' . L10n::t('[today]') : '');
+ $rr['date'] = L10n::getDay(DateTimeFormat::convert($rr['start'], $a->timezone, 'UTC', $rr['adjust'] ? $bd_format : $bd_short)) . (($today) ? ' ' . L10n::t('[today]') : '');
$rr['startime'] = null;
$rr['today'] = $today;
}
}
}
- $tpl = get_markup_template('birthdays_reminder.tpl');
- return replace_macros($tpl, [
+ $tpl = Renderer::getMarkupTemplate('birthdays_reminder.tpl');
+ return Renderer::replaceMacros($tpl, [
'$baseurl' => System::baseUrl(),
'$classtoday' => $classtoday,
'$count' => $total,
public static function getEventsReminderHTML()
{
- $a = get_app();
+ $a = \get_app();
$o = '';
if (!local_user() || $a->is_mobile || $a->is_tablet) {
$rr['title'] = $title;
$rr['description'] = $description;
- $rr['date'] = day_translate(DateTimeFormat::convert($rr['start'], $rr['adjust'] ? $a->timezone : 'UTC', 'UTC', $bd_format)) . (($today) ? ' ' . L10n::t('[today]') : '');
+ $rr['date'] = L10n::getDay(DateTimeFormat::convert($rr['start'], $rr['adjust'] ? $a->timezone : 'UTC', 'UTC', $bd_format)) . (($today) ? ' ' . L10n::t('[today]') : '');
$rr['startime'] = $strt;
$rr['today'] = $today;
DBA::close($s);
$classtoday = (($istoday) ? 'event-today' : '');
}
- $tpl = get_markup_template('events_reminder.tpl');
- return replace_macros($tpl, [
+ $tpl = Renderer::getMarkupTemplate('events_reminder.tpl');
+ return Renderer::replaceMacros($tpl, [
'$baseurl' => System::baseUrl(),
'$classtoday' => $classtoday,
'$count' => count($r),
public static function getAdvanced(App $a)
{
- $o = '';
$uid = $a->profile['uid'];
- $o .= replace_macros(
- get_markup_template('section_title.tpl'),
- ['$title' => L10n::t('Profile')]
- );
-
if ($a->profile['name']) {
- $tpl = get_markup_template('profile_advanced.tpl');
+ $tpl = Renderer::getMarkupTemplate('profile_advanced.tpl');
$profile = [];
}
if ($a->profile['gender']) {
- $profile['gender'] = [L10n::t('Gender:'), $a->profile['gender']];
+ $profile['gender'] = [L10n::t('Gender:'), L10n::t($a->profile['gender'])];
}
- if (($a->profile['dob']) && ($a->profile['dob'] > '0001-01-01')) {
+ if (!empty($a->profile['dob']) && $a->profile['dob'] > DBA::NULL_DATE) {
$year_bd_format = L10n::t('j F, Y');
$short_bd_format = L10n::t('j F');
- $val = day_translate(
+ $val = L10n::getDay(
intval($a->profile['dob']) ?
DateTimeFormat::utc($a->profile['dob'] . ' 00:00 +00:00', $year_bd_format)
: DateTimeFormat::utc('2001-' . substr($a->profile['dob'], 5) . ' 00:00 +00:00', $short_bd_format)
}
if (!empty($a->profile['dob'])
- && $a->profile['dob'] > '0001-01-01'
+ && $a->profile['dob'] > DBA::NULL_DATE
&& $age = Temporal::getAgeByTimezone($a->profile['dob'], $a->profile['timezone'], '')
) {
$profile['age'] = [L10n::t('Age:'), $age];
}
if ($a->profile['marital']) {
- $profile['marital'] = [L10n::t('Status:'), $a->profile['marital']];
+ $profile['marital'] = [L10n::t('Status:'), L10n::t($a->profile['marital'])];
}
/// @TODO Maybe use x() here, plus below?
$profile['marital']['with'] = $a->profile['with'];
}
- if (strlen($a->profile['howlong']) && $a->profile['howlong'] >= NULL_DATE) {
+ if (strlen($a->profile['howlong']) && $a->profile['howlong'] >= DBA::NULL_DATETIME) {
$profile['howlong'] = Temporal::getRelativeDate($a->profile['howlong'], L10n::t('for %1$d %2$s'));
}
if ($a->profile['sexual']) {
- $profile['sexual'] = [L10n::t('Sexual Preference:'), $a->profile['sexual']];
+ $profile['sexual'] = [L10n::t('Sexual Preference:'), L10n::t($a->profile['sexual'])];
}
if ($a->profile['homepage']) {
- $profile['homepage'] = [L10n::t('Homepage:'), linkify($a->profile['homepage'])];
+ $profile['homepage'] = [L10n::t('Homepage:'), HTML::toLink($a->profile['homepage'])];
}
if ($a->profile['hometown']) {
- $profile['hometown'] = [L10n::t('Hometown:'), linkify($a->profile['hometown'])];
+ $profile['hometown'] = [L10n::t('Hometown:'), HTML::toLink($a->profile['hometown'])];
}
if ($a->profile['pub_keywords']) {
$profile['edit'] = [System::baseUrl() . '/profiles/' . $a->profile['id'], L10n::t('Edit profile'), '', L10n::t('Edit profile')];
}
- return replace_macros($tpl, [
+ return Renderer::replaceMacros($tpl, [
'$title' => L10n::t('Profile'),
'$basic' => L10n::t('Basic'),
'$advanced' => L10n::t('Advanced'),
}
$tab = false;
- if (x($_GET, 'tab')) {
- $tab = notags(trim($_GET['tab']));
+ if (!empty($_GET['tab'])) {
+ $tab = Strings::escapeTags(trim($_GET['tab']));
}
$url = System::baseUrl() . '/profile/' . $nickname;
}
$arr = ['is_owner' => $is_owner, 'nickname' => $nickname, 'tab' => $tab, 'tabs' => $tabs];
- Addon::callHooks('profile_tabs', $arr);
+ Hook::callAll('profile_tabs', $arr);
- $tpl = get_markup_template('common_tabs.tpl');
+ $tpl = Renderer::getMarkupTemplate('common_tabs.tpl');
- return replace_macros($tpl, ['$tabs' => $arr['tabs']]);
+ return Renderer::replaceMacros($tpl, ['$tabs' => $arr['tabs']]);
}
/**
*/
public static function getMyURL()
{
- if (x($_SESSION, 'my_url')) {
+ if (!empty($_SESSION['my_url'])) {
return $_SESSION['my_url'];
}
return null;
* Ported from Hubzilla: https://framagit.org/hubzilla/core/blob/master/include/channel.php
*
* @param App $a Application instance.
+ * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+ * @throws \ImagickException
*/
public static function zrlInit(App $a)
{
}
$arr = ['zrl' => $my_url, 'url' => $a->cmd];
- Addon::callHooks('zrl_init', $arr);
+ Hook::callAll('zrl_init', $arr);
// Try to find the public contact entry of the visitor.
$cid = Contact::getIdForURL($my_url);
if (!$cid) {
- logger('No contact record found for ' . $my_url, LOGGER_DEBUG);
+ Logger::log('No contact record found for ' . $my_url, Logger::DEBUG);
return;
}
$contact = DBA::selectFirst('contact',['id', 'url'], ['id' => $cid]);
if (DBA::isResult($contact) && remote_user() && remote_user() == $contact['id']) {
- logger('The visitor ' . $my_url . ' is already authenticated', LOGGER_DEBUG);
+ Logger::log('The visitor ' . $my_url . ' is already authenticated', Logger::DEBUG);
return;
}
// Avoid endless loops
$cachekey = 'zrlInit:' . $my_url;
if (Cache::get($cachekey)) {
- logger('URL ' . $my_url . ' already tried to authenticate.', LOGGER_DEBUG);
+ Logger::log('URL ' . $my_url . ' already tried to authenticate.', Logger::DEBUG);
return;
} else {
Cache::set($cachekey, true, Cache::MINUTE);
}
- logger('Not authenticated. Invoking reverse magic-auth for ' . $my_url, LOGGER_DEBUG);
+ Logger::log('Not authenticated. Invoking reverse magic-auth for ' . $my_url, Logger::DEBUG);
Worker::add(PRIORITY_LOW, 'GProbe', $my_url);
// We have to check if the remote server does understand /magic without invoking something
$serverret = Network::curl($basepath . '/magic');
if ($serverret->isSuccess()) {
- logger('Doing magic auth for visitor ' . $my_url . ' to ' . $magic_path, LOGGER_DEBUG);
- $a->redirect($magic_path);
+ Logger::log('Doing magic auth for visitor ' . $my_url . ' to ' . $magic_path, Logger::DEBUG);
+ System::externalRedirect($magic_path);
}
}
}
* Ported from Hubzilla: https://framagit.org/hubzilla/core/blob/master/include/zid.php
*
* @param string $token
+ * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+ * @throws \ImagickException
*/
public static function openWebAuthInit($token)
{
- $a = get_app();
+ $a = \get_app();
// Clean old OpenWebAuthToken entries.
OpenWebAuthToken::purge('owt', '3 MINUTE');
// Try to find the public contact entry of the visitor.
$cid = Contact::getIdForURL($visitor_handle);
if(!$cid) {
- logger('owt: unable to finger ' . $visitor_handle, LOGGER_DEBUG);
+ Logger::log('owt: unable to finger ' . $visitor_handle, Logger::DEBUG);
return;
}
$_SESSION['visitor_home'] = $visitor['url'];
$_SESSION['my_url'] = $visitor['url'];
+ /// @todo replace this and the query for this variable with some cleaner functionality
+ $_SESSION['remote'] = [];
+
+ $remote_contacts = DBA::select('contact', ['id', 'uid'], ['nurl' => $visitor['nurl'], 'rel' => [Contact::FOLLOWER, Contact::FRIEND]]);
+ while ($contact = DBA::fetch($remote_contacts)) {
+ if (($contact['uid'] == 0) || Contact::isBlockedByUser($visitor['id'], $contact['uid'])) {
+ continue;
+ }
+
+ $_SESSION['remote'][] = ['cid' => $contact['id'], 'uid' => $contact['uid'], 'url' => $visitor['url']];
+ }
$arr = [
'visitor' => $visitor,
'url' => $a->query_string
* * \e array \b visitor
* * \e string \b url
*/
- Addon::callHooks('magic_auth_success', $arr);
+ Hook::callAll('magic_auth_success', $arr);
$a->contact = $arr['visitor'];
info(L10n::t('OpenWebAuth: %1$s welcomes %2$s', $a->getHostName(), $visitor['name']));
- logger('OpenWebAuth: auth success from ' . $visitor['addr'], LOGGER_DEBUG);
+ Logger::log('OpenWebAuth: auth success from ' . $visitor['addr'], Logger::DEBUG);
}
public static function zrl($s, $force = false)
}
$achar = strpos($s, '?') ? '&' : '?';
$mine = self::getMyURL();
- if ($mine && !link_compare($mine, $s)) {
+ if ($mine && !Strings::compareLink($mine, $s)) {
return $s . $achar . 'zrl=' . urlencode($mine);
}
return $s;
* Get the user ID of the page owner.
*
* Used from within PCSS themes to set theme parameters. If there's a
- * puid request variable, that is the "page owner" and normally their theme
+ * profile_uid variable set in App, that is the "page owner" and normally their theme
* settings take precedence; unless a local user sets the "always_my_theme"
* system pconfig, which means they don't want to see anybody else's theme
* settings except their own while on this site.
* @brief Get the user ID of the page owner
* @return int user ID
*
- * @note Returns local_user instead of user ID if "always_my_theme"
- * is set to true
+ * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+ * @note Returns local_user instead of user ID if "always_my_theme" is set to true
*/
- public static function getThemeUid()
+ public static function getThemeUid(App $a)
{
- $uid = ((!empty($_REQUEST['puid'])) ? intval($_REQUEST['puid']) : 0);
- if ((local_user()) && ((PConfig::get(local_user(), 'system', 'always_my_theme')) || (!$uid))) {
+ $uid = !empty($a->profile_uid) ? intval($a->profile_uid) : 0;
+ if (local_user() && (PConfig::get(local_user(), 'system', 'always_my_theme') || !$uid)) {
return local_user();
}
}
/**
- * Stip zrl parameter from a string.
+ * Strip zrl parameter from a string.
*
* @param string $s The input string.
* @return string The zrl.
}
/**
- * Stip query parameter from a string.
- *
- * @param string $s The input string.
- * @return string The query parameter.
- */
+ * Strip query parameter from a string.
+ *
+ * @param string $s The input string.
+ * @param $param
+ * @return string The query parameter.
+ */
public static function stripQueryParam($s, $param)
{
return preg_replace('/[\?&]' . $param . '=(.*?)(&|$)/ism', '$2', $s);