Actions

Difference between revisions of "Applying custom module chrome"

From Joomla! Documentation

m
 
(6 intermediate revisions by 3 users not shown)
Line 1: Line 1:
To define custom Module chrome in your template you need to create a file called modules.php in your template html directory.  For example, this might be [path-to-Joomla!]/templates/my_template/html/modules.php.
+
<includeonly>==Applying custom Module chrome==</includeonly>
 +
To define custom Module chrome in your template you need to create a file called modules.php in your template html directory.  For example, this might be PATH_TO_JOOMLA/templates/TEMPLATE_NAME/html/modules.php.
  
In this file you should define a function called modChrome_STYLE where 'STYLE' is the name of your custom Module chrome.  This function will take three arguments, $module, &$params, and &$attribs, as shown:
+
In this file you should define a function called <code>modChrome_STYLE</code> where '<code>STYLE</code>' is the name of your custom Module chrome.  This function will take three arguments, <code>$module</code>, <code>&$params</code>, and <code>&$attribs</code>, as shown:
  
 
<source lang="php">
 
<source lang="php">
 
<?php  
 
<?php  
function modChrome_STYLE( $module, &$params, &$attribs ) {
+
  function modChrome_STYLE( $module, &$params, &$attribs )  
   /* chromed Module output goes here */
+
   {
}
+
    /* chromed Module output goes here */
 +
  }
 
?>
 
?>
 
</source>
 
</source>
  
Within this function you can make use of any of the available Module properties (i.e. the fields in the jos_modules table in the Joomla! database on your server) for that Module, but the main ones you are likely to need are $module->content, $module->showtitle and $module->title.  $module->showtitle is a Boolean variable, so is either ''true'' (when the Module should be shown) or ''false'' (when it shouldn't be shown). $module->content and $module->title will return the main Module content and the Module title respectively.
+
Within this function you can make use of any of the available Module properties (i.e. the fields in the <code>jos_modules</code> table in the Joomla! database on your server) for that Module, but the main ones you are likely to need are <code>$module->content</code>, <code>$module->showtitle</code> and <code>$module->title</code><code>$module->showtitle</code> is a Boolean variable, so is either ''true'' (when the Module title '''should''' be shown) or ''false'' (when it '''shouldn't''' be shown). <code>$module->content</code> and <code>$module->title</code> will return the main Module content and the Module title respectively.
  
The function is a normal PHP function and so can use any regular PHP code.  One common example is to use an <tt>if</tt> statement to check the value of $module->showtitle, and then include the title or not accordingly:
+
The function is a normal PHP function and so can use any regular PHP code.  One common example is to use an <code>if</code> statement to check the value of <code>$module->showtitle</code>, and then include the title or not accordingly:
  
 
<source lang="php">
 
<source lang="php">
 
<?php
 
<?php
if ($module->showtitle) {
+
  if ($module->showtitle)  
   echo '<h2>' .$module->title .'</h2>';
+
   {
}
+
    echo '<h2>' .$module->title .'</h2>';
 +
  }
 
?>
 
?>
 
</source>
 
</source>
  
The Module parameters are accessed using the $params object.  For example, it is possible to assign a ''Module class suffix'' to a module in the backend of your Joomla! site; this is then stored in the parameters for that Module as <tt>moduleclass_sfx</tt>.  To create a <tt><nowiki>&lt;div&gt;</nowiki></tt> with  a <tt>class</tt> determined by the Module class suffix, you would use:
+
The Module parameters are accessed using the <code>$params</code> object.  For example, it is possible to assign a ''Module class suffix'' to a Module in the backend of your Joomla! site; this is then stored in the parameters for that Module as <code>moduleclass_sfx</code>.  To create a <code>&lt;div&gt;</code> with  a <code>class</code> determined by the Module class suffix, you would use:
  
 
<source lang="php">
 
<source lang="php">
Line 31: Line 34:
 
</source>
 
</source>
  
== Module chrome function ==
+
=== Custom chrome attributes ===
It is also possible to pass further attributes into the Module chrome function using the same <tt><jdoc:include /></tt> statement that sets the Module chrome. These additional attributes can be anything you like, and are stored in the $attribs array.  Take the following example Module chrome function:
+
It is also possible to pass further attributes into the Module chrome function using the same <code><jdoc:include /></code> statement that sets the Module chrome. These additional attributes can be anything you like, and are stored in the <code>$attribs</code> array.  Take the following example Module chrome function:
  
 
<source lang="php">
 
<source lang="php">
 
<?php
 
<?php
function modChrome_custom( $module, &$params, &$attribs ) {
+
  function modChrome_custom( $module, &$params, &$attribs ) {
  if (isset( $attribs['headerLevel'] )) {
+
    if (isset( $attribs['headerLevel'] ))  
     $headerLevel = $attribs['headerLevel'];
+
     {
  } else {
+
      $headerLevel = $attribs['headerLevel'];
    $headerLevel = 3;
+
    } else {
  }
+
      $headerLevel = 3;
 +
    }
  
  if (isset( $attribs['background'] )) {
+
    if (isset( $attribs['background'] ))  
     $background = $attribs['background'];
+
     {
  } else {
+
      $background = $attribs['background'];
    $background = 'blue';
+
    } else {
  }
+
      $background = 'blue';
 +
    }
  
  echo '<div class="' .$params->get( 'moduleclass_sfx' ) .'" >';
+
    echo '<div class="' .$params->get( 'moduleclass_sfx' ) .'" >';
  
  if ($module->showtitle) {
+
    if ($module->showtitle)  
     echo '<h' .$headerLevel .'>' .$module->title .'</h' .$headerLevel .'>';
+
     {
  }
+
      echo '<h' .$headerLevel .'>' .$module->title .'</h' .$headerLevel .'>';
 +
    }
  
  echo '<div class="' .$background .'">';
+
    echo '<div class="' .$background .'">';
  echo $module->content;
+
    echo $module->content;
  echo '</div'>;
+
    echo '</div>';
  
  echo '</div>';
+
    echo '</div>';
}
+
  }
 
?>
 
?>
 
</source>
 
</source>
  
You would then set the values for <tt>background</tt> and <tt>headerLevel</tt> in the <tt><jdoc:include /></tt> statement as shown below.  If no values are set, the attributes default to 'blue' and '3' respectively.
+
You would then set the values for <code>background</code> and <code>headerLevel</code> in the <code><jdoc:include /></code> statement as shown below.  If no values are set, the attributes default to 'blue' and '3' respectively.
  
 
{| class="wikitable"
 
{| class="wikitable"
|+ Passing attributes to Module chrome from <tt><jdoc:include /></tt>
+
|+ Passing attributes to Module chrome from <code><jdoc:include /></code>
! <tt><jdoc:include /></tt> statement
+
! <code><jdoc:include /></code> statement
 
! Output
 
! Output
 
|-
 
|-
 
|
 
|
<tt><jdoc:include type="modules" name="user1" /></tt>
+
<code><jdoc:include type="modules" name="user1" style="custom" /></code>
 
|
 
|
 
<source lang="html4strict">
 
<source lang="html4strict">
Line 85: Line 91:
 
|-
 
|-
 
|
 
|
<tt><jdoc:include type="modules" name="user1" background="green" /></tt>
+
<code><jdoc:include type="modules" name="user1" style="custom" background="green" /></code>
 
|
 
|
 
<source lang="html4strict">
 
<source lang="html4strict">
Line 98: Line 104:
 
|-
 
|-
 
|
 
|
<tt><jdoc:include type="modules" name="user1" headerLevel="1" background="yellow" /></tt>
+
<code><jdoc:include type="modules" name="user1" style="custom" headerLevel="1" background="yellow" /></code>
 
|
 
|
 
<source lang="html4strict">
 
<source lang="html4strict">
Line 114: Line 120:
 
[[Category:Advanced]]
 
[[Category:Advanced]]
 
[[Category:Modules]]
 
[[Category:Modules]]
[[Category:Templates]]
+
[[Category:Template Development]]
[[Category:Topics]]</noinclude>
+
[[Category:Template Reference]]
 +
</noinclude>

Latest revision as of 08:16, 24 June 2013

To define custom Module chrome in your template you need to create a file called modules.php in your template html directory. For example, this might be PATH_TO_JOOMLA/templates/TEMPLATE_NAME/html/modules.php.

In this file you should define a function called modChrome_STYLE where 'STYLE' is the name of your custom Module chrome. This function will take three arguments, $module, &$params, and &$attribs, as shown:

<?php 
  function modChrome_STYLE( $module, &$params, &$attribs ) 
  {
    /* chromed Module output goes here */
  }
?>

Within this function you can make use of any of the available Module properties (i.e. the fields in the jos_modules table in the Joomla! database on your server) for that Module, but the main ones you are likely to need are $module->content, $module->showtitle and $module->title. $module->showtitle is a Boolean variable, so is either true (when the Module title should be shown) or false (when it shouldn't be shown). $module->content and $module->title will return the main Module content and the Module title respectively.

The function is a normal PHP function and so can use any regular PHP code. One common example is to use an if statement to check the value of $module->showtitle, and then include the title or not accordingly:

<?php
  if ($module->showtitle) 
  {
    echo '<h2>' .$module->title .'</h2>';
  }
?>

The Module parameters are accessed using the $params object. For example, it is possible to assign a Module class suffix to a Module in the backend of your Joomla! site; this is then stored in the parameters for that Module as moduleclass_sfx. To create a <div> with a class determined by the Module class suffix, you would use:

<div class="<?php echo $params->get( 'moduleclass_sfx' ); ?>">
  <!-- div contents -->
</div>

Custom chrome attributes

It is also possible to pass further attributes into the Module chrome function using the same <jdoc:include /> statement that sets the Module chrome. These additional attributes can be anything you like, and are stored in the $attribs array. Take the following example Module chrome function:

<?php
  function modChrome_custom( $module, &$params, &$attribs ) {
    if (isset( $attribs['headerLevel'] )) 
    {
      $headerLevel = $attribs['headerLevel'];
    } else {
      $headerLevel = 3;
    }
 
    if (isset( $attribs['background'] )) 
    {
      $background = $attribs['background'];
    } else {
      $background = 'blue';
    }
 
    echo '<div class="' .$params->get( 'moduleclass_sfx' ) .'" >';
 
    if ($module->showtitle) 
    {
      echo '<h' .$headerLevel .'>' .$module->title .'</h' .$headerLevel .'>';
    }
 
    echo '<div class="' .$background .'">';
    echo $module->content;
    echo '</div>';
 
    echo '</div>';
  }
?>

You would then set the values for background and headerLevel in the <jdoc:include /> statement as shown below. If no values are set, the attributes default to 'blue' and '3' respectively.

Passing attributes to Module chrome from <jdoc:include />
<jdoc:include /> statement Output

<jdoc:include type="modules" name="user1" style="custom" />

<div>
  <h3><!-- Module title --></h3>
 
  <div class="blue">
    <!-- Module content -->
  </div>
</div>

<jdoc:include type="modules" name="user1" style="custom" background="green" />

<div>
  <h3><!-- Module title --></h3>
 
  <div class="green">
    <!-- Module content -->
  </div>
</div>

<jdoc:include type="modules" name="user1" style="custom" headerLevel="1" background="yellow" />

<div>
  <h1><!-- Module title --></h1>
 
  <div class="yellow">
    <!-- Module content -->
  </div>
</div>

Further information about passing attributes to Module chrome can be found in jtopic:115953.