| @ -0,0 +1,87 @@ | |||||
| --- | |||||
| title: Sharing Data from PHP to JavaScript | |||||
| author: Brett Langdon | |||||
| date: 2014-03-16 | |||||
| template: article.jade | |||||
| --- | |||||
| A quick example of how I decided to share dynamic content from PHP with my JavaScript. | |||||
| --- | |||||
| So the other day I was refactoring some of the client side code I was working on and | |||||
| came across something like the following: | |||||
| ### page.php | |||||
| ```php | |||||
| <html> | |||||
| ... | |||||
| <script type="text/javascript"> | |||||
| var modelTitle = "<?=$myModel->getTitle()?>"; | |||||
| // do something with modelTitle | |||||
| </script> | |||||
| </html> | |||||
| ``` | |||||
| There isn't really anything wrong here, in fact this seems to be a fairly common practice | |||||
| (from the little research I did). So... whats the big deal? Why write an article about it? | |||||
| My issue with the above is, what if the JavaScript gets fairly large (as mine was). The | |||||
| ideal thing to do is to move the js into it's own file, minify/compress it and serve it | |||||
| from a CDN so it doesn't effect page load time. But, now we have content that needs to be | |||||
| added dynamically from the PHP script in order for the js to run. How do we solve it? The | |||||
| approach that I took, which probably isn't original at all, but I think neat enough to | |||||
| share, was to let PHP make the data available to the script through `window.data`. | |||||
| ### page.php | |||||
| ```php | |||||
| <html> | |||||
| ... | |||||
| <?php | |||||
| $pageData = array( | |||||
| 'modelTitle' => $myModel->getTitle(), | |||||
| ); | |||||
| ?> | |||||
| <script type="text/javascript"> | |||||
| window.data = <?=json_encode($pageData)?>; | |||||
| </script> | |||||
| <script type="text/javascript" src="//my-cdn.com/scripts/page-script.min.js"></script> | |||||
| </html> | |||||
| ``` | |||||
| ### page-script.js | |||||
| ```javascript | |||||
| // window.data.modelTitle is available for me to use | |||||
| console.log("My Model Title: " + window.data.modelTitle); | |||||
| ``` | |||||
| Nothing really fancy, shocking, new or different here, just passing data from PHP to js. | |||||
| Something to note is that we have to have our PHP code set `window.data` before we load | |||||
| our external script so that `window.data` will be available when the script loads. Which | |||||
| this shouldn't be too much of an issue since most web developers are used to putting all | |||||
| of their `script` tags at the end of the page. | |||||
| Some might wonder why I decided to use `window.data`, why not just set | |||||
| `var modelTitle = "<?=$myModel->getTitle()?>";`? I think it is better to try and have a | |||||
| convention for where the data from the page will come from. Having to rely on a bunch of | |||||
| global variables being set isn't really a safe way to write this. What if you overwrite | |||||
| an existing variable or if some other script overwrites your data from the PHP script? | |||||
| This is still a cause for concern with `window.data`, but at least you only have to keep | |||||
| track of a single variable. As well, I think organizationally it is easier and more concise | |||||
| to have `window.data = <?=json_encode($pageData)?>;` as opposed to: | |||||
| ```php | |||||
| var modelTitle = "<?=$myModel->getTitle()?>"; | |||||
| var modelId = "<?=$myModel->getId()?>"; | |||||
| var username = "<?=getCurrentUser()?>"; | |||||
| ... | |||||
| ``` | |||||
| I am sure there are other ways to do this sort of thing, like with AJAX or having an | |||||
| initialization function that PHP calls with the correct variables it needs to pass, etc. | |||||
| This was just what I came up with and the approach I decided to take. | |||||
| If anyone has other methods of sharing dynamic content between PHP and js, please leave a | |||||
| comment and let me know, I am curious as to what most other devs are doing to handle this. | |||||