<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[Forum CakePHP.org.pl - RecordControllBehavior - wersja alpha]]></title>
		<link>http://forum.cakephp.org.pl/topic/51/recordcontrollbehavior-wersja-alpha/</link>
		<description><![CDATA[Najświeższe odpowiedzi w RecordControllBehavior - wersja alpha.]]></description>
		<lastBuildDate>Wed, 25 Mar 2009 08:26:41 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[RecordControllBehavior - wersja alpha]]></title>
			<link>http://forum.cakephp.org.pl/post/232/#p232</link>
			<description><![CDATA[<p>Z zalozenia ma sprawdzac uprawnienia do dowolnego rekordu podczas wykonywania operacji CRUD, w chwili obecenj mocno niedorobiony zwlaszcza callback beforeFind... Model w ktorym sprawdzamy uprawnienia&nbsp; &nbsp;uzytkownika musi miec ustawione pole aroId - ktore na chwil obecna jest id uzytkownika dla z tabeli users.</p><div class="codebox"><pre><code>&lt;?php
App::import(&quot;Component&quot;,&quot;Acl&quot;);

class RecordControllBehavior extends ModelBehavior
{

    private $Acl;
    private $Aro;
    private $Aco;
    
    public function setup($model,$config){
        $this-&gt;Acl = new AclComponent();
        $this-&gt;Aro = $model-&gt;getModelObject(&quot;Aro&quot;);
        $this-&gt;Aco = $model-&gt;getModelObject(&quot;Aco&quot;);
    }

    public function beforeFind($model,$queryData) {
        if(empty($model-&gt;aroId))
            return false;

        //TODO: uwglednic warunki OR, NOT i IN
        if(!empty($queryData[&#039;conditions&#039;][$model-&gt;primaryKey])):
            if($this-&gt;Acl-&gt;check(array(&#039;model&#039; =&gt; &#039;User&#039;, &#039;foreign_key&#039; =&gt; $model-&gt;aroId), array(&quot;model&quot; =&gt; $model-&gt;name , &quot;foreign_key&quot; =&gt; $queryData[&#039;conditions&#039;][$model-&gt;primaryKey]), &quot;read&quot;) !== true)
                return false;
            else
                return $queryData;
        endif;

        $aco = $this-&gt;Aco-&gt;find(&#039;first&#039;, array(&#039;conditions&#039; =&gt; array(&#039;alias&#039; =&gt; $model-&gt;name), &quot;fields&quot; =&gt; array(&quot;id&quot;, &quot;lft&quot;,&quot;rght&quot;)));
        $acos = set::extract($this-&gt;Aco-&gt;find(&#039;all&#039;, array(&#039;recursive&#039; =&gt; -1, &#039;conditions&#039; =&gt; array(&#039;lft &gt;=&#039; =&gt; $aco[&#039;Aco&#039;][&#039;lft&#039;], &#039;rght &lt;=&#039; =&gt; $aco[&#039;Aco&#039;][&#039;rght&#039;], &quot;NOT&quot; =&gt;array(&quot;id&quot; =&gt; $aco[&#039;Aco&#039;][&#039;id&#039;])), &quot;fields&quot; =&gt;array(&quot;foreign_key&quot;))),&quot;{n}.Aco.foreign_key&quot;);

        $stack = array();
        foreach($acos as $aco)
            if($this-&gt;Acl-&gt;check(array(&#039;model&#039; =&gt; &#039;User&#039;, &#039;foreign_key&#039; =&gt; $model-&gt;aroId),array(&quot;model&quot; =&gt; $model-&gt;name , &quot;foreign_key&quot; =&gt; $aco), &quot;read&quot;))
                $stack[] = $aco;

        $queryData[&#039;conditions&#039;][$model-&gt;primaryKey] = $stack;
        return $queryData;
    }

     public function beforeSave($model,$options) {
         if(empty($model-&gt;aroId))
            return false;
            
         if(empty($model-&gt;data[$model-&gt;name][$model-&gt;primaryKey])) {
            if($this-&gt;Acl-&gt;check(array(&#039;model&#039; =&gt; &#039;User&#039;, &#039;foreign_key&#039; =&gt; $model-&gt;aroId), $model-&gt;name, &quot;create&quot;) !== true)
                return false;

         } else
            if($this-&gt;Acl-&gt;check(array(&#039;model&#039; =&gt; &#039;User&#039;, &#039;foreign_key&#039; =&gt; $model-&gt;aroId), array(&quot;model&quot; =&gt; $model-&gt;name , &quot;foreign_key&quot; =&gt; $model-&gt;data[$model-&gt;name][$model-&gt;primaryKey]), &quot;update&quot;) !== true)
                return false;

         return true;
     }

     public function beforeDelete($model, $cascade) {
         if(empty($model-&gt;aroId))
            return false;

        if($this-&gt;Acl-&gt;check(array(&#039;model&#039; =&gt; &#039;User&#039;, &#039;foreign_key&#039; =&gt; $model-&gt;aroId), array(&quot;model&quot; =&gt; $model-&gt;name , &quot;foreign_key&quot; =&gt; $model-&gt;id), &quot;delete&quot;) !== true)
            return false;

        return true;
     }
}</code></pre></div><p>tabele : <br /></p><div class="codebox"><pre><code>CREATE TABLE IF NOT EXISTS `products` (
  `id` int(10) NOT NULL auto_increment,
  `name` varchar(32) NOT NULL,
  `tit` varchar(32) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=12 ;

--
-- Dumping data for table `products`
--

INSERT INTO `products` (`id`, `name`, `tit`) VALUES
(2, &#039;pr2&#039;, &#039;&#039;),
(3, &#039;pr3&#039;, &#039;&#039;),
(4, &#039;pr4&#039;, &#039;&#039;),
(5, &#039;pr5&#039;, &#039;&#039;),
(6, &#039;pr6&#039;, &#039;&#039;),
(7, &#039;pr7&#039;, &#039;&#039;),
(8, &#039;pr8&#039;, &#039;&#039;),
(9, &#039;pr9&#039;, &#039;&#039;),
(10, &#039;pr10&#039;, &#039;&#039;);</code></pre></div><div class="codebox"><pre><code>CREATE TABLE IF NOT EXISTS `users` (
  `id` int(10) NOT NULL auto_increment,
  `name` varchar(32) NOT NULL,
  `login` varchar(32) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;

--
-- Dumping data for table `users`
--

INSERT INTO `users` (`id`, `name`, `login`) VALUES
(1, &#039;user1&#039;, &#039;user1&#039;),
(2, &#039;user2&#039;, &#039;user2&#039;),
(3, &#039;user3&#039;, &#039;user3&#039;),
(4, &#039;user4&#039;, &#039;user4&#039;),
(5, &#039;user5&#039;, &#039;user5&#039;),
(6, &#039;user6&#039;, &#039;user6&#039;);</code></pre></div><p>acos ... aros </p><div class="codebox"><pre><code>       $aro = new Aro();
       $aco = new Aco();


       $groups = array(
        0 =&gt; array(
            &#039;alias&#039; =&gt; &#039;Product&#039;
        ));

    foreach($groups as $data)
    {
        //Remember to call create() when saving in loops...
        $aco-&gt;create($data);

        //Save data
        $aco-&gt;save();
    }


       $users = array(
        0 =&gt; array(
            &#039;alias&#039; =&gt; &#039;Product[1]&#039;,
            &#039;parent_id&#039; =&gt; 1,
            &#039;model&#039; =&gt; &#039;Product&#039;,
            &#039;foreign_key&#039; =&gt; 1,
        ),
        1 =&gt; array(
            &#039;alias&#039; =&gt; &#039;Product[2]&#039;,
            &#039;parent_id&#039; =&gt; 1,
            &#039;model&#039; =&gt; &#039;Product&#039;,
            &#039;foreign_key&#039; =&gt; 2,
        ),
        2 =&gt; array(
            &#039;alias&#039; =&gt; &#039;Product[3]&#039;,
            &#039;parent_id&#039; =&gt; 1,
            &#039;model&#039; =&gt; &#039;Product&#039;,
            &#039;foreign_key&#039; =&gt; 3,
        ),
        3 =&gt; array(
            &#039;alias&#039; =&gt; &#039;Product[4]&#039;,
            &#039;parent_id&#039; =&gt; 1,
            &#039;model&#039; =&gt; &#039;Product&#039;,
            &#039;foreign_key&#039; =&gt; 4,
        ),
         4 =&gt; array(
            &#039;alias&#039; =&gt; &#039;Product[5]&#039;,
            &#039;parent_id&#039; =&gt; 1,
            &#039;model&#039; =&gt; &#039;Product&#039;,
            &#039;foreign_key&#039; =&gt; 5,
        ),
        5 =&gt; array(
            &#039;alias&#039; =&gt; &#039;Product[6]&#039;,
            &#039;parent_id&#039; =&gt; 1,
            &#039;model&#039; =&gt; &#039;Product&#039;,
            &#039;foreign_key&#039; =&gt; 6,
        ),
         6 =&gt; array(
            &#039;alias&#039; =&gt; &#039;Product[7]&#039;,
            &#039;parent_id&#039; =&gt; 1,
            &#039;model&#039; =&gt; &#039;Product&#039;,
            &#039;foreign_key&#039; =&gt; 7,
        ),
        7 =&gt; array(
            &#039;alias&#039; =&gt; &#039;Product[8]&#039;,
            &#039;parent_id&#039; =&gt; 1,
            &#039;model&#039; =&gt; &#039;Product&#039;,
            &#039;foreign_key&#039; =&gt; 8,
        ),
        8 =&gt; array(
            &#039;alias&#039; =&gt; &#039;Product[9]&#039;,
            &#039;parent_id&#039; =&gt; 1,
            &#039;model&#039; =&gt; &#039;Product&#039;,
            &#039;foreign_key&#039; =&gt; 9,
        ),
        9 =&gt; array(
            &#039;alias&#039; =&gt; &#039;Product[10]&#039;,
            &#039;parent_id&#039; =&gt; 1,
            &#039;model&#039; =&gt; &#039;Product&#039;,
            &#039;foreign_key&#039; =&gt; 10,
        ),
    );

    //Iterate and create AROs (as children)
    foreach($users as $data)
    {
        //Remember to call create() when saving in loops...
        $aco-&gt;create($data);
        //Save data
        $aco-&gt;save();
    }


//Here&#039;s all of our group info in an array we can iterate through
    $groups = array(
        0 =&gt; array(
            &#039;alias&#039; =&gt; &#039;User&#039;
        ),
        
        1 =&gt; array(
            &#039;alias&#039; =&gt; &#039;Admin&#039;
        ),
    );

    //Iterate and create ARO groups
    foreach($groups as $data)
    {
        //Remember to call create() when saving in loops...
        $aro-&gt;create($data);

        //Save data
        $aro-&gt;save();
    }



       $users = array(
        0 =&gt; array(
            &#039;alias&#039; =&gt; &#039;User[1]&#039;,
            &#039;parent_id&#039; =&gt; 1,
            &#039;model&#039; =&gt; &#039;User&#039;,
            &#039;foreign_key&#039; =&gt; 1,
        ),
        1 =&gt; array(
            &#039;alias&#039; =&gt; &#039;User[2]&#039;,
            &#039;parent_id&#039; =&gt; 1,
            &#039;model&#039; =&gt; &#039;User&#039;,
            &#039;foreign_key&#039; =&gt; 2,
        ),
        2 =&gt; array(
            &#039;alias&#039; =&gt; &#039;User[3]&#039;,
            &#039;parent_id&#039; =&gt; 1,
            &#039;model&#039; =&gt; &#039;User&#039;,
            &#039;foreign_key&#039; =&gt; 3,
        ),
        3 =&gt; array(
            &#039;alias&#039; =&gt; &#039;User[4]&#039;,
            &#039;parent_id&#039; =&gt; 1,
            &#039;model&#039; =&gt; &#039;User&#039;,
            &#039;foreign_key&#039; =&gt; 4,
        ),
        4 =&gt; array(
            &#039;alias&#039; =&gt; &#039;User[5]&#039;,
            &#039;parent_id&#039; =&gt; 1,
            &#039;model&#039; =&gt; &#039;User&#039;,
            &#039;foreign_key&#039; =&gt; 5,
        ),
        5 =&gt; array(
            &#039;alias&#039; =&gt; &#039;User[6]&#039;,
            &#039;parent_id&#039; =&gt; 2,
            &#039;model&#039; =&gt; &#039;User&#039;,
            &#039;foreign_key&#039; =&gt; 6,
        )        
    );

    //Iterate and create AROs (as children)
    foreach($users as $data)
    {
        
        //Remember to call create() when saving in loops...
        $aro-&gt;create($data);

        //Save data
        $aro-&gt;save();        
    }

    //Other action logic goes here...

       
       $this-&gt;Acl-&gt;allow(array(&#039;model&#039; =&gt; &#039;User&#039;, &#039;foreign_key&#039; =&gt; 1), array(&#039;model&#039; =&gt; &quot;Product&quot; , &quot;foreign_key&quot; =&gt; &quot;1&quot;),array(&quot;read&quot;));
       $this-&gt;Acl-&gt;allow(array(&#039;model&#039; =&gt; &#039;User&#039;, &#039;foreign_key&#039; =&gt; 1), array(&#039;model&#039; =&gt; &quot;Product&quot; , &quot;foreign_key&quot; =&gt; &quot;2&quot;),array(&quot;read&quot;));
       $this-&gt;Acl-&gt;allow(array(&#039;model&#039; =&gt; &#039;User&#039;, &#039;foreign_key&#039; =&gt; 1), array(&#039;model&#039; =&gt; &quot;Product&quot; , &quot;foreign_key&quot; =&gt; &quot;3&quot;),array(&quot;read&quot;));
       $this-&gt;Acl-&gt;allow(array(&#039;model&#039; =&gt; &#039;User&#039;, &#039;foreign_key&#039; =&gt; 1), array(&#039;model&#039; =&gt; &quot;Product&quot; , &quot;foreign_key&quot; =&gt; &quot;4&quot;),array(&quot;read&quot;));
       $this-&gt;Acl-&gt;allow(array(&#039;model&#039; =&gt; &#039;User&#039;, &#039;foreign_key&#039; =&gt; 1), array(&#039;model&#039; =&gt; &quot;Product&quot; , &quot;foreign_key&quot; =&gt; &quot;5&quot;),array(&quot;read&quot;));
       
       $this-&gt;Acl-&gt;allow(array(&#039;model&#039; =&gt; &#039;User&#039;, &#039;foreign_key&#039; =&gt; 2), array(&#039;model&#039; =&gt; &quot;Product&quot; , &quot;foreign_key&quot; =&gt; &quot;6&quot;),array(&quot;read&quot;));
       $this-&gt;Acl-&gt;allow(array(&#039;model&#039; =&gt; &#039;User&#039;, &#039;foreign_key&#039; =&gt; 2), array(&#039;model&#039; =&gt; &quot;Product&quot; , &quot;foreign_key&quot; =&gt; &quot;7&quot;),array(&quot;read&quot;));
       $this-&gt;Acl-&gt;allow(array(&#039;model&#039; =&gt; &#039;User&#039;, &#039;foreign_key&#039; =&gt; 2), array(&#039;model&#039; =&gt; &quot;Product&quot; , &quot;foreign_key&quot; =&gt; &quot;8&quot;),array(&quot;read&quot;));


       $this-&gt;Acl-&gt;allow(array(&#039;model&#039; =&gt; &#039;User&#039;, &#039;foreign_key&#039; =&gt; 3), array(&#039;model&#039; =&gt; &quot;Product&quot; , &quot;foreign_key&quot; =&gt; &quot;6&quot;),array(&quot;read&quot;));
       $this-&gt;Acl-&gt;allow(array(&#039;model&#039; =&gt; &#039;User&#039;, &#039;foreign_key&#039; =&gt; 3), array(&#039;model&#039; =&gt; &quot;Product&quot; , &quot;foreign_key&quot; =&gt; &quot;7&quot;),array(&quot;read&quot;));
       $this-&gt;Acl-&gt;allow(array(&#039;model&#039; =&gt; &#039;User&#039;, &#039;foreign_key&#039; =&gt; 3), array(&#039;model&#039; =&gt; &quot;Product&quot; , &quot;foreign_key&quot; =&gt; &quot;8&quot;),array(&quot;read&quot;));
       $this-&gt;Acl-&gt;allow(array(&#039;model&#039; =&gt; &#039;User&#039;, &#039;foreign_key&#039; =&gt; 3), array(&#039;model&#039; =&gt; &quot;Product&quot; , &quot;foreign_key&quot; =&gt; &quot;1&quot;),array(&quot;read&quot;));
       $this-&gt;Acl-&gt;allow(array(&#039;model&#039; =&gt; &#039;User&#039;, &#039;foreign_key&#039; =&gt; 3), array(&#039;model&#039; =&gt; &quot;Product&quot; , &quot;foreign_key&quot; =&gt; &quot;2&quot;),array(&quot;read&quot;));

       $this-&gt;Acl-&gt;allow(array(&#039;model&#039; =&gt; &#039;User&#039;, &#039;foreign_key&#039; =&gt; 4), &quot;Product&quot;,array(&quot;read&quot;));

       $this-&gt;Acl-&gt;allow(&quot;Admin&quot;, &quot;Product&quot;);</code></pre></div><p>edit 1:<br />udalo sie zoptymalizować callback beforeFind, w chwili obecnej niezależnie od ilości liści w drzewie ( rekordów danego modelu) do sprawdzenia uprawnień (łącznie z dziedziczeniem uprawnień z gałęzi)&nbsp; potrzebne są tylko 2 zapytania. Jak będe mieć wenę to behavior będzie skończony dziś.</p>]]></description>
			<author><![CDATA[null@example.com (robal77)]]></author>
			<pubDate>Wed, 25 Mar 2009 08:26:41 +0000</pubDate>
			<guid>http://forum.cakephp.org.pl/post/232/#p232</guid>
		</item>
	</channel>
</rss>

