Symfony 1.4 передает переменные между шаблонами и действиями

Symfony 1.4 передает переменные между шаблонами и действиями

У меня есть индексная страница, которая включает в себя вызов серии партиалов через оператор switch; и это работает. Теперь мне нужно ограничить доступ к частичной зависимости от типа пользователя; кроме того, я считаю, что мой оператор switch должен быть в классе действий в соответствии с MVC, но я также не могу заставить его работать. Это может быть лучше объяснено на примере:

Вот моя файловая структура для модуля панели инструментов:

..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)
{

}

По сути, мне нужно, чтобы оператор switch был перемещен в действие (я думаю), и добавлен метод 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-адреса), даже если они перенаправляются на соответствующую страницу во время действия индекса.

Страница 404 должна вызываться, когда пользователь неправильного типа пытается получить доступ к другому частичному, явно введя URL-адрес. Вот почему я пытался добавить переменную в статус переключателя при вызове соответствующего партиала, а затем передать эту переменную в действие индекса, которое затем оценит ее и либо разрешит визуализацию партиала, либо если user_type и partial_type не match -> перенаправить на страницу 404. Есть смысл? Я надеюсь, что объяснил это достаточно тщательно. Я уверен, что есть более простой способ... Я просто недостаточно обучен, чтобы знать, что это может быть.

Я очень ценю ваш ответ и пытаюсь решить мою проблему.


person Patrick    schedule 02.09.2011    source источник


Ответы (3)


Вы должны поиграть с системой учетных данных, чтобы заблокировать неавторизованному пользователю доступ к ресурсу. «Тип» вашего пользователя может стать именем учетных данных. Тогда вам просто нужно создать файл security.yml, чтобы справиться с этим.

person arsenik    schedule 14.09.2011

У меня небольшие проблемы с пониманием того, когда должна произойти ошибка 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.

person Jeremy Kauffman    schedule 02.09.2011
comment
Спасибо за ответ. Однако ваше решение не совсем работает. Пожалуйста, смотрите мой ответ на ваше решение в разделе вопрос - обновление. Мои комментарии были слишком длинными, чтобы отвечать здесь. - person Patrick; 03.09.2011

Ладно, с этим я разобрался сам. Вот что я сделал, чтобы получить желаемый результат:

  1. Изменен маршрут, чтобы его нельзя было явно ввести и получить к нему доступ. Проблема решена.
person Patrick    schedule 08.09.2011