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}&nbsp;&rarr;</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

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 &copy; ' . 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

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;