kongondo

Module: Blog

Recommended Posts

@kongondo Yesss! It worked, but only when I disabled scheduled post and comments. Is there a way to enable them?

Also, would like to carry over the house styles to the blog.  Ignore this!!

Thank you so much.

Share this post


Link to post
Share on other sites

OK, we are getting somewhere. In my previous testing I had one or two issues with comments but was never able to replicate the issue further. I suggest the following:

  1. Do a cleanup (but do no uninstall Blog)
  2. Make sure you have both Comments field and Schedule Pages modules installed
  3. Run Blog install wizard
  4. Enjoy your new Blog...hopefully :)
Edited by kongondo
  • Like 1

Share this post


Link to post
Share on other sites

Hi @kongondo, here I'm again. The blog works fine and I'm able to style it according to my needs, but somehow on the "posts" homepage I'm not getting the summary view of the posts. I get the full post and a link to the next post at the bottom. How do I get summary posts to work? Thanks.

Share this post


Link to post
Share on other sites

Hi @MaryMatlow,

Please read the docs, here (WIP), especially, this section, but for your specific question, this topic :-). Please note that some newer and amended methods have not yet found their way into the docs, e.g. the method renderRelatedPosts(). However, these are all in this (long, I know) thread but probably best to take a peek at MarkupBlog class itself for all render methods before we get the docs up to speed again.

  • Like 1

Share this post


Link to post
Share on other sites

HI @kongondo,

So here's the progress. I've a summary page with blog posts listed, and have a full-length blog post page. On the blog-post template I've added an image field, and that image is the splash image to go across the top of the post, below which the post would be rendered. See screenshot:

 

Quote

Screen Shot 2017-01-15 at 9.44.16 PM.png

 

 

The thing I want to do is include this image as part of the summary post list, as in here:

 

Quote

Screen Shot 2017-01-15 at 9.47.59 PM.png

 

Any idea how can I achieve it. Thanks for your help.

Share this post


Link to post
Share on other sites

@kongondo I can't seem to get the featured image to work. Ive added image to blog_image field and am calling it on posts template like this:


<?php
    //CALL THE MODULE - MarkupBlog
    $blog = $modules->get("MarkupBlog");
    //main content
    $featured = array('tag'=>'thumb', 'width'=>550, 'position'=>'above');
    $content .= $blog->renderPosts("limit=7", true, $featured);

    //include the main/common markup
    require_once("blog-main.inc");

There are images in the blog_body field also but none of the images are being rendered.

Share this post


Link to post
Share on other sites

@MaryMatlow,

Seems you missed the third link in my post above :). The array indices were changed to 

'post_image_tag' => 'whatever',

etc..Please see the whole list there or within the module code itself

 

Edited by kongondo
  • Like 1

Share this post


Link to post
Share on other sites

Hi @kongondo, Thanks for your great module and you patient help with it. The blog page and summary page work fine. On the summary page with the array options we can turn off the comment count in the headline, how can i do the same on the blog post also. I'm using your default blog-post template to render single post.

Thanks for your help.

Share this post


Link to post
Share on other sites

Hi @MaryMatlow,

Same way, really. renderPosts() takes 3 arguments, the third of which is $options. Since you need to pass in the 3rd argument, in blog-post.php, line #56, you also have to specify the second argument like so:

$options = array('post_comments'=>0);
$content = $blog->renderPosts($page, false, $options) . $blog->postAuthor() . $renderComments . $blog->renderNextPrevPosts($page);

The 'false' is the second argument. The post will be rendered in full since what that says is that $small = false.

  • Like 2

Share this post


Link to post
Share on other sites

Thanks @kongondo, that's perfect. The blog works beautifully. But now I'm getting a fatal error with the BlogPublishDate module:

Compile Error: Cannot redeclare class BlogPublishDate (line 23 of /xx/xxxxxxxxx/html/site/modules/Blog/BlogPublishDate.module) 

Not sure where this has come from.

Share this post


Link to post
Share on other sites

That's coming from ProcessWire's file compiler; it is not a bug on Blog's side. Try clearing your file compiler cache to see if it solves the issue.  

  • Like 2

Share this post


Link to post
Share on other sites

Hi @kongondo i want to render just one category post on homepage but would like to disable pagination with it. Is there an options array to do that? I couldn't find it.

Second, I want to render posts from two categories on separate templates with different options. For example, when a news article is rendered I do not want author, comments etc but for the blog post I want to keep all that. The full single post uses the blog-post.php template by default. How can i make the news item to use let's say news-item.php?

Thanks.

 

Share this post


Link to post
Share on other sites
On 03/02/2017 at 5:05 PM, MaryMatlow said:

i want to render just one category post on homepage but would like to disable pagination with it. Is there an options array to do that? I couldn't find it.

I am not sure I understand this one. Not sure if you want 1 post from 1 category or several posts from 1 category. Irrespective, pagination only kicks in when you grab a limited number of items and the results returned are a PageArray. 

If what you mean is:

1. Render only 1 post from a given category: Here the trick is to return a Page rather than a PageArray. So, we use a get(). findOne() (if you are using PW 3.X) should also work.

$content = '';
// render a single blog post on Blog Home Page
//$singlePost = $pages->get(11335);// grab by ID
$singlePost = $pages->get('template=blog-post, sort=random, blog_categories=News Article, limit=1');// grab a random post
$content .= $blog->renderPosts($singlePost);

2. Render several posts from only 1 category. In this case, this will return an array. So, to avoid pagination, we need to grab ALL the available post, i.e. no limit (careful with this one if you have lots of posts!).

$content = '';
// render ALL blog posts from a single category on Blog Home Page
$oneCategoryPosts = $pages->find('template=blog-post, blog_categories=News Article');
$content .= $blog->renderPosts($oneCategoryPosts);
// these will also work; passing in a selector
#$selector = "template=blog-post, blog_categories=News Article";
#$content .= $blog->renderPosts($selector);

 

On 03/02/2017 at 5:05 PM, MaryMatlow said:

Second, I want to render posts from two categories on separate templates with different options. For example, when a news article is rendered I do not want author, comments etc but for the blog post I want to keep all that. The full single post uses the blog-post.php template by default. How can i make the news item to use let's say news-item.php?

No need to create a different template for blog posts classified as 'News Article'. Instead, we include some extra logic in the template file blog-post.php. See example below.

// get the category 'News Article'
$newsArticle = $pages->get('template=blog-category, name=news-article');

// special render for blog posts that are classified under 'News Article'
if($page->blog_categories->has($newsArticle)) {
    $options = array('post_categories'=>1, 'post_tags' => 0);// options ONLY for news articles 
    $renderAuthor = '';// don't render blog post author for news articles
    $renderComments = '';// ditto comments
}

// normal blog post
else {
    #$options = array();// if you wish, options for all other blog posts go in here
    $renderAuthor = $blog->postAuthor();// render authors for normal blog posts
    $renderComments = $blog->renderComments($page->blog_comments);// ditto comments
}

$content = $blog->renderPosts($page, false, $options) . $renderAuthor . $renderComments . $blog->renderNextPrevPosts($page);

 

Edited by kongondo
  • Like 2

Share this post


Link to post
Share on other sites

Hey @kongondo, thanks for your detailed response. Regarding, the homepage i should have explained that I need only the latest news article to display, and since there are going to be several news articles the pagination will appear by default, and i don't want to show it. Now I could hide it by using a CSS rule but thought there should be a more elegant solution.

The code for separating options for blog and news articles worked perfectly. :-) Thanks.

I thought I had worked out the rendering of blog and news articles separately but it doesn't seem to work. This is the code I'm using for display of news articles category, but all categories are being displayed:

$posts = $pages->find("template=blog-post, blog_categories='News', limit=10");//grab some posts
                $options = array('post_count' => 1, 'post_comments' => 2, 'post_small_image' => '1', 'post_small_image_width' => '740',);
                $posts = '';
                $posts .= $page->image;
                //render a limited number of summarised posts that belong to this category
                $posts .= $page->blog_body . $blog->renderPosts($posts, true, $options);
                    echo $posts;

Also, no featured image or images within the blog body are showing in any of the posts, summary view or single post view. On the previous site where I used the same code I had no problem with images. Appreciate your help.

Share this post


Link to post
Share on other sites
4 hours ago, MaryMatlow said:

Regarding, the homepage i should have explained that I need only the latest news article to display,

I already answered how to do this :). If you don't want pagination, then, in your case, grab only 1 item.

// GET 1 post, SORTED BY created {you could also sort by '-blog_date'}
$singlePost = $pages->get('template=blog-post, sort=-created, blog_categories=News');
$out = $blog->renderPosts($singlePost);
echo $out;

 

4 hours ago, MaryMatlow said:

This is the code I'm using for display of news articles category, but all categories are being displayed:


$posts = $pages->find("template=blog-post, blog_categories='News', limit=10");//grab some posts
                $options = array('post_count' => 1, 'post_comments' => 2, 'post_small_image' => '1', 'post_small_image_width' => '740',);
                $posts = '';
                $posts .= $page->image;
                //render a limited number of summarised posts that belong to this category
                $posts .= $page->blog_body . $blog->renderPosts($posts, true, $options);
                    echo $posts;

 

I am not being rude but this is the point at which I encourage you to get that 'PHP for beginners' book ;) (e.g., this one) as well as revisit the PW docs. Let's walk through your code:

Line 1#: You grab some posts using find(). That returns a PageArray. You then assign it to the variable $posts.

Line #3: You are overwriting the variable $post (which contains the PageArray from Line #1), assigning it an empty string, i.e. ''.

Line #4: You are appending to the empty string $post an Object which contains the current page's image.

Line # 6: You then append to $post  other stuff.....

That's why it doesn't work as expected :). I am surprised it didn't throw an error. Maybe you have debug turned off? 

  • Like 3

Share this post


Link to post
Share on other sites

@kongondo You are right. I'm a complete PHP novice, trying to wing my way through, copying code without understanding. Obviously that's no way to do things. It's time to teach myself the basics of PHP, and I'm determined to do that. :-) Thanks for pointing out the resources. And thanks for all your help and patience.

  • Like 3

Share this post


Link to post
Share on other sites
5 hours ago, MaryMatlow said:

It's time to teach myself the basics of PHP, and I'm determined to do that

...and we'll be here to help! Please have another go and let us know how it goes :)

  • Like 2

Share this post


Link to post
Share on other sites

Hi @kongondo, it's all coming together nicely. I have one Blog page and other News page (both outside the Blog page structure) and they display summary posts and news articles respectively. I'm using the Style number 3 from Blog configuration. Two issues:

1) When the post/news article opens the path is mysite/posts/blog1 or mysite/posts/news1 which is expected because I'm adding these under "Posts". Ideally I would want them to open as mysite/blog/blog1 or mysite/news/news1. Hope it makes sense. Is there a way to achieve this?

2) Clicking on "Categories" takes me to mysite/categories/news. I would want it go to mysite/news instead where all the summary news posts sit.

Thanks for your help.

Share this post


Link to post
Share on other sites
On 11/02/2017 at 4:21 PM, MaryMatlow said:

1) When the post/news article opens the path is mysite/posts/blog1 or mysite/posts/news1 which is expected because I'm adding these under "Posts". Ideally I would want them to open as mysite/blog/blog1 or mysite/news/news1. Hope it makes sense. Is there a way to achieve this

I am a bit confused here. Do you mean AND and not OR? I.e. do you want normal posts to open as /mysite/blog/blog1/ AND news posts to open as /mysite/news/news1? OR you are happy with either? If AND, then you will need URL rewriting as explained here (quite advanced code) or similar. If you mean OR, then just rename the page 'Posts' to whatever you need, i.e. either 'News' or 'Blog'.

On 11/02/2017 at 4:21 PM, MaryMatlow said:

2) Clicking on "Categories" takes me to mysite/categories/news. I would want it go to mysite/news instead where all the summary news posts sit.

I am not sure I understand this either. I assume you mean clicking on the sub-navigation on the right-hand side (in the demo blog template files)? If yes, that navigation is built using the method renderNav() in MarkupBlog. You might have to create your own custom navigation in that case.

  • Like 1

Share this post


Link to post
Share on other sites

I need some help. I have read all posts and documentation but can not get it to work. I have two questions.

1. Image summary page
My blog index page works but I would like to have the image on the right side. Can I do this with CSS (img.post-featured-image{float:right})?

<div class='row'>
	<div class='col-md-12'>			
		<?php
			$blog = $modules->get("MarkupBlog");
			$options = array('width'=>280, 'alt'=>'title', 'post_small_image'=>2);
			$content = $blog->renderPosts("limit=10", true, $options);
			echo $content; 
		?>	
	</div>
</div>

haddock.png

2. blog-post.php 

How can I output the post that is linked to. I mean the page with the full blog-item? I use this code but it does not work.

$blog = $modules->get("MarkupBlog");
$singlePost = $pages->get('template=blog-post, sort=-created');
$out = $blog->renderPosts($singlePost);
echo $out;

Can anyone help out or give directions on how to find solutions

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 horst
      Wire Mail SMTP

      An extension to the new WireMail base class that uses SMTP-transport

      This module integrates EmailMessage, SMTP and SASL php-libraries from Manuel Lemos into ProcessWire. I use this continously evolved libraries for about 10 years now and there was never a reason or occasion not to do so. I use it nearly every day in my office for automated composing and sending personalized messages with attachments, requests for Disposition Notifications, etc. Also I have used it for sending personalized Bulkmails many times.

      The WireMailSmtp module extends the new email-related WireMail base class introduced in ProcessWire 2.4.1 (while this writing, the dev-branch only).
       
      Here are Ryans announcement.



      Current Version 0.3.0
      get it from the Modules Directory Install and Configure

      Download the module into your site/modules/ directory and install it.

      In the config page you fill in settings for the SMTP server and optionaly the (default) sender, like email address, name and signature.
      You can test the smtp settings directly there. If it says "SUCCESS! SMTP settings appear to work correctly." you are ready to start using it in templates, modules or bootstrap scripts.


      Usage Examples
      The simplest way to use it:
      $numSent = wireMail($to, $from, $subject, $textBody); $numSent = wireMail($to, '', $subject, $textBody); // or with a default sender emailaddress on config page This will send a plain text message to each recipient.
       
      You may also use the object oriented style:
      $mail = wireMail(); // calling an empty wireMail() returns a wireMail object $mail->to($toEmail, $toName); $mail->from = $yourEmailaddress; // if you don't have set a default sender in config // or if you want to override that $mail->subject($subject); $mail->body($textBody); $numSent = $mail->send(); Or chained, like everywhere in ProcessWire:
      $mail = wireMail(); $numSent = $mail->to($toEmail)->subject($subject)->body($textBody)->send(); Additionaly to the basics there are more options available with WireMailSmtp. The main difference compared to the WireMail BaseClass is the sendSingle option. With it you can set only one To-Recipient but additional CC-Recipients.
      $mail = wireMail(); $mail->sendSingle(true)->to($toEmail, $toName)->cc(array('person1@example.com', 'person2@example.com', 'person3@example.com')); $numSent = $mail->subject($subject)->body($textBody)->send(); The same as function call with options array:
      $options = array( 'sendSingle' => true, 'cc' => array('person1@example.com', 'person2@example.com', 'person3@example.com') ); $numSent = wireMail($to, '', $subject, $textBody, $options); There are methods to your disposal to check if you have the right WireMail-Class and if the SMTP-settings are working:
      $mail = wireMail(); if($mail->className != 'WireMailSmtp') { // Uups, wrong WireMail-Class: do something to inform the user and quit echo "<p>Couldn't get the right WireMail-Module (WireMailSmtp). found: {$mail->className}</p>"; return; } if(!$mail->testConnection()) { // Connection not working: echo "<p>Couldn't connect to the SMTP server. Please check the {$mail->className} modules config settings!</p>"; return; } Following are a ...


      List of all options and features


      testConnection () - returns true on success, false on failures


      sendSingle ( true | false ) - default is false

      sendBulk ( true | false ) - default is false, Set this to true if you have lots of recipients (50+)


      to ($recipients) - one emailaddress or array with multiple emailaddresses

      cc ($recipients) - only available with mode sendSingle, one emailaddress or array with multiple emailaddresses

      bcc ($recipients) - one emailaddress or array with multiple emailaddresses

       
      from = 'person@example.com' - emailaddress, can be set in module config (called Sender Emailaddress) but it can be overwritten here

      fromName = 'Name Surname' - optional, can be set in module config (called Sender Name) but it can be overwritten here


      priority (3) - 1 = Highest | 2 = High | 3 = Normal | 4 = Low | 5 = Lowest

      dispositionNotification () or notification () - request a Disposition Notification


      subject ($subject) - subject of the message

      body ($textBody) - use this one alone to create and send plainText emailmessages

      bodyHTML ($htmlBody) - use this to create a Multipart Alternative Emailmessage (containing a HTML-Part and a Plaintext-Part as fallback)

      addSignature ( true | false ) - the default-behave is selectable in config screen, this can be overridden here
      (only available if a signature is defined in the config screen)

      attachment ($filename, $alternativeBasename = "") - add attachment file, optionally alternative basename


      send () - send the message(s) and return number of successful sent messages


      getResult () - returns a dump (array) with all recipients (to, cc, bcc) and settings you have selected with the message, the message subject and body, and lists of successfull addresses and failed addresses,


      logActivity ($logmessage) - you may log success if you want

      logError ($logmessage) - you may log warnings, too. - Errors are logged automaticaly
       
       
      useSentLog (true | false) - intended for usage with e.g. third party newsletter modules - tells the send() method to make usage of the sentLog-methods - the following three sentLog methods are hookable, e.g. if you don't want log into files you may provide your own storage, or add additional functionality here

      sentLogReset ()  - starts a new LogSession - Best usage would be interactively once when setting up a new Newsletter

      sentLogGet ()  - is called automaticly within the send() method - returns an array containing all previously used emailaddresses

      sentLogAdd ($emailaddress)  - is called automaticly within the send() method
       
      Changelog: https://github.com/horst-n/WireMailSmtp/blob/master/CHANGELOG.md
       
    • By Robin S
      An experimental module for adding images to a field via pasting one or more URLs.
      Add Image URLs
      Allows images to be added to an images field by pasting URLs.

      Usage
      Install the Add Image URLs module.
      A "Paste URLs" button will be added to all image fields. Use the button to show a textarea where image URLs may be pasted, one per line. Images are added when the page is saved.
       
      https://github.com/Toutouwai/AddImageUrls
    • By netcarver
      This module provides a very simple interface to a set of named counters. You simply call a single function, next('name'), to pull the next value out of a counter - or to set it up if it does not yet exist. Next() takes a few extra parameters to allow you to increment by values other than 1 or to start at a certain number.
      This provides some similar functionality to the built-in page naming feature of PW, and to this module recently posted by Stikki but I think it offers a little more flexibility than either. Having said that, I do like the simplicity of Stikki's new auto-increment module.
      Module Availability
      Here is my module on Github.
      Here it is in the module repository.
      Example Usage
      Here's how this module can be used to title and name a new page by adding a couple of simple hooks to site/ready.php. This example applies to new pages using a template called 'invoice' that can be quick-added to the page tree. In order to get the following to work, you must edit the template that will be the parent of the 'invoice' template and setup the template for children to "invoice" and set the "Name Format for Children" field to something other than the default blank value (I use  title  as my value.)
      <?php /** * Function to recognise our special template. */ function isInvoiceTemplate($template) { return ($template == 'invoice'); } /** * Pre-load the page title for invoice pages with a unique value * which includes a counter component. */ $pages->addHookBefore("Pages::setupNew", function($event) { $page = $event->arguments(0); $is_invoice = isInvoiceTemplate($page->template); $no_inv_num = $page->title == ''; if ($is_invoice && $no_inv_num) { $counter_name = 'WR-' . date('Y'); $number = $this->modules->get('DatabaseCounters')->next($counter_name, 10, 5000); $page->title = $counter_name . '-' . sprintf("%06u", $number); } }); /** * Prevent ProcessPageEdit from forcing an edit of the name if we got here * through a quickAdd from ProcessPageAdd. We can do this because we * preset the title field in the Pages::setupNew hook. */ $pages->addHookAfter("ProcessPageEdit::loadPage", function($event) { $page = $event->return; $is_invoice = isInvoiceTemplate($page->template); $is_temp = $page->hasStatus(Page::statusTemp); if ($is_invoice && $is_temp) { $page->removeStatus(Page::statusTemp); $event->return = $page; } }); Note, the above code + module is one direct solution to the problem posted here by RyanJ.


      Version History
      1.0.0 The initial release.
    • By flydev
      PulsewayPush
      Send "push" from ProcessWire to Pulseway.
       
      Description
      PulsewayPush simply send a push to a Pulseway instance. If you are using this module, you probably installed Pulseway on your mobile device: you will receive notification on your mobile.
      To get more information about Pulseway, please visit their website.
      Note
      They have a free plan which include 10 notifications (push) each day.
       
      Usage
      Install the PulsewayPush module.
      Then call the module where you like in your module/template code :
      <?php $modules->get("PulsewayPush")->push("The title", "The notification message.", "elevated"); ?>  
      Hookable function
      ___push() ___notify() (the two function do the same thing)
       
      Download
      Github:  https://github.com/flydev-fr/PulsewayPush Modules Directory: https://modules.processwire.com/modules/pulseway-push/  
      Examples of use case
      I needed for our work a system which send notification to mobile device in case of a client request immediate support. Pulseway was choosen because it is already used to monitor our infrastructure.
      An idea, you could use the free plan to monitor your blog or website regarding the number of failed logins attempts (hooking Login/Register?), the automated tool then block the attacker's IP with firewall rules and send you a notification.
       

       
      - - -
      2017-11-22: added the module to the modules directory
       
    • By cosmicsafari
      Hi all,
      Just wondering if its possible to just add some basic output to my modules config page.
      I was wanting to output a bulleted list of some information which I will be pulling from a third party.
      Retrieving the data is fine i'm just not sure how to output it to the config page?
      From what I can see in the link below, it only seems like you can append form items to the page.
      https://processwire.com/blog/posts/new-module-configuration-options/