Well, what would you know! Having written out what I wanted to get,
and by simply applying a little brainpower, I came up with the
solution. What I did was write a CakePHP component and helper. First
off, here is the component:
<?php
class JsonComponent extends Component {
var $json_for_layout = array();
function addToJSON($add = array()){
$this->json_for_layout = array_merge($this->json_for_layout,
$add);
}
function getJSON() {
return $this->json_for_layout;
}
}
?>
What this component does is allows me to pass in arrays to a global
array in the controller, json_for_layout. Every time I call this from
a controller, it add's to the array. The next step is in my
beforeRender() function in my AppController, I do this:
$this->set('json_for_layout', $this->Json->getJSON());
This sets my view variable. I then need to actually generate the JSON
and output it to a var:
<?php
class JsonHelper extends JavascriptHelper {
function renderJSON($data, $varname = 'Pastemonkey'){
$json = json_encode($data);
$output = $this->codeBlock('var ' . $varname . ' = ' . $json .
';');
return $output;
}
}
?>
Now, what I do is inside my header, I echo this out to the view:
<?php e($json->renderJSON($json_for_layout));?>
And thats it! Check your DOM tab in firebug to see the global object
now available.
For example, if I pass in my sitename, I can simply call it with:
Pastemonkey.sitename
Hope this helps out a few people, and I intend to write a more
thorough blog about it tomorrow.
On 01/11/2007, Tane Piper <[EMAIL PROTECTED]> wrote:
> Apologies for the cross posting here, but I myself am at a bit of a
> crossroads in my applications development, and I'd like to take the
> time to put out this email in the hopes that it generates some good
> discussion, and can maybe teach me a few things.
>
> A little background first to my issues. I am developing my
> application at the moment (pastemonkey.org) and it's being built on
> CakePHP and jQuery. At the moment, I'm using a lot of CakePHP's built
> in stuff to generate my HTML, and I'm using jQuery to do some simple
> Ajax stuff and some DOM manipulation.
>
> Where I am at a crossroads is how to do my client/server interaction
> with JSON. For example, I have the facility in place for inline
> comments. When you see a paste, you can double click on each line to
> create and view the comments. When you create one, there is code that
> generates the comment and enters the line number and paste ID.
>
> To display this, what I do is create an array of the line numbers, and
> generate JSON using PHP's inbuilt functions. So an array like this
> ('1', '2', '10', '15') becomes ["1", "2", "10", "15"]. What I then do
> is pass this to the view, and do this:
>
> <?php e($javascript->codeBlock('var lines = eval(' . $comment_lines . ')'));?>
>
> So what this does is it outputs
>
> var lines = eval( ["1", "2", "10", "15"]);
>
> I then have this function in my core javascript file:
>
> $('.geshi-output-view ol li').each(function(i){
> i++;
> $(this).attr('id', i);
> if ($.inArray(i, lines) != -1) {
> $(this).attr('style','').addClass('hasComment');
> }
> });
>
> What I am doing here is expecting there to already be a variable set
> called lines, and I check each line's ID (based on offset + 1) to see
> if it's in the JSON array, and if it does apply the class.
>
> It presents two issues - first it's ugly. It means I always have to
> have the javascript helper line above in any view I want to use it in,
> and I also expect the variable to be there (in the case of the view it
> always should be). I'm wondering if anyone know a much nicer, more
> global way to handle this?
>
> For example, Is there any way in PHP to generate a global object? For
> example a Pastemonkey object that I can attach to. e.g:
>
> Pastemonkey.Settings.sitename
> Pastemonkey.Comments[0]
> Pastemonkey.User.Colour.Header
> etc
>
> I'm basically looking for the cleanest way to handle persistent data
> from my server side that I can use client side with jQuery.
>
> Thanks
>
> --
> Tane Piper
> Blog - http://digitalspaghetti.me.uk
> AJAX Pastebin - http://pastemonkey.org
>
> This email is: [ ] blogable [ x ] ask first [ ] private
>
--
Tane Piper
Blog - http://digitalspaghetti.me.uk
AJAX Pastebin - http://pastemonkey.org
This email is: [ ] blogable [ x ] ask first [ ] private
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Cake
PHP" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/cake-php?hl=en
-~----------~----~----~----~------~----~------~--~---