Custom Body Class
<body class="<?php if ($page->id > 1) { echo "inner"; } else { echo "home"; } ?><?php echo ' ppt_' . $page->parent->template->name . ' pt_'. $page->template->name . ' pid_' . $page->id; ?>">
JS Slicknav Mobile Menu
<script src="<?php echo $config->urls->templates; ?>js/jquery.slicknav.min.js"></script>
$(document).ready(function(){
//Show jQuery slicknav mobile menu prepend ul to empty div.
$('#desktop_menu').slicknav({
prependTo:'#menu_holder',
label:'Menu',
allowParentLinks:true
});
});
CSS for Slicknav
/* Slicknav */
/*
Mobile Menu Core Style
*/
.slicknav_btn { position: relative; display: block; vertical-align: middle; float: right; padding: 0.438em 0.625em 0.438em 0.625em; line-height: 1.125em; cursor: pointer; }
.slicknav_menu .slicknav_menutxt { display: block; line-height: 1.188em; float: left; }
.slicknav_menu .slicknav_icon { float: left; margin: 0.188em 0 0 0.438em; }
.slicknav_menu .slicknav_no-text { margin: 0 }
.slicknav_menu .slicknav_icon-bar { display: block; width: 1.125em; height: 0.125em; -webkit-border-radius: 1px; -moz-border-radius: 1px; border-radius: 1px; -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); }
.slicknav_btn .slicknav_icon-bar + .slicknav_icon-bar { margin-top: 0.188em }
.slicknav_nav { clear: both }
.slicknav_nav ul,
.slicknav_nav li { display: block }
.slicknav_nav .slicknav_arrow { font-size: 0.8em; margin: 0 0 0 0.4em; }
.slicknav_nav .slicknav_item { cursor: pointer; }
.slicknav_nav .slicknav_row { display: block; }
.slicknav_nav a { display: block }
.slicknav_nav .slicknav_item a,
.slicknav_nav .slicknav_parent-link a { display: inline }
.slicknav_brand { float:left }
.slicknav_menu:before,
.slicknav_menu:after { content: " "; display: table; }
.slicknav_menu:after { clear: both }
/* IE6/7 support */
.slicknav_menu { *zoom: 1 }
/*
User Default Style
Change the following styles to modify the appearance of the menu.
*/
.slicknav_menu {
font-size:16px;
box-sizing:border-box;
}
.slicknav_menu * {
box-sizing:border-box;
}
/* Button */
.slicknav_btn {
margin: 5px 5px 6px;
text-decoration:none;
text-shadow: none;
-webkit-border-radius: 0;
-moz-border-radius: 0;
border-radius: 0;
background-color: #298869;
}
/* Button Text */
.slicknav_menu .slicknav_menutxt {
color: #FFF;
font-weight: normal;
text-shadow: 0 1px 1px #666;
font-family: "museo-sans", sans-serif;
}
/* Button Lines */
.slicknav_menu .slicknav_icon-bar {
background-color: #f5f5f5;
}
.slicknav_menu {
background:#298869;
padding:5px;
}
.slicknav_nav {
color:#fff;
margin:0;
padding:0;
font-size:0.955em;
}
.slicknav_nav, .slicknav_nav ul {
list-style: none;
overflow:hidden;
}
.slicknav_nav ul {
padding:0;
margin:0 0 0 20px;
}
.slicknav_nav .slicknav_row {
padding:5px 10px;
margin:2px 5px;
}
.slicknav_nav a{
padding:5px 10px;
margin:2px 5px;
text-decoration:none;
color:#fff;
}
.slicknav_nav .slicknav_item a,
.slicknav_nav .slicknav_parent-link a {
padding:0;
margin:0;
}
.slicknav_nav .slicknav_row:hover {
-webkit-border-radius: 6px;
-moz-border-radius: 6px;
border-radius: 6px;
background:#87b79b;
color:#fff;
}
.slicknav_nav a:hover{
-webkit-border-radius: 6px;
-moz-border-radius: 6px;
border-radius: 6px;
/* background:#ccc; */
color:#fff;
}
.slicknav_nav .slicknav_txtnode {
margin-left:15px;
}
.slicknav_brand {
color:#fff;
font-size: 18px;
line-height:30px;
padding:7px 12px;
height:44px;
}
/* End Slicknav */
/* Menu Styles. */
.slicknav_menu {
display:none;
}
#menu_holder {
display:none;
}
@media screen and (max-width: 767px) {
/* #menu is the original menu */
#desktop_menu {
display:none;
}
.mainmenu {
display:none;
}
.slicknav_menu {
display:block;
}
#menu_holder {
display:block;
overflow:hidden;
padding:0;
margin:0;
}
}
ProcessWire collection (like a custom search) page
This is where you can say like, "hey, group events with these keywords on this page" and it'll do that. Date sensitivity.
function returnGroupItems($pageObject, $pagesObject) {
$markup = "";
$blog = $pagesObject->get("8343");
if ($pageObject->result_limit) {
$limit = $pageObject->result_limit;
} else {
$limit = 48;
}
if ($pageObject->keywords != "") {
$keywords = $pageObject->keywords;
//$keywords = str_replace(" ", "", $keywords);
$keywords = str_replace(",", "|", $keywords);
$keyword_option = "title|summary|city|body~={$keywords},";
}
$markup .= "<!-- keywords: {$keywords} -->";
$this_month = strtotime(date("M"));
$events = $pagesObject->find("$keyword_option date>=$this_month, sort=date, main_image.count>0, limit=$limit");
if (count($events)) {
$markup .= "<div id='grid' data-columns>";
foreach ($events as $event) {
if ($event->main_image->first) {
if ($event->main_image->first->width > 400 && $event->main_image->first->height > 200) {
$markup .= "<div><a href='{$event->url}'><img src='{$event->main_image->first->url}' alt='{$event->title} image' /><div class='grid_caption'><p><strong>{$event->title}</strong><br>{$event->date}</p></div></a></div>";
}
}
$markup .= "";
}
$markup .= "</div><!-- data-columns -->";
}
if (count($pageObject->blog_pages)) {
$markup .= "<hr style='clear:both; height:0; background:transparent; width:100%; display:block;padding:10px 0;border-bottom:0px solid #999; border-top:none;'>";
$markup .= "<div style='clear:both'>";
if ($pageObject->blog_headline) {
$headline = $pageObject->blog_headline;
$markup .= "<h1>{$headline}</h1>";
}
$markup .= "<ul class='blog-group'>";
foreach ($pageObject->blog_pages as $item) {
$markup .= "<h2><a href='{$item->url}'>{$item->title} →</a></h2>";
}
$markup .= "</ul><!-- blog-group -->";
$markup .= "</div>";
}
if ($pageObject->descriptive_text) {
$markup .= "<div class='outro' style='display:block; padding-top:10px;'>";
$markup .= $pageObject->descriptive_text;
$markup .= "</div><!-- outro -->";
}
return $markup;
}
PHP Page redirect
header("Location: http://www.yourwebsite.com/user.php");
exit();
Foreach on an associative array
// if count array...
foreach ( $array as $key => $value ) {
// Do stuff with $key and/or $value
}
Pull from a page field and sort DIFFERENTLY than the page field sort!
$results = $pages->get(1011)->page_field->sort("-modified");
More here, including shuffle/randomize and NOT and reverse.
http://cheatsheet.processwire.com/pagearray-wirearray/sorting-and-filtering/
Display an RSS feed
https://processwire.com/talk/topic/451-load-rss-feeds-markuploadrss/
Display Multiple Feeds
See further downthread on first page.
Show Latest-modified Pages
if ($user->hasRole("superuser")) {
$result_pages = $pages->find("limit=60,sort=-modified");
if (count($result_pages)) {
foreach ($result_pages as $result) {
$orig_date = $result->modified;
$format_modified = date("Y-m-d", $orig_date);
echo "<p style='font-size:12px'>{$result->title}, <a href='http://www.mchcinc.org/login/page/edit/?id={$result->id}'>Edit</a> {$format_modified}</p>";
}
}
}
Pagination
// From: https://processwire.com/api/modules/markup-pager-nav/
// Make sure the "Pager" (MarkupPagerNav) module is installed in
// Admin > Modules. If it's not installed, click the Install link
// next to it.
// Determine what template(s) you want to use pagination with.
// Go to Admin > Setup > Templates > [Your Template] > URLs, and
// check the box for: Allow Page Numbers. Save.
// Pagination should now be enabled and ready to use in your templates.
// Custom markup:
<?php
echo $results->renderPager(array(
'nextItemLabel' => "Next",
'previousItemLabel' => "Prev",
'listMarkup' => "<ul class='MarkupPagerNav'>{out}</ul>",
'itemMarkup' => "<li class='{class}'>{out}</li>",
'linkMarkup' => "<a href='{url}'><span>{out}</span></a>"
));
// Straight markup:
$results = $pages->find("parent=/blog/, limit=10, sort=-date");
$pagination = $results->renderPager();
echo $results->render();
// Or:
echo "<ul>";
foreach($results as $result) {
echo "<li><a href='{$result->url}'>{$result->title}</a></li>";
}
echo "</ul>";
echo $pagination;
Pagination CSS
/* Pagination Styles */
.MarkupPagerNav {
clear: both;
margin: 1em 0;
padding:0;
}
.MarkupPagerNav li {
display: inline;
list-style: none;
margin: 0;
}
.MarkupPagerNav li a,
.MarkupPagerNav li.MarkupPagerNavSeparator {
display: block;
float: left;
padding: 2px 9px;
color: #fff;
background: #2f4248;
margin-right: 3px;
font-weight: bold;
text-transform: uppercase;
}
.MarkupPagerNav li.MarkupPagerNavOn a,
.MarkupPagerNav li a:hover {
color: #fff;
background: #db1174;
text-decoration: none;
}
.MarkupPagerNav li a:hover {
background:white;
color:#0e3f67;
}
.MarkupPagerNav li.MarkupPagerNavSeparator {
display: inline;
color: #777;
background: #d2e4ea;
padding-left: 3px;
padding-right: 3px;
}
Page Editable Buttons
<?php
if ($page->editable) {
//https://www.mendofutures.org/new/login/page/edit/?id=1026
$loginMsg = "Logged in as " . $user->name;
$treeLink = $config->urls->root . "login/page/";
$pageLink = $config->urls->root . "login/page/edit/?id=" . $page->id;
echo "<div class='editor'><p class='loginMsg'>{$loginMsg}</p><a href='{$pageLink}' class='editLink'>Edit Page</a><a href='{$treeLink}' class='treeLink'>Page Tree</a></div>";
} else {
}
?>
CSS
<style>
.editor {
position:fixed;
bottom:0;
left:0;
display:block;
}
.editor a:link,
.editor a:visited,
.editor a:hover,
.editor a:active,
.editor p {
text-decoration:none;
background:#629c9e;
padding: 8px 10px;
margin:0;
color:white;
border-right:2px solid #86afb1;
}
.editor a:hover {
background: #4c9295;
}
.loginMsg {
float:left;
display:block;
}
.editor .treeLink:link,
.editor .treeLink:visited,
.editor .treeLink:hover,
.editor .treeLink:active {
display:block;
float:left;
background:#38555f;
}
.editor .treeLink:hover {
background:#22373e;
}
.editor .editLink:link,
.editor .editLink:visited,
.editor .editLink:hover,
.editor .editLink:active {
display:block;
float:left;
background:#4d7988;
}
.editor .editLink:hover {
background:#395d69;
}
</style>
Create an RSS Feed with ProcessWire
Instructions
- Make sure to enable Modules -> Markup -> MarkupRSS (it's old but good)
- Create a new file in /site/templates/ called e.g. rss.php or jobs_rss.php
- Don't assign any fields to it
- Create a new page under e.g. /tools/ called /rss/ or whatever.
- Open the file you created and paste in the code below
- Go to the URL and test
PHP Code
<?php
// retrieve the RSS module
$rss = $modules->get("MarkupRSS");
// configure the feed. see the actual module file for more optional config options.
$rss->title = "Feed Title";
$rss->description = "Our Latest Job Openings";
// find the pages you want to appear in the feed.
// this can be any group of pages returned by $pages->find() or $page->children(), etc.
$items = $pages->find("template=job_opening, limit=10, sort=-created");
// send the output of the RSS feed, and you are done
$rss->render($items);
// Optional URL to the RSS feed
$rss->url = 'https://www.example.org/tools/jobs-rss';
// Optional copyright line in the feed
$rss->copyright = 'Copyright © ' . date("Y") . ', Example Inc.';
// TTL time to life/refresh, 60 minutes default
$rss->ttl = 60;
// ProcessWire field to use for item title (default=title)
$rss->itemTitleField = 'title';
// ProcessWire field to use for item description (default=summary)
$rss->itemDescriptionField = 'summary';
// Maximum length for description (module will truncate to this length)
$rss->itemDescriptionLength = 1024;
// ProcessWire field to use for item date (default=created)
$rss->itemDateField = 'created';
// Header to send before feed output (default is shown below)
$rss->header = 'Content-Type: application/xml; charset=utf-8;';
Paginate in ProcessWire
Instructions
- Copy function below to helpers.inc
PHP Code
echo paginate_children($pages, $page, "12", "-published");
// Function itself
function paginate_children ($pagesObject, $pageObject, $limit, $sorter) {
$markup = "";
if (count($pageObject->children())) {
// Straight markup:
$id_to_use = $pageObject->id;
$results = $pagesObject->find("parent=" . $id_to_use . ",limit=" . $limit . ",sort=" . $sorter);
$pagination = $results->renderPager();
// Or:
$markup .= "";
foreach($results as $result) {
if ($result->template->name == "link") {
$target_link = $result->url;
$extra_link = " · Visit→";
} else {
$target_link = $result->url;
$extra_link = "";
}
$publish_date = date("F d, Y",$result->published);
if ($result->summary) {
$extra_markup = "
Added {$publish_date}
{$result->summary}";
} else {
$extra_markup = "
Added {$publish_date}";
}
$markup .= "- {$result->title}{$extra_link}{$extra_markup}
";
}
$markup .= "
";
$markup .= $pagination;
}
return $markup;
}
PHP Data Retrieval Page
<?php
/* Copyright 2017, Marc Carson Web Design */
// Set your expiry date here.
$expiryDate = strtotime("2017-05-19");
// Default data setting
$data = "";
if ($_GET["id"] === "t") {
// Pseudo-protected data
$data = "pass";
}
$outputDefault = "Sorry, this information has expired. Please email marc@marccarson.com or call (707) 485-2650 for assistance.";
$now = time();
if ($now <= $expiryDate) {
$outputDefault = $data;
}
HTML Template
// HTML template
$tpl = <<<TPL
<!doctype html>
<html lang="en-IE">
<head>
<meta charset="utf-8" />
<title>Data Request</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<style>body { background: #ddd; } p { font-family: sans-serif; } p, pre { color: #666; }</style>
</head>
<body>
<main class="wrap" role="main">
<p>Requested Data:</p>
<pre>$outputDefault</pre>
</main>
<footer>
</footer>
</body>
</html>
TPL;
echo $tpl;