Showing posts with label Google. Show all posts
Showing posts with label Google. Show all posts

Saturday, 7 January 2012

PHP to Paper.......... Getting a list of Printers

If you've read the first part of this little series of posts, you'll know the aim is to allow a PHP web app to print, the web app has just Authenticated with Google and is now ready to start working with the Google Cloud Print Interfaces.

In this post, we'll take the next step to get things up and running, getting a list of the users printers, so we have the needed ID to send print jobs to.
This is really the first stage, really getting stuck into the Google Cloud Print service. When you add a printer to your Google Cloud Print Manager (using the user details which the web app is getting the Authentication Token for) it is given an ID which up till this point is kept hidden but the system will need it.
HINT: To help things out down the line, I would strongly suggest, whenever you add a printer to the Google Cloud Print Manager you rename it to something nice and friendly - you'll see why shortly.
Ok now for a little bit of code. We will start with setting up the client object which will be used for communicating with the interfaces:

// Google User Email:
$G_Email = "your_google_acount@googlemail.com";
// Google User Password:
$G_Pass = "your_google_acount_password";
// Create a Gdata client for the Google Cloud Print service:
$client = Zend_Gdata_ClientLogin::getHttpClient($G_Email, $G_Pass, 'cloudprint');

You'll notice, this is the same object we used when we got the authentication token. But we now need to add the following two lines, these need to be present for the Google Cloud Print servers to interact with us.:

// Add the hadders to the Client:
$client->setHeaders('Authorization','GoogleLogin auth='.$Client_Login_Token);
$client->setHeaders('X-CloudPrint-Proxy','a-name-for-your-system');

Now that's done, we are ready to start using the interfaces. The next step towards being able to print, is getting a list of the printers which the user account can use. You need this list to get hold of the Google appointed ID for the printer you want to use. To get the list we need to use the search interface. The request will return a JSON object:

// GCP Interface to list printers:
$client->setUri('http://www.google.com/cloudprint/interface/search?output=json');
// Request the list of printers:
$response = $client->request(Zend_Http_Client::POST);

We can now perform a quick test on the object to see if there was an authentication error for example:

// Test the response for an auth error:
if ($response->getStatus() == 403) {
    // Handle the error here.........
}

Now we have the JSON object which contains a couple of details of each of the users printers we can decode it into a PHP Array and we have our list. If however you wanted to allow your user to select a printer to use, you could process the array a little to make it easier to work with, and make it a little more user friendly for your user:

// Decode the result:
$result = json_decode($response->getBody(), true);
// Store an array of printers:
$printerList = array();
// Loop through the printers and to get capabilities:
foreach ($result['printers'] as $printer) {
    // Store details about this printer:
    $currentPrinter = array();
    // Store the printers ID:
    $currentPrinter['id'] =  $printer['id'];
    // Try getting the display name, else get the default name:
    $currentPrinter['name'] = (empty($printer['displayName']))?$printer['name']:$printer['displayName'];
    // Add this printer to the overall list:
    $printerList[] = $currentPrinter;
}

Now remember above I said rename your printer in the Google Cloud Print Manager, if you did your user will see a user friendly name, if you didn't, they will get the generic printer name, normally its make and model.

So up to now we have:
The next step is......sending though something to print!

Thursday, 29 December 2011

PHP to Paper.......... Where to Start - Authenticating with Google

After being tasked with getting a PHP web application to print for itself, and deciding Google Cloud Print was looking like the best solution, I set about finding the solution to my problem.

After reading the official doc's and deciding either this really isn't how Google currently intended for the service to be used or they really just hadn't had chance to put much into the doc's I widened my search.
I came across a very useful chap called Kin Lane, he has made some excellent blog posts on the subject and turns out he works in the field of printing. After a quick email and him agreeing that I *should* be able to achieve what I wanted with Google Cloud Print, I set about solving my puzzle.

At the time of writing this, there is very little in the way of code examples using Google Cloud Print, in fact the only one I had found focusing on submitting a job was this sample. This however left some questions to which I found no useful answers!

To start with, Google have provided some interfaces for working with the service. Kin Lane has covered connecting to some these services (receiving print jobs, rather than submitting print jobs, but it was a very good jump start) with PHP on his blog. The solution focuses on the use of the Zend Framework, which was handy with it being the framework the web app uses!

The Pseudo Answer:
  • The web app has a dedicated Google user account (in my case, this is one of the Google App accounts which is a group email address) 
  • Setup some printers for the user account as described here.
  • The system requests an Authentication Token from Google to allow use of the service.
  • The system can now access the printers and use the interfaces.
    • The system can now get a list of printers, and
    • The system can now submit jobs to be printed!
The Start of the Real Answer:

After setting up the printers for a user account, as described here.
The first step the system needs to take is getting an Authentication Token from Google which allows us to use the users services, in this case, the printers you have setup.

// Google User Email:
$G_Email = "your_google_acount@googlemail.com";
// Google User Password:
$G_Pass = "your_google_acount_password";
// Create a Gdata client for the Google Cloud Print service:
$client = Zend_Gdata_ClientLogin::getHttpClient($G_Email, $G_Pass, 'cloudprint');
// Get the Authentication Token:
$Client_Login_Token = $client->getClientLoginToken();

Picture taken from Google

You'll notice, the use of the Zend Framework makes getting the Authentication Token extremely easy, however, and this is quite a big however, there is the potential Google will deny an Authentication Token, and instead request a captcha to be completed, this is covered by the Zend Doc's and other guides on the web, but I will try to come back to it later due to this causing an error for an automated system.
Another thing to note is, once Google has served an Authentication Token, it remains valid for several days, I have read this can be anywhere from 14 days to 28 days, so to play it safe, I request a new token every 10 days to play it safe.

In the next entry I will cover the use of the different interfaces to allow us to print.

Saturday, 24 December 2011

PHP to Paper..........The Introduction to Printing

Well I'm sure if you have found this blog entry, it's not because you need to be taught how to suck eggs! I recently ran into the brick wall that is, getting a PHP web application to print directly to a printer, no user dialogs, and the printer a sitting on the opposite side of the world to the server, I'm guessing if you have found this, you are looking for a solution to the very same thing.
Google Cloud Print
Imagine this for a situation, you run an online shop, the server is online in a far away place, the office is in one location where workers maintain the shop and your items listed, in another location is your warehouse, every day someone in your warehouse has to log in to print out a picking note and a delivery note.
Now how much easier would it be if every time an order came in, the printer sitting in the warehouse churned out the paperwork the minute your customer confirmed their order?!

Well this was a challenge I had been tasked with, allowing a PHP based back office system to print, no dialogs, no questions asked. So where to start, I wanted a solution which was both simple and easy to maintain. As printers come and go, I wanted a solution that was somewhat future proof and didn't need much code work to change or add printers and the possibility of printing to more than one location.

After a little thinking and a little bit of trawling, I kept coming back to one possibility which the more I thought about the more I thought it's got to hold the answer.
If you haven't heard about it yet, you soon will, the awesome giant that is Google have come up with an excellent new beta product, its called Google Cloud Print, and while at the moment I don't really think it's intended to be an answer to the problem, the more I thought about it, the more I thought it was going to be the answer. Over the next few blog posts I am going to share my findings, and show you how I've used Google Cloud Print to get my PHP system to print directly to my printers, that's the server (in this case) stateside printing directly to a printer roughly 2500 miles away from it!


So a final word to end the introduction, before I get stuck into the nitty gritty: What is Google Cloud Print I hear you ask:

Print anywhere, from any device.
Google Cloud Print is a new technology that connects your printers to the web. Using Google Cloud Print, you can make your home and work printers available to you and anyone you choose, from the applications you use every day. Google Cloud Print works on your phone, tablet, Chromebook, PC, and any other web-connected device you want to print from.
A diagram showing the workflow of Google Cloud Print

Looking for the official help? Click Here for the developers doc's, but be warned as at the time of writing this, the doc's are somewhat limited due to Google Cloud Print still being in beta.

Sunday, 6 March 2011

Adding a jQuery UI Dialog to your blogger.com

One item I find very useful from the jQuery UI range is the .dialog(), its a much nicer sight than the typical browser alert() box!

In this little tutorial I will show you how to add a jQuery wrapper function which will allow you to show a dialog with a custom title and contents from anywhere in your blog. I have opted for a wrapper function as I generally don't change my dialog's, you could, if you wanted change things to allow you to customize the dialog a little more. But for now, I'll stick with the simple stuff!

If you have looked at my post on "Adding jQuery to your blogger.com"  and you were keen, you may have noticed, in the demo towards the bottom of the page, where I used the jQuery UI .button() effect to change a boring button for a nice pretty one, I also changed what happens when you click the button (just in case you wanted to see it really does work) yep, its a dialog.

Just in case you want to see it again:


Lets see some code:


Firstly lets add the HTML needed for the dialog:
  1. Login to your blog. At the top right of the page (for me anyway) click Design 
  2. Click on the Edit HTML tab.
  3. Now search for the line </body>
  4. Just before the line, add the following code, this will be the holder for the dialog:
  5. <div id='dialogMsg' style='display:none;'/>
Now its time for the jQuery wrapper function which will do the work of displaying the default dialog:
  1. Whilst still in the Edit HTML section, we are going to add some code to our jQuery block we setup if you followed "Adding jQuery to your blogger.com".
  2. Find the line $(document).ready(function(){ 
  3. Just after the line, add the following code:
  4. $.fn.dialogPopup=function(title, content) {
      $(this).html('');
      $(this).dialog('destroy');
      $(this).html(content);
      $(this).dialog({
       title:title, 
       modal:true,
       autoOpen:true,
       buttons: {
        "Close": function() {
         $(this).dialog("close");
        }
       },
       destroyOnEscape:true
      });
     };
    
OK so now all the codes in place lets see how we could use our new wrapper function.

A basic button example:
  1. Start by creating a New Post, or Editing an existing one.
  2. Complete your page first using the Compose tab (if thats how you normally do things).
  3. Click on the Edit HTML tab. Now we'll add the HTML and jQuery code which does the niceties.
  4. Find the part of the code where you want to add the, in this case button and add the following HTML:
  5. <input id="myNewButton" type="button" value="Nice jQuery UI Button" />
  6. Finally add a little script block which will allow us to setup the jQuery code just for this post:
  7. <script type="text/javascript">
     $(function(){
      $("#myNewButton").click(function(){
       $("#dialogMsg").dialogPopup("This is the title...", "And this is the contents of the dialog!"); 
      }).button();
     });
    </script>
    
The results from above:


What else could we use this for? What every you can think of!!! How about stopping someone right licking on the page (go on, you should know by now that you can try it out).
Wanna see how I did it:

$(this).mousedown(function(event) {
   switch (event.which) {
    case 3:
     $(document).bind("contextmenu",function(){return false;});
     $("#dialogMsg").dialogPopup("No right clicking....", "I do hope that was a test and ya ain't trying to pinch my code ya cheeky bugger :p ");
     break;
    }
  });


Scoobler.

Some jQuery books on Amazon.com:

JavaScript: The Definitive Guide     Murach's JavaScript and DOM Scripting (Murach: Training & Reference)     jQuery UI 1.6: The User Interface Library for jQuery

Saturday, 5 March 2011

Adding jQuery to your blogger.com

jQuery is one of my favorite frameworks available today. The sheer versatility of the framework is outstanding. So you can expect to see a fair few posts on jQuery throughout this blog. Hopefully you will find them useful - please feel free to ask questions, I will help out if and where I can!


I will dive straight in, with this being the first blog on the site, I may as well make it about my experience with setting up the blog, preparing it for the many posts to come.

Adding jQuery to blogger.com:
  1. Login to your blog. At the top right of the page (for me anyway) click Design 
  2. Click on the Edit HTML tab.
  3. Now search for the line <head>
  4. Now you need to add the jQuery core (I will be using the Google CDN version), after <head> add the following lines - you will notice I am also adding the jQuery UI aswell:
  5. <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" type="text/javascript">
    <script src='http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.10/jquery-ui.min.js' type='text/javascript'/>
    <link href='http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.10/themes/base/jquery-ui.css' rel='stylesheet' type='text/css'/>
    
  6. Next is to add any jQuery code you want to load with EVERY page:
  7. <script type='text/javascript'>
    //<![CDATA[
    $(document).ready(function() {
    
    });
    //]]>
    </script>
    
  8. Now you can place anything you want to run when the blog loads in the normal way. 
For example:
If you wanted to turn all buttons that you place on your blog:
<input type="button" id="myButton" value="This Button" />
Into jQuery UI buttons you could do this:

<script type='text/javascript'>
//<![CDATA[
$(document).ready(function() {
$(":button").button();
});
//]]>
</script>


Note:
The reason for adding the code between:
//<![CDATA[
.....
//]]>
Is that when you submit the code, it stops the code being interpreted, and characters being swapped for their ASCII representation. This isn't really a problem for most browsers, but it makes the code much harder to read next time you fancy changing something!

Scoobler.

Some jQuery books on Amazon.com:

jQuery in Action, Second Edition    jQuery Cookbook: Solutions & Examples for jQuery Developers (Animal Guide)    jQuery: Novice to Ninja
Scroll to Top