The Cookbook is a collection of real world examples and tutorials of how you can use Zoop.
Integrating Zoop and Drupal
Here Zoop community member Jeremy will be walking us through how he integrated Zoop and Drupal. This tutorial will be created Wiki style in hopes that others will aid / update.
Here Zoop community member Jeremy will be walking us through how he integrated Zoop and Drupal. This tutorial will be created Wiki style in hopes that others will aid / update.
Objective
The purpose of this tutorial is to show you how to add a Zoop (1.3) application or page to Drupal 5 as a content page. These techniques will probably work in Drupal 4 but the function names are different. Additionally, I will explain how to integrate session management from Drupal into Zoop. The latter opens up the entire scope of user/session/subscription management modules to your Zoop app. ..Yes, you read that correctly. **I have not tested any of this with Zoop 1.5**
Nothing is written in stone reagarding what to include and what to exclude. I have no HTML in my pages other then a single div with an id attribute since my Zoop app is 100% Ajax.
__SAMPLE__
___END_SAMPLE__
The myapp.js file contains this along with the entire application.
__JS_SAMPLE__
embed = MyApp;
window.onload=function(){
if(embed){
loadEmbed('Embed' + embed,'myContentDiv','myZone');
}else{
alert('Error: No content specified for loading');
}
}
loadEmbed = function(what,where,zone){
var url='/skeleton/index.php/' + zone + '/' + what;
new Ajax.Updater(where,url,{method: 'get', onComplete: function(transport){initApp();}
});
}
__END_SAMPLE__
This js loads the content returned from /skeleton/index.php/myZone/EmbedMyApp/ in to myContentDiv and onComplete it runs initApp(). initApp() just sets some defaults on the page.
Before I start, know that I've been using this scenario on a large application for going on 9 months with absolutely no ill effects.
...Your mileage may vary and I may have left something out unintentionally (Though I'm pretty sure I didn't).
Are you ready?
Go get something to eat and a pot of coffee, this could take days! ;-)
1. Locate Your Drupal includes/bootstrap.inc file. (yes, Drupal needs to be installed already).
Take note of the path to that file.
2. Open the file session/session_component.php in your Zoop source directory. (yes, Zoop needs to be installed already)
3. change the name of the init function to something else. I renamed mine '_init'. You might prefer 'original_init' or 'mydoghasfleas'.
4. Paste in this shiny new init function. Make sure you replace 'your_drupal_bootstrap_path' with the path you took note of above. Make sure it's the full path to the bootstrap.inc file.
function init()
{
require_once 'your_drupal_bootstrap_path';
drupal_bootstrap(DRUPAL_SESSION_DATA_ONLY);
}
6. Your done.
Assuming everything was done correctly with the bootstrap integration above you're ready to use drupal and zoop together.
Here's a way to have your Zoop app depend on Drupal for permissions,user management, sessions, etc.
1. Open up the zone file for your zoop app.
2. In your initZone file use something like this condition to control whatever you want to control.
$user = $GLOBALS['user']; //This is one of the globals that Drupal creates.
//print_r($user); // Do this to see what you have access to.
if($user->uid > '1'){
if( $user->roles[4] == 'Premium Subscriber' || $user->roles[6] == 'Some Role'){
define_paying_subscriber_globals(); // A function that does stuff for these people.
}else{
// Unauthenticated user - must login via drupal
print "The Section is for paying subscribers only.";
exit;
}
}else if($user->uid == '0'){
print "You are not logged in.";
exit;
}
3. You can access this page outside drupal or you can integrate Ajax calls to this page in your drupal page (that's what I do). The latter is detailed on this page.
Now you can build your site using all the user and group management possibilities of Drupal and use zoop to build the core application. In my case, I use premium content and roles in Drupal to control what parts of the application my users can access. There is no need to limit yourself to the initZone function. You can access the drupal globals from anywhere you want.
gotchas with Drupal:
Go create something,
Jeremy Brooks
Before attempting to install the Zoop framework, please make sure you have a recent version of PHP installed (minimum PHP 4.4.8+, we recommend the most recent stable version of PHP 5) and working both from the command line and with a web server.
php /usr/local/zoop/zoop_create.php project hellophp /your/path/to/zoop/zoop_create.php project hello )Check the directory listing after the script runs succesfully. You should see a folder/directory named "hello."
GuiControls config includes.php objects tmp GuiWidgets config.php index.php public zones classes guiplugins mail templates
define('zoop_dir','/usr/local/zoop')
Change this line to make sure that the second argument of this define statement is the same as the location you installed zoop. Save the file and exit.
function pageDefault($inPath) { echo("Hello world!"); }
http://yourhost.com/path/to/hello/
You should see the output "Hello world!"
http://yourhost.com/path/to/hello/index.php/ByName/YourName
You should see the output "Hello YourName!"
How to install Xampp, Zoop and make a simple Hello World.
You can see Zoop power to speed and organize your PHP programming.
And here are the code snippets I used in this screencast:
/** * pageDefault * * @param mixed $inPath * @access public * @return void */ function pageDefault($inPath) { // You may usually want the following line, but for our demo we don't // $this->zoneRedirect("login"); global $sGlobals; global $gui; //this is for gets. It displays the page $gui->display("contact-form.tpl"); }
/** * postDefault * * @param mixed $inPath * @access public * @return void */ function postDefault($inPath) { global $sGlobals, $gui; //this is for posts, it handles when forms get submitted. $post = getPost(); $from = $post['address']; $to = 'justin@mailinator.com'; $cc = null; $subject = $post['subject']; $body = $post['message']; $msg = new message(); $msg->sendTextEmail($from, $to, $cc, $subject, $body); $gui->assign('message', 'Thanks for contacting us!'); $gui->display('message.tpl'); }
Note: It's not a good practice to actually display things in the post handlers. As a general rule, you should do your emailing and form handling in the post handler, then redirect to a page function to display feedback. Something like this:
/** * postDefault * * @param mixed $inPath * @access public * @return void */ function postDefault($inPath) { global $sGlobals; //this is for posts, it handles when forms get submitted. $post = getPost(); $from = $post['address']; $to = 'justin@mailinator.com'; $cc = null; $subject = $post['subject']; $body = $post['message']; $msg = new message(); $msg->sendTextEmail($from, $to, $cc, $subject, $body); zoneRedirect('thanks'); } /** * pageThanks * * @param mixed $inPath * @access public * @return void */ function pageThanks($inPath) { global $sGlobals, $gui; $gui->assign('message', 'Thanks for contacting us!'); $gui->display('message.tpl'); }
{include file="head.tpl"} <body> <h1>Contact Me!</h1> <p>Fill out the form below to contact me.</p> <form method="POST"> <div> <label for="name">Name:</label> <input name="name" id="name" type="text" /> </div> <div> <label for="address">Email address:</label> <input name="address" id="address" type="text" /> </div> <div> <label for="subject">Subject:</label> <input name="subject" id="subject" type="text" /> </div> <div> <label for="message">Message:</label> <textarea name="message" id="message"></textarea> </div> <input type="submit" name="submit" value="Send Message" /> </form> </body></html>