Custom theme layout

Custom theme layout

by Conn Warwicker -
Number of replies: 6
Picture of Core developers Picture of Plugin developers

Hi,

 None of the in-built theme layouts (e.g. base, login, maintenance, etc...) have precisely what I want for my plugin pages, so I want to create my own layout.

I know I can do this in the theme itself, e.g. if I go into theme_boost I can append another layout in the config.php file, and create a new mustache template. However, I don't want to have to do this for every theme that people may be using.

Is there a way of defining the new layout, within my block plugin itself?


I thought I might be able to do something like, create a "/blocks/myblock/templates" directory, put the mustache template in there, and then instead of

using a core layout, e.g. 

$PAGE->set_pagelayout( 'base' ); reference my own, 

e.g. 
$PAGE->set_pagelayout( 'block_myblock/mytemplate' );

That doesn't work, but I'm not sure if I've just got the syntax wrong, or if it's not possible at all, and would require altering the themes themselves?

Thanks.


Average of ratings: -
In reply to Conn Warwicker

Re: Custom theme layout

by Mark Sharp -
Picture of Core developers Picture of Particularly helpful Moodlers Picture of Plugin developers

So one possibility is to have multiple child themes:

Boost -> Template theme -> Customer theme

So the customer theme is a child of template theme, which is a child of Boost theme.

https://docs.moodle.org/dev/Creating_a_theme_based_on_boost

In reply to Mark Sharp

Re: Custom theme layout

by Conn Warwicker -
Picture of Core developers Picture of Plugin developers

That seems like a lot of work, as I'd have to create new child themes for any theme people use and get them to install that as well, just to have a different page layout... mixed

I've been looking at the code behind it all and it seems like there is no way to create a new layout from anywhere other than a theme. I can't believe i'm the only one who's ever wanted to do it.. I could write the code to make it possible, but I don't know if it would be accepted into core or not.

In reply to Conn Warwicker

Re: Custom theme layout

by Jer Brand -

This is probably a silly suggestion, but: 

Could you find a layout that's extremely basic/empty and build up from there? If that didn't remove enough elements, it might be worth including a custom page layout, like $PAGE->set_pagelayout("my-plugin-layout"), even though it should ignore your invalid layout and default to base. You could then use the class for your plugin pages (pagelayout-my-plugin-layout) then remove elements you don't want with CSS.

It's not really answering the question (I don't see a way to register a one-off layout either), but do you think it might work in your situation?

In reply to Jer Brand

Re: Custom theme layout

by Gareth J Barnard -
Picture of Core developers Picture of Particularly helpful Moodlers Picture of Plugin developers

Pragmatically you can't define new layouts unless you're using a theme and even then that can cause issues.  What is wrong with the existing layouts that have no block areas and fill the page where the plugin can orchestrate the content area as it wishes?

In reply to Gareth J Barnard

Re: Custom theme layout

by Conn Warwicker -
Picture of Core developers Picture of Plugin developers

Hi,

I've been through all the available layout options:

base, standard, course, coursecategory, incourse, frontpage, admin, mydashboard, mypublic, login, popup, frametop, embedded, maintenance, print, redirect, report, secure


And none of them have what I want, which is:

- Header

- Footer

- No blocks


I basically want a standard moodle page with the header/footer/breadcrumb navigation, but no blocks and no content, so I can put whatever I want there. I used to be able to use the login layout for that, but not any more.


If there was a functionality within a plugin to append more layouts to the $THEME->layouts array, with the relevant file path and options, I could define the layout how I want, which is:


{{!
This file is part of Moodle - http://moodle.org/

Moodle is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

Moodle is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with Moodle. If not, see <http://www.gnu.org/licenses/>;.
}}
{{!
@template block_elbp/elbp
ELBP custom layout template.
}}
{{> theme_boost/head }}

<body {{{ bodyattributes }}}>

<div id="page-wrapper">

{{{ output.standard_top_of_body_html }}}
{{> theme_boost/navbar }}

<div id="page" class="container-fluid">
{{{ output.full_header }}}
<div id="page-content" class="row pb-3">
<div id="region-main-box" class="col-12">
<section id="region-main">
{{{ output.course_content_header }}}
{{{ output.main_content }}}
{{{ output.activity_navigation }}}
{{{ output.course_content_footer }}}
</section>
</div>
</div>
</div>

{{> theme_boost/footer }}

</div>
{{{ output.standard_end_of_body_html }}}
</body>
</html>
{{#js}}
require(['theme_boost/loader']);
{{/js}}

In reply to Jer Brand

Re: Custom theme layout

by Conn Warwicker -
Picture of Core developers Picture of Plugin developers

Hi,

it might do, though it's quite hacky so would probably have to be a last resort if I can't find a better solution.