streams/include/widgets.php

1475 lines
37 KiB
PHP
Raw Normal View History

<?php
/**
* @file include/widgets.php
*
* @brief This file contains the widgets.
*/
require_once('include/dir_fns.php');
require_once('include/contact_widgets.php');
2015-11-18 10:45:22 +00:00
require_once('include/attach.php');
2016-02-09 02:16:42 +00:00
require_once('include/Contact.php');
function widget_profile($args) {
$a = get_app();
2015-01-29 04:58:59 +00:00
$block = (((get_config('system', 'block_public')) && (! local_channel()) && (! remote_channel())) ? true : false);
return profile_sidebar($a->profile, $block, true);
}
2016-02-09 02:16:42 +00:00
function widget_zcard($args) {
$a = get_app();
$block = (((get_config('system', 'block_public')) && (! local_channel()) && (! remote_channel())) ? true : false);
$channel = channelx_by_n($a->profile_uid);
return get_zcard($channel,get_observer_hash(),array('width' => 875));
}
// FIXME The problem with the next widget is that we don't have a search function for webpages that we can send the links to.
// Then we should also provide an option to search webpages and conversations.
function widget_tagcloud($args) {
$o = '';
//$tab = 0;
$a = get_app();
$uid = $a->profile_uid;
$count = ((x($args,'count')) ? intval($args['count']) : 24);
$flags = 0;
$type = TERM_CATEGORY;
// FIXME there exists no $authors variable
$r = tagadelic($uid, $count, $authors, $owner, $flags, ITEM_TYPE_WEBPAGE, $type);
if($r) {
$o = '<div class="tagblock widget"><h3>' . t('Categories') . '</h3><div class="tags" align="center">';
foreach($r as $rr) {
$o .= '<span class="tag'.$rr[2].'">'.$rr[0].'</span> ' . "\r\n";
}
$o .= '</div></div>';
}
return $o;
}
function widget_collections($args) {
require_once('include/group.php');
2013-12-20 07:56:37 +00:00
$mode = ((array_key_exists('mode',$args)) ? $args['mode'] : 'conversation');
switch($mode) {
case 'conversation':
$every = argv(0);
$each = argv(0);
$edit = true;
$current = $_REQUEST['gid'];
$abook_id = 0;
$wmode = 0;
break;
case 'connections':
$every = 'connections';
$each = 'group';
$edit = true;
$current = $_REQUEST['gid'];
$abook_id = 0;
$wmode = 0;
2013-12-20 07:56:37 +00:00
case 'groups':
$every = 'connections';
$each = argv(0);
$edit = false;
$current = intval(argv(1));
$abook_id = 0;
$wmode = 1;
break;
case 'abook':
$every = 'connections';
$each = 'group';
$edit = false;
$current = 0;
$abook_id = get_app()->poi['abook_xchan'];
$wmode = 1;
break;
default:
return '';
break;
}
return group_side($every, $each, $edit, $current, $abook_id, $wmode);
}
function widget_appselect($arr) {
return replace_macros(get_markup_template('app_select.tpl'),array(
2014-05-22 03:54:09 +00:00
'$title' => t('Apps'),
'$system' => t('System'),
2015-01-29 04:56:04 +00:00
'$authed' => ((local_channel()) ? true : false),
2014-05-22 03:54:09 +00:00
'$personal' => t('Personal'),
'$new' => t('Create Personal App'),
'$edit' => t('Edit Personal App')
));
}
function widget_suggestions($arr) {
2015-01-29 04:56:04 +00:00
if((! local_channel()) || (! feature_enabled(local_channel(),'suggest')))
2013-12-11 11:01:28 +00:00
return '';
require_once('include/socgraph.php');
2015-01-29 04:56:04 +00:00
$r = suggestion_query(local_channel(),get_observer_hash(),0,20);
if(! $r) {
return;
}
$arr = array();
// Get two random entries from the top 20 returned.
// We'll grab the first one and the one immediately following.
// This will throw some entropy intot he situation so you won't
// be looking at the same two mug shots every time the widget runs
$index = ((count($r) > 2) ? mt_rand(0,count($r) - 2) : 0);
for($x = $index; $x <= ($index+1); $x ++) {
$rr = $r[$x];
if(! $rr['xchan_url'])
break;
$connlnk = z_root() . '/follow/?url=' . $rr['xchan_addr'];
$arr[] = array(
'url' => chanlink_url($rr['xchan_url']),
'profile' => $rr['xchan_url'],
'name' => $rr['xchan_name'],
'photo' => $rr['xchan_photo_m'],
'ignlnk' => z_root() . '/directory?ignore=' . $rr['xchan_hash'],
'conntxt' => t('Connect'),
'connlnk' => $connlnk,
'ignore' => t('Ignore/Hide')
);
}
$o = replace_macros(get_markup_template('suggest_widget.tpl'),array(
'$title' => t('Suggestions'),
'$more' => t('See more...'),
'$entries' => $arr
));
return $o;
}
function widget_follow($args) {
2015-01-29 04:56:04 +00:00
if(! local_channel())
return '';
$a = get_app();
$uid =$a->channel['channel_id'];
2015-06-15 04:08:00 +00:00
$r = q("select count(*) as total from abook where abook_channel = %d and abook_self = 0 ",
intval($uid)
);
if($r)
$total_channels = $r[0]['total'];
$limit = service_class_fetch($uid,'total_channels');
if($limit !== false) {
$abook_usage_message = sprintf( t("You have %1$.0f of %2$.0f allowed connections."), $total_channels, $limit);
}
else {
$abook_usage_message = '';
}
return replace_macros(get_markup_template('follow.tpl'),array(
'$connect' => t('Add New Connection'),
2016-01-14 09:36:45 +00:00
'$desc' => t('Enter channel address'),
2016-01-14 12:50:47 +00:00
'$hint' => t('Examples: bob@example.com, https://example.com/barbara'),
'$follow' => t('Connect'),
'$abook_usage_message' => $abook_usage_message
));
}
2013-12-09 23:27:46 +00:00
function widget_notes($arr) {
2015-01-29 04:56:04 +00:00
if(! local_channel())
2013-12-09 23:27:46 +00:00
return '';
2015-01-29 04:56:04 +00:00
if(! feature_enabled(local_channel(),'private_notes'))
2013-12-10 02:54:50 +00:00
return '';
2015-01-29 04:56:04 +00:00
$text = get_pconfig(local_channel(),'notes','text');
2013-12-09 23:27:46 +00:00
$o = replace_macros(get_markup_template('notes.tpl'), array(
'$banner' => t('Notes'),
'$text' => $text,
'$save' => t('Save'),
));
2013-12-09 23:27:46 +00:00
return $o;
}
2013-12-10 05:20:55 +00:00
function widget_savedsearch($arr) {
2015-01-29 04:56:04 +00:00
if((! local_channel()) || (! feature_enabled(local_channel(),'savedsearch')))
2013-12-10 05:20:55 +00:00
return '';
$a = get_app();
$search = ((x($_GET,'search')) ? $_GET['search'] : '');
2013-12-10 05:20:55 +00:00
if(x($_GET,'searchsave') && $search) {
$r = q("select * from `term` where `uid` = %d and `type` = %d and `term` = '%s' limit 1",
2015-01-29 04:56:04 +00:00
intval(local_channel()),
2013-12-10 05:20:55 +00:00
intval(TERM_SAVEDSEARCH),
dbesc($search)
);
if(! $r) {
q("insert into `term` ( `uid`,`type`,`term` ) values ( %d, %d, '%s') ",
2015-01-29 04:56:04 +00:00
intval(local_channel()),
2013-12-10 05:20:55 +00:00
intval(TERM_SAVEDSEARCH),
dbesc($search)
);
}
}
if(x($_GET,'searchremove') && $search) {
PostgreSQL support initial commit There were 11 main types of changes: - UPDATE's and DELETE's sometimes had LIMIT 1 at the end of them. This is not only non-compliant but it would certainly not do what whoever wrote it thought it would. It is likely this mistake was just copied from Friendica. All of these instances, the LIMIT 1 was simply removed. - Bitwise operations (and even some non-zero int checks) erroneously rely on MySQL implicit integer-boolean conversion in the WHERE clauses. This is non-compliant (and bad programming practice to boot). Proper explicit boolean conversions were added. New queries should use proper conventions. - MySQL has a different operator for bitwise XOR than postgres. Rather than add yet another dba_ func, I converted them to "& ~" ("AND NOT") when turning off, and "|" ("OR") when turning on. There were no true toggles (XOR). New queries should refrain from using XOR when not necessary. - There are several fields which the schema has marked as NOT NULL, but the inserts don't specify them. The reason this works is because mysql totally ignores the constraint and adds an empty text default automatically. Again, non-compliant, obviously. In these cases a default of empty text was added. - Several statements rely on a non-standard MySQL feature (http://dev.mysql.com/doc/refman/5.5/en/group-by-handling.html). These queries can all be rewritten to be standards compliant. Interestingly enough, the newly rewritten standards compliant queries run a zillion times faster, even on MySQL. - A couple of function/operator name translations were needed (RAND/RANDOM, GROUP_CONCAT/STRING_AGG, UTC_NOW, REGEXP/~, ^/#) -- assist functions added in the dba_ - INTERVALs: postgres requires quotes around the value, mysql requires that there are not quotes around the value -- assist functions added in the dba_ - NULL_DATE's -- Postgres does not allow the invalid date '0000-00-00 00:00:00' (there is no such thing as year 0 or month 0 or day 0). We use '0001-01-01 00:00:00' for postgres. Conversions are handled in Zot/item packets automagically by quoting all dates with dbescdate(). - char(##) specifications in the schema creates fields with blank spaces that aren't trimmed in the code. MySQL apparently treats char(##) as varchar(##), again, non-compliant. Since postgres works better with text fields anyway, this ball of bugs was simply side-stepped by using 'text' datatype for all text fields in the postgres schema. varchar was used in a couple of places where it actually seemed appropriate (size constraint), but without rigorously vetting that all of the PHP code actually validates data, new bugs might come out from under the rug. - postgres doesn't store nul bytes and a few other non-printables in text fields, even when quoted. bytea fields were used when storing binary data (photo.data, attach.data). A new dbescbin() function was added to handle this transparently. - postgres does not support LIMIT #,# syntax. All databases support LIMIT # OFFSET # syntax. Statements were updated to be standard. These changes require corresponding changes in the coding standards. Please review those before adding any code going forward. Still on my TODO list: - remove quotes from non-reserved identifiers and make reserved identifiers use dba func for quoting - Rewrite search queries for better results (both MySQL and Postgres)
2014-11-13 20:21:58 +00:00
q("delete from `term` where `uid` = %d and `type` = %d and `term` = '%s'",
2015-01-29 04:56:04 +00:00
intval(local_channel()),
2013-12-10 05:20:55 +00:00
intval(TERM_SAVEDSEARCH),
dbesc($search)
);
$search = '';
}
$srchurl = $a->query_string;
$srchurl = rtrim(preg_replace('/searchsave\=[^\&].*?(\&|$)/is','',$srchurl),'&');
$hasq = ((strpos($srchurl,'?') !== false) ? true : false);
$srchurl = rtrim(preg_replace('/searchremove\=[^\&].*?(\&|$)/is','',$srchurl),'&');
$srchurl = rtrim(preg_replace('/search\=[^\&].*?(\&|$)/is','',$srchurl),'&');
2014-12-15 22:37:31 +00:00
$srchurl = rtrim(preg_replace('/submit\=[^\&].*?(\&|$)/is','',$srchurl),'&');
2013-12-11 04:36:11 +00:00
$srchurl = str_replace(array('?f=','&f='),array('',''),$srchurl);
2014-12-15 22:37:31 +00:00
2013-12-10 05:20:55 +00:00
$hasq = ((strpos($srchurl,'?') !== false) ? true : false);
$hasamp = ((strpos($srchurl,'&') !== false) ? true : false);
if(($hasamp) && (! $hasq))
$srchurl = substr($srchurl,0,strpos($srchurl,'&')) . '?f=&' . substr($srchurl,strpos($srchurl,'&')+1);
2014-12-15 22:37:31 +00:00
2013-12-10 05:20:55 +00:00
$o = '';
$r = q("select `tid`,`term` from `term` WHERE `uid` = %d and `type` = %d ",
2015-01-29 04:56:04 +00:00
intval(local_channel()),
2013-12-10 05:20:55 +00:00
intval(TERM_SAVEDSEARCH)
);
$saved = array();
if(count($r)) {
foreach($r as $rr) {
$saved[] = array(
'id' => $rr['tid'],
'term' => $rr['term'],
'dellink' => z_root() . '/' . $srchurl . (($hasq || $hasamp) ? '' : '?f=') . '&amp;searchremove=1&amp;search=' . urlencode($rr['term']),
'srchlink' => z_root() . '/' . $srchurl . (($hasq || $hasamp) ? '' : '?f=') . '&amp;search=' . urlencode($rr['term']),
2013-12-12 10:15:02 +00:00
'displayterm' => htmlspecialchars($rr['term'], ENT_COMPAT,'UTF-8'),
'encodedterm' => urlencode($rr['term']),
'delete' => t('Remove term'),
'selected' => ($search==$rr['term']),
2013-12-10 05:20:55 +00:00
);
}
}
2013-12-10 05:20:55 +00:00
$tpl = get_markup_template("saved_searches.tpl");
$o = replace_macros($tpl, array(
'$title' => t('Saved Searches'),
'$add' => t('add'),
'$searchbox' => searchbox($search, 'netsearch-box', $srchurl . (($hasq) ? '' : '?f='), true),
2013-12-10 05:20:55 +00:00
'$saved' => $saved,
));
2013-12-10 05:20:55 +00:00
return $o;
}
function widget_filer($arr) {
2015-01-29 04:56:04 +00:00
if(! local_channel())
return '';
$a = get_app();
$selected = ((x($_REQUEST,'file')) ? $_REQUEST['file'] : '');
$terms = array();
$r = q("select distinct(term) from term where uid = %d and type = %d order by term asc",
2015-01-29 04:56:04 +00:00
intval(local_channel()),
intval(TERM_FILE)
);
if(! $r)
return;
foreach($r as $rr)
$terms[] = array('name' => $rr['term'], 'selected' => (($selected == $rr['term']) ? 'selected' : ''));
return replace_macros(get_markup_template('fileas_widget.tpl'),array(
'$title' => t('Saved Folders'),
'$desc' => '',
'$sel_all' => (($selected == '') ? 'selected' : ''),
'$all' => t('Everything'),
'$terms' => $terms,
'$base' => z_root() . '/' . $a->cmd
));
}
function widget_archive($arr) {
$o = '';
$a = get_app();
if(! $a->profile_uid) {
return '';
}
$uid = $a->profile_uid;
if(! feature_enabled($uid,'archives'))
return '';
if(! perm_is_allowed($uid,get_observer_hash(),'view_stream'))
return '';
$wall = ((array_key_exists('wall', $arr)) ? intval($arr['wall']) : 0);
$style = ((array_key_exists('style', $arr)) ? $arr['style'] : 'select');
$showend = ((get_pconfig($uid,'system','archive_show_end_date')) ? true : false);
$mindate = get_pconfig($uid,'system','archive_mindate');
$visible_years = get_pconfig($uid,'system','archive_visible_years');
if(! $visible_years)
$visible_years = 5;
$url = z_root() . '/' . $a->cmd;
$ret = list_post_dates($uid,$wall,$mindate);
if(! count($ret))
return '';
$cutoff_year = intval(datetime_convert('',date_default_timezone_get(),'now','Y')) - $visible_years;
$cutoff = ((array_key_exists($cutoff_year,$ret))? true : false);
$o = replace_macros(get_markup_template('posted_date_widget.tpl'),array(
'$title' => t('Archives'),
'$size' => $visible_years,
'$cutoff_year' => $cutoff_year,
'$cutoff' => $cutoff,
'$url' => $url,
'$style' => $style,
'$showend' => $showend,
'$dates' => $ret
));
return $o;
}
2013-12-11 04:36:11 +00:00
function widget_fullprofile($arr) {
$a = get_app();
if(! $a->profile['profile_uid'])
return;
2015-01-29 04:58:59 +00:00
$block = (((get_config('system', 'block_public')) && (! local_channel()) && (! remote_channel())) ? true : false);
2013-12-11 04:36:11 +00:00
return profile_sidebar($a->profile, $block);
}
2016-02-09 02:16:42 +00:00
function widget_shortprofile($arr) {
$a = get_app();
if(! $a->profile['profile_uid'])
return;
$block = (((get_config('system', 'block_public')) && (! local_channel()) && (! remote_channel())) ? true : false);
return profile_sidebar($a->profile, $block, true, true);
}
2013-12-11 04:36:11 +00:00
function widget_categories($arr) {
$a = get_app();
if($a->profile['profile_uid'] && (! perm_is_allowed($a->profile['profile_uid'],get_observer_hash(),'view_stream')))
return '';
2013-12-12 10:15:02 +00:00
$cat = ((x($_REQUEST,'cat')) ? htmlspecialchars($_REQUEST['cat'],ENT_COMPAT,'UTF-8') : '');
2013-12-11 04:36:11 +00:00
$srchurl = $a->query_string;
$srchurl = rtrim(preg_replace('/cat\=[^\&].*?(\&|$)/is','',$srchurl),'&');
$srchurl = str_replace(array('?f=','&f='),array('',''),$srchurl);
return categories_widget($srchurl, $cat);
2013-12-11 04:36:11 +00:00
}
function widget_tagcloud_wall($arr) {
$a = get_app();
2013-12-11 04:36:11 +00:00
if((! $a->profile['profile_uid']) || (! $a->profile['channel_hash']))
return '';
if(! perm_is_allowed($a->profile['profile_uid'], get_observer_hash(), 'view_stream'))
return '';
$limit = ((array_key_exists('limit', $arr)) ? intval($arr['limit']) : 50);
if(feature_enabled($a->profile['profile_uid'], 'tagadelic'))
return wtagblock($a->profile['profile_uid'], $limit, '', $a->profile['channel_hash'], 'wall');
2013-12-11 04:36:11 +00:00
return '';
2013-12-11 11:01:28 +00:00
}
2014-11-06 09:24:04 +00:00
function widget_catcloud_wall($arr) {
$a = get_app();
2014-11-06 09:24:04 +00:00
if((! $a->profile['profile_uid']) || (! $a->profile['channel_hash']))
return '';
if(! perm_is_allowed($a->profile['profile_uid'], get_observer_hash(), 'view_stream'))
2014-11-06 09:24:04 +00:00
return '';
$limit = ((array_key_exists('limit',$arr)) ? intval($arr['limit']) : 50);
return catblock($a->profile['profile_uid'], $limit, '', $a->profile['channel_hash'], 'wall');
2014-11-06 09:24:04 +00:00
}
function widget_affinity($arr) {
2015-01-29 04:56:04 +00:00
if(! local_channel())
return '';
2013-12-12 03:56:57 +00:00
$cmin = ((x($_REQUEST,'cmin')) ? intval($_REQUEST['cmin']) : 0);
$cmax = ((x($_REQUEST,'cmax')) ? intval($_REQUEST['cmax']) : 99);
2015-04-10 02:51:58 +00:00
2015-01-29 04:56:04 +00:00
if(feature_enabled(local_channel(),'affinity')) {
2015-04-10 02:51:58 +00:00
$labels = array(
t('Me'),
t('Family'),
t('Friends'),
t('Acquaintances'),
t('All')
);
call_hooks('affinity_labels',$labels);
$label_str = '';
if($labels) {
foreach($labels as $l) {
if($label_str) {
$label_str .= ", '|'";
$label_str .= ", '" . $l . "'";
}
else
$label_str .= "'" . $l . "'";
}
}
$tpl = get_markup_template('main_slider.tpl');
$x = replace_macros($tpl,array(
2015-01-05 17:30:12 +00:00
'$val' => $cmin . ',' . $cmax,
'$refresh' => t('Refresh'),
2015-04-10 02:51:58 +00:00
'$labels' => $label_str,
));
$arr = array('html' => $x);
call_hooks('main_slider',$arr);
return $arr['html'];
}
return '';
2013-12-14 21:26:40 +00:00
}
function widget_settings_menu($arr) {
2015-01-29 04:56:04 +00:00
if(! local_channel())
2013-12-14 21:26:40 +00:00
return;
$a = get_app();
$channel = $a->get_channel();
$abook_self_id = 0;
// Retrieve the 'self' address book entry for use in the auto-permissions link
2015-01-29 04:56:04 +00:00
$role = get_pconfig(local_channel(),'system','permissions_role');
2015-06-15 04:08:00 +00:00
$abk = q("select abook_id from abook where abook_channel = %d and abook_self = 1 limit 1",
intval(local_channel())
2013-12-14 21:26:40 +00:00
);
if($abk)
$abook_self_id = $abk[0]['abook_id'];
$hublocs = q("select count(*) as total from hubloc where hubloc_hash = '%s'",
dbesc($channel['channel_hash'])
);
$hublocs = (($hublocs[0]['total'] > 1) ? true : false);
2013-12-14 21:26:40 +00:00
$tabs = array(
array(
'label' => t('Account settings'),
'url' => $a->get_baseurl(true).'/settings/account',
'selected' => ((argv(1) === 'account') ? 'active' : ''),
),
2013-12-14 21:26:40 +00:00
array(
'label' => t('Channel settings'),
'url' => $a->get_baseurl(true).'/settings/channel',
'selected' => ((argv(1) === 'channel') ? 'active' : ''),
),
);
2013-12-14 21:26:40 +00:00
if(get_features()) {
$tabs[] = array(
'label' => t('Additional features'),
'url' => $a->get_baseurl(true).'/settings/features',
'selected' => ((argv(1) === 'features') ? 'active' : ''),
);
}
2013-12-14 21:26:40 +00:00
$tabs[] = array(
'label' => t('Feature/Addon settings'),
'url' => $a->get_baseurl(true).'/settings/featured',
'selected' => ((argv(1) === 'featured') ? 'active' : ''),
);
$tabs[] = array(
'label' => t('Display settings'),
'url' => $a->get_baseurl(true).'/settings/display',
'selected' => ((argv(1) === 'display') ? 'active' : ''),
);
2013-12-14 21:26:40 +00:00
if($hublocs) {
$tabs[] = array(
'label' => t('Manage locations'),
'url' => $a->get_baseurl(true) . '/locs',
'selected' => ((argv(1) === 'locs') ? 'active' : ''),
);
}
// IF can go away when UNO export and import is fully functional
if(! UNO) {
$tabs[] = array(
'label' => t('Export channel'),
'url' => $a->get_baseurl(true) . '/uexport',
'selected' => ''
);
}
$tabs[] = array(
'label' => t('Connected apps'),
'url' => $a->get_baseurl(true) . '/settings/oauth',
'selected' => ((argv(1) === 'oauth') ? 'active' : ''),
);
if($role === false || $role === 'custom') {
$tabs[] = array(
'label' => t('Connection Default Permissions'),
'url' => $a->get_baseurl(true) . '/connedit/' . $abook_self_id,
2013-12-14 21:26:40 +00:00
'selected' => ''
);
}
2013-12-14 21:26:40 +00:00
2015-01-29 04:56:04 +00:00
if(feature_enabled(local_channel(),'premium_channel')) {
2013-12-14 21:26:40 +00:00
$tabs[] = array(
'label' => t('Premium Channel Settings'),
'url' => $a->get_baseurl(true) . '/connect/' . $channel['channel_address'],
'selected' => ''
);
}
2015-01-29 04:56:04 +00:00
if(feature_enabled(local_channel(),'channel_sources')) {
2013-12-14 21:26:40 +00:00
$tabs[] = array(
'label' => t('Channel Sources'),
'url' => $a->get_baseurl(true) . '/sources',
'selected' => ''
);
}
$tabtpl = get_markup_template("generic_links_widget.tpl");
return replace_macros($tabtpl, array(
'$title' => t('Settings'),
'$class' => 'settings-widget',
'$items' => $tabs,
));
}
function widget_mailmenu($arr) {
2015-01-29 04:56:04 +00:00
if (! local_channel())
2013-12-14 21:26:40 +00:00
return;
$a = get_app();
2013-12-14 21:26:40 +00:00
return replace_macros(get_markup_template('message_side.tpl'), array(
'$title' => t('Private Mail Menu'),
'$combined'=>array(
'label' => t('Combined View'),
'url' => $a->get_baseurl(true) . '/mail/combined',
'sel' => (argv(1) == 'combined'),
),
'$inbox'=>array(
'label' => t('Inbox'),
'url' => $a->get_baseurl(true) . '/mail/inbox',
'sel' => (argv(1) == 'inbox'),
),
'$outbox'=>array(
'label' => t('Outbox'),
'url' => $a->get_baseurl(true) . '/mail/outbox',
'sel' => (argv(1) == 'outbox'),
),
2013-12-14 21:26:40 +00:00
'$new'=>array(
'label' => t('New Message'),
'url' => $a->get_baseurl(true) . '/mail/new',
2013-12-14 21:26:40 +00:00
'sel'=> (argv(1) == 'new'),
)
));
2013-12-19 10:16:14 +00:00
}
function widget_conversations($arr) {
if (! local_channel())
return;
$a = get_app();
if(argc() > 1) {
switch(argv(1)) {
case 'combined':
$mailbox = 'combined';
$header = t('Conversations');
break;
case 'inbox':
$mailbox = 'inbox';
$header = t('Received Messages');
break;
case 'outbox':
$mailbox = 'outbox';
$header = t('Sent Messages');
break;
default:
$mailbox = 'combined';
$header = t('Conversations');
break;
}
require_once('include/message.php');
// private_messages_list() can do other more complicated stuff, for now keep it simple
$r = private_messages_list(local_channel(), $mailbox, $a->pager['start'], $a->pager['itemspage']);
if(! $r) {
info( t('No messages.') . EOL);
return $o;
}
$messages = array();
foreach($r as $rr) {
$messages[] = array(
'mailbox' => $mailbox,
'id' => $rr['id'],
'from_name' => $rr['from']['xchan_name'],
'from_url' => chanlink_hash($rr['from_xchan']),
'from_photo' => $rr['from']['xchan_photo_s'],
'to_name' => $rr['to']['xchan_name'],
'to_url' => chanlink_hash($rr['to_xchan']),
'to_photo' => $rr['to']['xchan_photo_s'],
'subject' => (($rr['seen']) ? $rr['title'] : '<strong>' . $rr['title'] . '</strong>'),
'delete' => t('Delete conversation'),
'body' => $rr['body'],
'date' => datetime_convert('UTC',date_default_timezone_get(),$rr['created'], 'c'),
'seen' => $rr['seen'],
'selected' => ((argv(2)) ? (argv(2) == $rr['id']) : ($r[0]['id'] == $rr['id']))
);
}
$tpl = get_markup_template('mail_head.tpl');
$o .= replace_macros($tpl, array(
'$header' => $header,
'$messages' => $messages
));
$o .= alt_pager($a,count($r));
}
return $o;
}
2015-11-18 22:50:42 +00:00
function widget_eventsmenu($arr) {
if (! local_channel())
return;
2015-11-27 21:45:28 +00:00
return replace_macros(get_markup_template('events_menu_side.tpl'), array(
2015-11-18 22:50:42 +00:00
'$title' => t('Events Menu'),
2015-11-18 23:10:32 +00:00
'$day' => t('Day View'),
'$week' => t('Week View'),
'$month' => t('Month View'),
2015-11-18 22:50:42 +00:00
'$export' => t('Export'),
'$upload' => t('Import'),
'$submit' => t('Submit')
));
}
2015-11-27 21:45:28 +00:00
function widget_eventstools($arr) {
if (! local_channel())
return;
return replace_macros(get_markup_template('events_tools_side.tpl'), array(
'$title' => t('Events Tools'),
'$export' => t('Export Calendar'),
'$import' => t('Import Calendar'),
'$submit' => t('Submit')
));
}
2013-12-19 10:16:14 +00:00
function widget_design_tools($arr) {
$a = get_app();
// mod menu doesn't load a profile. For any modules which load a profile, check it.
2015-01-29 04:56:04 +00:00
// otherwise local_channel() is sufficient for permissions.
2013-12-19 10:16:14 +00:00
if($a->profile['profile_uid'])
2015-01-29 04:56:04 +00:00
if(($a->profile['profile_uid'] != local_channel()) && (! $a->is_sys))
return '';
2013-12-19 10:16:14 +00:00
2015-01-29 04:56:04 +00:00
if(! local_channel())
2013-12-19 10:16:14 +00:00
return '';
return design_tools();
2013-12-19 10:25:44 +00:00
}
2013-12-19 10:25:44 +00:00
function widget_findpeople($arr) {
return findpeople_widget();
2013-12-20 01:36:31 +00:00
}
function widget_photo_albums($arr) {
$a = get_app();
2013-12-20 01:36:31 +00:00
if(! $a->profile['profile_uid'])
return '';
$channelx = channelx_by_n($a->profile['profile_uid']);
if((! $channelx) || (! perm_is_allowed($a->profile['profile_uid'], get_observer_hash(), 'view_storage')))
2013-12-20 01:36:31 +00:00
return '';
require_once('include/photos.php');
2013-12-20 01:36:31 +00:00
return photos_album_widget($channelx, $a->get_observer());
2013-12-20 01:36:31 +00:00
}
function widget_vcard($arr) {
require_once ('include/Contact.php');
return vcard_from_xchan('', get_app()->get_observer());
2013-12-20 01:36:31 +00:00
}
/*
* The following directory widgets are only useful on the directory page
*/
function widget_dirsort($arr) {
return dir_sort_links();
}
function widget_dirtags($arr) {
return dir_tagblock(z_root() . '/directory', null);
}
function widget_menu_preview($arr) {
if(! get_app()->data['menu_item'])
return;
require_once('include/menu.php');
return menu_render(get_app()->data['menu_item']);
}
2014-01-29 09:52:23 +00:00
function widget_chatroom_list($arr) {
$a = get_app();
2014-01-29 09:52:23 +00:00
require_once("include/chat.php");
$r = chatroom_list($a->profile['profile_uid']);
return replace_macros(get_markup_template('chatroomlist.tpl'), array(
2014-01-29 09:52:23 +00:00
'$header' => t('Chat Rooms'),
'$baseurl' => z_root(),
'$nickname' => $a->profile['channel_address'],
2014-01-29 09:52:23 +00:00
'$items' => $r,
));
2014-01-30 05:29:48 +00:00
}
2014-02-28 01:07:11 +00:00
function widget_bookmarkedchats($arr) {
$h = get_observer_hash();
if(! $h)
return;
$r = q("select xchat_url, xchat_desc from xchat where xchat_xchan = '%s' order by xchat_desc",
dbesc($h)
2014-02-28 01:07:11 +00:00
);
2014-11-24 04:29:34 +00:00
if($r) {
for($x = 0; $x < count($r); $x ++) {
$r[$x]['xchat_url'] = zid($r[$x]['xchat_url']);
}
}
2014-02-28 01:07:11 +00:00
return replace_macros(get_markup_template('bookmarkedchats.tpl'),array(
'$header' => t('Bookmarked Chatrooms'),
'$rooms' => $r
));
}
function widget_suggestedchats($arr) {
// probably should restrict this to your friends, but then the widget will only work
// if you are logged in locally.
$h = get_observer_hash();
if(! $h)
return;
$r = q("select xchat_url, xchat_desc, count(xchat_xchan) as total from xchat group by xchat_url, xchat_desc order by total desc, xchat_desc limit 24");
2014-11-24 04:29:34 +00:00
if($r) {
for($x = 0; $x < count($r); $x ++) {
$r[$x]['xchat_url'] = zid($r[$x]['xchat_url']);
}
}
2014-02-28 01:07:11 +00:00
return replace_macros(get_markup_template('bookmarkedchats.tpl'),array(
'$header' => t('Suggested Chatrooms'),
'$rooms' => $r
));
}
function widget_item($arr) {
$channel_id = 0;
if(array_key_exists('channel_id',$arr) && intval($arr['channel_id']))
$channel_id = intval($arr['channel_id']);
if(! $channel_id)
$channel_id = get_app()->profile_uid;
if(! $channel_id)
return '';
if((! $arr['mid']) && (! $arr['title']))
return '';
if(! perm_is_allowed($channel_id, get_observer_hash(), 'view_pages'))
return '';
require_once('include/security.php');
$sql_extra = item_permissions_sql($channel_id);
if($arr['title']) {
$r = q("select item.* from item left join item_id on item.id = item_id.iid
where item.uid = %d and sid = '%s' and service = 'WEBPAGE' and item_type = %d $sql_options $revision limit 1",
intval($channel_id),
dbesc($arr['title']),
intval(ITEM_TYPE_WEBPAGE)
);
}
else {
$r = q("select * from item where mid = '%s' and uid = %d and item_type = " . intval(ITEM_TYPE_WEBPAGE) . " $sql_extra limit 1",
dbesc($arr['mid']),
intval($channel_id)
);
}
if(! $r)
return '';
xchan_query($r);
$r = fetch_post_tags($r, true);
$o = prepare_page($r[0]);
return $o;
2014-03-05 12:28:48 +00:00
}
function widget_clock($arr) {
$miltime = 0;
if(isset($arr['military']) && $arr['military'])
$miltime = 1;
$o = <<< EOT
<div class="widget">
<h3 class="clockface"></h3>
<script>
var timerID = null
var timerRunning = false
function stopclock(){
if(timerRunning)
clearTimeout(timerID)
timerRunning = false
}
function startclock(){
stopclock()
showtime()
}
function showtime(){
var now = new Date()
var hours = now.getHours()
var minutes = now.getMinutes()
var seconds = now.getSeconds()
var military = $miltime
var timeValue = ""
if(military)
timeValue = hours
else
timeValue = ((hours > 12) ? hours - 12 : hours)
timeValue += ((minutes < 10) ? ":0" : ":") + minutes
// timeValue += ((seconds < 10) ? ":0" : ":") + seconds
if(! military)
timeValue += (hours >= 12) ? " P.M." : " A.M."
$('.clockface').html(timeValue)
timerID = setTimeout("showtime()",1000)
timerRunning = true
}
$(document).ready(function() {
startclock();
});
</script>
</div>
EOT;
return $o;
2014-05-14 04:33:39 +00:00
}
/**
* @function widget_photo($arr)
* widget to display a single photo.
* @param array $arr;
* 'src' => URL of photo
* 'zrl' => true or false, use zid in url
* 'style' => CSS string
* URL must be an http or https URL
*/
function widget_photo($arr) {
$style = $zrl = false;
if(array_key_exists('src', $arr) && isset($arr['src']))
2014-05-14 04:33:39 +00:00
$url = $arr['src'];
if(strpos($url,'http') !== 0)
return '';
if(array_key_exists('style', $arr) && isset($arr['style']))
2014-05-14 04:33:39 +00:00
$style = $arr['style'];
2014-05-14 07:55:32 +00:00
// ensure they can't sneak in an eval(js) function
if(strpbrk($style,'(\'"<>') !== false)
$style = '';
2014-05-14 07:55:32 +00:00
if(array_key_exists('zrl', $arr) && isset($arr['zrl']))
2014-05-14 04:33:39 +00:00
$zrl = (($arr['zrl']) ? true : false);
if($zrl)
$url = zid($url);
$o = '<div class="widget">';
$o .= '<img ' . (($zrl) ? ' class="zrl" ' : '')
. (($style) ? ' style="' . $style . '"' : '')
. ' src="' . $url . '" alt="' . t('photo/image') . '">';
2014-11-20 23:34:49 +00:00
$o .= '</div>';
return $o;
}
2016-01-15 01:25:27 +00:00
function widget_cover_photo($arr) {
require_once('include/identity.php');
$o = '';
$a = get_app();
2016-03-09 00:46:47 +00:00
if($a->module == 'channel' && $_REQUEST['mid'])
return '';
2016-01-15 01:25:27 +00:00
$channel_id = 0;
if(array_key_exists('channel_id', $arr) && intval($arr['channel_id']))
$channel_id = intval($arr['channel_id']);
if(! $channel_id)
$channel_id = $a->profile_uid;
2016-01-15 01:25:27 +00:00
if(! $channel_id)
return '';
$channel = channelx_by_n($channel_id);
2016-01-15 01:25:27 +00:00
if(array_key_exists('style', $arr) && isset($arr['style']))
$style = $arr['style'];
else
$style = 'width:100%; height: auto;';
2016-01-15 01:25:27 +00:00
// ensure they can't sneak in an eval(js) function
if(strpbrk($style,'(\'"<>') !== false)
$style = '';
2016-01-15 01:25:27 +00:00
if(array_key_exists('title', $arr) && isset($arr['title']))
$title = $arr['title'];
else
$title = $channel['channel_name'];
if(array_key_exists('subtitle', $arr) && isset($arr['subtitle']))
$subtitle = $arr['subtitle'];
else
$subtitle = $channel['xchan_addr'];
2016-01-15 01:25:27 +00:00
$c = get_cover_photo($channel_id,'html');
if($c) {
$photo_html = (($style) ? str_replace('alt=',' style="' . $style . '" alt=',$c) : $c);
$o = replace_macros(get_markup_template('cover_photo_widget.tpl'),array(
'$photo_html' => $photo_html,
'$title' => $title,
'$subtitle' => $subtitle,
'$hovertitle' => t('Click to show more'),
));
2016-01-15 01:25:27 +00:00
}
return $o;
}
2014-11-20 23:34:49 +00:00
function widget_photo_rand($arr) {
require_once('include/photos.php');
$style = false;
if(array_key_exists('album', $arr) && isset($arr['album']))
2014-11-20 23:34:49 +00:00
$album = $arr['album'];
else
$album = '';
$channel_id = 0;
if(array_key_exists('channel_id', $arr) && intval($arr['channel_id']))
$channel_id = intval($arr['channel_id']);
if(! $channel_id)
$channel_id = get_app()->profile_uid;
2014-11-20 23:34:49 +00:00
if(! $channel_id)
return '';
$scale = ((array_key_exists('scale',$arr)) ? intval($arr['scale']) : 0);
$ret = photos_list_photos(array('channel_id' => $channel_id),get_app()->get_observer(),$album);
2014-11-20 23:34:49 +00:00
$filtered = array();
if($ret['success'] && $ret['photos'])
foreach($ret['photos'] as $p)
if($p['scale'] == $scale)
$filtered[] = $p['src'];
if($filtered) {
$e = mt_rand(0, count($filtered) - 1);
2014-11-20 23:34:49 +00:00
$url = $filtered[$e];
}
if(strpos($url, 'http') !== 0)
2014-11-20 23:34:49 +00:00
return '';
if(array_key_exists('style', $arr) && isset($arr['style']))
2014-11-20 23:34:49 +00:00
$style = $arr['style'];
// ensure they can't sneak in an eval(js) function
if(strpos($style,'(') !== false)
return '';
$url = zid($url);
$o = '<div class="widget">';
$o .= '<img class="zrl" '
. (($style) ? ' style="' . $style . '"' : '')
. ' src="' . $url . '" alt="' . t('photo/image') . '">';
2014-05-14 04:33:39 +00:00
$o .= '</div>';
return $o;
}
2014-11-22 20:26:04 +00:00
function widget_random_block($arr) {
$channel_id = 0;
if(array_key_exists('channel_id',$arr) && intval($arr['channel_id']))
$channel_id = intval($arr['channel_id']);
if(! $channel_id)
$channel_id = get_app()->profile_uid;
if(! $channel_id)
return '';
if(array_key_exists('contains',$arr))
$contains = $arr['contains'];
$o = '';
require_once('include/security.php');
$sql_options = item_permissions_sql($channel_id);
$randfunc = db_getfunc('RAND');
$r = q("select item.* from item left join item_id on item.id = item_id.iid
where item.uid = %d and sid like '%s' and service = 'BUILDBLOCK' and
2015-05-22 05:17:17 +00:00
item_type = %d $sql_options order by $randfunc limit 1",
2014-11-22 20:26:04 +00:00
intval($channel_id),
dbesc('%' . $contains . '%'),
intval(ITEM_TYPE_BLOCK)
2014-11-22 20:26:04 +00:00
);
if($r) {
$o = '<div class="widget bblock">';
if($r[0]['title'])
$o .= '<h3>' . $r[0]['title'] . '</h3>';
2014-11-22 20:26:04 +00:00
$o .= prepare_text($r[0]['body'],$r[0]['mimetype']);
$o .= '</div>';
}
return $o;
}
function widget_rating($arr) {
$a = get_app();
$poco_rating = get_config('system','poco_rating_enable');
if((! $poco_rating) && ($poco_rating !== false)) {
return;
}
if($arr['target'])
$hash = $arr['target'];
else
$hash = $a->poi['xchan_hash'];
if(! $hash)
return;
$url = '';
$remote = false;
if(remote_channel() && ! local_channel()) {
$ob = $a->get_observer();
if($ob && $ob['xchan_url']) {
$p = parse_url($ob['xchan_url']);
if($p) {
$url = $p['scheme'] . '://' . $p['host'] . (($p['port']) ? ':' . $p['port'] : '');
$url .= '/rate?f=&target=' . urlencode($hash);
}
$remote = true;
}
}
2015-02-05 02:31:12 +00:00
$self = false;
if(local_channel()) {
$channel = $a->get_channel();
if($hash == $channel['channel_hash'])
2015-02-05 02:31:12 +00:00
$self = true;
head_add_js('ratings.js');
}
$o = '<div class="widget">';
$o .= '<h3>' . t('Rating Tools') . '</h3>';
2015-02-05 02:31:12 +00:00
if((($remote) || (local_channel())) && (! $self)) {
if($remote)
$o .= '<a class="btn btn-block btn-primary btn-sm" href="' . $url . '"><i class="icon-pencil"></i> ' . t('Rate Me') . '</a>';
else
$o .= '<div class="btn btn-block btn-primary btn-sm" onclick="doRatings(\'' . $hash . '\'); return false;"><i class="icon-pencil"></i> ' . t('Rate Me') . '</div>';
}
$o .= '<a class="btn btn-block btn-default btn-sm" href="ratings/' . $hash . '"><i class="icon-eye-open"></i> ' . t('View Ratings') . '</a>';
$o .= '</div>';
return $o;
}
2015-02-16 19:09:12 +00:00
// used by site ratings pages to provide a return link
2015-08-12 00:39:29 +00:00
function widget_pubsites($arr) {
2015-02-16 19:09:12 +00:00
if(get_app()->poi)
return;
return '<div class="widget"><ul class="nav nav-pills"><li><a href="pubsites">' . t('Public Hubs') . '</a></li></ul></div>';
2015-04-09 08:53:37 +00:00
}
2015-08-12 00:39:29 +00:00
function widget_forums($arr) {
$a = get_app();
if(! local_channel())
return '';
$o = '';
if(is_array($arr) && array_key_exists('limit',$arr))
$limit = " limit " . intval($limit) . " ";
else
2015-08-12 03:58:03 +00:00
$limit = '';
2015-08-12 00:39:29 +00:00
2015-08-12 05:23:20 +00:00
$unseen = 0;
if(is_array($arr) && array_key_exists('unseen',$arr) && intval($arr['unseen']))
$unseen = 1;
2015-08-12 00:39:29 +00:00
$perms_sql = item_permissions_sql(local_channel()) . item_normal();
2015-08-12 05:23:20 +00:00
$r1 = q("select * from abook left join xchan on abook_xchan = xchan_hash where ( xchan_pubforum = 1 or ((abook_their_perms & %d ) != 0 and (abook_their_perms & %d ) = 0) ) and xchan_deleted = 0 and abook_channel = %d order by xchan_name $limit ",
intval(PERMS_W_TAGWALL),
intval(PERMS_W_STREAM),
2015-08-12 03:25:02 +00:00
intval(local_channel())
2015-08-12 00:39:29 +00:00
);
2015-08-12 05:23:20 +00:00
if(! $r1)
return $o;
$str = '';
// Trying to cram all this into a single query with joins and the proper group by's is tough.
// There also should be a way to update this via ajax.
for($x = 0; $x < count($r1); $x ++) {
$r = q("select sum(item_unseen) as unseen from item where owner_xchan = '%s' and uid = %d $perms_sql ",
dbesc($r1[$x]['xchan_hash']),
intval(local_channel())
);
if($r)
$r1[$x]['unseen'] = $r[0]['unseen'];
}
if($r1) {
2015-08-12 00:39:29 +00:00
$o .= '<div class="widget">';
2015-08-12 02:22:14 +00:00
$o .= '<h3>' . t('Forums') . '</h3><ul class="nav nav-pills nav-stacked">';
2015-08-12 00:39:29 +00:00
2015-08-12 05:23:20 +00:00
foreach($r1 as $rr) {
if($unseen && (! intval($rr['unseen'])))
continue;
$o .= '<li><a href="network?f=&pf=1&cid=' . $rr['abook_id'] . '" ><span class="badge pull-right">' . ((intval($rr['unseen'])) ? intval($rr['unseen']) : '') . '</span><img src="' . $rr['xchan_photo_s'] . '" style="width: 16px; height: 16px;" /> ' . $rr['xchan_name'] . '</a></li>';
2015-08-12 00:39:29 +00:00
}
2015-08-12 02:22:14 +00:00
$o .= '</ul></div>';
2015-08-12 00:39:29 +00:00
}
return $o;
}
2015-08-21 01:43:01 +00:00
function widget_tasklist($arr) {
2015-11-27 21:45:28 +00:00
if (! local_channel())
return;
2015-08-21 01:43:01 +00:00
require_once('include/event.php');
$o .= '<script>var tasksShowAll = 0; $(document).ready(function() { tasksFetch(); $("#tasklist-new-form").submit(function(event) { event.preventDefault(); $.post( "tasks/new", $("#tasklist-new-form").serialize(), function(data) { tasksFetch(); $("#tasklist-new-summary").val(""); } ); return false; } )});</script>';
$o .= '<script>function taskComplete(id) { $.post("tasks/complete/"+id, function(data) { tasksFetch();}); }
function tasksFetch() {
$.get("tasks/fetch" + ((tasksShowAll) ? "/all" : ""), function(data) {
$(".tasklist-tasks").html(data.html);
});
2015-08-21 01:43:01 +00:00
}
</script>';
$o .= '<div class="widget">' . '<h3>' . t('Tasks') . '</h3><div class="tasklist-tasks">';
$o .= '</div><form id="tasklist-new-form" action="" ><input id="tasklist-new-summary" type="text" name="summary" value="" /></form>';
2015-08-21 01:43:01 +00:00
$o .= '</div>';
return $o;
}
2015-08-31 05:39:33 +00:00
function widget_helpindex($arr) {
$o .= '<div class="widget">' . '<h3>' . t('Documentation') . '</h3>';
$o .= '<ul class="nav nav-pills nav-stacked">';
2015-08-31 06:01:39 +00:00
$o .= '<li><a href="help/general">' . t('Project/Site Information') . '</a></li>';
$o .= '<li><a href="help/members">' . t('For Members') . '</a></li>';
$o .= '<li><a href="help/admins">' . t('For Administrators') . '</a></li>';
$o .= '<li><a href="help/develop">' . t('For Developers') . '</a></li>';
2015-08-31 05:39:33 +00:00
$o .= '</ul></div>';
return $o;
2015-09-09 03:48:35 +00:00
}
function widget_admin($arr) {
/*
* Side bar links
*/
if(! is_site_admin()) {
return login(false);
}
$a = get_app();
$o = '';
// array( url, name, extra css classes )
$aside = array(
'site' => array(z_root() . '/admin/site/', t('Site'), 'site'),
'users' => array(z_root() . '/admin/users/', t('Accounts'), 'users', 'pending-update', t('Member registrations waiting for confirmation')),
2015-09-09 03:48:35 +00:00
'channels' => array(z_root() . '/admin/channels/', t('Channels'), 'channels'),
2016-02-04 04:24:46 +00:00
'security' => array(z_root() . '/admin/security/', t('Security'), 'security'),
2016-01-06 21:01:28 +00:00
'features' => array(z_root() . '/admin/features/', t('Features'), 'features'),
2015-09-09 03:48:35 +00:00
'plugins' => array(z_root() . '/admin/plugins/', t('Plugins'), 'plugins'),
'themes' => array(z_root() . '/admin/themes/', t('Themes'), 'themes'),
'queue' => array(z_root() . '/admin/queue', t('Inspect queue'), 'queue'),
'profs' => array(z_root() . '/admin/profs', t('Profile Fields'), 'profs'),
2015-09-09 03:48:35 +00:00
'dbsync' => array(z_root() . '/admin/dbsync/', t('DB updates'), 'dbsync')
);
/* get plugins admin page */
$r = q("SELECT * FROM addon WHERE plugin_admin = 1");
$plugins = array();
2015-09-09 03:48:35 +00:00
if($r) {
foreach ($r as $h){
$plugin = $h['name'];
$plugins[] = array(z_root() . '/admin/plugins/' . $plugin, $plugin, 'plugin');
2015-09-09 03:48:35 +00:00
// temp plugins with admin
$a->plugins_admin[] = $plugin;
}
}
$logs = array(z_root() . '/admin/logs/', t('Logs'), 'logs');
$arr = array('links' => $aside,'plugins' => $plugins,'logs' => $logs);
call_hooks('admin_aside',$arr);
2015-09-09 03:48:35 +00:00
$o .= replace_macros(get_markup_template('admin_aside.tpl'), array(
'$admin' => $aside,
'$admtxt' => t('Admin'),
'$plugadmtxt' => t('Plugin Features'),
'$plugins' => $plugins,
2015-09-09 03:48:35 +00:00
'$logtxt' => t('Logs'),
'$logs' => $logs,
'$h_pending' => t('Member registrations waiting for confirmation'),
2015-09-09 03:48:35 +00:00
'$admurl'=> z_root() . '/admin/'
));
return $o;
}
function widget_album($args) {
$owner_uid = get_app()->profile_uid;
$sql_extra = permissions_sql($owner_uid);
2015-11-17 23:03:27 +00:00
if(! perm_is_allowed($owner_uid,get_observer_hash(),'view_storage'))
return '';
if($args['album'])
$album = $args['album'];
if($args['title'])
$title = $args['title'];
2015-11-18 04:44:57 +00:00
/**
* This may return incorrect permissions if you have multiple directories of the same name.
* It is a limitation of the photo table using a name for a photo album instead of a folder hash
*/
if($album) {
$x = q("select hash from attach where filename = '%s' and uid = %d limit 1",
dbesc($album),
intval($owner_uid)
);
if($x) {
$y = attach_can_view_folder($owner_uid,get_observer_hash(),$x[0]['hash']);
if(! $y)
return '';
}
}
$order = 'DESC';
$r = q("SELECT p.resource_id, p.id, p.filename, p.type, p.scale, p.description, p.created FROM photo p INNER JOIN
(SELECT resource_id, max(scale) scale FROM photo WHERE uid = %d AND album = '%s' AND scale <= 4 AND photo_usage IN ( %d, %d ) $sql_extra GROUP BY resource_id) ph
ON (p.resource_id = ph.resource_id AND p.scale = ph.scale)
ORDER BY created $order ",
intval($owner_uid),
dbesc($album),
intval(PHOTO_NORMAL),
intval(PHOTO_PROFILE)
);
//edit album name
$album_edit = null;
$photos = array();
if($r) {
$twist = 'rotright';
foreach($r as $rr) {
if($twist == 'rotright')
$twist = 'rotleft';
else
$twist = 'rotright';
$ext = $phototypes[$rr['type']];
$imgalt_e = $rr['filename'];
$desc_e = $rr['description'];
$imagelink = (z_root() . '/photos/' . get_app()->profile['channel_address'] . '/image/' . $rr['resource_id']);
$photos[] = array(
'id' => $rr['id'],
'twist' => ' ' . $twist . rand(2,4),
'link' => $imagelink,
'title' => t('View Photo'),
'src' => z_root() . '/photo/' . $rr['resource_id'] . '-' . $rr['scale'] . '.' .$ext,
'alt' => $imgalt_e,
'desc'=> $desc_e,
'ext' => $ext,
'hash'=> $rr['resource_id'],
'unknown' => t('Unknown')
);
}
}
$tpl = get_markup_template('photo_album.tpl');
$o .= replace_macros($tpl, array(
'$photos' => $photos,
'$album' => (($title) ? $title : $album),
'$album_id' => rand(),
'$album_edit' => array(t('Edit Album'), $album_edit),
'$can_post' => false,
'$upload' => array(t('Upload'), z_root() . '/photos/' . get_app()->profile['channel_address'] . '/upload/' . bin2hex($album)),
'$order' => false,
'$upload_form' => $upload_form,
'$usage' => $usage_message
));
return $o;
}