kongondo

Module: Blog

790 posts in this topic

The Module Blog for ProcessWire replicates and extends the popular Blog Profile.

Blog is now in version 2.

Please read the README in the Github link below in its entirety before using this module 

Blog Documentation is here (Work in Progress!)

See this post for new features in version 2 or the readme in GitHub.

To upgrade from version 1, see these instructions.

##################################################

Most of the text below refers to Blog version 1 (left here for posterity)

 

Blog version 1 consists of two modules:

ProcessBlog: Manage Blog in the backend/Admin.

MarkupBlog: Display Blog in the frontend.

Being a module, Blog can be installed in both fresh and existing sites. Note, however, that presently, ProcessBlog is not compatible with existing installs of the Blog Profile. This is because of various structural and naming differences in respect of Fields, Templates, Template Files and Pages. If there is demand for such compatibility, I will code a separate version for managing Blog Profile installs.

In order to use the 'Recent Tweets Widget', you will need to separately install and setup the module 'MarkupTwitterFeed'.

Please read the README in the Github link below in its entirety before using this module (especially the bit about the Pages, etc. created by the module). 

I'll appreciate Beta testers, thanks! Stable release works fine.

Download

Modules Directory: http://modules.processwire.com/modules/process-blog/

Githubhttps://github.com/kongondo/Blog

You can also install from right within your ProcessWire install.

Screenshots (Blog version 1)

ProcessBlog-001.pngProcessBlog-002.pngProcessBlog-003.pngProcessBlog-004.pngProcessBlog-005.pngProcessBlog-007.pngProcessBlog-008.pngProcessBlog-009.pngProcessBlog-010.pngProcessBlog-011.png

Video Demos

ProcessBlog

MarkupBlog

Credits

Ryan Cramer

The Alpha Testers and 'Critics'  :-)

License

GPL2

45 people like this

Share this post


Link to post
Share on other sites

A very wonderful and remarkable piece of work.  Thank you for producing this module.  

I believe and certainly hope that this module will further open the door for acceptance of ProcessWire in a lot of places.

Kongondo, you have talent. 

8 people like this

Share this post


Link to post
Share on other sites

@Charles - you are too kind! Thanks. :)

@all - updated the first post + README...

Share this post


Link to post
Share on other sites

I just installed this module on an existing test site. So far all I can say is "wow!!!"

I did try Ryan's Blog Profile, which is also amazing. The profile seems to have everything. 

This Blog module seems to offer the perfect solution to "I need a blog/news/article system for an existing PW site".

I will need to dig into the folders, especially the CSS, to see how difficult it will be to make the Bog module structure fit in with the navigation and design of the previously existing test site...

Hats off to you Kongondo...

2 people like this

Share this post


Link to post
Share on other sites

Wow looks very good and complete from what i can see in the screenshots. I'm not a blogger myself but i think many other people are, so this module can be very interesting to get some new people atrackted to ProcessWire.

2 people like this

Share this post


Link to post
Share on other sites

Installed, wow! Amazing work.

Already a first beta-testing feedback: I have templates with the word "widget" in template name. They show up in the dashboard > settings tab though they have nothing to do with the blog. And if you publish a post from the dashboard > posts tab, the posts list doesn't update (the post remains as unpublished until you refresh your browser). That could be confusing to the unexperienced.

1 person likes this

Share this post


Link to post
Share on other sites

kongondo - really fantastic - you have put a huge amount of thought and work into this.

I just tested an import from WP using the latest version of Nico's MigratorWordpress. I just edited the config settings in his module to match your template and field names and bingo, a perfect import!

5 people like this

Share this post


Link to post
Share on other sites

Installed, wow! Amazing work.

Already a first beta-testing feedback: I have templates with the word "widget" in template name. They show up in the dashboard > settings tab though they have nothing to do with the blog. And if you publish a post from the dashboard > posts tab, the posts list doesn't update (the post remains as unpublished until you refresh your browser). That could be confusing to the unexperienced.

Thanks for testing totoff.

I believe you are referring to these template files: blog-recent-comments; blog-recent-posts; and blog-recent-tweets. Yes, currently, the template files are not being used. I have been mulling whether to leave them as is for those who wish to directly render the contents of those template files. I'll think a bit more about this but it is likely I will remove the template files. Incidentally, the first 2 templates are quite similar; will probably merge them into one. 

Regarding your second issue, I haven't experienced that (see also video demo). Publishing a post using the 'posts' view, whether as unpublished or published, forces a reload of the page since a button is clicked. The 'posts' table below then shows the newly created post at the very top (selector sorting is by date descending). I think what you probably mean is that when you edit a post, the new post status is not reflected in the posts table. That is correct; this is because the editing happens in a modal (actually an iframe) that is not really aware of the 'page below it'. I will see if I can use jQuery to force a reload of the 'page below' [hope this makes sense! ;-)]

Share this post


Link to post
Share on other sites

Hi all,

Thanks for testing and comments.

Template Files

One thing I should have clarified. The included demo example template files are just that; a demo. They are not part of the 'blog' module. They are not meant to showcase any templating approach. They are intentionally verbose (e.g. similar markup repeated across all of them as opposed to, for example, using head.inc, footer.inc or some other approach e.g., main.php, etc.). The idea is that the user decides how to structure their blog, what CSS framework to use (or not to use), JS, etc. On the contrary, the template files are meant to showcase MarkupBlog. What you can do with its methods/functions. Yes, MarkupBlog generates some markup but these are necessary and minimal. Using wrapper DIVs etc, as shown in the example template files, you can structure your blog however you want to fit in your new/existing site. Even the CSS and JS are demos! :-). In a nutshell, MarkupBlog does not come with its own CSS and JS. What is included is just meant to give you an idea of how to use it :-). In due course,  I will do a write-up of all the methods available in MarkupBlog and what they do.

@Max..

As per above, it is not difficult to fit MarkupBlog into your existing site's structure. In fact, since it is a module, you can even call it wherever you wish, in whatever template files, even your existing ones. What I am saying is that you don't even have to use the example template files! You just need to know the parameters MarkupBlog methods expect and you are on your way. This may be a bit advanced for you at the moment, so you might want to instead edit the example files as much as you wish :D

Role and Permission

Note that Blog installs the role 'blog-author' and permission 'blog'. These are available to you to control access as you wish. They are not automatically applied to any user. With these, you can can control the finer details of your blog. 

Authors

Currently, the 'authors' tab/view only shows the count of 'published' posts per author. I'll soon update this, probably with a two different columns; one showing count of 'published' and the other showing count of 'pending [unpublished]' posts for each author. 

3 people like this

Share this post


Link to post
Share on other sites

I have updated the author's posts' table to show both 'published' and 'pending' posts.

post-894-0-25094000-1400971493_thumb.png

2 people like this

Share this post


Link to post
Share on other sites

Update:

After closing an edit modal (widgets, posts, tags, categories), the parent page now refreshes to reflect relevant changes (e.g. date, author, published status, etc)...

1 person likes this

Share this post


Link to post
Share on other sites

Hi kongondo,

I believe you are referring to these template files: blog-recent-comments; blog-recent-posts; and blog-recent-tweets.

No, I refered to my template files I set up for other purposes than the blog.

I think what you probably mean is that when you edit a post, the new post status is not reflected in the posts table.

Exactly, thanks for making this more clear.

After closing an edit modal (widgets, posts, tags, categories), the parent page now refreshes to reflect relevant changes

Super fast service!  ^-^

1 person likes this

Share this post


Link to post
Share on other sites

Wow, this looks sharp! I'll definitely need to check this out this week, I'm not a blogger but this makes me want to be one :-)

Well done, superb work kongondo.

1 person likes this

Share this post


Link to post
Share on other sites

Fantastic work Kongondo!! Can't wait to try this, been wanting to add a blog to one of my existing PW sites so this is perfect timing :)  Wicked awesome man! Thanks for sharing :)

1 person likes this

Share this post


Link to post
Share on other sites

Hi kongondo,

No, I refered to my template files I set up for other purposes than the blog......

Thanks for clarifying. Fixed in the latest commit. I think the problem was that you have a page called widgets. The previous selector was looking for pages with a parent 'widgets'. Good catch! I have changed the selector to be more specific.

1 person likes this

Share this post


Link to post
Share on other sites

Follow-up to my post above about the 'example template files':

1. If you decide to hide some widgets (say recent posts), the HTML is still showing up and reporting 'no posts found'. That's just an oversight on my part. 'Unavailable' widgets should not even output their HTML; 'no posts found' should mean exactly that. I'll try to fix this later, but it is not a high priority :-)

2. On a related issue, you will need to install and configure MarkupTwitterFeed in order to use the example 'Twitter Widget'.

Update:

I have updated the example Template File 'blog-recent-tweets.php'. The references to some fields were wrong :-). Also updated the README + First Post.

Share this post


Link to post
Share on other sites

I love it when someone posts something as amazing as this! Another one where simply clicking 'Like' is nowhere near enough.

Thank you Kongondo, this is an exceptional contribution.

2 people like this

Share this post


Link to post
Share on other sites

That's amazing - the very day I decided to put a blog on my site, this gets uploaded! Thank you so much! 

I've installed it and incorporated it into my site with surprising ease. 

The only issue I've had is with comment moderation - how do I do it? There's no option in the blog admin. 


EDIT: I found it - edit the post that the comment is on and the section for approving comments is at the bottom. Guess I should have watched the video tutorials! :)

1 person likes this

Share this post


Link to post
Share on other sites

@looeee,

Welcome to the forums! I'm glad the module is of benefit...

Currently, there is no comment moderation within Blog itself. This is deliberate. You have two choices:

1. You can install the module 'Comments Manager' to manage all your comments in one place. It would have been nice to integrate Blog and CM better but currently there are no plans to do so.

2. You can moderate comments on a per post basis. Just edit a post and you will find all comments awaiting your approval :-)

2 people like this

Share this post


Link to post
Share on other sites

Great thanks! The comments manager is just what I was looking for. To make it it a bit more integrated I just moved the "Comments Manager" page from /admin/setup to /admin/blog, which doesn't seem to have caused any problems. 
 

A couple of things: to get widgets from the sidebar to display on non-blog pages, the module has to be called on every page:

//CALL THE MODULE - MarkupBlog
$blogOut = $modules->get("MarkupBlog");

I've just added it to the top of my sidebar.inc for the time being, I'll have to refactor my code a bit in the future to stop it being called twice on blog pages.

Second, to get posts to show only an excerpt, in the template files change the line:

$content .= $blogOut->renderPosts("limit={$limit}");

to 

$content .= $blogOut->renderPosts("limit={$limit}", $small=true);

Currently it looks like the excerpt length is hardcoded to 450 characters - perhaps adding an option for people to set this themselves would be a good idea? In the meantime, for anyone that wants to change this, find the line 

$summary = strip_tags(substr($page->blog_body, 0, 450));

in MarkupBlog.module and set it to whatever you want. 

Great work, I'm getting more impressed the more time I spend with it! 

2 people like this

Share this post


Link to post
Share on other sites

@looeee,

Thanks for further testing this.

One thing I have tried to clarify in my posts further up is that the included Template Files are just demos. Some of the code in there is not even related to MarkupBlog. The code in the Template Files is also deliberately verbose. For instance, there is a lot of repetitive code that could be best split up into includes. I decided to leave it like that so that users could select whatever templating approach they wanted (yes, refactoring needed; I might revisit this decision in future). In order to do this effectively, they need to be familiar with the methods/functions available in MarkupBlog :-). So, I will be writing up a guide covering those methods (e.g. your examples above). :D

Configurable Excerpt Length:

Good suggestion. Please file an issue on GitHub if you can so that I don't forget this.

Cheers.

1 person likes this

Share this post


Link to post
Share on other sites

Kongondo,

Regarding blog_date field. I get the feeling it is designed to be the date/time that the blog post is published, but from what I can see it gets set when the post is first created and doesn't automatically change after that. I might be misunderstanding your use of the field, but I would like to see it change automatically when the post is published and not change after that - maybe even disable user editing of it?

I know we often draft up several posts at a time and publish them later. I don't think we should have to manually adjust this field when publishing the post.

Another thought for you - have you considered integrating this module:

http://modules.processwire.com/modules/schedule-pages/

or the functionality from it into the blog posts tab? This would make WP users feel at home. Thanks for considering.

3 people like this

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 blynx
      Hej,
      just finished the first working version of my photoswipe bundle. https://github.com/blynx/MarkupProcesswirePhotoswipe
      As always any feedback is highly appreciated
      Modules directory: http://modules.processwire.com/modules/markup-processwire-photoswipe
      .zip download: https://github.com/blynx/MarkupProcesswirePhotoswipe/archive/master.zip
      You can add a photoswipe enabled thumbnail gallery / lightbox to your site like this. Just pass an image field to the renderGallery method:
      <?php $pwpswp = $modules->get('Pwpswp'); echo $pwpswp->renderGallery($page->nicePictures); Options are provided like so:
      <?php $galleryOptions = [ 'imageResizerOptions' => [ 'size' => '500x500' 'quality' => 70, 'upscaling' => false, 'cropping' => false ], 'loresResizerOptions' => [ 'size' => '500x500' 'quality' => 20, 'upscaling' => false, 'cropping' => false ], 'pswpOptions' => (object) [ 'shareEl' => false, 'indexIndicatorSep' => ' von ', 'closeOnScroll' => false ] ]; echo $pswp->renderGallery($page->images, $galleryOptions); More info about all that is in the readme: https://github.com/blynx/MarkupProcesswirePhotoswipe
      It is possible to customize pretty much anything by providing your own templates and scripts.
      What do you think? Any ideas, bugs, critique, requests?
      cheers
      Steffen
    • By alexcapes
      Hi,
      I've been invited by Apple to use their 'News' service for a publication in the UK. https://www.apple.com/uk/news/
      A number of CMSs already have plugins to publish content via the API, however Processwire is not one (yet!)
      https://newsresources.apple.com/en/faq/66346243
      It's slightly beyond my technical abilities but would be very interested in anyone that is willing to look at developing a Processwire Module.
      (for reference here is the Apple News API documentation)
      Update: Chapter Three have created a PHP Apple News library here https://github.com/chapter-three/AppleNewsAPI
    • By flydev
      OAuth2Login for ProcessWire
      A Module which give you ability to login an existing user using your favorite thrid-party OAuth2 provider (i.e. Facebook, GitHub, Google, LinkedIn, etc.)..
      You can login from the backend to the backend directly or render a form on the frontend and redirect the user to a choosen page.
      Built on top of ThePhpLeague OAuth2-Client lib.
      Registration is not handled by this module but planned.
       
      Howto Install
      Install the module following this procedure:
       - http://modules.processwire.com/modules/oauth2-login/
       - https://github.com/flydev-fr/OAuth2Login
      Next step, in order to use a provider, you need to use Composer to install each provider
      ie: to install Google, open a terminal, go to your root directory of pw and type the following command-line: composer require league/oauth2-google
      Tested providers/packages :
          Google :  league/oauth2-google     Facebook: league/oauth2-facebook     Github: league/oauth2-github     LinkedIn: league/oauth2-linkedin
      More third-party providers are available there. You should be able to add a provider by simply adding it to the JSON config file.

      Howto Use It
      First (and for testing purpose), you should create a new user in ProcessWire that reflect your real OAuth2 account information. The important informations are, Last Name, First Name and Email. The module will compare existing users by firstname, lastname and email; If the user match the informations, then he is logged in.
      ie, if my Google fullname is John Wick, then in ProcessWire, I create a new user  Wick-John  with email  johnwick@mydomain.com
      Next step, go to your favorite provider and create an app in order to get the ClientId and ClientSecret keys. Ask on the forum if you have difficulties getting there.
      Once you got the keys for a provider, just paste it into the module settings and save it. One or more button should appear bellow the standard login form.
      The final step is to make your JSON configuration file.
      In this sample, the JSON config include all tested providers, you can of course edit it to suit your needs :
      { "providers": { "google": { "className": "Google", "packageName": "league/oauth2-google", "helpUrl": "https://console.developers.google.com/apis/credentials" }, "facebook": { "className": "Facebook", "packageName": "league/oauth2-facebook", "helpUrl": "https://developers.facebook.com/apps/", "options": { "graphApiVersion": "v2.10", "scope": "email" } }, "github": { "className": "Github", "packageName": "league/oauth2-github", "helpUrl": "https://github.com/settings/developers", "options": { "scope": "user:email" } }, "linkedin": { "className": "LinkedIn", "packageName": "league/oauth2-linkedin", "helpUrl": "https://www.linkedin.com/secure/developer" } } }  
      Backend Usage
      In ready.php, call the module :
      if($page->template == 'admin') { $oauth2mod = $modules->get('Oauth2Login'); if($oauth2mod) $oauth2mod->hookBackend(); }  
      Frontend Usage
      Small note: At this moment the render method is pretty simple. It output a InputfieldForm with InputfieldSubmit(s) into wrapped in a ul:li tag. Feedbacks and ideas welcome!
      For the following example, I created a page login and a template login which contain the following code :
      <?php namespace ProcessWire; if(!$user->isLoggedin()) { $options = array( 'buttonClass' => 'my_button_class', 'buttonValue' => 'Login with {provider}', // {{provider}} keyword 'prependMarkup' => '<div class="wrapper">', 'appendMarkup' => '</div>' ); $redirectUri = str_lreplace('//', '/', $config->urls->httpRoot . $page->url); $content = $modules->get('Oauth2Login')->config( array( 'redirect_uri' => $redirectUri, 'success_uri' => $page->url ) )->render($options); }

       
      Screenshot
       



    • By psy
      ProcessWire DropboxAPI on GitHub: https://github.com/clipmagic/DropboxAPI
       
      This module is a wrapper for Kunal Varma's Dropbox PHP SDK https://github.com/kunalvarma05/dropbox-php-sdk
      It was created to perform a specific function for a client, ie upload PDF files on a PW website to a specific Dropbox account folder.
      The PDF files, created using @Wanze's excellent PagesToPdf module using the WirePDF functions, are generated from Formbuilder forms completed by front-end site visitors.  Works a treat!
      There's more that could be done to allow ProcessWire to take advantage of all the features of the SDK, eg downloads, multiple Dropbox accounts, etc. You are welcome to request changes and/or fork the GitHub project to extend the feature set.
      Enjoy!
      System requirements
      PHP 5.6.4 or greater Composer The PHP mbstring extension General information
      This module enables you to access a single Dropbox (www.dropbox.com) account to upload files from a ProcessWire website.
      All kudos to (https://github.com/kunalvarma05/dropbox-php-sdk) for the PHP API.
      First steps
      Visit (https://www.dropbox.com/developers) and read the documentation. Log into Dropbox and create a new application. It's recommended to limit ProcessWire App access to a specified folder Make a note of the App key, the App secret and the name of the Dropbox folder Installation
      Download the zip file into your site/modules folder then expand the zip file. Next, login to ProcessWire > go to Modules > click "Refresh". You should see a note that a new module was found. Install the DropboxAPI module. Configure the module with your App key, App secret and your Call Back URL You need to generate a Dropbox access token to enable your site to communicate with the nominated Dropbox account. Dropbox will generate a token for you or you can create a page for the front end of your ProcessWire site with a template to submit the token request to Dropbox, eg:
      <?php namespace ProcessWire; $drop = $modules->get('DropboxAPI'); if ($input->get->code && $input->get->state) { $code = $sanitizer->text($input->get->code); $state = $sanitizer->text($input->get->state); //Fetch the AccessToken $accessToken = $drop->getAccessToken($code, $state); echo "Copy/paste this code into the module configuration: " . $accessToken; } else { echo "<p><a href='" . $drop->getAuthURL() . "'>Log in with Dropbox</a></p>"; } ?> Once you have entered the token in the module configuration, you can unpublish this page.
      Usage
      Read the dropbox-php-sdk documentation!
      An example template for sending a file to a Dropbox App folder from ProcessWire:
      <?php namespace ProcessWire; use Kunnu\Dropbox\Dropbox; use Kunnu\Dropbox\DropboxApp; use Kunnu\Dropbox\DropboxFile; // send pdf to Dropbox $drop = $modules->get('DropboxAPI'); $app = new DropboxApp($drop->app_key, $drop->app_secret, $drop->authorization_code); if ($app) { //Configure Dropbox service $dropbox = new Dropbox($app); $dropboxFile = new DropboxFile('/path/to/myfilename.pdf'); $file = $dropbox->upload($dropboxFile, "/myfilename.pdf", ['autorename' => true]); //Uploaded File meta data if ($file) { $success = $file->getName() . " uploaded to Dropbox"; $drop->log($success); } }  
       
    • By sirhc
      Hi all,
      Im trying to install this core module and got the error of not having the ImageMagick library installed.
      But if im checking for the version of my ImageMagick installed on my server via SSH im getting this response;
      identify -version
      Version: ImageMagick 6.9.4-9 Q16 i386 2016-06-21 http://www.imagemagick.org
      Copyright: Copyright (C) 1999-2016 ImageMagick Studio LLC
      License: http://www.imagemagick.org/script/license.php
      Features: Cipher DPC 
      Delegates (built-in): bzlib freetype gslib jng jpeg png ps tiff xml zlib
      Does this even mean the library is installed? And if yes, why cant i install my module?
      Pleaassee help me
      Greetz.