Limiting Smarty {foreach}

A user on the Blogsome forums wanted to be able to reduce the number of items that appeared in a Smarty generated list. Since the original code was using {foreach}, and I know {section} has a max=n attribute, I thought I’d try that. The problem was that the Array in question: {popularposts} generates $pposts; is not an array that can be accessed by indices. It’s key instead is the number of hits on the pages, so that’s not much good to us. However, it’s possible to use a simple {if} clause, and the {counter} function, to _effectively _limit the number of iterations.

    {counter assign=idx print=0}
    {foreach from=$array key=key item=item}
        {counter}
        {if $idx < = n}
            Data to be repeated goes in here.
        {/if}
    {/foreach}

Replacing n with a number will cause n-1 iterations to be displayed. I said effectively above, as the other iterations will actually occur, but no data will actually be printed on the screen, as there is no {else} clause.

Related Stories.

After hacking through the source, I finally figured out how to make {relatedstories} work. The trick is that it stores the date in a variable called $relatedstories.

    {relatedstories}
    {if $relatedstories}
      <h2>Related Stories</h2>
      <ul>
      {foreach from=$relatedstories key=key item=story}
        <li> <a href="{get_permalink id=$story->ID}" >
            {$story->post_title}</a>
        </li>
      {/foreach}
      </ul>
    {/if}

I’ve got it set up in my sidebar at the moment. It’s smart enough to figure out when it’s not a single post page, and won’t show then, so you don’t need any fancy extra Smarty Tags to only show in single post view. Oh, and it also sets the variable $relatedstoriesWords, so it’s possible to do something like: <h2 title="{$relatedstoriesWords}">Related Stories</h2> and when you hover over the title, it tells you the words it’s looking for. I’m still working on how to truncate the title. {$story->post_title|truncate} fails dismally. Quite annoying.

Blogsome Forum RSS feed.

Blogsome has implemented RSS feeds in the forums: RSS: click if your RSS syndicator can handle feed: URIs. RSS: an http: link to the feed.

Tiger kills Acrobat Distiller 5 (Classic)

Since upgrading to Tiger, Jaq obviously hadn’t done any creating PDFs in Distiller. It still uses Classic, and Tiger upgrades stop it from actually producing the PDF files. However, there is a solution: open up Distiller, and change the Job Options... settings for all of the profiles, so that Fast Web Vie_w, and _Embed Thumbnails are both unchecked. Bingo, works again.

Pigsy says:

Better bury a priest alive than stop him getting his fill.

Strangest Spam

I received the strangest Spam today. Gmail didn’t flag it as Spam, but that’s because there isn’t much to it:

X-Gmail-Received: 207621b91521d8580702cc6b8f5dc303db882c71
Delivered-To: xxx@gmail.com
Received: by 10.70.73.14 with SMTP id v14cs27376wxa;
        Sun, 16 Oct 2005 21:21:02 -0700 (PDT)
Received: by 10.36.105.16 with SMTP id d16mr2452237nzc;
        Sun, 16 Oct 2005 21:21:02 -0700 (PDT)
Return-Path: <onisimvfdi@aucklandnz.com>
Received: from m1.dnsix.com (m1.dnsix.com [63.251.171.164])
        by mx.gmail.com with ESMTP id e1si1376069nzd.2005.10.16.21.21.02;
        Sun, 16 Oct 2005 21:21:02 -0700 (PDT)
Received-SPF: neutral (gmail.com: 63.251.171.164 is neither permitted nor denied by best guess record for domain of onisimvfdi@aucklandnz.com)
Date: Sun, 16 Oct 2005 21:21:02 -0700 (PDT)
Message-Id: <435326ae.1e47a7b1.2e3f.ffffea7aSMTPIN_ADDED@mx.gmail.com>
Received: from [221.169.78.40] (helo=aucklandnz.com)
	by m1.dnsix.com with smtp (Exim 4.44)
	id 1ERF09-0008R3-2k
	for xxx@xxx.com; Sun, 16 Oct 2005 13:21:01 -0700

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
<TITLE>404 Not Found</TITLE>
</HEAD><BODY>
<H1>Not Found</H1>
The requested URL was not found on this server.<P>
<HR>
<ADDRESS>Apache/1.3.31</ADDRESS>
</BODY></HTML>

No web addresses, one email. I think maybe this Spammer had a problem… The two IP addresses listed as the first sources, those Received: headers that appear first, are both Private Range IP addresses, but the m1.dnsix.com one seems like the service provider. Oh well, no biggie.

(kind of) Fix for XMLRPC bug.

I’ve been playing around with the version of the WP-mu source that’s used on Blogsome’s servers, trying to find the exact point where the bug is that escapes apostrophes and quotes.

Basically, the XMLRPC client contacts the server, and sends the data in. According to the console, the content of the post is actually in a field called description.

Searching through the XMLRPC file I find only five references to the word description. Two of these are in functions to do with posting. Both are basically the same, one is for blogger, the other metaweblog type connections:

    $post_content = apply_filters('content_save_pre', $content_struct['description']);

Now, a bit of research showed up that apply_filters is a function that allows plugins and their ilk to access the data before it gets saved to the database. Now, I’m fairly sure it is not a plugin doing this.

I also discovered that it is likely that the update to XMLRPC.php that happened was accompanied by a change to another file, that calls stripslashes(), another WP function. The XMLRPC update was, after all, a fix that removed the ability for XMLRPC calls to run unescaped code. So it makes sense that it escapes stuff.

In the short term, I discovered ecto has the ability to automatically run a script as you post: in the New Post window, make sure Options are showing, and choose the Formatting tab. (Incidentally, if you are only using double-quotes, it seems the Smarten Quotes will help, but it may mess with code).

I use a script that is like this to fix everything up:

import sys
data = open(sys.argv[1]).read()

data = data.replace('”,“')
data = data.replace('“',”“”)

open(sys.argv[1],'w').write(data)

This on its own is not enough - I seemed to have to go into the HTML editing mode before it would work. I think ecto does its own conversion of certain HTML entities to real characters.

This post is a test post to see how it all goes with <pre> tags and the like.

Interactionless Catchpa

Over on this site, I read about a system that seems to be a bit like mine (only perhaps more complicated). It did give me one idea though: I could automatically populate the value into the box. Or even more simply, have the JavaScript simply fix up the action="" attribute. Then the user just needs to set the action attribute to a whitespace string, and then the JavaScript will make it possible for the reader to submit comments. I’m not sure if this would really be all is needed to prevent Spam comments. Requiring JavaScript to be on… • And trackbacking it gave me another idea: setting the action on a trackback URI to copy the URI to the clipboard. That would be cool. Or making the ‘LinkThis’ bookmarklet get the trackback URI from the page. Should be able to look for a link with rel="trackback", and use the href from this. Okay, this bit works, but again I’ve run into the problem that I’m trying access an ‘off-site’ document. And I cannot do that with JavaScript.

    var a = document.getElementsByTagName('a');
    var tb = '';
    for (var i=0;i<a.length;i++){
        if (a[i].rel=="trackback") 
            tb=a[i].href;};

That code fragment will get the trackback URI. But there’s no argument I can pass to the bookmarklet.php file that will insert this automatically. Something to add to the Blogsome wishlist, I guess.

Additions to Blogsome

Things I’d like to see in Blogsome:

  • The XMLRPC bug fixed. I want to be able to post from ecto again.
  • More quicktags. I’ve written some code to enable <abbr> and <acronym> tags, as well as < and > signs.
  • The ability to have md5() as a Smarty filter.
  • An _RSS _feed from the forums. Not strictly Blogsome, but would be cool. Done!
  • Preview in Editing window uses template (or part of template?)
  • The GMT Offset bug fixed.

A lot of this stuff should be able to be merged back into the WP/WPµ tree - the XMLRPC bug has been already, for instance. But I understand that the Blogsome team aren’t keen on upgrading the software if it is going to break something.

Cross Browser Script Up

My script is now up and running, and cross-browser. I’ll leave the Catchpa slightly disabled for the time being so I can test it a bit more on different machines. You’ll also notice a nice little floating toolbar - this is only supposed to appear on the site when a user is logged in, but it seems to be there all of the time at the moment. The script is about 56k, which I think is too big, however I’ve had some issues with the compression utility I was using, so I’ll roll my own solution. It is all in one file again, (easier to manage updating it), and I think the browser caches it, so it should only be slow on the first load. Things I need to do:

  • Set it up so the true.gif and false.gif images are preloaded, so there is no delay on the first time a user clicks on a checkbox.
  • Have a tag in the template for enabling/disabling checkbox replacement.
  • Fix up admin toolbar.

I’m sure there’s probably other stuff I need to do…