Added experimental pages for the new design.
This commit is contained in:
parent
1febb1a414
commit
154f33ca86
36 changed files with 922 additions and 13 deletions
BIN
assets/fonts/Lato-Black.ttf
Normal file
BIN
assets/fonts/Lato-Black.ttf
Normal file
Binary file not shown.
BIN
assets/fonts/Lato-BlackItalic.ttf
Normal file
BIN
assets/fonts/Lato-BlackItalic.ttf
Normal file
Binary file not shown.
BIN
assets/fonts/Lato-Bold.ttf
Normal file
BIN
assets/fonts/Lato-Bold.ttf
Normal file
Binary file not shown.
BIN
assets/fonts/Lato-BoldItalic.ttf
Normal file
BIN
assets/fonts/Lato-BoldItalic.ttf
Normal file
Binary file not shown.
BIN
assets/fonts/Lato-Hairline.ttf
Normal file
BIN
assets/fonts/Lato-Hairline.ttf
Normal file
Binary file not shown.
BIN
assets/fonts/Lato-HairlineItalic.ttf
Normal file
BIN
assets/fonts/Lato-HairlineItalic.ttf
Normal file
Binary file not shown.
BIN
assets/fonts/Lato-Heavy.ttf
Normal file
BIN
assets/fonts/Lato-Heavy.ttf
Normal file
Binary file not shown.
BIN
assets/fonts/Lato-HeavyItalic.ttf
Normal file
BIN
assets/fonts/Lato-HeavyItalic.ttf
Normal file
Binary file not shown.
BIN
assets/fonts/Lato-Italic.ttf
Normal file
BIN
assets/fonts/Lato-Italic.ttf
Normal file
Binary file not shown.
BIN
assets/fonts/Lato-Light.ttf
Normal file
BIN
assets/fonts/Lato-Light.ttf
Normal file
Binary file not shown.
BIN
assets/fonts/Lato-LightItalic.ttf
Normal file
BIN
assets/fonts/Lato-LightItalic.ttf
Normal file
Binary file not shown.
BIN
assets/fonts/Lato-Medium.ttf
Normal file
BIN
assets/fonts/Lato-Medium.ttf
Normal file
Binary file not shown.
BIN
assets/fonts/Lato-MediumItalic.ttf
Normal file
BIN
assets/fonts/Lato-MediumItalic.ttf
Normal file
Binary file not shown.
BIN
assets/fonts/Lato-Regular.ttf
Normal file
BIN
assets/fonts/Lato-Regular.ttf
Normal file
Binary file not shown.
BIN
assets/fonts/Lato-Semibold.ttf
Normal file
BIN
assets/fonts/Lato-Semibold.ttf
Normal file
Binary file not shown.
BIN
assets/fonts/Lato-SemiboldItalic.ttf
Normal file
BIN
assets/fonts/Lato-SemiboldItalic.ttf
Normal file
Binary file not shown.
BIN
assets/fonts/Lato-Thin.ttf
Normal file
BIN
assets/fonts/Lato-Thin.ttf
Normal file
Binary file not shown.
BIN
assets/fonts/Lato-ThinItalic.ttf
Normal file
BIN
assets/fonts/Lato-ThinItalic.ttf
Normal file
Binary file not shown.
220
assets/style.css
Normal file
220
assets/style.css
Normal file
|
@ -0,0 +1,220 @@
|
||||||
|
@font-face {
|
||||||
|
font-family: "LatoHairline";
|
||||||
|
src: url("fonts/Lato-Hairline.ttf") format("truetype");
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: "LatoLight";
|
||||||
|
src: url("fonts/Lato-Light.ttf") format("truetype");
|
||||||
|
}
|
||||||
|
|
||||||
|
*{
|
||||||
|
box-sizing:border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
html,body{
|
||||||
|
margin:0;
|
||||||
|
padding:0;
|
||||||
|
}
|
||||||
|
|
||||||
|
html{
|
||||||
|
font-family:'LatoLight', 'Lato', sans-serif;
|
||||||
|
font-weight:300;
|
||||||
|
font-size:100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
a{
|
||||||
|
text-decoration:none;
|
||||||
|
color:inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
#top-bar{
|
||||||
|
background:#f5f5f5;
|
||||||
|
padding:8px 14px;
|
||||||
|
height:55px;
|
||||||
|
text-align:center;
|
||||||
|
position:relative;
|
||||||
|
font-weight:300;
|
||||||
|
}
|
||||||
|
|
||||||
|
#top-bar .header{
|
||||||
|
position:absolute;
|
||||||
|
top:14px;
|
||||||
|
left:14px;
|
||||||
|
display:inline-block;
|
||||||
|
font-size:16px;
|
||||||
|
font-weight:300;
|
||||||
|
line-height:0.9em;
|
||||||
|
background:url('/images/friendica.svg') top left no-repeat;
|
||||||
|
background-size:14px;
|
||||||
|
padding-left:18px;
|
||||||
|
margin:0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#top-bar .search-form{
|
||||||
|
margin:0 20px;
|
||||||
|
display:inline-block;
|
||||||
|
}
|
||||||
|
#top-bar .search-wrapper{
|
||||||
|
background:#fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav#links{
|
||||||
|
position:absolute;
|
||||||
|
top:0;
|
||||||
|
right:14px;
|
||||||
|
line-height:55px;
|
||||||
|
}
|
||||||
|
nav#links a{
|
||||||
|
display:inline-block;
|
||||||
|
margin:0 4px;
|
||||||
|
padding:0 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sub-menu-outer{
|
||||||
|
background:#eee;
|
||||||
|
line-height:45px;
|
||||||
|
height:45px;
|
||||||
|
border-top:1px solid #ddd;
|
||||||
|
border-bottom:1px solid #ddd;
|
||||||
|
}
|
||||||
|
.sub-menu-outer .sub-menu-inner{
|
||||||
|
width:500px;
|
||||||
|
margin:auto;
|
||||||
|
}
|
||||||
|
.sub-menu-inner .option{
|
||||||
|
padding:9px 6px;
|
||||||
|
margin:0 5px;
|
||||||
|
}
|
||||||
|
.sub-menu-inner .option.active{
|
||||||
|
border-bottom:2px solid #f00;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-results,
|
||||||
|
.homepage-wrapper{
|
||||||
|
width:500px;
|
||||||
|
margin:auto;
|
||||||
|
text-align:center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-results{
|
||||||
|
margin-bottom:25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.homepage-wrapper{
|
||||||
|
margin:120px auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.homepage-wrapper .header{
|
||||||
|
font-size:68px;
|
||||||
|
font-family:'LatoHairline', 'Lato', sans-serif;
|
||||||
|
font-weight:100;
|
||||||
|
line-height:0.9em;
|
||||||
|
background:url('/images/friendica.svg') top left no-repeat;
|
||||||
|
background-size:61px;
|
||||||
|
margin-left:40px;
|
||||||
|
}
|
||||||
|
.homepage-wrapper .about{
|
||||||
|
text-align:justify;
|
||||||
|
line-height:1.5em;
|
||||||
|
color:#555;
|
||||||
|
}
|
||||||
|
|
||||||
|
.homepage-wrapper .profiles{
|
||||||
|
margin-top:3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.profile{
|
||||||
|
display:table;
|
||||||
|
width:100%;
|
||||||
|
text-decoration:none;
|
||||||
|
color:#000;
|
||||||
|
padding:2px;
|
||||||
|
outline:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.profile.selected,
|
||||||
|
.profile:focus,
|
||||||
|
.profile:hover{
|
||||||
|
padding:1px;
|
||||||
|
border:1px solid #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.profile .profile-photo,
|
||||||
|
.profile .profile-info{
|
||||||
|
display:table-cell;
|
||||||
|
vertical-align:top;
|
||||||
|
text-align:left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.profile .profile-photo{
|
||||||
|
margin:8px;
|
||||||
|
border-radius:15px;
|
||||||
|
border:1px solid #ddd;
|
||||||
|
}
|
||||||
|
.profile .profile-info{
|
||||||
|
padding:8px;
|
||||||
|
width:100%;
|
||||||
|
}
|
||||||
|
.profile .profile-info strong{
|
||||||
|
font-weight:600;
|
||||||
|
}
|
||||||
|
.profile .profile-info .fa{
|
||||||
|
line-height:1.1em;
|
||||||
|
color:#999;
|
||||||
|
}
|
||||||
|
.profile .profile-info .url{
|
||||||
|
font-size:80%;
|
||||||
|
margin-bottom:3px;
|
||||||
|
color:#555;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-wrapper{
|
||||||
|
position:relative;
|
||||||
|
display:inline-block;
|
||||||
|
width:500px;
|
||||||
|
background:#f5f5f5;
|
||||||
|
border:1px solid #ddd;
|
||||||
|
border-radius:8px;
|
||||||
|
height:38px;
|
||||||
|
line-height:22px;
|
||||||
|
}
|
||||||
|
.search-wrapper .search-field{
|
||||||
|
line-height:22px;
|
||||||
|
display:block;
|
||||||
|
border:none;
|
||||||
|
outline:none;
|
||||||
|
background:none;
|
||||||
|
padding:8px 12px;
|
||||||
|
padding-right:117px;
|
||||||
|
width:100%;
|
||||||
|
}
|
||||||
|
.search-wrapper .reset{
|
||||||
|
position:absolute;
|
||||||
|
top:0;
|
||||||
|
right:65px;
|
||||||
|
height:25px;
|
||||||
|
width:25px;
|
||||||
|
margin:6px;
|
||||||
|
padding:0;
|
||||||
|
line-height:1;
|
||||||
|
font-size:12px;
|
||||||
|
color:#555;
|
||||||
|
background:#eee;
|
||||||
|
border:1px solid #ddd;
|
||||||
|
border-radius:20px;
|
||||||
|
font-family:'FontAwesome';
|
||||||
|
font-weight:100;
|
||||||
|
}
|
||||||
|
.search-wrapper .search{
|
||||||
|
border:none;
|
||||||
|
border-left:1px solid #ddd;
|
||||||
|
color:#555;
|
||||||
|
background:#eee;
|
||||||
|
position:absolute;
|
||||||
|
top:0;
|
||||||
|
right:0;
|
||||||
|
height:36px;
|
||||||
|
width:65px;
|
||||||
|
border-radius:0 8px 8px 0;
|
||||||
|
}
|
185
images/friendica.svg
Normal file
185
images/friendica.svg
Normal file
|
@ -0,0 +1,185 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
version="1.1"
|
||||||
|
width="100"
|
||||||
|
height="100"
|
||||||
|
id="svg2">
|
||||||
|
<defs
|
||||||
|
id="defs4">
|
||||||
|
<linearGradient
|
||||||
|
id="highlightgradient">
|
||||||
|
<stop
|
||||||
|
id="stop3833"
|
||||||
|
style="stop-color:#ffffff;stop-opacity:0.74374998"
|
||||||
|
offset="0" />
|
||||||
|
<stop
|
||||||
|
id="stop3829"
|
||||||
|
style="stop-color:#ffffff;stop-opacity:0"
|
||||||
|
offset="1" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="shadowgradient">
|
||||||
|
<stop
|
||||||
|
id="stop3833-5"
|
||||||
|
style="stop-color:#000000;stop-opacity:0.5"
|
||||||
|
offset="0" />
|
||||||
|
<stop
|
||||||
|
id="stop3829-9"
|
||||||
|
style="stop-color:#818080;stop-opacity:0"
|
||||||
|
offset="1" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
x1="44.948269"
|
||||||
|
y1="0"
|
||||||
|
x2="54.103466"
|
||||||
|
y2="46.797421"
|
||||||
|
id="linearGradient4011"
|
||||||
|
xlink:href="#highlightgradient"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="scale(1,0.54545455)" />
|
||||||
|
<linearGradient
|
||||||
|
x1="52.016712"
|
||||||
|
y1="96"
|
||||||
|
x2="42.867535"
|
||||||
|
y2="41.837971"
|
||||||
|
id="linearGradient4021"
|
||||||
|
xlink:href="#shadowgradient"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1,0,0,0.5,0,48)" />
|
||||||
|
<filter
|
||||||
|
x="-0.029999999"
|
||||||
|
y="-0.12"
|
||||||
|
width="1.0599999"
|
||||||
|
height="1.24"
|
||||||
|
color-interpolation-filters="sRGB"
|
||||||
|
id="filter4055">
|
||||||
|
<feGaussianBlur
|
||||||
|
id="feGaussianBlur4057"
|
||||||
|
stdDeviation="1.2" />
|
||||||
|
</filter>
|
||||||
|
<filter
|
||||||
|
x="-0.029877551"
|
||||||
|
y="-0.122"
|
||||||
|
width="1.0597551"
|
||||||
|
height="1.244"
|
||||||
|
color-interpolation-filters="sRGB"
|
||||||
|
id="filter4059">
|
||||||
|
<feGaussianBlur
|
||||||
|
id="feGaussianBlur4061"
|
||||||
|
stdDeviation="1.22" />
|
||||||
|
</filter>
|
||||||
|
</defs>
|
||||||
|
<metadata
|
||||||
|
id="metadata7">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
transform="translate(0,-952.3622)"
|
||||||
|
id="layer1"
|
||||||
|
style="display:inline">
|
||||||
|
<path
|
||||||
|
d="m 18,954.3622 c -8.9908981,0.0431 -16,7.05218 -16,16 0,0 0,41.4991 0,64 0,9.1201 7.0091019,16 16,16 l 16,0 0,-26 32,0 -0.08398,-23.9316 -31.91602,0.1679 0,-20.2363 32,0 0,-26 c 0,0 -40,0 -48,0 z"
|
||||||
|
id="rect2993"
|
||||||
|
style="fill:#ffc019;fill-opacity:1;stroke:none" />
|
||||||
|
<path
|
||||||
|
d="m 82,1050.3622 c 8.990898,0 16.086165,-6.966 16,-16 0,0 0,-41.4991 0,-64 0.07767,-9.01639 -7.067354,-16 -16,-16 l -16,0 0,26 -32,0 0,22 32,0 0,22 -32,0 0,26 c 0,0 32,0 48,0 z"
|
||||||
|
id="rect2993-6"
|
||||||
|
style="fill:#1872a2;fill-opacity:1;stroke:none" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform="translate(0,4)"
|
||||||
|
id="g3997"
|
||||||
|
style="display:inline">
|
||||||
|
<path
|
||||||
|
d="m 66,-2 0,26 -32,0 0,22 m 32,0 0,22 -32,0 0,26"
|
||||||
|
id="path3999"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||||
|
<rect
|
||||||
|
width="96"
|
||||||
|
height="96"
|
||||||
|
rx="16"
|
||||||
|
ry="16"
|
||||||
|
x="2"
|
||||||
|
y="-2"
|
||||||
|
id="rect4001"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform="translate(0,4)"
|
||||||
|
id="layer3"
|
||||||
|
style="display:none">
|
||||||
|
<path
|
||||||
|
d="m 64,0 0,26 -32,0 0,22 32,0 0,22 -32,0 0,26"
|
||||||
|
id="path3926"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||||
|
<rect
|
||||||
|
width="96"
|
||||||
|
height="96"
|
||||||
|
rx="16"
|
||||||
|
ry="16"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
id="rect3928"
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform="translate(0,4)"
|
||||||
|
id="layer2"
|
||||||
|
style="display:inline">
|
||||||
|
<rect
|
||||||
|
width="96"
|
||||||
|
height="48.04369"
|
||||||
|
rx="15.214664"
|
||||||
|
ry="15.215644"
|
||||||
|
x="2"
|
||||||
|
y="-2"
|
||||||
|
id="rect3823"
|
||||||
|
style="fill:url(#linearGradient3930);fill-opacity:1;stroke:none" />
|
||||||
|
<rect
|
||||||
|
width="96"
|
||||||
|
height="47.86721"
|
||||||
|
rx="15.214664"
|
||||||
|
ry="15.159752"
|
||||||
|
x="2"
|
||||||
|
y="-94"
|
||||||
|
transform="scale(1,-1)"
|
||||||
|
id="rect3823-8"
|
||||||
|
style="fill:url(#linearGradient3904);fill-opacity:1;stroke:none" />
|
||||||
|
<rect
|
||||||
|
width="98"
|
||||||
|
height="24"
|
||||||
|
rx="15.214664"
|
||||||
|
ry="8.2994423"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
transform="matrix(1.0296115,0,0,1.1963836,-0.901924,-6.713207)"
|
||||||
|
id="rect4003"
|
||||||
|
style="fill:url(#linearGradient4011);fill-opacity:1;stroke:none;filter:url(#filter4059)" />
|
||||||
|
<rect
|
||||||
|
width="96"
|
||||||
|
height="24"
|
||||||
|
rx="14.008356"
|
||||||
|
ry="12"
|
||||||
|
x="0"
|
||||||
|
y="72"
|
||||||
|
transform="matrix(0.9768331,0,0,0.91974646,3.1649641,6.098115)"
|
||||||
|
id="rect4013"
|
||||||
|
style="opacity:0.5674603;fill:url(#linearGradient4021);fill-opacity:1;stroke:none;filter:url(#filter4055)" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 5.4 KiB |
21
mod/home.php
21
mod/home.php
|
@ -1,14 +1,17 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
if(! function_exists('home_init')) {
|
use Friendica\Directory\Rendering\View;
|
||||||
function home_init(&$a) {
|
use Friendica\Directory\Helper\Profile as ProfileHelper;
|
||||||
|
|
||||||
$r = q("SELECT * FROM `user` WHERE 1 LIMIT 1");
|
if(! function_exists('home_content')) {
|
||||||
if(count($r))
|
function home_content(&$a) {
|
||||||
goaway( $a->get_baseurl() . "/profile/" . $r[0]['nickname'] );
|
|
||||||
else
|
$profiles = q("SELECT * FROM profile WHERE comm=1 AND LENGTH(pdesc)>0 ORDER BY RAND() LIMIT 3");
|
||||||
goaway( $a->get_baseurl() . "/register" );
|
|
||||||
|
$view = new View('homepage', 'minimal');
|
||||||
|
$view->addHelper('photoUrl', ProfileHelper::get('photoUrl'));
|
||||||
|
$view->output(array(
|
||||||
|
'profiles' => $profiles
|
||||||
|
));
|
||||||
|
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
use \DateTime;
|
||||||
|
|
||||||
require_once('datetime.php');
|
require_once('datetime.php');
|
||||||
function photo_init(&$a) {
|
function photo_init(&$a) {
|
||||||
|
|
||||||
|
|
||||||
switch($a->argc) {
|
switch($a->argc) {
|
||||||
case 2:
|
case 2:
|
||||||
$photo = $a->argv[1];
|
$photo = $a->argv[1];
|
||||||
|
@ -24,8 +27,26 @@ function photo_init(&$a) {
|
||||||
$data = file_get_contents('images/default-profile-sm.jpg');
|
$data = file_get_contents('images/default-profile-sm.jpg');
|
||||||
}
|
}
|
||||||
|
|
||||||
header("Content-type: image/jpeg");
|
//Enable async process from here.
|
||||||
|
session_write_close();
|
||||||
|
|
||||||
|
//Try and cache our result.
|
||||||
|
$etag = md5($data);
|
||||||
|
header('Etag: '.$etag);
|
||||||
header('Expires: ' . datetime_convert('UTC','UTC', 'now + 1 week', 'D, d M Y H:i:s' . ' GMT'));
|
header('Expires: ' . datetime_convert('UTC','UTC', 'now + 1 week', 'D, d M Y H:i:s' . ' GMT'));
|
||||||
|
header("Cache-Control: max-age=".intval(7*24*3600));
|
||||||
|
if(function_exists('header_remove')) {
|
||||||
|
header_remove('Pragma');
|
||||||
|
header_remove('pragma');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] == $etag) {
|
||||||
|
header('HTTP/1.1 304 Not Modified');
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
header("Content-type: image/jpeg");
|
||||||
echo $data;
|
echo $data;
|
||||||
exit;
|
exit;
|
||||||
|
|
||||||
}
|
}
|
93
mod/search.php
Normal file
93
mod/search.php
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Friendica\Directory\Rendering\View;
|
||||||
|
use Friendica\Directory\Helper\Search as SearchHelper;
|
||||||
|
use Friendica\Directory\Helper\Profile as ProfileHelper;
|
||||||
|
|
||||||
|
function search_content(&$a) {
|
||||||
|
|
||||||
|
//Filters
|
||||||
|
$community = null;
|
||||||
|
$filter = null;
|
||||||
|
if($a->argc >= 2){
|
||||||
|
|
||||||
|
$filter = $a->argv[1];
|
||||||
|
switch($filter){
|
||||||
|
|
||||||
|
case 'forums':
|
||||||
|
$community = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'people':
|
||||||
|
$community = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
$community = null;
|
||||||
|
$filter = null;
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
$alpha = false;
|
||||||
|
if(x($_GET, 'alpha') == 1)
|
||||||
|
$alpha = true;
|
||||||
|
|
||||||
|
//Query
|
||||||
|
$search = ((x($_GET,'query')) ? notags(trim($_GET['query'])) : '');
|
||||||
|
|
||||||
|
if(empty($search)){
|
||||||
|
goaway('/home');
|
||||||
|
}
|
||||||
|
|
||||||
|
if($search)
|
||||||
|
$alpha = true;
|
||||||
|
|
||||||
|
//Run our query.
|
||||||
|
if($search)
|
||||||
|
$search = dbesc($search . '*');
|
||||||
|
$sql_extra = ((strlen($search)) ? " AND MATCH (`name`, `pdesc`, `homepage`, `locality`, `region`, `country-name`, `gender`, `marital`, `tags` )
|
||||||
|
AGAINST ('$search' IN BOOLEAN MODE) " : "");
|
||||||
|
|
||||||
|
if(!is_null($community))
|
||||||
|
$sql_extra .= " and comm=".intval($community)." ";
|
||||||
|
|
||||||
|
$sql_extra = str_replace('%','%%',$sql_extra);
|
||||||
|
|
||||||
|
$total = 0;
|
||||||
|
$r = q("SELECT COUNT(*) AS `total` FROM `profile` WHERE `censored` = 0 $sql_extra ");
|
||||||
|
if(count($r)){
|
||||||
|
$total = $r[0]['total'];
|
||||||
|
$a->set_pager_total($r[0]['total']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if($alpha)
|
||||||
|
$order = " order by name asc ";
|
||||||
|
else
|
||||||
|
$order = " order by updated desc, id desc ";
|
||||||
|
|
||||||
|
|
||||||
|
$r = q("SELECT * FROM `profile` WHERE `censored` = 0 $sql_extra $order LIMIT %d , %d ",
|
||||||
|
intval($a->pager['start']),
|
||||||
|
intval($a->pager['itemspage'])
|
||||||
|
);
|
||||||
|
|
||||||
|
//Show results.
|
||||||
|
$view = new View('search');
|
||||||
|
|
||||||
|
$view->addHelper('paginate', function()use($a){return paginate($a);});
|
||||||
|
$view->addHelper('photoUrl', ProfileHelper::get('photoUrl'));
|
||||||
|
$view->addHelper('filterAllUrl', SearchHelper::get('filterAllUrl'));
|
||||||
|
$view->addHelper('filterPeopleUrl', SearchHelper::get('filterPeopleUrl'));
|
||||||
|
$view->addHelper('filterForumsUrl', SearchHelper::get('filterForumsUrl'));
|
||||||
|
|
||||||
|
$view->output(array(
|
||||||
|
'total' => number_format($total),
|
||||||
|
'results' => $r,
|
||||||
|
'filter' => $filter,
|
||||||
|
'query' => x($_GET,'query') ? $_GET['query'] : ''
|
||||||
|
));
|
||||||
|
|
||||||
|
}
|
47
src/Helper/BaseHelper.php
Normal file
47
src/Helper/BaseHelper.php
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
<?php namespace Friendica\Directory\Helper;
|
||||||
|
|
||||||
|
use \OutOfBoundsException;
|
||||||
|
use \ReflectionMethod;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides easy access to common helpers, to add them to your views.
|
||||||
|
*/
|
||||||
|
abstract class BaseHelper
|
||||||
|
{
|
||||||
|
|
||||||
|
public static function get($name)
|
||||||
|
{
|
||||||
|
$helper = new static();
|
||||||
|
return $helper->{$name};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A reference to the global App.
|
||||||
|
* @var \App
|
||||||
|
*/
|
||||||
|
protected $app;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
global $a;
|
||||||
|
$this->app = $a;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Provides access to a wrapper for your helper functions.
|
||||||
|
public function __get($name)
|
||||||
|
{
|
||||||
|
|
||||||
|
if(!method_exists($this, $name)){
|
||||||
|
throw new OutOfBoundsException("Helper method '$name' does not exist on ".get_class($this));
|
||||||
|
}
|
||||||
|
|
||||||
|
$helper = $this;
|
||||||
|
$method = new ReflectionMethod($this, $name);
|
||||||
|
return function()use($method, $helper){
|
||||||
|
$arguments = func_get_args();
|
||||||
|
return $method->invokeArgs($helper, $arguments);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
16
src/Helper/Profile.php
Normal file
16
src/Helper/Profile.php
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
<?php namespace Friendica\Directory\Helper;
|
||||||
|
|
||||||
|
use \BadMethodCallException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides easy access to common helpers, to add them to your views.
|
||||||
|
*/
|
||||||
|
class Profile extends BaseHelper
|
||||||
|
{
|
||||||
|
|
||||||
|
public function photoUrl($profileId)
|
||||||
|
{
|
||||||
|
return $this->app->get_baseurl() . '/photo/' . $profileId;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
26
src/Helper/Search.php
Normal file
26
src/Helper/Search.php
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
<?php namespace Friendica\Directory\Helper;
|
||||||
|
|
||||||
|
use \BadMethodCallException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides easy access to common helpers, to add them to your views.
|
||||||
|
*/
|
||||||
|
class Search extends BaseHelper
|
||||||
|
{
|
||||||
|
|
||||||
|
public function filterAllUrl($query)
|
||||||
|
{
|
||||||
|
return $this->app->get_baseurl() . '/search?query=' . urlencode($query);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function filterPeopleUrl($query)
|
||||||
|
{
|
||||||
|
return $this->app->get_baseurl() . '/search/people?query=' . urlencode($query);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function filterForumsUrl($query)
|
||||||
|
{
|
||||||
|
return $this->app->get_baseurl() . '/search/forums?query=' . urlencode($query);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
109
src/Rendering/View.php
Normal file
109
src/Rendering/View.php
Normal file
|
@ -0,0 +1,109 @@
|
||||||
|
<?php namespace Friendica\Directory\Rendering;
|
||||||
|
|
||||||
|
use \Closure;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class with insert data in a two-step view.
|
||||||
|
*/
|
||||||
|
class View
|
||||||
|
{
|
||||||
|
|
||||||
|
#TODO: Replace this with better code.
|
||||||
|
|
||||||
|
public static function getViewPath($name)
|
||||||
|
{
|
||||||
|
return dirname(__DIR__).'/templates/view/'.$name.'.php';
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getLayoutPath($name)
|
||||||
|
{
|
||||||
|
return dirname(__DIR__).'/templates/layout/'.$name.'.php';
|
||||||
|
}
|
||||||
|
|
||||||
|
protected $layout;
|
||||||
|
protected $view;
|
||||||
|
protected $helpers;
|
||||||
|
|
||||||
|
public function getHelpers(){
|
||||||
|
return $this->helpers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function addHelper($name, Closure $helper)
|
||||||
|
{
|
||||||
|
$this->helpers[$name] = $helper;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getView(){
|
||||||
|
return $this->view;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setView($value){
|
||||||
|
$this->view = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getLayout(){
|
||||||
|
return $this->layout;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setLayout($value){
|
||||||
|
$this->layout = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __construct($view=null, $layout="default")
|
||||||
|
{
|
||||||
|
|
||||||
|
$this->view = $view;
|
||||||
|
$this->layout = $layout;
|
||||||
|
$this->helpers = array();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function render(array $data=array())
|
||||||
|
{
|
||||||
|
|
||||||
|
//First the outer view.
|
||||||
|
$view = self::getViewPath($this->view);
|
||||||
|
$viewContent = $this->encapsulatedRequire($view, $data);
|
||||||
|
|
||||||
|
//Then the layout, including the view as $content.
|
||||||
|
$data['content'] = $viewContent;
|
||||||
|
$layout = self::getLayoutPath($this->layout);
|
||||||
|
return $this->encapsulatedRequire($layout, $data);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function output(array $data=array())
|
||||||
|
{
|
||||||
|
|
||||||
|
header("Content-type: text/html; charset=utf-8");
|
||||||
|
echo $this->render($data);
|
||||||
|
exit;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function encapsulatedRequire($filename, array $data=null)
|
||||||
|
{
|
||||||
|
|
||||||
|
//This will provide our variables on the global scope.
|
||||||
|
$call = function($__FILE__, $__VARS__){
|
||||||
|
extract($__VARS__, EXTR_SKIP);
|
||||||
|
require $__FILE__;
|
||||||
|
};
|
||||||
|
|
||||||
|
//Use our current data as fallback.
|
||||||
|
if(!is_array($data)){
|
||||||
|
$data = $this->currentData;
|
||||||
|
}
|
||||||
|
|
||||||
|
//This will add the helper class to $this.
|
||||||
|
$helpers = new ViewHelpers($this, $data);
|
||||||
|
$call = $call->bindTo($helpers, get_class($helpers));
|
||||||
|
|
||||||
|
//Run and return the value.
|
||||||
|
ob_start();
|
||||||
|
$call($filename, $data);
|
||||||
|
return ob_get_clean();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
59
src/Rendering/ViewHelpers.php
Normal file
59
src/Rendering/ViewHelpers.php
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
<?php namespace Friendica\Directory\Rendering;
|
||||||
|
|
||||||
|
use \BadMethodCallException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This provides functions in a view to do things like including new views.
|
||||||
|
*/
|
||||||
|
class ViewHelpers
|
||||||
|
{
|
||||||
|
|
||||||
|
protected $view;
|
||||||
|
protected $contextData;
|
||||||
|
|
||||||
|
public function __construct(View $view, array $contextData)
|
||||||
|
{
|
||||||
|
$this->view = $view;
|
||||||
|
$this->contextData = $contextData;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function view($name, array $overrides=null)
|
||||||
|
{
|
||||||
|
|
||||||
|
$data = $this->contextData;
|
||||||
|
|
||||||
|
if(is_array($overrides)){
|
||||||
|
$data = array_merge($data, $overrides);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->view->encapsulatedRequire(View::getViewPath($name), $data);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function layout($name, array $overrides=null)
|
||||||
|
{
|
||||||
|
|
||||||
|
$data = $this->contextData;
|
||||||
|
|
||||||
|
if(is_array($overrides)){
|
||||||
|
$data = array_merge($data, $overrides);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->view->encapsulatedRequire(View::getLayoutPath($name), $data);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __call($name, $arguments)
|
||||||
|
{
|
||||||
|
|
||||||
|
$helpers = $this->view->getHelpers();
|
||||||
|
|
||||||
|
if(array_key_exists($name, $helpers)){
|
||||||
|
return call_user_func_array($helpers[$name], $arguments);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new BadMethodCallException("Helper method '$name' does not exist or is not added.");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
4
src/templates/layout/_navigation.php
Normal file
4
src/templates/layout/_navigation.php
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
<nav id="links">
|
||||||
|
<a href="/stats">Stats</a>
|
||||||
|
<a href="/help">Help</a>
|
||||||
|
</nav>
|
7
src/templates/layout/_searcher.php
Normal file
7
src/templates/layout/_searcher.php
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
<form action="/search" method="get" class="search-form">
|
||||||
|
<div class="search-wrapper">
|
||||||
|
<input class="search-field" type="text" name="query" placeholder="<?php echo $query ? $query : 'Search your friends'; ?>" tabindex="1" autofocus />
|
||||||
|
<input class="reset" type="reset" value="" tabindex="3" />
|
||||||
|
<input class="search" type="submit" value="Search" tabindex="2" />
|
||||||
|
</div>
|
||||||
|
</form>
|
13
src/templates/layout/_topBar.php
Normal file
13
src/templates/layout/_topBar.php
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
<header id="top-bar">
|
||||||
|
|
||||||
|
<a href="/home">
|
||||||
|
<h1 class="header">
|
||||||
|
Friendica <br> Directory
|
||||||
|
</h1>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<?php echo $this->layout('_searcher'); ?>
|
||||||
|
|
||||||
|
<?php echo $this->layout('_navigation'); ?>
|
||||||
|
|
||||||
|
</header>
|
5
src/templates/layout/default.php
Normal file
5
src/templates/layout/default.php
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
echo $this->layout('minimal', array(
|
||||||
|
'topBar' => $this->layout('_topBar')
|
||||||
|
));
|
20
src/templates/layout/minimal.php
Normal file
20
src/templates/layout/minimal.php
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
<!DOCTYPE html >
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1">
|
||||||
|
<link rel="search" type="application/opensearchdescription+xml" title="Friendica Directory" href="/opensearch" />
|
||||||
|
|
||||||
|
<title>Friendica Directory</title>
|
||||||
|
<link rel="shortcut icon" href="/images/friendica-32.png" />
|
||||||
|
<link rel="apple-touch-icon" href="/images/friendica-128.png"/>
|
||||||
|
|
||||||
|
<link href="//fonts.googleapis.com/css?family=Lato:100,300" rel="stylesheet" type="text/css">
|
||||||
|
<link href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css" rel="stylesheet" type="text/css">
|
||||||
|
<link href="/assets/style.css" rel="stylesheet" type="text/css" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<?php if(isset($topBar)) echo $topBar; ?>
|
||||||
|
<?php echo $content; ?>
|
||||||
|
</body>
|
||||||
|
</html>
|
23
src/templates/view/_profile.php
Normal file
23
src/templates/view/_profile.php
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
<a class="profile" href="<?php echo $profile['homepage']; ?>" target="_blank">
|
||||||
|
|
||||||
|
<img class="profile-photo" src="<?php echo $this->photoUrl($profile['id']); ?>" />
|
||||||
|
<div class="profile-info">
|
||||||
|
<strong class="name"><?php echo $profile['name']; ?></strong>
|
||||||
|
<div class="url"><?php echo $profile['homepage']; ?></div>
|
||||||
|
<div class="description"><?php echo $profile['pdesc']; ?></div>
|
||||||
|
<div class="location">
|
||||||
|
<?php
|
||||||
|
$parts = array();
|
||||||
|
if(!empty($profile['locality'])) $parts[] = $profile['locality'];
|
||||||
|
if(!empty($profile['country-name'])) $parts[] = $profile['country-name'];
|
||||||
|
?>
|
||||||
|
|
||||||
|
<?php if (count($parts)): ?>
|
||||||
|
<i class="fa fa-globe"></i>
|
||||||
|
<?php echo implode(', ', $parts); ?>
|
||||||
|
<?php endif ?>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</a>
|
26
src/templates/view/homepage.php
Normal file
26
src/templates/view/homepage.php
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
<?php echo $this->layout('_navigation'); ?>
|
||||||
|
|
||||||
|
<div class="homepage-wrapper">
|
||||||
|
|
||||||
|
<h1 class="header">
|
||||||
|
Friendica <br> Directory
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<?php echo $this->layout('_searcher'); ?>
|
||||||
|
|
||||||
|
<p class="about">
|
||||||
|
Friendica is a decentralized social network.
|
||||||
|
And this is a directory to find people on this network.
|
||||||
|
Vivamus condimentum tempor pellentesque. Phasellus turpis nulla, lacinia vitae quam in,
|
||||||
|
cursus semper est. Ut lobortis ex quis sodales porta. Nam rhoncus tortor lobortis auctor
|
||||||
|
efficitur. Ut ac ullamcorper lorem.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="profiles">
|
||||||
|
<h3>Random groups</h3>
|
||||||
|
<?php foreach ($profiles as $profile)
|
||||||
|
echo $this->view('_profile', array('profile'=>$profile));
|
||||||
|
?>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
32
src/templates/view/search.php
Normal file
32
src/templates/view/search.php
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
<div class="sub-menu-outer">
|
||||||
|
<div class="sub-menu-inner search-options">
|
||||||
|
<a class="option <?php echo $filter === null ? 'active' : '' ?>" href="<?php echo $this->filterAllUrl($query); ?>">All</a>
|
||||||
|
<a class="option <?php echo $filter == 'people' ? 'active' : '' ?>" href="<?php echo $this->filterPeopleUrl($query); ?>">People</a>
|
||||||
|
<a class="option <?php echo $filter == 'forums' ? 'active' : '' ?>" href="<?php echo $this->filterForumsUrl($query); ?>">Forums</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="search-results">
|
||||||
|
<div class="profiles">
|
||||||
|
|
||||||
|
<?php if (count($results)): ?>
|
||||||
|
|
||||||
|
<h3>Results for "<?php echo $query; ?>" (<?php echo $total; ?>)</h3>
|
||||||
|
<?php
|
||||||
|
|
||||||
|
foreach ($results as $profile)
|
||||||
|
echo $this->view('_profile', array('profile'=>$profile));
|
||||||
|
|
||||||
|
echo $this->paginate();
|
||||||
|
|
||||||
|
?>
|
||||||
|
|
||||||
|
|
||||||
|
<?php else: ?>
|
||||||
|
|
||||||
|
<h3>There were no results</h3>
|
||||||
|
|
||||||
|
<?php endif ?>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
Loading…
Reference in a new issue