F3 框架:Hive 变量的范围和用法



我已经使用Fat Free Framework 3.6一段时间了,我在确保与所用变量相关的一些事情时遇到了一些麻烦;另外请注意,我作为一个PHP程序员知识渊博。 以下是一些示例(我为SQL映射器使用了一些"快捷方式"方法,但我想它仍然是可读的(:

function testroute() {
// Q1 - Using f3-access to authorize a logged in user to advance on a route
$this->access->authorize($this->f3->get('SESSION.user.group_id'));

// Q2 - Change the f3 UPLOADS variable
$this->f3->update('UPLOADS', '/different/location');

// Q3 - Instantiante Users and User Groups from DB
$users = new User($this->db);
$userGroups = new UserGroups($this->db);
// Load all records to array
$arrayOfUsers = $users->all();
$arrayOfUserGroups = $userGroups->all();
// Make the arrays available to the template
$this->f3->set('arrayOfUsers', $arrayOfUsers );
$this->f3->set('arrayOfUserGroups', $arrayOfUserGroups );
// Render the View
$this->f3->set('view','content.test.htm');
$template=Template::instance();
echo $template->render('layout.sidebar.htm');
}

考虑上面的示例代码:

  1. 登录用户是否可以篡改/利用SESSION.user.group_id变量,从而更改为其用户组存储的值?如果是这样,有什么更安全的方式来做这样的事情,比如在登录时设置isAdmin标志?
  2. 更改UPLOADS变量是使整个配置单元(即所有用户(的不同,还是仅对当前用户进行更改?
  3. 在模板中,有没有办法使用给定usergroup_id值来获取相关userGroup的不同键,就像它是 slug 一样?在下面的示例中,我试图避免循环遍历@arrayOfGroups为此我尝试使用 array_search,但它返回空(实际上它返回id=0slug(,即:

    <include href="{{ 'navbar.htm' }} />

    <repeat group="{{ @arrayOfUsers }}" value="{{ @item }}" >

    <tr class="">
    <td>{{ @item.username }}</td>
    <td>{{ @item.usergroup_id }}</td>
    <td>{{ @arrayOfUserGroups[array_search(@item.usergroup_id].slug }}</td>
    </tr>
    

    </repeat>

  4. 在最后一个示例中,我有一个导航栏的<include>引用,该导航栏又具有导航项的<li></li>元素。使用此testroute()控制器将<li class="active"></li>应用于特定项目的适当方法是什么?

干杯

问题 #1:登录用户可以更改其组吗?

不可以,用户不能直接修改SESSION的内容(除非您为他提供了这样做的方法(。如果会话 ID 被盗,唯一可以利用的是访问本身(也称为"会话劫持",参见此处或那里(。

现在,为了灵活性,您最好将最低限度保存在SESSION内。将用户组存储在会话中会阻止您动态更改登录用户的组(更改将在下次登录时生效(。我宁愿建议只存储用户 ID 并从中检索组。

问题#2:更改UPLOAD变量是否会使整个配置单元(即所有用户(有所不同,还是仅对当前用户进行更改?

仅适用于当前用户。

注意:整个配置单元"仅适用于当前用户"。仅共享缓存的变量。

问题#3:如何从$arrayOfUserGroups中检索特定组?

$arrayOfUserGroups是根据$userGroups->all()计算得出的,我想这是DBSQLMapper->find()方法的结果。该方法不会按 id 索引结果,而只会按 SQL 输出中的出现顺序编制索引。

因此,解决问题的一种方法是在返回结果之前重新索引结果。像这样:

function all() {
$groups=$this->mapper->find('');
$all=[];
foreach ($groups as $group)
$all[$group->id]=$group;
return $all;
// or if you prefer a one-liner:
return array_combine(array_map(function($g){return $g->id;},$groups),$groups);
}

现在在您的模板中:

{{ @arrayOfUserGroups[@item.usergroup_id].slug }}

问题#4:如何激活导航项?

有多种方法可以实现此目的,这取决于几个因素,例如导航栏层次结构深度、路由结构(URL 或别名的命名约定、静态或动态路由(等。

因此,我假设你使用的是具有一级层次结构、没有别名和动态路由的基本导航栏。在这种情况下,您可以将导航项(路径+标签(列表保存在一个变量中,并将它们与当前 PATH 进行比较。例如:

<repeat group="@navItems" value="@item">
<li class="{{ @item.path==@PATH ? 'active' : '' }}">
<a href="{{ @item.path }}">{{ @item.label }}</a>
</li>
</repeat>

最新更新