Skip to main content

This site requires you to update your browser. Your browsing experience maybe affected by not having the most up to date version.

Template Questions

Auto paginate long articles


Reply

3 Posts   1384 Views

Avatar
Xochi

13 October 2010 at 1:28pm Community Member, 6 Posts

I am building a site for a journal which has a number of long articles. Is there a way for the view template to create a new page for every x number of words or characters and have auto generated <<prev 1 2 3 . . . next >> navigators at the bottom of each page if more than one page? Thanks.

Avatar
Xochi

13 October 2010 at 1:56pm Community Member, 6 Posts

I found this code from this site [url]http://www.sitepoint.com/forums/showthread.php?t=249193[/url]. It is not specific to Silverstripe but wondering if it will work. I am definitely a php newbie so any help on which scripts different parts of this code would go into would be greatly appreciated.

class Page
{
var $num;
var $text;
var $sentences;

var $i;
var $perpage;

function Page($text, $pagenum=1, $perpage=40)
{
$this->num = $pagenum;
$this->perpage = $perpage;
$this->text = $text;

$this->start = $this->perpage * ($this->num - 1); // 40*(1-1)=0, 40*(2-1)=40. This is the starting point
$this->stop = $this->perpage * $this->num; // 40*1=40, 40*2=80, this is the ending point

$this->sentences();
}

function sentences()
{
$this->sentences = explode('. ', $this->text); // Use ". " instead of just "." to avoid issues with elipses.
$this->sentences = array_filter($this->sentences, array($this, 'filter'));
}

function filter($in)
{
if ($this->i >= $this->start && $this->i < $this->stop)
{
$r = true; // Leave it in the array.
}
else
{
$r = false;
}
$this->i++; // Increment for next time.
return $r;
}

function output()
{
echo implode('. ', $this->sentences).'.';
}
}

$str = 'Hello. World. I. Am. Testing.';

$p = new Page($str, 1, 2);
$p->output();
echo '<br/><br/>';

$p = new Page($str, 2, 2);
$p->output();
echo '<br/><br/>';

$p = new Page($str, 3, 2);
$p->output();
echo '<br/><br/>';

Avatar
Ryan M.

2 November 2010 at 11:22am Community Member, 309 Posts

Here's a tutorial on pagination within the SS system: [url]http://doc.silverstripe.org/private:recipes:pagination[/url]

You'll have to build your own function that combines pagination with PHP's str_word_count ([url]http://php.net/manual/en/function.str-word-count.php[/url]), and use the URL params or $_REQUEST to determine which page to serve up, ie ?page=2 or /article/25/page2