kongondo

Module: Blog

Recommended Posts

Hi All,

I am mainly specialized in frontend-development and have limited experience with PHP. I just started out with Processwire, so my problem might be really basic and specific to the "PW-logic", but now I feel I got stucked with the below problem.

I am trying to rebuild a site (previously WP) on localhost, and I am looking to set up a blog within this. All my "normal" pages are showing up fine, except the blog. When navigating to the blog, a white screen is rendered. My page header (menu, search box...) and footer aren't rendered either. HTTP status is 200 (OK).

Kongondo's blog components (MarkupBlog, ProcessBlog) are installed, I have read the instructions and everything went fine with the installation, my Apache and PW logs having been both error-free regarding this case. I have turned on debugging in config.php. I have an "Example post" with some dummy content, so that one at least should be visible. 

In my templates folder, the blog-related files are empty except for the comments ("* A blank template file to get you up and running quickly with your Blog
 *"). However, in site\modules\MarkupBlog, I have files with regular php-codes. In templates, I have "blog", within which I have two fields, "title" and "blog_body".

Do I miss something regarding templates and template-files? Or is it a different issue?

Thank you in advance!

 

 

 

 

 

 

 

 

Share this post


Link to post
Share on other sites
On 2017-6-20 at 2:15 PM, zkriszti said:

In my templates folder, the blog-related files are empty except for the comments ("* A blank template file to get you up and running quickly with your Blog
 *").

Hi @zkriszti. Seems you installed blog with the option 'blank template files', hence there is no demo content. Blog's documentation, found here, should help you along. It's incomplete but sufficient to get you started.

  • Like 1

Share this post


Link to post
Share on other sites
On 6/26/2017 at 7:39 AM, kongondo said:

Hi @zkriszti. Seems you installed blog with the option 'blank template files', hence there is no demo content. Blog's documentation, found here, should help you along. It's incomplete but sufficient to get you started.

Yes, thank you :) meanwhile I realized this being the problem, so the blog is up and running by now, waiting for my content... :)

Share this post


Link to post
Share on other sites

@kongondo, I have one more question. :) I have not found an option in the admin backend to modify whether I want to output the number of comments on the top or at the bottom. I have found this part of the markup in the MarkupBlog.module, where it refers to $commentsCountTop and $commentsCountBottom boolean variables, so I suppose they should exist as a setting somewhere... I've been looking for this a whole day back and forth, but can't find it... It would be easy to just modify MarkupBlog.module accordingly, but 1. it would contradict the logic (why would this option be a variable then?) 2. I suppose that it got overwritten during a possible update. Thank you in advance. :)

 

Share this post


Link to post
Share on other sites
On 2017-7-1 at 1:28 PM, zkriszti said:

I have not found an option in the admin backend to modify whether I want to output the number of comments on the top or at the bottom. I have found this part of the markup in the MarkupBlog.module, where it refers to $commentsCountTop and $commentsCountBottom boolean variables, so I suppose they should exist as a setting somewhere

Hi. The documentation is still incomplete, sorry. That and similar options found in MarkupBlog.module should be passed to the respective methods. In this case, the method renderPosts(). Its third argument is $options. For instance:

 

$blog = $modules->get('MarkupBlog');
$options = array('post_comments' => 1, 'post_author_text' => 'Authored by');
$posts = $pages->find('template=blog-post, limit=10r');
echo $blog->renderPosts($posts, false, $options);

Please see the method MarkupBlog::getPostsOptions for all available options.

  • Like 1

Share this post


Link to post
Share on other sites

Update: Merged dev 2.4.1 to master.

Changelog

  1. New, cleaner Backend UI.
  2. Better sorting of Posts, Categories and Tags in their dashboards.
  3. New option for posts: post_edit. Allows top or bottom placement of link to edit post for logged in users or non-display of link for all users. Thanks @antoiba86
  4. Code refactoring.

Screenshots in this post:

 

  • Like 1

Share this post


Link to post
Share on other sites

I’d like to add ‘placeholder’ texts in the name, email, and text input fields of the comment function. How do I do this?

Share this post


Link to post
Share on other sites
On 22/07/2017 at 4:15 AM, Claus said:

I’d like to add ‘placeholder’ texts in the name, email, and text input fields of the comment function. How do I do this?

Hi, as you've noted in your other post, it is a Comments module issue. However, we can work something out, sort of.  As you can see here, Comments module allows for preset values (not exactly HTML placeholders) for cite, email, website and text inputs. We can use those. In the next update, I'll make it possible to pass those as part of $options (third argument) to renderComments().

Share this post


Link to post
Share on other sites

This might be more of a PHP-question, but strongly related to the renderNav() function of the blog module.

My blog starting page enumerates my Categories using renderNav(), which works fine (only a category list, no post-listing here yet). But to add a visual tweak to it, I have added an image to each of my categories (one single image to each of the categories, each has its own). Now what I need is a modified html output so that the images should be clickable blocks instead of just the category titles. (Category titles would show up on the image with some transparent background). I think this is quite a frequent visual pattern.

My template file looks like this:

$blog = $modules->get('MarkupBlog');

$urls = $pages->find('template=blog-category, limit=0');
$category_list = $blog->renderNav('', $urls, '', false);

$content = $category_list;

...and output html by $content should look like something like this (instead of just a simple list now) :

<li>
  <a href="[category-url]" class="category-box">
    <img src=[blog-category-img-url] />
    <span class="category-title">[category title here]</span>
  </a>
</li>

...and then I can write the necessary CSS to accomplish the desired visual output.

So how do I go about it? How do I make (or extend) renderNav() to give me an output like this? Basically, I want it to get not just the title but my "blog_category_image" custom field, too. Any help is greatly appreciated. :)

 

Share this post


Link to post
Share on other sites

Quick by the ways first..

41 minutes ago, zkriszti said:

$urls = $pages->find('template=blog-category, limit=0');

Are you sure you don't want to limit? If you are, then no need to add 'limit=0' in your selector.

 

41 minutes ago, zkriszti said:

So how do I go about it? How do I make (or extend) renderNav() to give me an output like this? Basically, I want it to get not just the title but my "blog_category_image" custom field, too.

The easier path would be to copy renderNav(), modify that to your liking and save it as a function somewhere in your site (if you will be reusing it throughout), or in you blog-categories template file. You would then call it (if function is called renderNavCustom) as:

$category_list = renderNavCustom('', $urls, '', false);
$content = $category_list;

Your $urls is a already a PageArray so you should be able to loop through that to grab each category Page's blog_category_image. 

Hope this helps.

Edited by kongondo

Share this post


Link to post
Share on other sites

What would be the way to import blog posts from one PW-DB to another? I had a working PW installation with some blog-posts in it. I then exported the 'blog' fields using  MySQL Workbench, then deleted the fields in the target DB, and then imported the exported SQL-file into this new DB. Alas that didn’t work. The 'blog' fields exist in the new DB, and they are populated with the correct data, but in the PW admin interface they don’t show up under Pages nor under Blog:Posts.

I probably did something terrible?

Share this post


Link to post
Share on other sites
On 06/08/2017 at 6:21 PM, Claus said:

The 'blog' fields exist in the new DB, and they are populated with the correct data, but in the PW admin interface they don’t show up under Pages nor under Blog:Posts.

Hi Claus,

Blog keeps a reference of its parent pages (Posts, Settings, Widgets, etc) in the module's settings in the DB. If you look at the DB table modules in ProcessWire, you will find a row each for each of your configurable modules. In this DB table, under the column class, look for the entry for ProcessBlog. In the data column for this entry, you will see  JSON string similar to the following:

{
  "blogFullyInstalled": 1,
  "blogStyle": "1",
  "schedulePages": 1,
  "commentsUse": 1,
  "templateFilesInstall": "2",
  "tagTemplatesFields": "blog",
  "blog": 1020,
  "blog-posts": 1021,
  "blog-categories": 1022,
  "blog-tags": 1023,
  "blog-comments": 1024,
  "blog-widgets": 1025,
  "blog-authors": 1026,
  "blog-archives": 1027,
  "blog-settings": 1028,
  "blog-asc": 1032,
  "blog-dnc": 1033,
  "blog-dc": 1034,
  "blog-rposts": 1035,
  "blog-rcomments": 1036,
  "blog-broll": 1037,
  "blog-tweets": 1039,
  "blog-pauthor": 1040,
  "quickPostEditor": 1
}

In the above, blog refers to the main Blog page and its ID is 1020; blog-posts refers to the parent Posts page and its ID is 1021, etc.  That is the missing information. If you exported your parent Blog pages verbatim, then the contents of your data column in the DB for ProcessBlog entry in your source DB should match what you want in your target DB. All you need to do is copying them over. If your parent Blog pages' IDs changed, then just edit them in the data column of the target DB.

Hope this resolves your issue. Apologies couldn't answer sooner. 

Share this post


Link to post
Share on other sites

I am finding myself having to deconstruct everything. I am not having an easy time. I am sure I am approaching this wrong. Every step I have overcome has not been without a struggle.

So I want to present the blog posts within the current sites html. So I created my own blog.php with the following code

<?php
$blog = $modules->get("MarkupBlog");
foreach($pages->find("template=blog-post, limit=10") as $child) {
    
    $content .= "
    <div class=\"pure-u-lg-1-3 pure-u-md-1-3 pure-u-1-1\">
        <a href=\"{$child->url}\">{$child->title}</a>
        <img src=\"{$child->blog_images->first->url}\">
    </div>";
}

This works just find. Then I think well when site.com/blog displays the blog post now how do I call the previous and next markup? I believe I have to use the function $blog->renderNextPrevPosts(). Like I said, I am probably approaching this wrong.

Share this post


Link to post
Share on other sites
1 hour ago, RichyRich said:

I am finding myself having to deconstruct everything. I am not having an easy time. I am sure I am approaching this wrong. Every step I have overcome has not been without a struggle.

Hi @RichyRich. Welcome to the forums and ProcessWire. Sorry you are struggling. If you haven't seen them yet, please see the (yet incomplete) docs. They should get you started.

I see you are calling $blog but you are not actually doing anything with it. Did you want to display one blog post per page? Or a number of blog posts?

Share this post


Link to post
Share on other sites

Thank you for a response kongondo & abdus. Yea I realize $blog is not being used. I would like /blog to display 10 blog posts, I am having trouble on how to render the links to the next 10 posts, or a list of categories using $blog. Regarding the issues with navigating pages of 10 blog post, I started writing that myself, but I think it is a waste of time considering I am sure it can be called using $blog

Share this post


Link to post
Share on other sites
42 minutes ago, RichyRich said:

I am having trouble on how to render the links to the next 10 posts

In this particular case, Blog will automatically render the pagination for you. You just need to make sure that the template where you call it allows pagination. Example (@see /ProcessBlog/template-files/blog-posts.php/). 

$blog = $modules->get("MarkupBlog");
//render a limited number of summarised posts
$content = $blog->renderPosts("limit=10", true);
//render a limited number of full posts
//$content = $blog->renderPosts("limit=10");
echo $content;

 

Edited by kongondo

Share this post


Link to post
Share on other sites

***Issue resolved****

Found answer buried in this thread on page 20

 

Hello - just started using ProcessWire and I love it so far! I am having an issue with the blog module. When accessing anything blog related on the frontend, I receive a 404(regular pages work). I've tried all 4 of the structures, but no luck. I'm guessing it has something to do with the URL rewrite. Below are my platform specs:

Windows/IIS

PHP 7

PW: 3.0.62

Blog/MarkupBlog: 2.4.1

Blog demo content installed

 

I have attached my web.config file as well.

 

Thanks in advance for the help. Looking forward to working with this platform!

 

 

 

 

web.config

Share this post


Link to post
Share on other sites
On 7/24/2017 at 10:32 PM, kongondo said:

Your $urls is a already a PageArray so you should be able to loop through that to grab each category Page's blog_category_image.

I still seem to be stuck with this. I most probably misplace something, but what I get as a result is the right URLs, the right titles BUT the very same image for all of my categories (see attachment). The image that is displayed belongs to the last category (the one with the highest ID), bit it is displayed for all the 3 of them. even though they all have their respective images. For test purposes, if I display the ID on the frontend, I get the ID of the last category for all the 3 categories.

The relevant part of my code (based on your original renderNav() function) looks like this:
(because I need to display the images together with the urls and category titles, I suppose that this is where I should get my blog category images as well, and not in a separate loop). 

foreach($nav as $url => $title) {
            
                    $imagelocation = $page->blog_category_image->url; 
                                                     
					if($url == $currentURL) $out .=
                        "<li class='on category-item'>
                            <a class='on category-box' href='$url'>
                                <img src='$imagelocation' />
                                <span class='category-title'>$title</span>
                                <span></span>
                                
                            </a>
                        </li>";
            
					else $out .= 
                        "<li class='category-item'>
                            <a class='category-box' href='$url'>
                                <img src='$imagelocation' />
                                <span class='category-title'>$title</span>
                                <span></span>
                            </a>
                        </li>";
		}

I greatly appreciate your help. :) 

pw_output.PNG

Share this post


Link to post
Share on other sites
On 08/09/2017 at 1:48 PM, zkriszti said:

$imagelocation = $page->blog_category_image->url;

Here you are getting the same image over and over. The image on the current page in the field blog_category_image.

For your needs, maybe just skip your custom renderNav(). Maybe one of the following should fit your needs.

// If showing all categories
$categories = $pages->find('template=blog-category');
$out = '';
if(count($categories)) {
    foreach ($categories as $category) {    
        $on = $page->blog_categories->has($category) ? ' on' : '';
        $out .= "<li class='category-item{$on}'>
                    <a class='category-box{$on}' href='{category->$url}'>
                        <img src='{$category->blog_category_image->url}' />
                        <span class='category-title'>{$category->title}</span>
                        <span></span>
                    </a>
                </li>";    
    }
}

echo $out;

######## OR ########

// If showing only the current post's categories (no need for 'on')
$categories = $page->blog_categories;
if(count($categories)) {
    $out = '';
    foreach ($categories as $category) {    
        $out .= "<li class='category-item'>
                    <a class='category-box' href='{category->$url}'>
                        <img src='{$category->blog_category_image->url}' />
                        <span class='category-title'>{$category->title}</span>
                        <span></span>
                    </a>
                </li>";    
    }
}
    
echo $out;

 

Share this post


Link to post
Share on other sites

I seem to have another issue, and as far as I've found out (having searched all the way through the forum), this is related to the small version of posts stripping tags. More exactly, I can't get 'post_small_allowable_tags' to work. I just can't seem to get the "view more" anchor appear.

The affected page is a blog-category view (based on the module's blog-category.php), where I get a few post excerpts from a given category, ideally with adding that "view more" tag. Which is nowhere to be found in the output. :(

The relevant parts of my template file look like this:

$options = array('post_small_allowable_tags' => '<p><a>', 'post_more_text' => 'tovább');
$content .= $blog->renderPosts($posts, true, $options);

Then the html output looks like this:

<div class="summary">
  <p>It's my blogpost and here is a 
    <a href="http://...">link to my another article in the text working fine.</a>
    Some more text, some more text, some more text.</p>
</div>

It is strange, because inside .summary I do have <p> and <a> tags, but <a> is only for the content (because there is a link in the referred article itself). But I don't have "view more" at the end of the summary.

Thank you very much for your help in advance!

 

Share this post


Link to post
Share on other sites

Hello @kongondo, thanks for making this cool module. I haven't used it yet but from what I've seen, it seems amazing!

I was just on my way to install this when I ran into attached error, is there anyway you can help me out? I have no idea where to even start to fix this.

I tried running the install again after but it seems half it has been setup and cannot overwrite those files (also attached).

I'm running a local version of ProcessWire 3.0.62 using AMPPS.

Thanks!

Edit: it seems it was creating a post when installation failed. Could it because I have a page already called blog? It's setup like this:

http://127.0.0.1/procwire/resources/blog/

I can delete this page and reinstall. But I need to clean the files somehow...

Screen Shot 2017-10-28 at 8.58.49 pm.png

Screen Shot 2017-10-28 at 9.11.33 pm.png

Edited by bot19
idea of potential issue

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By bernhard
      Some of you might have followed the development of this module here: https://processwire.com/talk/topic/15524-previewdiscussion-rockdatatables/ . It is the successor of "RockDataTables" and requires RockFinder to get the data for the grid easily and efficiently. It uses the open source part of agGrid for grid rendering.
       
      WHY?
      ProcessWire is awesome for creating all kinds of custom backend applications, but where it is not so awesome in my opinion is when it comes to listing this data. Of course we have the built in page lister and we have ListerPro, but none of that solutions is capable of properly displaying large amounts of data, for example lists of revenues, aggregations, quick and easy sorts by the user, instant filter and those kind of features. RockGrid to the rescue 😉 
       
      Features/Highlights:
      100k+ rows Instant (client side) filter, search, sort (different sort based on data type, eg "lower/greater than" for numbers, "contains" for strings) extendable via plugins (available plugins at the moment: fullscreen, csv export, reload, batch-processing of data, column sum/statistics, row selection) all the agGrid features (cell renderers, cell styling, pagination, column grouping etc) vanilla javascript, backend and frontend support (though not all plugins are working on the frontend yet and I don't plan to support it as long as I don't need it myself)  
      Limitations:
      While there is an option to retrieve data via AJAX the actual processing of the grid (displaying, filtering, sorting) is done on the client side, meaning that you can get into troubles when handling really large datasets of several thousands of rows. agGrid should be one of the most performant grid options in the world (see the official example page with a 100k row example) and does a lot to prevent problems (such as virtual row rendering), but you should always have this limitation in mind as this is a major difference to the available lister options that do not have this limitation.
      Currently it only supports AdminThemeUikit and I don't plan to support any other admin theme.
       
      Download: https://gitlab.com/baumrock/FieldtypeRockGrid
      Installation: https://gitlab.com/baumrock/RockGrid/wikis/Installation
      Quikckstart: https://gitlab.com/baumrock/RockGrid/wikis/quickstart
      Further instructions: https://gitlab.com/baumrock/RockGrid/wikis/quickstart#further-instructions
      German Translation File: site--modules--fieldtyperockgrid--fieldtyperockgrid-module-php.json
      Changelog: https://gitlab.com/baumrock/FieldtypeRockGrid/raw/master/changelog.md
       
      Module status: alpha, License: MIT
      Note that every installation and uninstallation sends an anonymous google analytics event to my google analytics account. If you don't want that feel free to remove the appropriate lines of code before installation/uninstallation.
       
      Contribute:
      You can contribute to the development of this and other modules or just say thank you by
      testing, reporting issues and making PRs at gitlab liking this post buying me a drink: paypal.me/baumrock/5 liking my facebook page: facebook.com/baumrock hiring me for pw work: baumrock.com  
      Support: Please note that this module might not be as easy and plug&play as many other modules. It needs a good understanding of agGrid (and JavaScript in general) and it likely needs some looks into the code to get all the options. Please understand that I can not provide free support for every request here in the forum. I try to answer all questions that might also help others or that might improve the module but for individual requests I offer paid support for 60€ per hour (excl vat).
       
      Use Cases / Examples:
      Colored grid cells, Icons, Links etc. The Grid also has a "batcher" feature built in that helps communicating with the server via AJAX and managing resource intensive tasks in batches:

      Filters, PW panel links and instant reload on panel close:

      You can combine the grid with a chart library like I did with the (outdated) RockDataTables module:

    • By thomasaull
      Some time ago I created a site profile for creation of a REST API with ProcessWire. Since I kept struggeling with updating stuff between different projects which use this, I decided to convert it into a module. It is now ready for testing: https://github.com/thomasaull/RestApi
      Additionally I added a few small features:
      automatic creation of JWT Secret at module install routes can be flagged as auth: false, which makes them publicly accessible even though JWT Auth is activated in module settings To check things out, download and install the module and check the folder /site/api for examples.
      If you find any bugs or can think of improvements, please let me know!
    • By kongondo
      Sites Manager
       
      16 September 2018:
      FOR NOW, PLEASE DO NOT USE THIS MODULE IN A PRODUCTION SITE. A  RECENT ProcessWire UPDATE HAS BROKEN THE MODULE. I AM WORKING ON A FIX.
       
      ################
       
      Sites Manager is a module for ProcessWire that allows Superusers to easily create/install ProcessWire sites on the same serverspace the module is running in. Only Superusers can use the module. You can create both stand-alone and multi-sites.
       
      Single/Stand-alone Sites
      Stand-alone or single-sites are sites that will run in their own document root/directory with their own wire and site folders, .htaccess, index.php, etc. In other words, a normal ProcessWire site.
      Multiple Sites
      Multi-sites are sites that will run off one wire folder (shared amongst two or more sites) each having their own site folder and database. In this regard, it is important to note that Sites Manager is not in itself a multiple sites solution! Rather, it is a utility that helps you create multi-sites to be run using the ProcessWire core multiple sites feature. For more on this core feature, see the official ProcessWire documentation, specifically the solution referred to as Option #1.
      Option #1 approach requires the site admin to initially install ProcessWire in a temporary directory for each new site. The directory then needs to be renamed as site-xxx, where ‘xxx’ is any name you want to use to differentiate the installation from other sites, before it is moved to the webroot. For instance, site-mysite, site-another, site-whatever. In addition, the /wire/index.config.php file must be copied/moved to the webroot. Each time a site is added, the index.config.php has to be edited to add ‘domain’ => ‘site-directory’ key=>value pairs for the site. This process can become a bit tedious. This module aims to automate the whole multi-site site creation process.
      The module is based off the official ProcessWire installer. Creating a site is as simple as completing and submitting a single form! You also have the option to type and paste values or reuse a pre-defined install configuration.
       
      The module will:
      Install a ProcessWire site in your named directory, applying chmod values as specified
      Move the directory to your webroot
      Update/Create a Superuser account as per the submitted form, including setting the desired admin theme and colour
      For multi sites, update sites.json (used by index.config.php to get array of installed sites)
       
      For multi sites, the only difference in relation to the core multi-sites index.config.php is that this file is slightly different from the one that ships with ProcessWire.
      Download from GitHub: Sites Manager (Beta Release)
      Features
      Install unlimited number of sites in one (multi-sites) or independent (single-site) ProcessWire installs. Install by completing a Form, Typing or pasting in configurations or using pre-created install configurations. Choose an Admin Theme to auto-install along with the site installation. For single-sites installation, download, save and reuse ProcessWire versions of your choice. Install and maintain site profiles for reuse to create other sites. Create install configurations to speed up installation tasks. Client and server-side validation of site creation values. Edit uploaded profiles (e.g., replace profile file). Lock installed sites, configurations and profiles to prevent editing. Bulk delete items such as site profiles, installed site directories and/or databases (confirmation required for latter two). View important site details (admin login, chmod, etc). Links to installed sites home and admin pages. Timezones auto-complete/-suggest. Pre-requisites, Installation & Usage
      Please see the documentation.
      Technicalities/Issues
      Only Superusers can use the module.
      ProcessWire 2.7 - 3.x compatible
      Currently using ProcessWire 2.7 installer (install.php)
      For multi-sites, potential race condition when sites.json is being updated on a new site install vs. index.config.php accessing the json file?
      Not tested with sub-directory installs (for instance localhost/pw/my-site-here/)
      Currently not doing the extra/experimental database stuff (database charset and engine)
      Future Possibilities
      Install specified modules along with the ProcessWire install
      Profile previews?
      Credits
      @ryan: for the ProcessWire installer
      @abdus: for the index.config.php reading from JSON idea
      @swampmusic: for the challenge
      Video Demo
      Demo  showing how quick module works on a remote server [YMMV!]. Video shows downloading and processing two versions of ProcessWire (~takes 7 seconds) and installing a single/stand-alone ProcessWire 3 site using the new Admin Theme UI Kit (~2 seconds) on a remote server.
       
      Screens
      1

      2

       
       
    • By Robin S
      Breadcrumb Dropdowns
      Adds dropdown menus of page edit links to the breadcrumbs in Page Edit.

      Installation
      Install the Breadcrumb Dropdowns module. The module requires ProcessWire >= v3.0.83 and AdminThemeUikit.
      There is a checkbox option in the module config that determines if the breadcrumb dropdowns will include pages that the user does not have permission to edit.
      Features/details
      The module adds an additional breadcrumb item at the end for the currently edited page. That's because I think it's more intuitive for the dropdown under each breadcrumb item to show the item's sibling pages rather than the item's child pages. In the dropdown menus the current page and the current page's parents are highlighted in a crimson colour to make it easier to quickly locate them in case you want to edit the next or previous sibling page. Unpublished and hidden pages are indicated in the dropdowns with similar styling to that used in Page List. If the option to include uneditable pages is selected then those pages are indicated by italics with a reduced text opacity and the "not-allowed" cursor is shown on hover. There is a limit of 25 pages per dropdown for performance reasons and to avoid the dropdown becoming unwieldy. If the current user is allowed to add new pages under the parent page an "Add New" link is shown at the bottom of the breadcrumb dropdown. If the currently edited page has children or the user may add children, a caret at the end of the breadcrumbs reveals a dropdown of up to the first 25 children and/or an "Add New" link. Overriding the listed siblings for a page
      If you want to override the siblings that are listed in the dropdowns you can hook the BreadcrumbDropdowns::getSiblingsmethod and change the returned PageArray. For most use cases this won't be necessary.
      Incompatibilities
      This module replaces the AdminThemeUikit::renderBreadcrumbs method so will potentially be incompatible with other modules that hook the same method.
       
      https://modules.processwire.com/modules/breadcrumb-dropdowns/
      https://github.com/Toutouwai/BreadcrumbDropdowns
    • By Ken Muldrew
      I'm trying to get a short routine to run once per day that will look at some pages and send a reminder email when that customer's subscription (yearly) is about to expire. When I run the code in a template then it works without issue, but inside my lazycron service routine, I get an "Error: Uncaught Error: Call to a member function get() on null" as if the database cannot be found. My autoload module is just the sample HelloWorld module included with ProcessWire, editted to perform this task. The whole of it is included below (I've stripped out the code that generates the email because it never gets past $pages->find):
       
      <?php namespace ProcessWire;
      /**
       * ProcessWire 'LazyCronLoad'  module
       *
       */
      class LazyCronLoad extends WireData implements Module {
          public static function getModuleInfo() {
              return array(
                  'title' => 'LazyCronLoad', 
                  'version' => 1, 
                  'summary' => 'Just loads a lazy cron callback.',
                  'singular' => true, 
                  'autoload' => true, 
                  );
          }
          public function init() {
              // initialize the hook in the AutoLoad module
              $this->addHook('LazyCron::everyDay', $this, 'myHook');
              
          }
          public function myHook(HookEvent $e) {
              // called once per day
              wire('log')->save('user_activities',' lazy cron service routine');
                  $transport_pages = $pages->find("template=aggregate-entry, aggregate_type.title='Transport'");
                  foreach ($transport_pages as $page) {
                      if (($page->purchase_date + 30325800 < time()) && ($page->purchase_date + 30412600 > time())) { // between 351 and 352 days
                          wire('log')->save('user_activities', $page->id . ' email reminder sent');
                          // send email
                  }
              }
          }        
          
      }
      The first wire('log') shows up but the second one doesn't (the purchase_date condition is met (as demonstrated by running the code in a template close in time to when the lazycron routine executes)). The error log gives the Uncaught Error shown above. 
      I think this is a beginner's mistake with something obvious being missed and would be grateful for any assistance in fixing it.