Why not making this a clean component or custom View class, e.g.
SerializeView etc?
Hacking this in the AppController (which should stay lean) doesnt sound
right to me.
Also, re-usability is not very good this way.
And don't use private, use protected :P
Am Montag, 28. Oktober 2013 01:50:38 UTC+1 schrieb Matt Bowden:
>
> No question here, just thought I'd share a solution to a problem I needed
> to solve.
>
> I'm working on a decoupled application where the back-end is all CakePHP
> and the front-end is all Javascript. The front-end communicates with the
> back-end as a RESTful API. I could write a handful of posts in here about
> some of the problems I ran into, but right now, I just want to share a
> trick I developed with serializing view variables.
>
> I use jQuery AJAX functions to get json from CakePHP. I got tired of
> writing this all over my controllers:
>
> $this->set('_serialize', array('omg', 'so' 'many', 'view', 'vars'));
>
> So I decided to automatically serialize all my view variables in my app
> controller's beforeRender callback. (beforeRender is called after all the
> application logic is finished, right before the view is rendered. Good name
> for it huh?)
>
> // AppController.php
> public function beforeRender(){
>
> // When setting _serialize, you pass in a list of variable names.
>
> // array_keys($this->viewVars) returns an array of the names of the view
> variables
>
> $this->set('_serialize', array_keys($this->viewVars));
>
> }
>
> That works, but if I need a way to ignore some view variables, I would
> have to do something a little more elaborate.
>
> // AppController.php
> public function beforeRender(){
>
> // When setting _serialize, you pass in a list of variable names.
> // array_keys($this->viewVars) returns an array of the names of the view
> variables
>
> $viewVars = array_keys($this->viewVars);
>
>
>
> // I include _serialize to prevent the possibility of a _serialize inside
> another _serialize
>
> $varsToIgnore = array('_serialize', 'debugToolbarPanels',
> 'varThatOnlyAppliesToBackEnd');
>
>
>
> foreach($varsToIgnore as $varToIgnore){
>
> // Might be a better way of doing this, but it works and seems safe
>
> // in_array checks if a value exists in an array
>
> // unset removes an array or array index in this case
>
> // array_search returns the index of where a value is found
>
> if(in_array($varToIgnore, $viewVars))
> unset($viewVars[array_search($varToIgnore, $viewVars)]);
>
> }
>
>
>
> // Reindex the viewVars array after removing variables from above
>
> // I don't know if this is really necessary, but I did it anyway.
>
> $viewVars = array_values($viewVars);
>
>
>
> $this->set('_serialize', $viewVars);
>
> }
>
> My beforeRender method is getting a little too long for my liking, so I
> decided to clean it up a bit, by moving the variables to ignore into a
> private property and the logic to serialize the view variables into its own
> private method.
>
> // AppController.php
> // A shorter name would be easier to type
> private var $viewVariablesNotToSerialize = array('_serialize',
> 'debugToolbarPanels', 'varThatOnlyAppliesToBackEnd');
>
> public function beforeRender(){
>
> $this->__serializeViewVars();
>
> }
>
> private function __serializeViewVars(){
>
> // When setting _serialize, you pass in a list of variable names.
> // array_keys($this->viewVars) returns an array of the names of the view
> variables
>
> $viewVars = array_keys($this->viewVars);
>
>
>
> foreach($this->__viewVarsNotToSerialize as $varToIgnore){
>
> // Might be a better way of doing this, but it works and seems safe
>
> // in_array checks if a value exists in an array
>
> // unset removes an array or array index in this case
>
> // array_search returns the index of where a value is found
>
> if(in_array($varToIgnore, $viewVars))
> unset($viewVars[array_search($varToIgnore, $viewVars)]);
>
> }
>
>
>
> // Reindex the viewVars array after remove variables from above
>
> // I don't know if this is really necessary, but I did it anyway.
>
> $viewVars = array_values($viewVars);
>
>
>
> $this->set('_serialize', $viewVars);
>
> }
>
> I hope someone finds this useful.
>
> Matt Bowden
> Web Application Developer
> Skybrick
>
--
Like Us on FaceBook https://www.facebook.com/CakePHP
Find us on Twitter http://twitter.com/CakePHP
---
You received this message because you are subscribed to the Google Groups
"CakePHP" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/cake-php.
For more options, visit https://groups.google.com/groups/opt_out.