Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Symfony][Symfony2] Jak zawęzić wynik z select-a (ACL ?) ?
stirith
post 1.06.2012, 13:12:35
Post #1





Grupa: Zarejestrowani
Postów: 162
Pomógł: 2
Dołączył: 18.01.2008

Ostrzeżenie: (0%)
-----


Załóżmy że mam tabelę: "CV" - do tej tabeli dodawane są informacje o CV użytkownika (id, id_user, nazwa CV, path do pliku). Użytkownik może mieć kilka różnych CV w tej tabeli.

Stworzyłem drugą tabelę która przechowuje: id, id_usera, id_pracodawcy i id_cv.

Jak stworzę w symfony2 formularz i dodam klasę do parametru: "data_class" to formularz stworzy mi listę <select> z dostępnymi CV....Jednakże każdy użytkownik może wybrać każde CV...A ja chciałbym aby użytkownik mógł wybrać CV tylko te które dodał sam....(i są do niego przypisane)

Czy da się to osiągnąć używając ACL ? Możecie mnie nakierować jak ? Jaki atrybut przypisać obiektowi (CV) ?
Go to the top of the page
+Quote Post
pedro84
post 1.06.2012, 13:19:14
Post #2





Grupa: Nieautoryzowani
Postów: 2 249
Pomógł: 305
Dołączył: 2.10.2006

Ostrzeżenie: (0%)
-----


http://symfony.com/doc/current/cookbook/security/acl.html


--------------------
Google knows the answer...
Go to the top of the page
+Quote Post
stirith
post 1.06.2012, 16:38:52
Post #3





Grupa: Zarejestrowani
Postów: 162
Pomógł: 2
Dołączył: 18.01.2008

Ostrzeżenie: (0%)
-----


Liczyłem trochę na inną odpowiedź...ale ok :-)

Mam kolejne pytanie z tym związane:

W dokumentacji mamy fragment:

Kod
    $comment = new Comment();

    // setup $form, and bind data
    // ...

    if ($form->isValid()) {
        $entityManager = $this->get('doctrine.orm.default_entity_manager');
        $entityManager->persist($comment);
        $entityManager->flush();

        // creating the ACL
        $aclProvider = $this->get('security.acl.provider');
        $objectIdentity = ObjectIdentity::fromDomainObject($comment);
        $acl = $aclProvider->createAcl($objectIdentity);


Kod
$objectIdentity = ObjectIdentity::fromDomainObject($comment);


Tutaj przekazuje się obiekt...ale jeśli ja mam coś takiego:


Kod
        $form = $this->createForm(new \My\JobBundle\Form\CvType());
        
        if($this->getRequest()->getMethod() === 'POST')
        {
            $form->bindRequest($request);
            
            if($form->isValid())
            {
                $cv = $form->getData();
                
                $em = $this->getDoctrine()->getEntityManager();
                $em->persist($cv);
                $em->flush();


To jak mam przekazać obiekt do acl-a ?

Kod
$objectIdentity = ObjectIdentity::fromDomainObject($cv);
questionmark.gif
Go to the top of the page
+Quote Post
destroyerr
post 1.06.2012, 16:41:47
Post #4





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

Ostrzeżenie: (0%)
-----


Moim zdaniem ACL nie ma tutaj sensu.

Cytat
Jak stworzę w symfony2 formularz i dodam klasę do parametru: "data_class" to formularz stworzy mi listę <select> z dostępnymi CV....Jednakże każdy użytkownik może wybrać każde CV...A ja chciałbym aby użytkownik mógł wybrać CV tylko te które dodał sam....(i są do niego przypisane)

Nie wiem jaki formularz i nie wiem czy data_class ustawiłeś na nim czy na jakimś jego polu.
Jeżeli masz pole select, które pobiera dane z bazy, to znaczy, że korzystasz (prawdopodobnie) z EntityChoiceList[\i]. Jako jeden z argumentów konstruktora przyjmuje [i]EntityLoaderInterface. Możesz więc skorzystać z [i]ORMQueryBuilderLoader[\i] i odpowiednio wyfiltrować odpowiednie CV.
Go to the top of the page
+Quote Post
stirith
post 1.06.2012, 16:52:39
Post #5





Grupa: Zarejestrowani
Postów: 162
Pomógł: 2
Dołączył: 18.01.2008

Ostrzeżenie: (0%)
-----


Poradziłem sobie jeśli chodzi o moje ostatnio zadane pytanie

Co do rozwiązania jakie podałeś - to tak zapewne zrobię, natomiast zainteresował mnie sam ACL i mam w związku z tym kolejne pytanie:

mam kod:

Kod
                        if($form->isValid())
            {
                $cv = $form->getData();
                
                $em = $this->getDoctrine()->getEntityManager();
                $em->persist($cv);
                $em->flush();
                
                // creating the ACL
                $aclProvider = $this->get('security.acl.provider');
                $objectIdentity = ObjectIdentity::fromDomainObject($cv);
                $acl = $aclProvider->createAcl($objectIdentity);

                // retrieving the security identity of the currently logged-in user
                $securityContext = $this->get('security.context');
                $user = $securityContext->getToken()->getUser();
                $securityIdentity = UserSecurityIdentity::fromAccount($user);

                // grant owner access
                $acl->insertObjectAce($securityIdentity, MaskBuilder::MASK_OWNER);
                $aclProvider->updateAcl($acl);

            }


Wszystko ładnie mi się dodaje do bazy, do tabel acl-owych również...

Mam w bazie kilka cv dodanych przez 2 różnych użytkowników...Jeśli pobieram wszystkie cv to oboje użytkowników widzi wszystkie cv...a przecież chyba nie tak miało być ? To jak acl zabezpiecza obiekty ? Może mi to ktoś wyjaśnić ?
Go to the top of the page
+Quote Post
ano
post 2.06.2012, 13:34:06
Post #6





Grupa: Zarejestrowani
Postów: 435
Pomógł: 40
Dołączył: 16.02.2003
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


No dobra, przecież sam mówisz, że "pobierasz wszystko". Skąd EntityRepository:findAll() ma wiedzieć, że używasz jakiegoś tam ACL?
Jak koniecznie chcesz użyć ACL to możesz pobrać wszystkie CV tym findAll'em i potem w pętli przefiltrować za pomocą http://symfony.com/doc/current/cookbook/se...checking-access (wybrać tylko te do których user ma dostęp).
ALEEE
po co skoro można w warunku findBy(array('user' => $currentUserId ) ograniczyć wynik zapytania tylko do tych, CV które dodał dany User? Będzie o wiele wydajniejsze i skalowalne...


--------------------
Linkedin | ...
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 11.05.2024 - 22:13