Gallery:如何创建区块

来自站长百科
跳转至: 导航、​ 搜索

区块的新建[ ]

模块提供的区块可以被放置在Gallery布局的任意位置。想想乐高(Lego)砖吧,通过任意布置区块,你可以创建自己的布局样式。

请参看外观主题中的区块,以获取现有的所有区块列表。.

  • 最小化,模块区块由modules/moduleid/templates/blocks/blocks.inc中的入口点和modules/moduleid/templates/blocks/上的对应模板文件所构成。
  • CSS链接,JavaScript源码及任何HTML <head>内容都可以使用Preloads进行添加。
  • 一些标准数据(默认项目,用户)已加载并随时可通过模板变量进行访问。参见:模板变量
  • 数据可通过Callbacks载入。
  • 区块可被参量化,区块可为某特定项目进行显示。itemId可作为参量传输。
  • 推荐从现有区块开始进行学习。可在modules/*/templates/blocks/,modules/*/Preloads.inc和modules/*/Callbacks.inc中找例子。


最小化区块示例[ ]

测试模块中创建一个名为Example的区块:

  • 使用如下内容在modules/test/templates/blocks/blocks.inc中创建一个blocks.inc文件:
<?php
$blocks = array(
    'Example' => array(
        'description' => $gallery->i18n('Example block')));
?>
  • 使用如下内容在modules/test/templates/blocks/Example.tpl(文件名必须为'blockname.tpl')中创建一个区块模板
  {if $user.isRegisteredUser}
    {g->text text="Hello %s" arg1=$user.userName}
  {else}
    {g->text text="Welcome! Login to see more photos!"}
  {/if}
  

区块参量示例[ ]

Blocks.inc[ ]

区块参量需要在blocks.inc文件中指定:

<?php
$blocks = array(
    'Example' => array(
        'description' => $gallery->i18n('Example block'),
        'vars' => array(
            'someNumber' => array(
                'description' => $gallery->i18n('介于1和5之间的一个数字'),
                'type' => 'choice',
                'default' => '5',
                'choices' => array(
                    '1' => 1,
                    '2' => 2,
                    '3' => 3,
                    '4' => 4,
                    '5' => 5)),
            'textToShow' => array(
                'description' => $gallery->i18n('要显示的文本'),
                'type' => 'text',
                'default' => ''),
            )));
?>

区块模板[ ]

  • 区块参量可用在模板中。
  • 应为各参量分派默认值。
  • $item是一很常见的区块参量,一般默认为$theme.item。你无需在blocks.inc中将此参量列出。
{assign var=someNumber value=$someNumber|default:5}
{if empty($item)} {assign var=item value=$theme.item} {/if}

{capture assign="defaultMessage"}{g->text text="This is an example block"}{/capture}
{assign var=textToShow value=$textToShow|default:$defaultMessage}

<div class="{$class}">
  <p>{$textToShow}</p>
  <p>{g->text text="You chose number %s!" arg1=$someNumber}
  {if $item.canContainChildren}
    {g->text text="This is an album!"}
  {/if}
</div>

预加载(Preload)[ ]

  • 如果你的区块依靠CSS文件或想在HTML <head>部分包括进Javascript文件而不是在区块中的话,可以使用区块预加载。
  • preload的命名惯例很严格,,而入某区块是某外观主题区块列表一部分的话,preload就会自动被呼叫。
  • 如果你是手动包括区块的话(使用{g->block ...}),那么preload就不会被呼叫。你还需要手动包括CSS/JavaScript。

要为测试模块的Example区块创建preload的话,使用如下内容在modules/test/Preloads.inc中创建一个Preloads.inc文件:

<?php
class TestPreloads {
    function preload(&$template, $preload, $paramSet) {
	static $loaded;

	if (!empty($loaded[$preload])) {
	    return null;
	}

	$loaded[$preload] = 1;
	switch($preload) {
	case 'Example':
            /* To include a CSS file... */
	    $template->style('modules/test/MyCssFile.css');
            /* To include a JavaScript file... */
	    $template->javascript('modules/test/MyJavaScriptFile.js');
	    return null;
        case 'ExampleTwo':
            // Put here the preloads for another block of your module
	}

	return GalleryCoreApi::error(ERROR_BAD_PARAMETER);
    }
}
?>

注:

  • 类别名称必须符合模块id.的格式,"${moduleid}Preloads"
  • 在preload文件的分支语句中列出所有模块的区块。


参量和callback示例[ ]

  • 有关callback的资料,请见Callbacks
  • 针对参量,我们使用前面例子中相同的blocks.inc。

区块模板[ ]

{assign var=someNumber value=$someNumber|default:5}
{if empty($item)} {assign var=item value=$theme.item} {/if}

{capture assign="defaultMessage"}{g->text text="This is an example block"}{/capture}
{assign var=textToShow value=$textToShow|default:$defaultMessage}

{* Load some data *}
{g->callback type="test.LoadItemData" itemId=$item.id myLimit=$someNumber}

{if !empty($block.test.LoadItemData)}
<div class="{$class}">
  <p>{$textToShow}</p>
  <ul>
  {foreach from=$block.test.LoadItemData.items item=photo}
    <li>{g->text text="Photo name:"}{$photo.title}, {g->text text="Owner: %s" arg1=$photo.owner}</li>
  {/foreach}
  </ul>
</div>
{/if}

注:

  • 在此例中,我们假设测试模块具有一名为LoadItemData的callback,它会读取项目及相关数据(所有者名称)。如$itemId为某相册的id,它就能读至该相册的$someNumber子项目。它还能过滤子项目而仅返回图片(而不包括视频,mp3或其他媒体)。