December 13, 2014 —John Koster
So its been quite a while since I've written a blog post. I've been busy. With lots of things. One of those things has been playing around with Semantic UI, a web design framework in the same spirit as Bootstrap and Foundation.
Semantic UI is pretty cool. I'm not going to get into it too much at the moment (I've got plans for more stuff on Semantic UI, however). You can learn more about it at the website http://semantic-ui.com/ (opens in new window/tab). I will say however, that it is pretty cool.
In the past I've written a number of posts about pagination with Laravel. This post is another paginator post! But, we are going to make a paginator for Semantic UI. It will look like this:
Step 0 is a thing right? It is on this website. The first thing we need to do is figure out exactly how you mark up a paginator in Semantic UI. This can be done by referring to the Semantic UI documentation for the menu collection, which can be found here: http://semantic-ui.com/collections/menu.html#pagination (opens in a new window).
1<div class="ui pagination menu"> 2 <a class="icon item"> 3 <i class="left arrow icon"></i> 4 </a> 5 <a class="active item"> 6 1 7 </a> 8 <div class="disabled item"> 9 ...10 </div>11 <a class="item">12 1013 </a>14 <a class="item">15 1116 </a>17 <a class="item">18 1219 </a>20 <a class="icon item">21 <i class="right arrow icon"></i>22 </a>23</div>
From the docs, we can see that to represent a group of paginated links, we wrap the collection in an element with the ui
, pagination
and menu
classes. Each item in the collection is just an anchor with the item
class, so that is pretty easy. To represent a disabled item we add a disabled
class. And similarity, to represent the active item we add an active
class. Pretty simple.
Now that we are armed with some reference markup, we are now able to begin writing our custom paginator class and view. On to step 1!
First, we are going to write a SemanticPresenter
class. This class is what Laravel 4 will use when constructing the links for the pagination elements. So let's start it.
Create a new file named SemanticPresenter.php
somewhere where composer and your project can find it. It should look like this at the start:
1<?php2 3use Illuminate\Pagination\Presenter;4 5class SemanticPresenter extends Presenter {6 7}
Our class needs to extend Laravel's Presenter
class. It will provide us some methods that we can override to tell Laravel how our pagination elements should be rendered. Basically, what the methods are going to do is take some pieces of data, such as the URL, page number, active status, etc, and return a piece of HTML with some CSS classes.
The first methods we are going to write are the getActivePageWrapper
, getDisabledTextWrapper
and getPageLinkWrapper
methods.
getActivePageWrapper
MethodThis method gets called by Laravel when it is rendering a link for whatever page the user is currently on. Our method for Semantic UI will look like this:
1/** 2 * Get HTML wrapper for active text. 3 * 4 * @param string $text 5 * @return string 6 */ 7public function getActivePageWrapper($text) 8{ 9 return '<div class="active item">' . $text . '</div>';10}
It simply wraps the active page's name in a div
with the CSS classes active
and item
.
getDisabledTextWrapper
This method is used by Laravel for a few things. For example, when rendering the ellipsis and, of course, any disabled links, it calls this method to do it. So our code needs to return some HTML and CSS that will indicate to the user that the link is disabled. For Semantic UI, our implementation looks like this:
1/** 2 * Get HTML wrapper for disabled text. 3 * 4 * @param string $text 5 * @return string 6 */ 7public function getDisabledTextWrapper($text) 8{ 9 return '<div class="disabled item">' . $text . '</div>';10}
getPageLinkWrapper
MethodThis method is what Laravel calls when it is generating the links to the different pages a user can go to. It takes the page's URL, name and an option rel
attribute and generates a link to it. Our Semantic UI version will look like this:
1/** 2 * Get HTML wrapper for a page link. 3 * 4 * @param string $url 5 * @param int $page 6 * @param string $rel 7 * @return string 8 */ 9public function getPageLinkWrapper($url, $page, $rel = null)10{11 $rel = is_null($rel) ? '' : ' rel="' . $rel . '"';12 13 return '<a class="item" href="' . $url . '"' . $rel . '>' . $page . '</a>';14}
Now that we have the first three methods implemented, we need to finish a few more: the getDots
and render
method.
The getDots
method is responsible for rendering the ellipsis when there is a lot of links. For the Semantic paginator, we are going to use the ellipsis horizontal icon
the framework provides:
1/**2 * Get a pagination "dot" element.3 *4 * @return string5 */6public function getDots()7{8 return $this->getDisabledTextWrapper('<i class="ellipsis horizontal icon"></i>');9}
Overall, its a pretty simple method. We pass our icon HTML and CSS through the getDisabledTextWrapper
method so the end user sees a disabled ellipsis link. Now we have to implement the render
method.
Typically, most custom presenters don't override the render
method. But we are going to, mainly so that we can use Semantic's arrow icons for the next and previous links:
1/** 2 * Render the Pagination contents. 3 * 4 * @return string 5 */ 6public function render() 7{ 8 if ($this->lastPage < 13) 9 {10 $content = $this->getPageRange(1, $this->lastPage);11 }12 else13 {14 $content = $this->getPageSlider();15 }16 return $this->getPrevious('<i class="left arrow icon"></i>').$content.$this->getNext('<i class="right arrow icon"></i>');17}
Now we need to make a pagination view. This is the easy part. We simply create a new view in the views
folder wherever you want. I named mine paginator.php
in a folder that I named semantic
. The paginator view looks like this:
1<?php2 $presenter = new SemanticPresenter($paginator);3?>4 5<?php if ($paginator->getLastPage() > 1): ?>6 <div class="ui pagination menu">7 <?php echo $presenter->render(); ?>8 </div>9<?php endif; ?>
The paginator view is responsible for taking a $paginator
object from Laravel and rendering the paginator's HTML container. It also makes a call to a render()
method that internally calls all the methods we implemented earlier on the links the paginator has.
Now we need to configure Laravel to use our Semantic UI paginator view. Don't worry - this is really easy. Open up the config/view.php
file and look for the pagination
key within the array and change its value to the location of your Semantic paginator view. My pagination configuration entry looks like this:
1...2'pagination' => 'semantic.paginator',3...
Remember that when resolving the paths of views in Laravel, the 'dot' notation can be used to separate directories. So semantic.paginator
would map to the directory 'semantic' and the file 'paginator.php'.
Now Laravel will use our fancy Semantic UI paginator view and presenter!
There you have it. A custom paginator for Laravel 4 that generates Semantic UI compatible markup. Nifty. I hope you enjoyed this little tutorial about Semantic UI and Laravel.
∎
The following amazing people help support this site and my open source projects ♥️
If you're interesting in supporting my work and want to show up on this list, check out my GitHub Sponsors Profile.