symfony 1.4在模板和操作之间传递变量

时间:2011-09-02 15:20:21

标签: php symfony1 symfony-1.4

symfony 1.4在模板和操作之间传递变量

我有一个索引页面,其中包含通过switch语句调用一系列部分内容;它的工作原理。我现在需要根据用户的类型限制对部分的访问;此外,我相信我的switch语句应该在MVC的actions类中,但是我也无法使用它。通过示例可以更好地解释这一点:

这是我的仪表板模块的文件结构:

..dashboard
    ..actions
    ..config
    ..templates
        _admins.php
        _employers.php
        _employees.php
        _guest.php
        indexSuccess.php

这是我当前的indexSuccess模板(当前有效...但如果记录的用户类型与页面类型不匹配,则不限制访问权限):

$type = sfContext::getInstance()->getUser()->getGuardUser()->getProfile()->getType()->getName();
switch($type)
{
case ('Employer'): 
    include_partial('dashboard/employers');
    $page_user_type = "employer";  //this example line currently does not exist, it's for example purpose below
    $break;
case ('Employee'):
    include_partial('dashboard/employees');
    break;
case ('Administrator'):
    include_partial('dashboard/admins');
    break;
default: include_partial('dashboard/guest');
    break;
}

这是我的动作类(当前为空):

public function executeIndex(sfWebRequest $request)
{

}

基本上,我需要的是切换语句移动到动作(我认为),并添加了forward404Unless()方法,执行以下操作:

$logged_user = sfContext::getInstance()->getUser()->getGuardUser()->getId(); 
$this->forward404Unless($logged_user == $page_user_type);   //where the $page_user_type variable is retrieved by the switch statement in the example line above.  

我尝试过使用getAttribute()和setAttribute()但没有成功......我宁愿不要因为尴尬而分享尝试。这里只是一个初学者...

任何帮助将不胜感激。提前致谢。

更新:

以下是有关交换机和不同部分的更多信息:

开关根据用户的类型呈现不同的部分。它没有做的是让其他类型的其他登录用户不能访问所有其他部分...在我的设计中,这是非常糟糕的。例如:“雇主”类型的登录用户可能无法查看“雇员”类型的部分内容。目前,他们可以(通过明确键入其他URL),即使它们在索引操作期间被重定向到适当的页面。

当错误类型的用户尝试通过显式键入url来访问其他部分时,应调用404页面。这就是为什么我在调用适当的partial时尝试向switch语句添加一个变量,然后将该变量传递给index动作然后对其进行评估并允许部分呈现,或者user_type和partial_type没有匹配 - >转到404页面。合理?我希望我能够解释得足够多。我确信有一种更简单的方法......我只是没有受过足够的教育,知道那可能是什么。

我确实感谢您的回复并尝试解决我的问题。

3 个答案:

答案 0 :(得分:0)

我很难理解404应该发生的时间。这会处理吗?

动作:

public function executeIndex(sfWebRequest $request)
{
  $this->profileType = $this->getUser()->getGuardUser()->getProfile()->getType()->getName();
  $this->forward404Unless(in_array($this->profileType, array('type1', 'type2')), 'Invalid profile type');
}

在视图中使用switch语句是完全可以接受的,但如果这是indexSuccess.php的全部内容,您可能希望调用sfAction::setTemplate

答案 1 :(得分:0)

好的,我自己想出了这个。以下是我为获得理想结果所做的工作:

  1. 更改了路由,以便无法显式输入和访问。问题解决了。

答案 2 :(得分:0)

您应该使用凭据系统来阻止未授权用户访问资源。 您的用户的“类型”可以成为凭证的名称。然后你只需要创建security.yml来处理它。