Understanding Single Pages (A primer)
Permalink
Most of us know that blocks provide an extensible interface to C5 by allowing us to reuse certain types of content across multiple pages with ease. What is less known is that there is another way to extend C5 sitting right under our noses called "Single Pages".
Single Pages fulfill a need for functional content that will not be used in other areas of the site. A good example of a single page that ships with C5 is the login page. Single pages exist in the single_pages folder and are backed by a controller of the same name in the controllers folder. So a single page called widgets would be setup as so:
The template "view.php" from your theme will be applied to your single page. In order to print the content of the single page, the content area of view.php should look like:
The controller of a single page is much simpler than a block in that it doesn't have to define all of the options for the single page since it won't be reused. A basic controller for our widgets single page would look like:
Addressing controller methods from within your single page "view" is slightly different than a block. It would appear that single pages run within an instance of an object, and there is an instance variable that contains a controller object. So if you have a hello_world() function in your controller, you'd access it from your single page view as such:
You can also automatically submit to single pages like this, from within your view.
Putting the pieces together, let's make our widget single page fly! To install the single page enter the C5 admin and visit the page types interface. At the bottom of the page, there's an option to install a new single page. Type widgets in the field and click the button. Widgets will be added to the sitemap. While single pages can have children, they cannot be children. They will always exist on the 2nd level of the site map (one level below home).
Now visit your page:http://YOUR_DOMAIN_HERE/widgets...
There's much more you can do with Single Pages, this is just a primer to get you up and running! Jereme
Single Pages fulfill a need for functional content that will not be used in other areas of the site. A good example of a single page that ships with C5 is the login page. Single pages exist in the single_pages folder and are backed by a controller of the same name in the controllers folder. So a single page called widgets would be setup as so:
$C5_ROOT/single_pages/widgets.php $C5_ROOT/controllers/widgets.php
The template "view.php" from your theme will be applied to your single page. In order to print the content of the single page, the content area of view.php should look like:
<?php print $innerContent; ?>
The controller of a single page is much simpler than a block in that it doesn't have to define all of the options for the single page since it won't be reused. A basic controller for our widgets single page would look like:
<?php class WidgetsController extends Controller { // any number of public methods can go in the controller. public function hello_world() { } }
Addressing controller methods from within your single page "view" is slightly different than a block. It would appear that single pages run within an instance of an object, and there is an instance variable that contains a controller object. So if you have a hello_world() function in your controller, you'd access it from your single page view as such:
<?php $this->controller->hello_world(); ?>
You can also automatically submit to single pages like this, from within your view.
<form method="post" action="<?=$this->action('hello_world')?>"> </form>
Putting the pieces together, let's make our widget single page fly! To install the single page enter the C5 admin and visit the page types interface. At the bottom of the page, there's an option to install a new single page. Type widgets in the field and click the button. Widgets will be added to the sitemap. While single pages can have children, they cannot be children. They will always exist on the 2nd level of the site map (one level below home).
Now visit your page:http://YOUR_DOMAIN_HERE/widgets...
There's much more you can do with Single Pages, this is just a primer to get you up and running! Jereme
It appears my little primer is missing most of its PHP examples. I'm awaiting a fix from the cats at C5.
j
Sadly I think we did some dumb things with strip_tags and the like. I think we're ditching markdown in favor of a simpler approach (like the sourceforge forums) but with a way to deal with code blocks specifically.
Any suggestions for resurrecting the php in my post?
Rather than running everything through htmlentities() we were running strip_tags, which is obviously not a very smart thing to do on a site where a large number of posts will deal with HTML and PHP topics.
Jereme,
I wasn't able to retrieve everything you had in here (sorry about that!) but I edited the text above and inserted some pseudo-code that hopefully makes this more helpful.
And to everyone reading this - more documentation on using single pages (and the MVC-style syntax that C5 allows with pages/page types) is coming very soon to the documentation section.
I wasn't able to retrieve everything you had in here (sorry about that!) but I edited the text above and inserted some pseudo-code that hopefully makes this more helpful.
And to everyone reading this - more documentation on using single pages (and the MVC-style syntax that C5 allows with pages/page types) is coming very soon to the documentation section.
Wow Andrew thanks! I was going to repost, so I _really_ appreciate you taking that on.
Thanks for mini-tutorial jereme.
I've created the file /themes/mytheme/view.php, and it works good for newly created single-pages. However I can't figure out how to apply this to concrete's login page. Any pointers?
Thanks,
Alejandro
I've created the file /themes/mytheme/view.php, and it works good for newly created single-pages. However I can't figure out how to apply this to concrete's login page. Any pointers?
Thanks,
Alejandro
Certain core pages of C5 have their themes specified by path. This includes /login/. However you can override this by setting up your own theme paths.
http://www.concrete5.org/help/documentation/developers/themes/speci...
http://www.concrete5.org/help/documentation/developers/themes/speci...
we really gotta do something about making long links wrap ;)
seems like we are cause mine's truncated in display above but the url is wrong. perhaps a div's edge just needs to be brought in if it's a reply?
Thanks. The only thing I'm missing now is the ability to add blocks to these single pages, not possible yet, correct?
Is it possible to access/use a custom controller (Want my own Registration Controller) For the internal site pages? I created a dummy controller in the top level controllers/ directory but accessing it in the same way that say the built in registration form accesses it's controller doesn't work.. e.g. index.php/register/-/do_register ...
Alejandro,
You can add blocks to a single page just like you can a page type. Single pages have an edit mode one in the same.
You can add blocks to a single page just like you can a page type. Single pages have an edit mode one in the same.
You said:
"Widgets will be added to the sitemap. While single pages can have children, they cannot be children. They will always exist on the 2nd level of the site map (one level below home)."
From the sitemap I was able to make it a child page. Seems to work fine. Is this a new update?
"Widgets will be added to the sitemap. While single pages can have children, they cannot be children. They will always exist on the 2nd level of the site map (one level below home)."
From the sitemap I was able to make it a child page. Seems to work fine. Is this a new update?
Is it just me or does anyone else finds regular pages more flexible than single pages?
I mean, I can do exactly the same things with one and the other, even have custom controllers and that and have my code consistent across all pages, and keep all pages inside my theme instead of all over the place!
I don't have to be thinking about whether a page is a single page, and then the controller name is slightly different, and I need to add it somewhere else, and the page itself seats outside my theme folder, which makes the use of the "inc" function inconsistent, cause it's looking for elements in the theme... etc...
Anyone else had the same experience?
I mean, I can do exactly the same things with one and the other, even have custom controllers and that and have my code consistent across all pages, and keep all pages inside my theme instead of all over the place!
I don't have to be thinking about whether a page is a single page, and then the controller name is slightly different, and I need to add it somewhere else, and the page itself seats outside my theme folder, which makes the use of the "inc" function inconsistent, cause it's looking for elements in the theme... etc...
Anyone else had the same experience?