基于用户级别的模板过滤

时间:2013-07-19 11:00:40

标签: php joomla

我正在开发Joomla组件,我们有很多基于用户的功能。我厌倦了写作如果要过滤哪些部分为用户显示,所以我决定编写某种脚本以使其更容易。所以我的目标是实现这样的模板结构:

<div id="my-component-root">
    <div class="common-content">
    </div>
    <!--{if[admin]}-->
    <div class="admin-content">
    </div>
    <!--{endif[admin]}-->

    <!--{if[captain]}-->
    <div class="captain-content">
    </div>
    <!--{endif[captain]}-->
</div>

因此生成的模板将被预处理并生成模板并传递给视图。 (这是普通用户的结果)

<div id="my-component-root">
    <div class="common-content">
    </div>
</div>

我的问题是是实现此类模板预处理的最简单方法吗?

编辑:

就像正常打开if标记,除了它允许简单的方法来编译模板以获得像普通用户这样的精确用户类型。通过这种方式,我不需要编辑多个脚本来改变站点间的代码..

2 个答案:

答案 0 :(得分:1)

@insanebits检查下面的代码..

<div id="my-component-root">
    <div class="common-content">
    </div>

    <div class="<?=$userLevel;?>-content">
    </div>
</div>

其中$userLevel可以是管理员或普通用户或管理员,基于类名称将更改...并且为了实现此目的,您应该为admin/user/moderator提供单独的模板我已经增强了Royal Bg建议。 ...

答案 1 :(得分:1)

我真的取决于你的HTML是如何构建的,你真正存储了什么信息以及它的敏感程度。

如果您有例如:

<div id="my-component-root">
    <div class="common-content">
    </div>
    <!--{if[admin]}-->
    <div class="admin-content">
        Welcome %User, You have logged in as Administrator
    </div>
    <!--{endif[admin]}-->

    <!--{if[captain]}-->
    <div class="captain-content">
        Hello, you are not Administrator.
    </div>
    <!--{endif[captain]}-->
</div>

所以,用户带着userlevel = captain来到这里,div加载了captain-content,反之亦然。一切都是静态的,但也是一堆代码。

您还有机会将文本放在事件所在的事件上。因此,您可以动态构建类并在构建的类上加载内容,如@Friend和Me已经在回答和注释中编写。如果您有敏感内容,这种方式会更不安全。因为有人可以编辑您的HTML并根据班级名称接收内容。

在现代架构中,内容既不是静态的,也不是源代码中的内容。例如,如果逻辑包含userLevel逻辑,则意味着您不仅要使用“Hello admin”或“Hello user”向它们致敬,还要加载管理员允许的某些选项以及用户不允许的选项。

这样你需要做几件事:

  • 将文件管理员允许的功能分开,即:admin_edit_profile.php ...
  • 制作一个允许在给定占位符上构建文本(翻译方法)的方法
  • 对包含的文件进行安全性检查,其中level()传递给admin_profile.php,因此应该有类似if ($userLevel != 'admin') die())
  • 的smth
  • **我们假设你有一个方法roles()的UserLevel类,它给出了任何人可以分配哪个角色的权限,即管理员可以edit_profile。方法level()返回级别(admin,user ...)**

现在你可以:

<div id="my-component-root">
    <div class="common-content">
    </div>
    <?php foreach($userLevel->roles() as $role):
    <div class="<?=$userLevel->level();?>-content">
        <?php require_once "$userLevel->level()" . "_" . "$role" . ".php"; ?>
        <?= __('placeholder_text_for_translation_for_role' . $role); ?>
    </div>
    <?php endforeach; ?>

现在,您可以将已翻译的ie placeholder_text_for_translation_for_role_edit_profile的内容存储在数据库中,并在包含后立即返回其翻译(英文文本)。

通过这种方式,您将包含带有管理员配置文件编辑选项的文件

<?php require_once "admin_edit_profile.php"; ?>

并为其提供文字

<?= "Here you can edit user profiles"; ?>

所以构建的整个内容将是:

<div id="my-component-root">
    <div class="common-content">
    </div>
    <div class="admin-content">
        <?php require_once "admin_edit_profile.php"; ?>
        <?= "Here you can edit user profiles"; ?>
    </div>