我已经使用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');
}
考虑上面的示例代码:
SESSION.user.group_id
变量是否可以被登录用户篡改/利用,更改为其用户组存储的值?如果是这样,那么/更安全的做事方式是什么,例如在登录时设置isAdmin
标志? UPLOADS
变量是否会使整个配置单元(即所有用户)不同,或者仅对当前用户进行更改?在模板中,有没有办法使用给定group_id
的{{1}}值来获取相关user
的不同键,就像它的slug?在下面的示例中,我试图避免循环userGroup
,为此我尝试使用array_search,但它返回空(实际上它返回 id = 0 @arrayOfGroups >),即:
slug
<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>
参考,导航栏中会有导航项的<include>
元素。使用此<li></li>
控制器将testroute()
应用于特定项目的适当方法是什么?
干杯
答案 0 :(得分:1)
问题#1:登录用户可以更改其群组吗?
不,用户无法直接修改SESSION
的内容(除非您为他提供了一种方法)。唯一可以被利用的是访问本身,如果会话ID被盗(又名&#34;会话劫持&#34; cf。here或there)。
现在,为了灵活性,您最好在SESSION
内保存最低限度。在会话中存储用户组会阻止您动态更改已登录用户的组(更改将在下次登录时生效)。我建议只存储用户ID并从中检索组。
问题2:更改UPLOADS变量是否会使整个配置单元(即所有用户)不同,或者仅对当前用户进行更改?
仅适用于当前用户。
注意:整个配置单元仅适用于当前用户&#34;。只共享缓存的变量。
问题3:如何从$arrayOfUserGroups
检索特定群组?
$arrayOfUserGroups
是根据$userGroups->all()
计算的,我猜这是DB\SQL\Mapper->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或别名的命名约定,静态或动态路由)等。
因此,我假设您使用的是具有一级层次结构,没有别名且没有dynamic route的基本导航栏。在这种情况下,您可以在一个变量中保存导航项列表(路径+标签),并将它们与当前PATH进行比较。 E.g:
<repeat group="@navItems" value="@item">
<li class="{{ @item.path==@PATH ? 'active' : '' }}">
<a href="{{ @item.path }}">{{ @item.label }}</a>
</li>
</repeat>