2013-06-06 13 views
1

Я занимаюсь разработкой приложения с помощью sfDoctrineGuardPlugin и Symfony 1.4.20 затем Я три пользователя и три группы пользователей и некоторые права следующим образом:Присвоить группы, основанные на зарегистрированных учетных данных пользователя

user_name   user_group  permissions 
u1    Group1   can_admin_full, can_admin 
u2    Group2   can_admin 
u3    Group3   no_admin 

Так u1 должен иметь возможность добавлять пользователей в приложение, но может видеть только Group2 и Group3 в разделе «Параметры групп», u2 должен иметь возможность добавлять пользователей в приложение, но может видеть только Group3 в разделе «Параметры групп», поэтому u1 и u2 не должны добавлять пользователей, принадлежащих к Group1, как я могу получить это с помощью sfDoctrineGuard? Возможно?

ПРИМЕЧАНИЕ: Я использую GroupN в качестве примера, но ниже в примере кода указаны правильные имена для групп и разрешений!

EDIT: Улучшить вопрос Таким образом, после более внимательно взглянуть на this я пытаюсь к тому же, но с учетом моего кода, так в lib/form/doctrine/sfDoctrineGuardPlugin/sfGuardUserForm.class.php я изменить это:

class sfGuardUserForm extends PluginsfGuardUserForm { 

    public function configure() { 
     //groups_list 
     $this->getWidget('groups_list')->setOption('expanded', true); 
     $this->getWidget('groups_list')->setOption('table_method', 'getListForAdmin'); 
     $this->getValidator('groups_list')->setOption('query', Doctrine::getTable('sfGuardGroup')->getListForAdmin()); 
    } 

} 

Кроме того, я сделал это изменения в lib/model/doctrine/sfDoctrineGuardPlugin/sfGuardGroupTable.class.php

class sfGuardGroupTable extends PluginsfGuardGroupTable { 

    /** 
    * Returns an instance of this class. 
    * 
    * @return object sfGuardGroupTable 
    */ 
    public static function getInstance() { 
     return Doctrine_Core::getTable('sfGuardGroup'); 
    } 

    /** 
    * Builds list query based on credentials 
    * 
    */ 
    public function getListForAdmin() { 
     $user = sfContext::getInstance()->getUser(); 
     $q = $this->createQuery('g'); 

     if ($user->hasPermissions('can_admin_full')) { 
      $q->addWhere('g.name IN (?)', array('Administradores Monitor', 'Monitor')); 
     } else if ($user->hasPermissions('can_admin')) { 
      $q->addWhere('g.name IN (?)', array('Monitor')); 
     } 
     return $q; 
    } 

} 

Но не работают, потому что Войти с помощью пользователя, который принадлежит к группе «Administrador де Servicios» и имеет can_a разрешения» Dmin' и „can_admin_full“ и я могу видеть все группы в виджете, и я ищу только для видеть в этом случае „Administradores Monitor“ и „Monitor“

EDIT 2 Также попробуйте этот другой код:

$this->widgetSchema['groups_list'] = new sfWidgetFormDoctrineChoice(array('multiple' => true, 'table_method' => 'getListForAdmin', 'query' => Doctrine::getTable('sfGuardGroup')->getListForAdmin())); 

и до сих пор не работает, я меняю 'table_method' => 'getListForAdmin' в 'table_method' => 'getListForAdmin1' и ничего не происходит, так что я подозреваю, что этот метод никогда не вызывается

EDIT 3 N вл он работает, но увидеть это: Если я использую этот подход:

$this->getWidget('groups_list')->setOption('expanded', true); 
$this->getWidget('groups_list')->setOption('table_method', 'getListForAdmin'); 
$this->getValidator('groups_list')->setOption('query', Doctrine::getTable('sfGuardGroup')->getListForAdmin()); 

Тогда я получаю эту ошибку:

SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

Если я использую другой подход:

$this->widgetSchema['groups_list'] = new sfWidgetFormDoctrineChoice(array('multiple' => true, 'table_method' => 'getListForAdmin', 'query' => Doctrine::getTable('sfGuardGroup')->getListForAdmin())); 

Я получаю эта другая ошибка:

sfWidgetFormDoctrineChoice requires the following options: 'model'.

Затем я добавил параметр model:

$this->widgetSchema['groups_list'] = new sfWidgetFormDoctrineChoice(array('multiple' => true, 'model' => 'sfGuardGroup', 'table_method' => 'getListForAdmin', 'query' => Doctrine::getTable('sfGuardGroup')->getListForAdmin())); 

Но получить такую ​​же ошибку, как первый подход, я подозреваю, что проблема в getListForAdmin() функции, но на самом деле не знаю, где именно

Что случилось в этот момент?

+0

Да, это возможно. Но помните, что SO - это не то место, где кто-то будет писать код для вас, но могли бы вы найти помощь, когда вы застряли. Покажите нам, что вы пытались достичь, что вам нужно, и у вас были проблемы. Тогда мы сможем вам помочь. –

+0

@MichalTrojanowski Привет и спасибо за ваш ответ, я не прошу кого-то сделать эту работу для меня, просто пытаясь получить правильный путь, чтобы это сделать. Я имею в виду некоторые предложения, в которых файлы для редактирования, какие методы, какие советы по это просто, чтобы получить всю идею, вы можете помочь в этом? – Reynier

+0

Это намного лучше теперь :) См. Мой ответ ниже. Не уверен, что это проблема, но давайте начнем с чего-то, и мы получим результат в конечном итоге;) –

ответ

1

Попробуйте изменить условный getListForAdmin():

if ($user->hasPermissions('can_admin_full')) { 
     $q->whereIn('g.name', array('Administradores Monitor', 'Monitor')); 
    } else if ($user->hasPermissions('can_admin')) { 
     $q->whereIn('g.name', array('Monitor')); 
    } 
+0

Я изменил условие, как вы предложили, но все еще не работает. Теперь, может быть, я полностью потерян, и все работает правильно, см. Эту серию изображений на http://www.dropmocks.com/mBtcM7. image (1) - это то, что пользователь может видеть под действием ** User Edit **, пользователь с разрешениями can_admin или can_admin_full никогда не должен видеть флажок, чтобы сделать нового пользователя суперпользователем, также пользователь должен видеть только Administradores Monitor и Monitor под Группы (Grupo на изображении), чтобы он не работал. – Reynier

+0

Теперь изображение (2) показывает, что зарегистрированный пользователь принадлежит группе «Administrador de Servicio», а изображение (3) показывает разрешения, присваиваемые этой группе, где u1, пользователь, который я использую для проверки функциональности и является пользователем, принадлежит, что тогда не так? Я чего-то не хватает? – Reynier

+0

Пожалуйста, убедитесь, что форма фактически используется сгенерированным модулем бэкэнд. 'SfGuardPlugin' также имеет' sfGuardUserAdminForm'. Может быть, вы должны отредактировать это? –

 Смежные вопросы

  • Нет связанных вопросов^_^