1
0
mirror of https://github.com/processwire/processwire.git synced 2025-08-31 10:21:44 +02:00

Initial commit to new repo (carried over from: https://github.com/ryancramerdesign/ProcessWire/tree/devns)

This commit is contained in:
Ryan Cramer
2016-09-02 14:55:17 -04:00
parent cfae5fc6f3
commit bac5b0de5d
1691 changed files with 279091 additions and 1 deletions

View File

@@ -0,0 +1,98 @@
PROCESSWIRE TEMPLATE FILES
==========================
The files in this directory correspond with the templates list in ProcessWire admin. Template files are just
PHP files that output markup. They may also be just basic HTML files (with a .PHP extension). Most pages in
the site are assigned to one of the template files in this directory.
These template files typically comprise the majority of what makes your site unique from any other
ProcessWire installation. In keeping with this approach, you'll also see '/scripts/' and '/styles/'
directories within this templates directory. They contain the site's javascript and CSS files. Though
that is stylistic only, you can certainly place them somewhere else or rename them as desired.
Templates have full unrestricted access to the ProcessWire API and typically use it for finding pages and
referencing their properties for output. If desired, templates may go further than this and call upon other
web applications or anything else that you might do with PHP.
Every template is supplied with a $page object that refers to the current page being viewed. This $page
object is locally scoped to the template file. The only thing you need to do to access it is directly
refer to it in your PHP code. For instance, if you wanted to output the page's $title field from your
template, you would do the following:
<?php echo $page->title; ?>
...or short syntax (if supported by your web host):
<?=$page->title?>
And likewise for any other fields assigned to the template. Though some fields require more, like
files, images, page references and the like.
For more details about the $page API variable, please see:
http://processwire.com/api/variables/page/
LOADING OTHER PAGES FROM YOUR TEMPLATE
======================================
Templates are also supplied with a $pages API variable that provides for loading and finding other pages.
The most common methods used in that object are get() and find(), both of which take a selector string to
locate and return pages. The only difference between them is that get() always returns 1 page, and find()
returns a PageArray. Below are examples:
// find all pages using the skyscraper template
$skyscrapers = $pages->find("template=skyscraper");
// find all skyscrapers with a height greater than 500 ft, and less than or equal to 1000 ft.
$skyscrapers = $pages->find("template=skyscraper, height>500, height<=1000");
// find all skyscrapers in Chicago with 60+ floors, sorted by floors ascending
$skyscrapers = $pages->get("/cities/chicago/")->children("floors>=60, sort=floors");
// find all skyscrapers built before 1950 with 10+ floors, sorted by year, then floors
$skyscrapers = $pages->find("template=skyscraper, year<1950, floors>=10, sort=-year, sort=-floors");
// find all skyscrapers by architects David Childs or Renzo Piano, and sort by height descending
$david = $pages->get("/architects/david-childs/");
$renzo = $pages->get("/architects/renzo-piano/");
$skyscrapers = $pages->find("architect=$david|$renzo, sort=-height");
// find all skyscrapers that mention the words "limestone" and "granite" somewhere in their body copy.
$skyscrapers = $pages->get("/cities/")->find("template=skyscraper, body~=limestone granite");
// find all skyscrapers that mention the phrase "empire state building" in their body copy.
$skyscrapers = $pages->find("template=skyscraper, body*=empire state building");
For more about the $pages API variable, please see:
http://processwire.com/api/variables/pages/
INCLUDING A TEMPLATE FROM ANOTHER TEMPLATE
==========================================
When you include a template from another template, use the following syntax:
include("./my-template.php");
Note the leading "./" above. Do NOT use this syntax:
include("my-template.php");
The difference between the second [incorrect] example and the first [correct] example is that the first
example starts with: "./". This tells PHP to look in the current directory. Whereas if you omit that part,
PHP will search your include path, which could result in an error, or even worse, include the wrong file.
So just remember to always precede your included files with "./".
MORE INFORMATION
================
The information in this file is very brief. Please see the official documentation at:
http://processwire.com/api/
The ProcessWire API cheatsheet is especially handy:
http://processwire.com/api/cheatsheet/
Please join the ProcessWire forum and we're always glad to assist with any questions you have:
http://processwire.com/talk/

View File

@@ -0,0 +1,15 @@
<?php namespace ProcessWire;
/**
* Admin template just loads the admin application controller,
* and admin is just an application built on top of ProcessWire.
*
* This demonstrates how you can use ProcessWire as a front-end
* to another application.
*
* Feel free to hook admin-specific functionality from this file,
* but remember to leave the require() statement below at the end.
*
*/
require($config->paths->adminTemplates . 'controller.php');

View File

@@ -0,0 +1,13 @@
<?php
/**
* Page template
*
*/
include("./head.inc");
echo $page->body;
include("./foot.inc");

View File

@@ -0,0 +1,11 @@
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head>
<title>500 Internal Server Error</title>
</head>
<body>
<h1>Internal Server Error</h1>
<p>The server encountered an internal error or misconfiguration and was unable to complete your request.</p>
<p>{message}</p>
</body>
</html>

View File

@@ -0,0 +1,21 @@
When a fatal error occurs, ProcessWire displays the message:
"Unable to complete this request due to an error."
The message is intentionally vague for security purposes.
Details will be logged to /site/assets/logs/errors.txt.
When present in this directory, the file 500.html will be
displayed instead of the generic error message above. Feel
free to modify this file to show whatever you would like.
Please note the following:
* 500.html is plain HTML and has no PHP or API access.
* You may enter the tag {message} and ProcessWire will
replace this with additional details when applicable.
When not applicable, it will make it blank.
* If you are logged in as an admin, ProcessWire will
give you a detailed error message rather than 500.html.

View File

@@ -0,0 +1,43 @@
<?php
// Output navigation for any children below the bodycopy.
// This navigation cycles through the page's children and prints
// a link and summary:
if($page->numChildren) {
echo "<ul class='nav'>";
foreach($page->children as $child) {
echo "<li><p><a href='{$child->url}'>{$child->title}</a><br />";
echo "<span class='summary'>{$child->summary}</span></p></li>";
}
echo "</ul>";
}
?>
</div><!--/bodycopy-->
</div><!--/container-->
</div><!--/content-->
<div id="footer" class="footer">
<div class="container">
<p>Powered by <a href='http://processwire.com'>ProcessWire Open Source CMS/CMF</a></p>
</div>
</div>
<?php
// If the page is editable, then output a link that takes us straight to the page edit screen:
if($page->editable()) {
echo "<a class='nav' id='editpage' href='{$config->urls->admin}page/edit/?id={$page->id}'>Edit</a>";
}
?>
</body>
</html>

View File

@@ -0,0 +1,160 @@
<?php
/**
* Demo site header include file (HTML5)
*
* Note that this file has nothing to do with ProcessWire. We just split our common
* header and footer markup into separate files (head.inc and foot.inc) like this,
* since it was common to all of our templates.
*
*/
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title><?php echo $page->get("headline|title"); ?></title>
<meta name="description" content="<?php echo $page->summary; ?>" />
<meta name="generator" content="ProcessWire <?php echo $config->version; ?>" />
<link rel="stylesheet" type="text/css" href="<?php echo $config->urls->templates?>styles/main.css" />
<!--[if IE]>
<link rel="stylesheet" type="text/css" href="<?php echo $config->urls->templates?>styles/ie.css" />
<![endif]-->
<!-- This website is powered by ProcessWire CMF/CMS - https://processwire.com -->
</head>
<body>
<p id='bgtitle'><?php
// print the section title as big faded text that appears near the top left of the page
echo $page->rootParent->title;
?></p>
<div id="masthead" class="masthead">
<div class="container">
<a href='<?php echo $config->urls->root; ?>'><p id='logo'>ProcessWire</p></a>
<ul id='topnav'><?php
// Create the top navigation list by listing the children of the homepage.
// If the section we are in is the current (identified by $page->rootParent)
// then note it with <a class='on'> so we can style it differently in our CSS.
// In this case we also want the homepage to be part of our top navigation,
// so we prepend it to the pages we cycle through:
$homepage = $pages->get("/");
$children = $homepage->children;
$children->prepend($homepage);
foreach($children as $child) {
$class = $child === $page->rootParent ? " class='on'" : '';
echo "<li><a$class href='{$child->url}'>{$child->title}</a></li>";
}
?></ul>
<ul id='breadcrumb'><?php
// Create breadcrumb navigation by cycling through the current $page's
// parents in order, linking to each:
foreach($page->parents as $parent) {
echo "<li><a href='{$parent->url}'>{$parent->title}</a> &gt; </li>";
}
?></ul>
<h1 id='title'><?php
// The statement below asks for the page's headline or title.
// Separating multiple fields with a pipe "|" returns the first
// one that has a value. So in this case, we print the headline
// field if it's there, otherwise we print the title.
echo $page->get("headline|title");
?></h1>
<form id='search_form' action='<?php echo $config->urls->root?>search/' method='get'>
<input type='text' name='q' id='search_query' value='<?php echo htmlentities($input->whitelist('q'), ENT_QUOTES, 'UTF-8'); ?>' />
<button type='submit' id='search_submit'>Search</button>
</form>
<?php
// Grab a random image from the homepage and display it.
// Note that $homepage was loaded above where we generated the top navigation.
if(count($homepage->images)) {
$image = $homepage->images->getRandom();
$thumb = $image->size(232, 176);
echo "<a href='{$image->url}'><img id='photo' src='{$thumb->url}' alt='{$thumb->description}' width='{$thumb->width}' height='{$thumb->height}' /></a>";
}
?>
</div>
</div>
<div id="content" class="content">
<div class="container">
<div id="sidebar">
<?php
// Output subnavigation
//
// Below we check to see that we're not on the homepage, and that
// there are at least one or more pages in this section.
//
// Note $page->rootParent is always the top level section the page is in,
// or to word differently: the first parent page that isn't the homepage.
if($page->path != '/' && $page->rootParent->numChildren > 0) {
// We have determined that we're not on the homepage
// and that this section has child pages, so make navigation:
echo "<ul id='subnav' class='nav'>";
foreach($page->rootParent->children as $child) {
$class = $page === $child ? " class='on'" : '';
echo "<li><a$class href='{$child->url}'>{$child->title}</a></li>";
}
echo "</ul>";
}
?>
<div class='sidebar_item'>
<?php
// if the current page has a populated 'sidebar' field, then print it,
// otherwise print the sidebar from the homepage
if($page->sidebar) echo $page->sidebar;
else echo $homepage->sidebar;
?>
</div>
</div><!--/sidebar-->
<div id="bodycopy">

View File

@@ -0,0 +1,13 @@
<?php
/**
* Home template
*
*/
include("./head.inc");
echo $page->body;
include("./foot.inc");

View File

@@ -0,0 +1,49 @@
<?php
/**
* Search template
*
*/
$out = '';
if($q = $sanitizer->selectorValue($input->get->q)) {
// Send our sanitized query 'q' variable to the whitelist where it will be
// picked up and echoed in the search box by the head.inc file.
$input->whitelist('q', $q);
// Search the title, body and sidebar fields for our query text.
// Limit the results to 50 pages.
// Exclude results that use the 'admin' template.
$matches = $pages->find("title|body|sidebar~=$q, limit=50");
$count = count($matches);
if($count) {
$out .= "<h2>Found $count pages matching your query:</h2>" .
"<ul class='nav'>";
foreach($matches as $m) {
$out .= "<li><p><a href='{$m->url}'>{$m->title}</a><br />{$m->summary}</p></li>";
}
$out .= "</ul>";
} else {
$out .= "<h2>Sorry, no results were found.</h2>";
}
} else {
$out .= "<h2>Please enter a search term in the search box (upper right corner)</h2>";
}
// Note that we stored our output in $out before printing it because we wanted to execute
// the search before including the header template. This is because the header template
// displays the current search query in the search box (via the $input->whitelist) and
// we wanted to make sure we had that setup before including the header template.
include("./head.inc");
echo $out;
include("./foot.inc");

View File

@@ -0,0 +1,28 @@
<?php
/**
* Site map template
*
*/
include("./head.inc");
function sitemapListPage($page) {
echo "<li><a href='{$page->url}'>{$page->title}</a> ";
if($page->numChildren) {
echo "<ul>";
foreach($page->children as $child) sitemapListPage($child);
echo "</ul>";
}
echo "</li>";
}
echo "<ul class='sitemap'>";
sitemapListPage($pages->get("/"));
echo "</ul>";
include("./foot.inc");

View File

@@ -0,0 +1,5 @@
#bgtitle {
/* This doesn't render well in IE (any version), so we just exclude it. */
display: none;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 B

View File

@@ -0,0 +1,504 @@
@import url(reset.css);
/**
* ProcesssWire.com site template stylesheet. Prepared for use in the basic site profile.
*
* Please feel free to use and/or modify under the same license as ProcessWire.
*
* Copyright 2010 by Ryan Cramer Design, LLC
*
*/
body {
background: #e4ebee url(images/bg.gif) repeat-x;
}
body, input, textarea, table {
font-family: Georgia, "Times New Roman", Times, serif;
font-size: 14px;
color: #2f4248;
}
#masthead,
#content,
#footer {
padding-right: 20px;
padding-left: 20px;
}
.container {
position: relative;
width: 85%;
min-width: 920px;
max-width: 1200px;
margin: 0 auto;
}
#masthead {
background: none;
height: 210px;
}
#logo {
position: absolute;
left: 0;
top: 44px;
background: url(images/logo.gif);
width: 179px;
height: 25px;
text-indent: -9999px;
}
#title {
font-size: 37px;
color: #003051;
position: absolute;
top: 155px;
left: 0;
}
#bgtitle {
position: absolute;
top: 62px;
left: 0;
font-size: 162px;
color: rgba(255, 255, 255, 0.2);
}
#topnav {
position: absolute;
right: 250px;
top: 3px;
}
#topnav li {
display: inline;
}
#topnav a,
#sidebar ul.nav a,
#breadcrumb a,
a.nav {
font-family: "Helvetica Neue", Arial, sans-serif;
font-size: 11px;
font-weight: bold;
text-transform: uppercase;
color: #a7e5f9;
}
#topnav a {
display: block;
float: left;
margin: 0 0 0 1px;
padding: 48px 10px 20px 10px;
}
#topnav a:hover,
#topnav a.on {
color: #fff;
background: url(images/topnav_a_bg.gif) top left repeat-x;
}
#breadcrumb {
position: absolute;
left: 0;
top: 97px;
}
#breadcrumb li {
color: #5197ae;
font-size: 11px;
display: inline;
padding: 0 2px 0 0;
}
#breadcrumb a {
color: #005f7d;
padding: 0 2px 0 0;
}
#breadcrumb a:hover {
text-decoration: underline;
}
#search_form { }
#search_query {
position: absolute;
top: 7px;
right: 0;
width: 222px;
padding: 2px 5px;
height: 17px;
border: none;
}
#search_submit {
position: absolute;
top: 7px;
right: 0;
border: none;
background: url(images/btn-search.png) top left no-repeat;
width: 27px;
height: 21px;
text-indent: -9999px;
}
#search_submit:hover {
background-position: center left;
cursor: pointer;
}
#search_submit:focus {
background-position: bottom left;
}
#masthead #photo {
position: absolute;
top: 34px;
right: 0;
}
#content {
background: #f8f8f8;
font-size: 14px;
line-height: 1.7em;
color: #333;
padding-top: 0;
padding-bottom: 4em;
min-height: 400px;
}
#content p,
#content ul,
#content ol,
#content table {
margin: 1em 0 1.5em 0;
}
#content a {
color: #f00076;
}
#content a:hover {
background-color: #f00076;
color: #fff;
text-decoration: none;
}
#content em {
font-style: italic;
}
#content strong {
font-family: "Helvetica Neue", Arial, sans-serif;
font-weight: bold;
color: #555;
}
#content h2,
#content h3,
#content h4 {
margin-top: 1.5em;
line-height: 1.3em;
}
#content h2 {
color: #006fbb;
font-size: 23px;
margin-bottom: 0.5em;
}
#content h3 {
color: #690033;
font-size: 18px;
border-bottom: 1px dotted #ccc;
margin-bottom: -0.5em;
padding-bottom: 0.25em;
}
#content h2 + h3 {
margin-top: 0;
}
#content h3 + ul,
#content h3 + ol {
margin-top: 1.5em;
}
#content h4 {
font-size: 1em;
font-weight: bold;
text-transform: uppercase;
}
#content ol li {
margin: 0 0 0 3em;
}
#content ul li {
margin: 0 0 0 3em;
display: list-item;
list-style: disc;
}
#content ol li {
margin: 0 0 0 3em;
display: list-item;
list-style: decimal;
}
#content ul.nav { }
#content ul.nav li {
display: block;
list-style: none;
margin: 0;
border-bottom: 1px dotted #ccc;
}
#content ul.nav li a {
font-family: "Helvetica Neue", Arial, sans-serif;
font-weight: bold;
margin: 0;
}
#content ul.nav li p {
margin: 1em 0;
}
#content .disclaimer {
font-size: 11px;
line-height: 17px;
color: #777;
}
#sidebar {
position: relative;
float: right;
width: 232px;
min-height: 200px;
padding-bottom: 2em;
}
#sidebar h3 {
border: none;
color: #006fbb;
font-size: 16px;
}
#sidebar h3 + ul.nav {
margin-top: 1em;
}
#sidebar #photo {
display: block;
}
#sidebar ul.nav {
margin: 0 0 1em 0;
}
#sidebar ul.nav li {
margin: 0;
border: none;
}
#sidebar ul.nav a {
display: block;
padding: 8px 10px 8px 15px;
color: #005f7d;
background: #d5e5eb;
border-top: 1px solid #fff;
}
#sidebar ul.nav a:hover,
#sidebar ul.nav a.on {
background: #db1174;
color: #fff;
text-decoration: none;
}
#sidebar .sidebar_item {
padding: 0 5px 0 14px;
margin: 0 0 2em 0;
border-left: 1px dotted #ccc;
}
#bodycopy {
padding-right: 265px;
padding-top: 1px;
margin-top: 0;
}
#bodycopy strong {
color: #444;
}
#content #bodycopy > h2:first-child {
margin-top: 1em;
}
#bodycopy .video {
margin: 1em 0;
background: #000;
padding: 10px;
padding-bottom: 3px;
width: 640px;
}
#footer {
clear: both;
border: none;
font-size: 11px;
padding: 2em 0;
}
#footer p,
#footer a {
color: #85aaba;
}
#footer p {
text-align: center;
}
#footer a:hover {
text-decoration: underline;
color: #db1174;
}
/**
* The edit link that appears when you are logged in.
* It is recommended that you implement an edit button
* in your templates to make it easy to switch to and
* from the admin control panel when editing pages.
*
*/
#editpage {
position: absolute;
top: 0;
left: 0;
padding: 5px 6px;
background: #db1174;
color: #fff;
display: block;
font-weight: bold;
}
#editpage:hover {
background: #ffffcc;
color: #000;
}
/**
* Alignment styles that are used by the InputfieldTinyMCE for
* positioning images in bodycopy. If you are using this field type,
* you may want to include these or similar styles in your site.
*
*/
.align_left {
float: left;
margin: 0 1em 0.25em 0;
}
.align_right {
float: right;
margin: 0 0 0.25em 1em;
}
.align_center {
display: block;
margin-left: auto;
margin-right: auto;
}
/**
* Optional CSS classes specific to the FieldtypeComments module
* when used in this site design template.
*
*/
#content .CommentList {
margin: 1em 0 0 0;
}
#content .CommentListItem {
list-style: none;
margin: 0;
border-left: 5px solid #ddd;
border-top: 1px dotted #ccc;
padding: 1em 0 1px 1em;
background: #fff;
}
#content .CommentListItem p {
margin-top: 0;
}
#content .CommentHeader,
#CommentForm label {
margin: 0;
font-weight: bold;
font-size: 11px;
text-transform: uppercase;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
color: #3786bc;
}
#content .CommentText {
color: #666;
}
#CommentForm { }
#CommentForm h3 {
margin: 0;
border: none;
}
#CommentForm label {
display: block;
color: #f00076;
color: #999;
}
#CommentForm p {
margin: 0.5em 0;
}
.CommentForm_cite,
.CommentForm_email {
float: left;
}
.CommentForm_cite input,
.CommentForm_email input {
width: 200px;
margin-right: 1em;
}
.CommentForm_text {
clear: left;
}
.CommentForm_text textarea {
padding: 2px;
width: 75%;
height: 100px;
}
#CommentForm .error {
background: #a30000;
color: #fff;
padding: 0.25em 0.5em;
}
#CommentForm .success {
font-weight: bold;
}
/**
* WireFatalError is a class that ProcessWire will use to output
* fatal errors in the design, but only if debug mode is on, or if
* you are logged in as a superuser.
*
*/
.WireFatalError {
background: #a30000;
color: #fff;
padding: 1em;
position: relative;
z-index: 9999;
}

View File

@@ -0,0 +1,50 @@
/**
* Reset stylesheet to normalize styles across browsers
*
*/
body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,label,input,textarea,p,blockquote,th,td {
margin:0;
padding:0;
}
table {
border-collapse:collapse;
border-spacing:0;
}
fieldset,img {
border:0;
}
address,caption,cite,code,dfn,em,strong,th,var {
font-style:normal;
font-weight:normal;
}
ol,ul,li {
list-style:none;
margin: 0;
padding: 0;
}
caption,th {
text-align:left;
}
h1,h2,h3,h4,h5,h6 {
font-size:100%;
font-weight:normal;
}
q:before,q:after {
content:'';
}
abbr,acronym {
border:0;
}
a {
text-decoration: none;
}