LnBlog 0.7.0 beta 1

Well, it's finally here: the first beta release of LnBlog 0.7.0. You can download it here if you're feeling adventurous. Note that this version requires that you run an upgrade on each of your blogs in order for it to work correctly, so I strongly recommend that you make backup copies of all your blog directories as well as you LnBlog directory.  Also note that you'll need to register your blogs before you can do this.  It's not hard - just type the path in the box and hit the button, just like running an upgrade.  This is just so that the system knows about them. New blogs are registered when they are created.

This release includes massive code cleanup and a number of new features. On the cleanup side, if you look in the LnBlog/pages directory, you'll notice that the article handling pages are gone. That's because they've been folded into the blog entry pages. This is also the reason that you need to upgrade your blog wrappers: if you don't, articles simply won't work. I've also moved a lot of the logic out of the back-end classes and into the page files, where it belongs. The classes were simply getting too smart. While this was fine for normal operation, and made for really small pages, it got me into serious trouble when I started adding support for the Blogger API, because the classes all assumed they were interacting with a client browser.

But enough of that. You probably want to know about the new features. Well, here's an incomplete list for you, in no particular order:

  • Blog tracking. The system now tracks what blogs you create and keeps a list of them. So now, instead of typing in the blog path on the administration page, you can just select it from a drop-down list. Note that if you are upgrading from an old installation, you will have to type the same old path in the "register blog" box on the admin page to get it in the list. Or you can just add the blogs to the BlogList line (comma-separated, no spaces) in your LnBlog/userdata/system.ini file.
  • Partial support for group-based security. Basically, it is now possible to have more than one administrator. More meaningful group security will come later. There is no graphical interface for this yet, but you can set users in groups by adding their name to the appropriate comma-delimited list in your LnBlog/userdata/group.ini file.
  • Another path for plugins and themes. You can now create LnBlog/userdata/themes and LnBlog/userdata/plugins directories for your non-standard themes and plugins. This just makes it a little easier to upgrade, as you don't have to individually sort out and copy any extra stuff you've installed.
  • Support for the Blogger 1.0 API. Use your LnBlog/blogger.php file as the URL for the requests. One thing to note abou the API is that the blogger.getTemplate and blogger.setTemplate methods are not implemented. This is because they don't really apply to the way LnBlog works.
  • Support for post editor plugins. That's right, now that the pre-releases of Opera 9 have support for edit mode, I've finally added the ability to use a JavaScript rich text editor. There is no such editor included in the standard release (as the editor would take up more space than the rest of LnBlog), but you can download plugins for TinyMCE and FCKEditor from the new plugins page. Of course, you can only enable one such plugin at a time, but that shouldn't be surprising.

That's about it for now. If you have any problems or find any bugs, please report them to me by e-mail or by leaving a comment. I'm thinking that I'll finish off the Blogger API support, fix any more bugs I find, and call that the final release. There are a number of other things to add, but I'd like to stick a little more to the "release early and often" philosophy.

Theming, Part 2: Sidebar Templates and Plugins

It's time for part 2 of the LnBlog themes tutorial series. In this episode, we'll cover modifying your sidebar. This will include a brief discussion of how theme templates work as well as an introduction to the plugin system. In the process, we will also create a very simple and extremely unimpressive plugin. Note that in this tutorial, unlike the last one, I will assume that you have a basic knowledge of HTML and CSS. This tutorial will also include some PHP code, although I will nto assume a working knowledge of PHP (although if you have one, it will help).

As you may recall from last time, LnBlog's theme system has a concept of paths. This applies not only to images and style sheets, as we saw before, but also to template. In other words, LnBlog will look for a given template first in your blog's templates directory, second in the templates directory of your current theme, and lastly in the templates for the default theme. This means that you can easily modify the templates for each of your blogs individually or for all of them at a time.

Modifying the template

Let's start by making a copy of your LnBlog/themes/default/templates/include_sidebar.php file and saving it on your local hard drive so we can play with it. If you open up the file in a text editor, you'll notice that there's almost nothing in it. It should just look like this: activateEventFull($tmp=false, "sidebar", "OnOutput"); $EVENT_REGISTER->activateEventFull($tmp=false, "sidebar", "OutputComplete"); ?> Of course, if you don't know PHP, that's probably doesn't mean anything to you. In fact, it probably doesn't mean much even if you do know PHP. That's because this code is part of LnBlog's event system

As you may already know, the default page banner, menubar, and sidebar in LnBlog are all implemented as plugins. If you open up your include_banner.php or include_menubar.php, they'll contain similar code. Basically, this code raises an event, i.e. it tells LnBlog's event manager that something interesting is happening and any plugin that's interested in this event better get it's act together. The event manager them checks a list of plugins that signed up to be notified when this event happens and tells them to do their thing.

Now, since this is a template, we can actually ad HTML code right into it. For illustrative purposes, I'll add some of my favorite links to the sidebar. Here's what the resulting code looks like: <?php global $EVENT_REGISTER; $EVENT_REGISTER->activateEventFull($tmp=false, "sidebar", "OnOutput"); ?> <h3>Recommended Links</h3> <ul> <li><a href="http://blogs.msdn.com/oldnewthing/">The Old New Thing</a></li> <li><a href="http://www.securityfocus.com/">Security Focus</a></li> <li><a href="http://www.larkware.com/">The Daily Grind</a></li> </ul> <?php $EVENT_REGISTER->activateEventFull($tmp=false, "sidebar", "OutputComplete"); ?> Notice that I broke the PHP code into two blocks and put the HTML in between them. Since tempaltes are actually PHP files, anything inside the <?php ?> tags is treated as PHP code, and anything outside them is treated as HTML. If you're sharp, you probably noticed that I did this because of the event code: I put my markup between the OnOutput and OutputComplete events.

If you save this file and upload it to your blog's templates directory, you'll see your list of links in the sidebar. However, you'll notice that the links are at the bottom of the sidebar. That's because all the plugins are loaded by the OnOutput event. If you move the HTML code above that event, then all your links will end up at the top of the sidebar. But what if you want your links in the middle somewhere? Maybe you want your links between your articles and your RSS feeds. Well, that's why this isn't the recommended way to add to the sidebar.

A simple sidebar plugin

However, there is good news. Writing a simple plugin to display some links in the sidebar is easy. Really easy. In fact, it's about a dozen lines of boiler-plate PHP code with your HTML inserted in the middle. And once you have the plugin written, it will be detected by the plugin manager and you will be able to change where it appears in the sidebar by changing its load order in the plugin loading configuration page.

Here's a plugin version of the links in the example above: <?php class MyLinks extends Plugin { function MyLinks() { $this->plugin_desc = "Shows my favorite links in the sidebar"; $this->plugin_version = "0.1.0"; } function show_links() { ?> <h3>Recommended Links</h3> <ul> <li><a href="http://blogs.msdn.com/oldnewthing/">The Old New Thing</a></li> <li><a href="http://www.securityfocus.com/">Security Focus</a></li> <li><a href="http://www.larkware.com/">The Daily Grind</a></li> </ul> <?php } } $plug = new MyLinks(); $plug->registerEventHandler("sidebar", "OnOutput", "show_links"); ?> This is about the simplest plugin you can have. It is a simple PHP class with a constructor that defines the version number and a short description, and a single method that dumps some HTML output to the screen. Note at the bottom that you have to create an instance of the class and register the method with the event manager.

Now is probably a good time to mention that plugins use a path mechanism too. In other words, you can have plugins that apply only to a single blog, just like you can with theme template and style sheet. Just make a "plugins" directory in the blog's directory and put the plugins there. They will be treated just like a regular plugin, but no other blog will be able to see them.

So, now let's install your new plugin. Copy the above code and paste it into a new file named sidebar_mylinks.php. Note that it is very important that you not have any blank lines or spaces outside the PHP <?php >> tags, as this will cause error messages due to the way PHP handles output. Now, create that plugins directory in you blog's directory on the server and upload the sidebar_mylinks.php file into it. If you open up your blog in a web browser, you should see the new links. If you change the load order of your sidebar_mylinks plugin from the plugin loading page, then the link section will move in the sidebar.

If you want to have several independant sidebar sections, you can make copies of this plugin to achieve that. Just change the HTML code, the plugin_desc on the fourth line, and change all three instances of the name MyLinks to MyOtherLinks, or something like that (the exact name doesn't matter, so long as no two plugins have the same name). If you're feeling adventurous, you can also adapt this to add markup to the banner or menubar by changing the "sidebar" parameter in the registerEventHandler line to "banner" or "menubar".

You can download files for this tutorial here. In the next installment, we'll go into theming the content areas of a page, including templates for blog entries. We'll also cover modifying the associated style sheets and possibly adding some images.