Search code examples
typo3fluxfluid-layoutextbase

Get layout name in front end - fluid typo3


I have a fluid typo3 site with single page layout.One menu have different layout.How to get the selected layout name in my main template?

main.html

 <v:page.menu levels="1" as="sections">
                    <f:for each="{sections}" as="section" iteration="itemIteration">

     <f:debug>{sections}</f:debug>
    </f:for>
                </v:page.menu>

sub.html

<f:layout name="Pagewithnav" />
    <f:section name="Configuration">
        <flux:form id="subnav" icon="{f:uri.resource(path: 'Icons/Page/logo.png')}" label="Sub Navigation">
            <!-- Insert fields, sheets, grid, form section objects etc. here, in this flux:form tag -->
        </flux:form>
        <flux:grid>
            <!-- Edit this grid to change the "backend layout" structure -->
            <flux:grid.row>
                <flux:grid.column colPos="0" colspan="4" name="main" label="Navigation wrapper" />
            </flux:grid.row>
            <flux:grid.row>
                <flux:grid.column colPos="1" colspan="4" name="main" label="Main wrapper" />
            </flux:grid.row>
        </flux:grid>
    </f:section>
    <f:section name="Main">
        <div class="sub_nav">
           <div class="container">
               <v:content.render column="0"/>
           </div>
        </div>
        <div class="container">
            <v:content.render column="1"/>
        </div>
    </f:section>

Solution

  • It depends on what exactly you mean by "Layout name":

    • If you mean fields of the pages table for each individual page then those will be available in each record when you iterate it in v:page.menu (for example, tx_fed_page_controller_action).
    • If you mean fields of pages but also when this variable is inherited (for example, backend_layout is and tx_fed_page_controller_action is as well, but each through different methods) it becomes more complex: you would need to walk through the root line and use the first non-empty value. For that, v:page.rootLine plus v:iterator.filter plus v:iterator.first can be of great help (put output from root line into filter to remove non-empty values then use the first VH to select the first value from that filtered result).
    • If you define this "layout" in a Flux form field on your page template it becomes a FlexForm variable which you can read with flux:form.data (with inheritance if not disabled and if templates match up through root line).

    Depending on exactly which you mean there are quite a few possible solutions. If you are also looking for a recommendation about which one it makes sense to use: most likely you mean the layout you select in page properties (regardless of field) and for this, v:page.rootLine plus v:iterator.filter plus v:iterator.first is a nice and generic method to "slide select" any non-empty value from the root line of the current page.