Merge pull request #90 from fabrixxm/master

Community Home 2.0
This commit is contained in:
fabrixxm 2012-12-28 08:05:00 -08:00
commit 84d5d96dc8
7 changed files with 165 additions and 240 deletions

Binary file not shown.

View file

@ -9,3 +9,26 @@ choosed to be in site directory), last ten public photos and last ten
In main content is shown the community stream. This plugin doesn't In main content is shown the community stream. This plugin doesn't
honour your community page visibility site setting: the community honour your community page visibility site setting: the community
stream is shown also if you have choose to not show the community page. stream is shown also if you have choose to not show the community page.
If 'home.html' is found in your friendica root, its content is inserted
before community stream
Each elements can be show or not. At the moment, there is no admin page
for settings, so this settings must be added to yout .htconfig.php
$a->config['communityhome']['showcommunitystream'] = true;
$a->config['communityhome']['showlastlike'] = true;
$a->config['communityhome']['showlastphotos'] = true;
$a->config['communityhome']['showactiveusers'] = true;
$a->config['communityhome']['showlastusers'] = true;
If you don't want to show something, set it to false.
Note:
-----
- Default is "false". With no settings in .htconfig.php, nothing is
shown, except login form and content of 'home.html'
- Active users query can be heavy for db, and on some system don't work

View file

@ -39,4 +39,5 @@ aside .directory-photo-img { max-width: 48px; max-height: 48px; }
aside #likes { margin: 0px; padding: 0px; list-style: none; } aside #likes { margin: 0px; padding: 0px; list-style: none; }
aside #login-extra-links { overflow: auto; width: 100%; padding-top:120px;} aside #div_id_remember { overflow: auto; width: 100%; padding-top:120px;}
#login_openid input { width: 160px; }

View file

@ -2,7 +2,7 @@
/** /**
* Name: Community home * Name: Community home
* Description: Show last community activity in homepage * Description: Show last community activity in homepage
* Version: 1.0 * Version: 2.0
* Author: Fabio Comuni <http://kirgroup.com/profile/fabrixxm> * Author: Fabio Comuni <http://kirgroup.com/profile/fabrixxm>
*/ */
@ -35,145 +35,151 @@ function communityhome_home(&$a, &$o){
$aside['$login_form'] = login(($a->config['register_policy'] == REGISTER_CLOSED) ? false : true); $aside['$login_form'] = login(($a->config['register_policy'] == REGISTER_CLOSED) ? false : true);
// last 12 users // last 12 users
$aside['$lastusers_title'] = t('Latest users'); if (get_config('communityhome','showlastusers')===true){
$aside['$lastusers_items'] = array(); $aside['$lastusers_title'] = t('Latest users');
$sql_extra = ""; $aside['$lastusers_items'] = array();
$publish = (get_config('system','publish_all') ? '' : " AND `publish` = 1 " ); $sql_extra = "";
$order = " ORDER BY `register_date` DESC "; $publish = (get_config('system','publish_all') ? '' : " AND `publish` = 1 " );
$order = " ORDER BY `register_date` DESC ";
$r = q("SELECT `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname` $r = q("SELECT `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname`
FROM `profile` LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid` FROM `profile` LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid`
WHERE `is-default` = 1 $publish AND `user`.`blocked` = 0 $sql_extra $order LIMIT %d , %d ", WHERE `is-default` = 1 $publish AND `user`.`blocked` = 0 $sql_extra $order LIMIT %d , %d ",
0, 0,
12 12
); );
# $tpl = file_get_contents( dirname(__file__).'/directory_item.tpl'); # $tpl = file_get_contents( dirname(__file__).'/directory_item.tpl');
$tpl = get_markup_template( 'directory_item.tpl', 'addon/communityhome/' ); $tpl = get_markup_template( 'directory_item.tpl', 'addon/communityhome/' );
if(count($r)) { if(count($r)) {
$photo = 'thumb'; $photo = 'thumb';
foreach($r as $rr) { foreach($r as $rr) {
$profile_link = $a->get_baseurl() . '/profile/' . ((strlen($rr['nickname'])) ? $rr['nickname'] : $rr['profile_uid']); $profile_link = $a->get_baseurl() . '/profile/' . ((strlen($rr['nickname'])) ? $rr['nickname'] : $rr['profile_uid']);
$entry = replace_macros($tpl,array( $entry = replace_macros($tpl,array(
'$id' => $rr['id'], '$id' => $rr['id'],
'$profile-link' => $profile_link, '$profile_link' => $profile_link,
'$photo' => $a->get_cached_avatar_image($rr[$photo]), '$photo' => $a->get_cached_avatar_image($rr[$photo]),
'$alt-text' => $rr['name'], '$alt_text' => $rr['name'],
)); ));
$aside['$lastusers_items'][] = $entry; $aside['$lastusers_items'][] = $entry;
}
} }
} }
// 12 most active users (by posts and contacts) // 12 most active users (by posts and contacts)
// this query don't work on some mysql versions // this query don't work on some mysql versions
$r = q("SELECT `uni`.`contacts`,`uni`.`items`, `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname` FROM if (get_config('communityhome','showactiveusers')===true){
(SELECT COUNT(`id`) as `contacts`, `uid` FROM `contact` WHERE `self`=0 GROUP BY `uid`) AS `con`, $r = q("SELECT `uni`.`contacts`,`uni`.`items`, `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname` FROM
(SELECT COUNT(`id`) as `items`, `uid` FROM `item` WHERE `item`.`changed` > DATE(NOW() - INTERVAL 1 MONTH) AND `item`.`wall` = 1 GROUP BY `uid`) AS `ite`, (SELECT COUNT(`id`) as `contacts`, `uid` FROM `contact` WHERE `self`=0 GROUP BY `uid`) AS `con`,
( (SELECT COUNT(`id`) as `items`, `uid` FROM `item` WHERE `item`.`changed` > DATE(NOW() - INTERVAL 1 MONTH) AND `item`.`wall` = 1 GROUP BY `uid`) AS `ite`,
SELECT `contacts`,`items`,`ite`.`uid` FROM `con` RIGHT OUTER JOIN `ite` ON `con`.`uid`=`ite`.`uid` (
UNION ALL SELECT `contacts`,`items`,`ite`.`uid` FROM `con` RIGHT OUTER JOIN `ite` ON `con`.`uid`=`ite`.`uid`
SELECT `contacts`,`items`,`con`.`uid` FROM `con` LEFT OUTER JOIN `ite` ON `con`.`uid`=`ite`.`uid` UNION ALL
) AS `uni`, `user`, `profile` SELECT `contacts`,`items`,`con`.`uid` FROM `con` LEFT OUTER JOIN `ite` ON `con`.`uid`=`ite`.`uid`
WHERE `uni`.`uid`=`user`.`uid` ) AS `uni`, `user`, `profile`
AND `uni`.`uid`=`profile`.`uid` AND `profile`.`publish`=1 WHERE `uni`.`uid`=`user`.`uid`
GROUP BY `uid` AND `uni`.`uid`=`profile`.`uid` AND `profile`.`publish`=1
ORDER BY `items` DESC,`contacts` DESC GROUP BY `uid`
LIMIT 0,10"); ORDER BY `items` DESC,`contacts` DESC
if($r && count($r)) { LIMIT 0,10");
$aside['$activeusers_title'] = t('Most active users'); if($r && count($r)) {
$aside['$activeusers_items'] = array(); $aside['$activeusers_title'] = t('Most active users');
$aside['$activeusers_items'] = array();
$photo = 'thumb';
foreach($r as $rr) { $photo = 'thumb';
$profile_link = $a->get_baseurl() . '/profile/' . ((strlen($rr['nickname'])) ? $rr['nickname'] : $rr['profile_uid']); foreach($r as $rr) {
$entry = replace_macros($tpl,array( $profile_link = $a->get_baseurl() . '/profile/' . ((strlen($rr['nickname'])) ? $rr['nickname'] : $rr['profile_uid']);
'$id' => $rr['id'], $entry = replace_macros($tpl,array(
'$profile-link' => $profile_link, '$id' => $rr['id'],
'$photo' => $rr[$photo], '$profile_link' => $profile_link,
'$alt-text' => sprintf("%s (%s posts, %s contacts)",$rr['name'], ($rr['items']?$rr['items']:'0'), ($rr['contacts']?$rr['contacts']:'0')) '$photo' => $rr[$photo],
)); '$alt_text' => sprintf("%s (%s posts, %s contacts)",$rr['name'], ($rr['items']?$rr['items']:'0'), ($rr['contacts']?$rr['contacts']:'0'))
$aside['$activeusers_items'][] = $entry; ));
$aside['$activeusers_items'][] = $entry;
}
} }
} }
// last 12 photos // last 12 photos
$aside['$photos_title'] = t('Latest photos'); if (get_config('communityhome','showlastphotos')===true){
$aside['$photos_items'] = array(); $aside['$photos_title'] = t('Latest photos');
$r = q("SELECT `photo`.`id`, `photo`.`resource-id`, `photo`.`scale`, `photo`.`desc`, `user`.`nickname`, `user`.`username` FROM $aside['$photos_items'] = array();
(SELECT `resource-id`, MAX(`scale`) as maxscale FROM `photo` $r = q("SELECT `photo`.`id`, `photo`.`resource-id`, `photo`.`scale`, `photo`.`desc`, `user`.`nickname`, `user`.`username` FROM
WHERE `profile`=0 AND `contact-id`=0 AND `album` NOT IN ('Contact Photos', '%s', 'Profile Photos', '%s') (SELECT `resource-id`, MAX(`scale`) as maxscale FROM `photo`
AND `allow_cid`='' AND `allow_gid`='' AND `deny_cid`='' AND `deny_gid`='' GROUP BY `resource-id`) AS `t1` WHERE `profile`=0 AND `contact-id`=0 AND `album` NOT IN ('Contact Photos', '%s', 'Profile Photos', '%s')
INNER JOIN `photo` ON `photo`.`resource-id`=`t1`.`resource-id` AND `photo`.`scale` = `t1`.`maxscale`, AND `allow_cid`='' AND `allow_gid`='' AND `deny_cid`='' AND `deny_gid`='' GROUP BY `resource-id`) AS `t1`
`user` INNER JOIN `photo` ON `photo`.`resource-id`=`t1`.`resource-id` AND `photo`.`scale` = `t1`.`maxscale`,
WHERE `user`.`uid` = `photo`.`uid` `user`
AND `user`.`blockwall`=0 WHERE `user`.`uid` = `photo`.`uid`
AND `user`.`hidewall` = 0 AND `user`.`blockwall`=0
ORDER BY `photo`.`edited` DESC AND `user`.`hidewall` = 0
LIMIT 0, 12", ORDER BY `photo`.`edited` DESC
dbesc(t('Contact Photos')), LIMIT 0, 12",
dbesc(t('Profile Photos')) dbesc(t('Contact Photos')),
); dbesc(t('Profile Photos'))
);
if(count($r)) { if(count($r)) {
# $tpl = file_get_contents( dirname(__file__).'/directory_item.tpl'); # $tpl = file_get_contents( dirname(__file__).'/directory_item.tpl');
$tpl = get_markup_template( 'directory_item.tpl', 'addon/communityhome/' ); $tpl = get_markup_template( 'directory_item.tpl', 'addon/communityhome/' );
foreach($r as $rr) { foreach($r as $rr) {
$photo_page = $a->get_baseurl() . '/photos/' . $rr['nickname'] . '/image/' . $rr['resource-id']; $photo_page = $a->get_baseurl() . '/photos/' . $rr['nickname'] . '/image/' . $rr['resource-id'];
$photo_url = $a->get_baseurl() . '/photo/' . $rr['resource-id'] . '-' . $rr['scale'] .'.jpg'; $photo_url = $a->get_baseurl() . '/photo/' . $rr['resource-id'] . '-' . $rr['scale'] .'.jpg';
$entry = replace_macros($tpl,array( $entry = replace_macros($tpl,array(
'$id' => $rr['id'], '$id' => $rr['id'],
'$profile-link' => $photo_page, '$profile_link' => $photo_page,
'$photo' => $photo_url, '$photo' => $photo_url,
'$alt-text' => $rr['username']." : ".$rr['desc'], '$alt_text' => $rr['username']." : ".$rr['desc'],
)); ));
$aside['$photos_items'][] = $entry; $aside['$photos_items'][] = $entry;
}
} }
} }
// last 10 liked items // last 10 liked items
$aside['$like_title'] = t('Latest likes'); if (get_config('communityhome','showlastlike')===true){
$aside['$like_items'] = array(); $aside['$like_title'] = t('Latest likes');
$r = q("SELECT `T1`.`created`, `T1`.`liker`, `T1`.`liker-link`, `item`.* FROM $aside['$like_items'] = array();
(SELECT `parent-uri`, `created`, `author-name` AS `liker`,`author-link` AS `liker-link` $r = q("SELECT `T1`.`created`, `T1`.`liker`, `T1`.`liker-link`, `item`.* FROM
FROM `item` WHERE `verb`='http://activitystrea.ms/schema/1.0/like' GROUP BY `parent-uri` ORDER BY `created` DESC) AS T1 (SELECT `parent-uri`, `created`, `author-name` AS `liker`,`author-link` AS `liker-link`
INNER JOIN `item` ON `item`.`uri`=`T1`.`parent-uri` FROM `item` WHERE `verb`='http://activitystrea.ms/schema/1.0/like' GROUP BY `parent-uri` ORDER BY `created` DESC) AS T1
WHERE `T1`.`liker-link` LIKE '%s%%' OR `item`.`author-link` LIKE '%s%%' INNER JOIN `item` ON `item`.`uri`=`T1`.`parent-uri`
GROUP BY `uri` WHERE `T1`.`liker-link` LIKE '%s%%' OR `item`.`author-link` LIKE '%s%%'
ORDER BY `T1`.`created` DESC GROUP BY `uri`
LIMIT 0,10", ORDER BY `T1`.`created` DESC
$a->get_baseurl(),$a->get_baseurl() LIMIT 0,10",
); $a->get_baseurl(),$a->get_baseurl()
);
foreach ($r as $rr) { foreach ($r as $rr) {
$author = '<a href="' . $rr['liker-link'] . '">' . $rr['liker'] . '</a>'; $author = '<a href="' . $rr['liker-link'] . '">' . $rr['liker'] . '</a>';
$objauthor = '<a href="' . $rr['author-link'] . '">' . $rr['author-name'] . '</a>'; $objauthor = '<a href="' . $rr['author-link'] . '">' . $rr['author-name'] . '</a>';
//var_dump($rr['verb'],$rr['object-type']); killme(); //var_dump($rr['verb'],$rr['object-type']); killme();
switch($rr['verb']){ switch($rr['verb']){
case 'http://activitystrea.ms/schema/1.0/post': case 'http://activitystrea.ms/schema/1.0/post':
switch ($rr['object-type']){ switch ($rr['object-type']){
case 'http://activitystrea.ms/schema/1.0/event': case 'http://activitystrea.ms/schema/1.0/event':
$post_type = t('event'); $post_type = t('event');
break; break;
default: default:
$post_type = t('status');
}
break;
default:
if ($rr['resource-id']){
$post_type = t('photo');
$m=array(); preg_match("/\[url=([^]]*)\]/", $rr['body'], $m);
$rr['plink'] = $m[1];
} else {
$post_type = t('status'); $post_type = t('status');
} }
break; }
default: $plink = '<a href="' . $rr['plink'] . '">' . $post_type . '</a>';
if ($rr['resource-id']){
$post_type = t('photo');
$m=array(); preg_match("/\[url=([^]]*)\]/", $rr['body'], $m);
$rr['plink'] = $m[1];
} else {
$post_type = t('status');
}
}
$plink = '<a href="' . $rr['plink'] . '">' . $post_type . '</a>';
$aside['$like_items'][] = sprintf( t('%1$s likes %2$s\'s %3$s'), $author, $objauthor, $plink); $aside['$like_items'][] = sprintf( t('%1$s likes %2$s\'s %3$s'), $author, $objauthor, $plink);
}
} }
# $tpl = file_get_contents(dirname(__file__).'/communityhome.tpl'); # $tpl = file_get_contents(dirname(__file__).'/communityhome.tpl');
@ -182,8 +188,13 @@ function communityhome_home(&$a, &$o){
$o = '<h1>' . ((x($a->config,'sitename')) ? sprintf( t("Welcome to %s") ,$a->config['sitename']) : "" ) . '</h1>'; $o = '<h1>' . ((x($a->config,'sitename')) ? sprintf( t("Welcome to %s") ,$a->config['sitename']) : "" ) . '</h1>';
$oldset = get_config('system','no_community_page'); if(file_exists('home.html'))
set_config('system','no_community_page', false); $o = file_get_contents('home.html');
$o .= community_content($a,1);
set_config('system','no_community_page', $oldset); if (get_config('communityhome','showcommunitystream')===true){
$oldset = get_config('system','no_community_page');
set_config('system','no_community_page', false);
$o .= community_content($a,1);
set_config('system','no_community_page', $oldset);
}
} }

View file

@ -1,3 +0,0 @@
This is a variant of the community home. Instead of displaying the community tab in the front page, we still use home.html, but we also add the latest users to the sidebar.
Simply replace addon/communityhome/communityhome.php with this version then enable community home in your admin panel as usual.

View file

@ -1,107 +0,0 @@
<?php
/**
* Name: Community home
* Description: Show last community activity in homepage
* Version: 1.0
* Author: Fabio Comuni <http://kirgroup.com/profile/fabrixxm>
*/
require_once('mod/community.php');
function communityhome_install() {
register_hook('home_content', 'addon/communityhome/communityhome.php', 'communityhome_home');
logger("installed communityhome");
}
function communityhome_uninstall() {
unregister_hook('home_content', 'addon/communityhome/communityhome.php', 'communityhome_home');
logger("removed communityhome");
}
function communityhome_home(&$a, &$o){
// custom css
$a->page['htmlhead'] .= '<link rel="stylesheet" type="text/css" href="'.$a->get_baseurl().'/addon/communityhome/communityhome.css" media="all" />';
$aside = array(
'$tab_1' => t('Login'),
'$tab_2' => t('OpenID'),
'$noOid' => get_config('system','no_openid'),
);
// login form
$aside['$login_title'] = t('Login');
$aside['$login_form'] = login(($a->config['register_policy'] == REGISTER_CLOSED) ? false : true);
// last 12 users
$aside['$lastusers_title'] = t('Latest users');
$aside['$lastusers_items'] = array();
$sql_extra = "";
$publish = (get_config('system','publish_all') ? '' : " AND `publish` = 1 " );
$order = " ORDER BY `register_date` DESC ";
$r = q("SELECT `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname`
FROM `profile` LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid`
WHERE `is-default` = 1 $publish AND `user`.`blocked` = 0 $sql_extra $order LIMIT %d , %d ",
0,
12
);
$tpl = file_get_contents( dirname(__file__).'/directory_item.tpl');
if(count($r)) {
$photo = 'thumb';
foreach($r as $rr) {
$profile_link = $a->get_baseurl() . '/profile/' . ((strlen($rr['nickname'])) ? $rr['nickname'] : $rr['profile_uid']);
$entry = replace_macros($tpl,array(
'$id' => $rr['id'],
'$profile-link' => $profile_link,
'$photo' => $rr[$photo],
'$alt-text' => $rr['name'],
));
$aside['$lastusers_items'][] = $entry;
}
}
// 12 most active users (by posts and contacts)
// this query don't work on some mysql versions
$r = q("SELECT `uni`.`contacts`,`uni`.`items`, `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname` FROM
(SELECT COUNT(`id`) as `contacts`, `uid` FROM `contact` WHERE `self`=0 GROUP BY `uid`) AS `con`,
(SELECT COUNT(`id`) as `items`, `uid` FROM `item` WHERE `item`.`changed` > DATE(NOW() - INTERVAL 1 MONTH) AND `item`.`wall` = 1 GROUP BY `uid`) AS `ite`,
(
SELECT `contacts`,`items`,`ite`.`uid` FROM `con` RIGHT OUTER JOIN `ite` ON `con`.`uid`=`ite`.`uid`
UNION ALL
SELECT `contacts`,`items`,`con`.`uid` FROM `con` LEFT OUTER JOIN `ite` ON `con`.`uid`=`ite`.`uid`
) AS `uni`, `user`, `profile`
WHERE `uni`.`uid`=`user`.`uid`
AND `uni`.`uid`=`profile`.`uid` AND `profile`.`publish`=1
GROUP BY `uid`
ORDER BY `items` DESC,`contacts` DESC
LIMIT 0,10");
if($r && count($r)) {
$aside['$activeusers_title'] = t('Most active users');
$aside['$activeusers_items'] = array();
$photo = 'thumb';
foreach($r as $rr) {
$profile_link = $a->get_baseurl() . '/profile/' . ((strlen($rr['nickname'])) ? $rr['nickname'] : $rr['profile_uid']);
$entry = replace_macros($tpl,array(
'$id' => $rr['id'],
'$profile-link' => $profile_link,
'$photo' => $rr[$photo],
'$alt-text' => sprintf("%s (%s posts, %s contacts)",$rr['name'], ($rr['items']?$rr['items']:'0'), ($rr['contacts']?$rr['contacts']:'0'))
));
$aside['$activeusers_items'][] = $entry;
}
}
$tpl = file_get_contents(dirname(__file__).'/communityhome.tpl');
$a->page['aside'] = replace_macros($tpl, $aside);
$o = '';
if(file_exists('home.html'))
$o .= file_get_contents('home.html');
}

View file

@ -2,8 +2,8 @@
<div class="directory-item" id="directory-item-$id" > <div class="directory-item" id="directory-item-$id" >
<div class="directory-photo-wrapper" id="directory-photo-wrapper-$id" > <div class="directory-photo-wrapper" id="directory-photo-wrapper-$id" >
<div class="directory-photo" id="directory-photo-$id" > <div class="directory-photo" id="directory-photo-$id" >
<a href="$profile-link" class="directory-profile-link" id="directory-profile-link-$id" > <a href="$profile_link" class="directory-profile-link" id="directory-profile-link-$id" >
<img class="directory-photo-img" src="$photo" alt="$alt-text" title="$alt-text" /> <img class="directory-photo-img" src="$photo" alt="$alt_text" title="$alt_text" />
</a> </a>
</div> </div>
</div> </div>