Ограничить выбор, показанный в symfony admin generator edit multi-select - PullRequest
0 голосов
/ 15 апреля 2011

Я использую генератор администратора для модуля sfGuardUser.Часть редактирования файла generator.yml выглядит следующим образом:

edit:
  title: Editing User "%%username%%"
  display:
    "User":  [first_name, last_name, email_address, username, password, password_again]
    "Permissions and groups": [is_active, groups_list, sites_list]

Теперь не каждый пользователь будет иметь доступ к этой форме, только администраторы сайта, позволяющие администраторам сайта создавать и обновлять своих собственных пользователей.Между User и Site существует отношение «многие ко многим».Каждый администратор сайта также является пользователем и поэтому имеет набор связанных сайтов.

Я бы хотел, чтобы sites_list не показывал ВСЕ сайты, а, скорее, только сайты, с которыми связан администратор сайта, таким образом гарантируя, что администратор сайта не сможет разместить одного из своих собственных пользователей на сайте, администратором которого не является.связанные с.

Мне кажется, мне нужно заменить sites_list на что-то еще, чтобы сделать это, но я не знаю, где и как сделать это изменение.

1 Ответ

0 голосов
/ 17 апреля 2011

Единственный способ, которым я думаю об этом, - это изменить виджет sites_lists из автоматически созданной формы.В вашем случае, например, вы можете сделать что-то вроде:

<!-- SitesTable -->
public function getByUser($userId){
     //create your query to find all sites from that user
      $userSites = $this->createQuery()->...
                        ->where('user_id = ?', $userId);

      //create the array
      $choices = array();
      foreach ( $userSites as $site ) {
          $choices[$site->getId()] = $site->getName();
      }

      return $choices;
}

<!-- sfGuardUserForm -->
class sfGuardUserForm extends BaseSfGuardUserForm{
    public function configure() {
      //unset the old sites_list
      unset($this['sites_list']);

      //obtain the user id (depends on how it's implemented, i'm not using sfGuard)
      $userId = sfContext::getInstance()->getUser()->getId(); 

      $choices = Doctrine::getTable('Sites')->getByUser($userId);

      //set the new widget filtered
      $this->setWidget('sites_list', new sfWidgetFormChoice(array('choices' => $choices)));
      $this->setValidator('sites_list', new sfValidatorChoice(array('choices' => array_keys($choices))));

}
...