Templates

Overview

Templates are your components' HTML and consist of valid HTML/CFML tags. This includes <cfif>, <cfloop>, etc.

<cfoutput>
    <!--- HTML template goes here --->
    <div>
        <button wire:click="doSomething">Click here</button>
        <!-- Any valid CFML here -->
        <cfif datePart( 'h', now() ) lt 12>
            <p>Good morning!</p>
        <cfelse>
            <p>Good afternoon!</p>
        </cfif>
    </div>
</cfoutput>

Your templates must have a single outer element for CBWIRE to bind to your component and update the DOM properly. This can be any valid HTML element. Below, we are using a div element.

Below is a template with one outer element ( good ) and another with two outer elements ( bad ).

<cfoutput>
    <!--- GOOD: single outer element --->
    <div>
        <p>My awesome component</p>
    </div>
</cfoutput>

<cfoutput>
    <!--- BAD: 2 outer elements --->
    <div>
        My awesome component    
    </div>
    <div>
        <p>This won't work.</p>
    </div>
</cfoutput>

Implicit Rendering

By default, CBWIRE will look in the ./wires folder for a .cfm file with the same name as your component.

./wires/Counter.cfc <--- CFC file
./wires/Counter.cfm <--- Template file based on CFC name

Explicit Rendering

To override the default implicit rendering, we can tell CBWIRE where our component template is by defining a onRender() method on our component and using the template() method.

// ./wires/MyTemplate.cfc
component extends="cbwire.models.Component" {
    function onRender() {
        return template( "someFolder.MyTemplate" ); // renders ./somefolder/MyTemplate.cfm    
    }
}

We can pass parameters when calling template().

// ./wires/MyTemplate.cfc
component extends="cbwire.models.Component" {
    function onRender() {
        return template( "someFolder.MyTemplate", { "someVar": "value" } );
    }
}

In this case, someVar becomes available to our template.

<!--- ./someFolder/MyTemplate.cfm --->
<cfoutput>
    <div>
        Somevar: #someVar#
    </div>
</cfoutput>

You can also return your template inline like so:

// ./wires/MyTemplate.cfc
component extends="cbwire.models.Component" {
    function onRender() {
        return "<div>My component</div>";
    }
}

Using Data Properties

You can access your data properties from your template by calling #propertyName#.

// ./wires/Greeter.cfc
component extends="cbwire.models.Component" {
    data = {
        "greeting": "Hello from CBWIRE"
    };
}
<!--- ./wires/greeter.cfm --->
<cfoutput>
    <div>
        Greeting: #greeting#
    </div>
</cfoutput>

Using Computed Properties

You define computed properties on your component by using the computed annotation.

function greeting() computed {}
// ./wires/Greeter.cfc
component extends="cbwire.models.Component" {
    function greeting() computed {
        return "Hello from CBWIRE";
    }
}

You access computed properties in your template by invoking the method.

<!--- ./wires/greeter.cfm --->
<cfoutput>
    <div>
        Greeting: #greeting()#
    </div>
</cfoutput>

Using Helper Methods

You can access any global helper methods defined in your ColdBox application and any modules you have installed.

For example, suppose you've installed the cbi8n module ( an internalization module for ColdBox ). You can access its global helper methods in your template, such as the $r() method for displaying text in various languages.

<cfoutput>
    <div>
        #$r( "greeting" )#
    </div>
</cfoutput>

Last updated

Was this helpful?