I just received a copy of Yii 1.1 Application Development Cookbook from Packt, and I’m already done reading it!. It’s a great book if you are working with the Yii Framework. Stay tuned for the full review!

  • Learn to use Yii more efficiently through plentiful Yii recipes on diverse topics
  • Make the most efficient use of your controller and views and reuse them
  • Automate error tracking and understand the Yii log and stack trace
  • Full of practically useful solutions and concepts that you can use in your application, with clearly explained code and all the necessary screenshots

Short story: Rendering a view over ajax in Yii Framework might include JS and CSS files. There is no way for Yii to know that some of these files might already be present in your DOM. Having your browser re-download and add duplicates of these files can or will lead to problems. A short snipped of JS code will filter away all JS and CSS references from incoming content, while leaving inline script and style intact. No server-side changes required. Scroll down for code.

Longer story: If you attempt to render a view with processing of script in Yii Framework you’ll end up with script tags for whichever scripts the components in your view requires. For example, if you have a view which uses the CListView component, you’ll end up with jquery.listview and jquery.js. This is pretty much what you would expect when rendering a view, but it will lead to problems if you are rendering this in an ajax response and the scripts in question are present in the DOM. Yii has no way to know that you have already executed a request, which returned these scripts. There has been some talk on the Yii Framework forums on how to tackle this problem, but so far I’ve not seen any implementations or hacks that’s been satisfactory.

Server side tracking of client scripts
One way to go is to keep track of the script files that has been sent to the client on the server, and reset this state when a full page request is executed. This might seem like a good idea, but once a user starts browsing with several tabs at the same time it gets complicated. It will require hacks to prevent resetting in cases where requests fail midways etc. The state must be kept not only on a path basis, but also for submitted content (ie ajax post), which would further complicate things.

My proposal is to use jQuerys dataFilter hook (via $.ajaxSetup), which is invoked after ajax request and allows you to filter any data returned before it’s passed on to ordinary success-handlers etc.

Update: Thanks to NLAC for some code improvements.

Simply include this script after jQuery, or add this function to your existing code:

$.ajaxSetup({
	global: true,
	dataFilter: function(data,type){
		//  only 'text' and 'html' dataType should be filtered
		if (type && type != "html" && type != "text")
		{
            		return data;
		}
 
		var selector = 'script[src],link[rel="stylesheet"]';
 
      		// get loaded scripts from DOM the first time we execute.
        	if (!$._loadedScripts) {
			$._loadedScripts = {};
			$._dataHolder = $(document.createElement('div'));
 
            		var loadedScripts = $(document).find(selector);
 
			//fetching scripts from the DOM
		        for (var i = 0, len = loadedScripts.length; i < len; i++) 
			{
        		        $._loadedScripts[loadedScripts[i].src] = 1;
            		}
        	}
 
		//$._dataHolder.html(data) does not work
		$._dataHolder[0].innerHTML = data;
 
		// iterate over new scripts and remove if source is already in DOM:
		var incomingScripts = $($._dataHolder).find(selector);
		for (var i = 0, len = incomingScripts.length; i < len; i++)
		{
			if ($._loadedScripts[incomingScripts[i].src])
			{
	        	        $(incomingScripts[i]).remove();
            		}
            		else
            		{
                		$._loadedScripts[incomingScripts[i].src] = 1;
            		}
        	}
 
		return $._dataHolder[0].innerHTML;
	}
});

If you have improvements for this code, please email me at eirikhm@gmail.com

Book review: PHP 5 Social Networking
ISBN: 1849512388
ISBN 13: 78-1-849512-38-1
Publisher:Packt Publishing
Author:Michael Peacock

PHP 5 Social Networking cover

Short story: If you are fresh to social networks, this book will get you up and moving. It explains how to build a fully featured social network, based on a custom underlying framework. At the end of the book you will have a functional site, and know the what’s what of social networks. It’s very easy to follow the author, and the code is very readable. New concepts and features are introduced in a way that makes it easy for the reader to keep up.


PS: Packt currently has a 40% off special offer on this book, so I recommend you pick it up via their website!


Slightly longer story: I must admit that I’m having problems seeing the value of rolling your own MVC framework when building applications like this. The main arguments made in favor of going custom is ease of maintenance, licensing and code efficiency. I really don’t buy these, as there are several good frameworks available under the BSD license, which are proven time upon time (Yii, Zend, Code Igniter, Symfony). Not only is the code maintained by teams of highly skilled developers, but also reviewed for security holes and exploits by the less good-mannered of our beloved internet. A *very* important aspect of social networking sites is security, and I feel that the book should spend more time on that subject (maybe including info on cross site scripting and related).
However, the one argument I really do see the value in is the process of learning. Writing a PHP framework is a very valuable exercise, and if you still have that on your TODO-list, this book should serve as a good guide on the way. The framework produced will allow you to keep extending and improving features after you are done with the material covered in the book.

Heads up! New book from Packt Publishing called PHP 5 Social Networking!

I just received a copy of PHP 5 Social Networking in eBook format, and plan on getting started reading it this week. The book looks really interesting, and closely matches my daily work as I’m now doing social networks on a full-time basis.

PHP 5 Social Networking cover
This book will demonstrate how to create, maintain, and extend a powerful social network site. It shows how to create your own flexible social networking framework, allowing users to sign up, customize their profile, befriend other users, share information, communicate, interact with one another, and much more.

You can check out the sample chapter Public and Private Messages right now.

Book review: Flex 3 with Java (follow link to buy)
ISBN: 1847195342
ISBN: 13 978-1-847195-34-0
Publisher: Packt Publishing
Author: Satish Kore

Flex 3 with Java Cover

Flex 3 with Java Cover

Short version: If you are a Java / PHP developer seeking to get started with Flex, building on your skills as a server-side developer, this book will do you good. If you are new to software development, or just started out I would recommend you check out Essential ActionScript 3.0 by Colin Mook, then come back to this book when you have some experience doing applications with AS3.

Slightly longer version: Some time ago I reviewed Mastering phpMyAdmin 3.1 from Packt Publishing, and since they had some interesting books on Flash / Flex I volunteered to review a few more.
First out is Flex 3 with Java. It’s a 300 page book, dealing with Flex, Java and how you can build solutions using BlazeDS as a backend.
I first checked out Flex back when the Flex 3 beta came out. At that time I was doing PHP with the Prado Framework, and instantly felt like home within the Flex IDE. However, I never took the time to really get into Flex, and my knowledge of ActionScript was pretty limited at the time.
I’ve now been working with AS3 for six months, and I’ve got a pretty solid grip on it. Most of the work I’m doing is pure AS3 (no Flash IDE, no Flex SDK), but I’ve got some very interesting side-projects built on Flex in the works as well.

The book assumes you have no experience with Flex / Actionscript from earlier. Now, it is clearly written for a more tech-savvy audience. You do not need to be a experienced developer to follow the subjects covered, but it will most certainly help to have done some software development before picking it up. The author gets a bit ahead of himself on some topics in the book, but it’s not a big problem. However, I would have liked to see a “who is this book for” section at the beginning, stating that this books is well suited for developers wanting to pick up Flex.
As expected it spends the first few chapters dealing with installation on the Flex SDK / tools as well as a brief but good coverage of AS3 and the basics of MXML.

Going into this book I was expecting the majority of the contents to cover the actual interop between Java and Flex. The book clearly deals with much more than that. Given that I’ve been trough a number of Flex and AS3 books the last months I think I would have preferred a book that was focusing more of it’s energy on the core subject instead of peripheral topics such as styling, packaging and deployment and i18n support. I totally agree that these subjects are important to master, but I think it would have been better if the book focused more on the actual interops topics as mentioned above. For me the books falls a bit between two chairs, as it does not spend enough time on basics to give the complete beginner a deep enough intro to Flex and AS3, yet not enough on the heavier side for the more experienced developer.

Oh, the book is also available as PDF if you prefer that.

Download Chapter 5 – Working with XML

PS: Check back soon as I will have a review of Papervision3D Essentials ready!

Following my review of Mastering phpMyAdmin 3.1 Packt Publishing was kind enough to send me a couple of more books to review. While I am waiting for these books to get here I have gotten my hands on some sample chapters. Check them out!

Papervision3D Essentials

Papervision3D Essentials Cover

Papervision3D Essentials Cover


Authors
Jeff Winder, Paul Tondeur
ISBN
1847195725
ISBN 13: 978-1-847195-72-2

Download Chapter 8 – External models











Flex 3 with Java

Flex 3 with Java Cover

Flex 3 with Java Cover

Author Satish Kore
ISBN 1847195342
ISBN 13 978-1-847195-34-0

Download Chapter 5 – Working with XML











As I mentioned in this previous post I’ve started to play around with C# and XNA Game Studio, and it’s very entertaining. I started out using The Platformer Starter Kit , which is a basic platformer game that you can customize and base your game on. I followed the tutorials mentioned in the previous link, and everything just works pretty smooth. Very satisfying to see immediate results reflected in a working game. After finishing them I decided to add a new feature by myself, a falling apple which would kill the player (I’ve been playing I Wanna Be The Guy lately). Hence, this post: XNA Platformer Starter Kit – Falling Apples. Now, this is a very basic feature. I just based my Apple on a copy of the Gem class, and did some minor modifications to allow them to fall down once the player walks under them, and if the player is hit he’ll die. A picture to show the final result:

Falling Apples

Falling Apples

Please bear in mind that this post is just a note of the changes I did to make this work, and should not be considered a full tutorial. I might end up doing more proper posts on XNA as I progress in my work with it.

So, here it goes!

First, create a new C# class. Just copy all the contents from the Gem class, and rename Gem to Apple (and gems to apples). Also, add the following line to the Apple constructor so that we can see the difference between apples and gems: Color = Color.Red;

Now, remove the following lines, since we do not need them:

private SoundEffect collectedSound;
 
public readonly int PointValue;

And add these:

private const float GravityAcceleration = 6500.0f;
private const float MaxFallSpeed = 600.0f;
private bool isFalling;
 
public Vector2 Velocity
{
    get { return velocity; }
    set { velocity = value; }
}
Vector2 velocity;

Now, since we want to be able to trigger the apples to fall when the player passes under them, we’ll need to create a bounding rectangle, which is taller than the actual apple. This will be the rectangle the player will collide with once he passes under the apple, and hence the apple will start falling.

public Rectangle TriggerRectangle
{
    get
    {
        int left = (int)basePosition.X;
        int width = 32;
        int top = (int)basePosition.Y;
        int height = 200;
        return new Rectangle(left, top, width, height);
    }
}

We need to implement some kind of basic physics to calculate how fast the apple should be falling. This is done by adding a new method called ApplyPhysics, which checks if the apple is falling, and if it is, it updates the velocity and position based on some simple calculations:

private void ApplyPhysics(GameTime gameTime)
{
    float elapsed = (float)gameTime.ElapsedGameTime.TotalSeconds;
    if (isFalling)
    {
        velocity.Y = MathHelper.Clamp(velocity.Y + GravityAcceleration * elapsed, -MaxFallSpeed, MaxFallSpeed);
        Position += velocity * elapsed;
    }
}

To make sure it actually falls when triggered we need to update public void Update(GameTime gameTime) and add a call to the ApplyPhysics method we just created. The call can be added right after bounce, at the end of the method:

    bounce = (float)Math.Sin(t) * BounceHeight * texture.Height;
    ApplyPhysics(gameTime);
}

The last thing we need to do in the Apple class is to add a method for actually starting the fall:

public void OnRockFalling()
{
    isFalling = true;
}

Next up are some changes to the Level class. Find the line which creates the Gem array:

private List&lt;Gem&gt; gems = new List&lt;Gem&gt;();

And add a new array for the Apples:

private List&lt;Apple&gt; apples = new List&lt;Apple&gt;();

Next up is the loading of the Apples. In the LoadTile method, add a new case statement as follows:

    case 'R':
        return LoadAppleTile(x, y);

This will load R’s in the level code as apples. We now need to create the LoadAppleTile method:

private Tile LoadApppleTile(int x, int y)
{
    Point position = GetBounds(x, y).Center;
    apples.Add(new Apple(this, new Vector2(position.X, position.Y)));
    return new Tile(null, TileCollision.Passable);
}

Almost there! We need to create a few news method for getting the apples to work. The first is called UpdateApples, which checks the collisions with the player:

private void UpdateApples(GameTime gameTime)
{
    for (int i = 0; i &lt; apples.Count; ++i)
    {
        Apple apple = apples[i];
        apple.Update(gameTime);
        if (apple.BoundingCircle.Intersects(Player.BoundingRectangle))
        {
            OnPlayerKilled(null);
        }
        else if (apple.TriggerRectangle.Intersects(Player.BoundingRectangle))
        {
            OnAppleFalling(apple);
        }
    }
}

Next up is the OnAppleFalling method, which in turn calls OnAppleFalling in the Apple class.

private void OnAppleFalling(Apple apple)
{
    apple.OnAppleFalling();
}

Now we just need to insert calls for these methods in the correct places. First up is the UpdateApples method. This is called from the Update method. Just find the following line:

    UpdateGems(gameTime);

and insert the UpdateApples call under it:

    UpdateApples(gameTime);

The last change is to the Draw method. You’ll see there is two lines used to draw the gems, and that’s what we need to do for our apples. Insert the two following lines after the code for the gems:

foreach (Apple apple in apples)
    apple.Draw(gameTime, spriteBatch);

Now, to give this a spin, open the 0.txt level file and place some R’s here and there. When you start up the game you should see some red gems which falls down when you pass under them.

PS: A more clever approach here would be to create a base class for these classes, which would hold all the shared logic and methods, but the goal for this tutorial is to show how to implement the new feature as easily as possible.

[tags]C#,XNA,Game Development[/tags]

So, I finally got around to upgrading WordPress and setting up a proper theme. I still want to customize it a bit, but it’s fine for now.

I’ve recently started playing with XNA Game Studio, and I’m really impressed with what Microsoft has pulled off with this framework. I found a starter-kit for a platformer, and I was up and running, making new content and features in less than 45 mins. It’s been a long time since I last worked with C#, and I found it refreshing to get back to it.  I’ll try to do some posts on it later on.

I’ve been dormant for quite some time, mainly due to a major project going on at work. This week I’m starting my vacation, and its time to get back to all things fun. Today I got offered a spot on the Prado Developer Team, which I hope will prove to be both a challenge and a great opportunity to improve my knowledge on both the framework and PHP.

As a part-time project I’ve started building a multi-touch display surface inspired by Microsoft Surface. I’ve completed a *very* basic edition (tutorial here, and I’ve just started planning a more complicated setup along the lines of this project.

I’ll do some posts on the process as soon as I get some pictures.

[tags]PHP, Prado, Multi-touch[/tags]   

Aug 262008


After receiving quite some feedback on my post “Why Delphi for PHP should have used Prado instead of VCL” I decided to do a follow up to that post. Some of the feedback was quite interesting, hence this post was born.

First and foremost I’d like to address the feedback I got regarding the class name prefixing in VCL/PHP. I argued that the lack of class prefixes could create problems in the future, and used Prado’s T notation as as sample of something that would at least be a bit better. Let’s take a look at two VCL/PHP classes named Collection and Object. These two names are often reserved in programming langues (atleast object oriented ones). If PHP decides to introduce these two classes the VCL/PHP guys would be pretty screwed. It would involve refactoring the framework as well as applications which uses those classes. Prado on the other hand has a prefix (TCollection etc. minor, but it’s a world of difference). I assume that the VCL/PHP authors will introduce namespace support with PHP 5.3, so this issue will hopefully be a thing of the past when 5.3 ships. That said, I’m a bit curious to see how the migration / backwards compability would turn out if VCL/PHP adopt namespaces.

What I miss in the feedback I got from my previous post was people acually using VCL/PHP for enterprise applications and how that is working. From what I can tell the usage of Exceptions is still limited to the 3rd party libs such as Zend Framework which are included with VCL/PHP. That’s a bit interesting.

I’d like to touch on the comment made by Pieter Viljoen for my original post. I agree that Codegear pushed quite a toolset for the PHP community in a short time, but the underlying code is not enterprise quality. One can argue that PHP is ugly and flawed (not sure I agree on that part), but that does not mean that one should not strive for good architecture and methodology when developing frameworks on top of PHP. I see the point that VCL/PJP offers features that are interesting for starting PHP developers, but for large scale applications I just don’t see it. I’d be pretty cautious pulling in a framework without exception support if I was to create an application.

Again, I’m really interested in some feedback from someone that actually has built applications with VCL/PHP.

I’ve also noticed that there is not much activity in the VCL/PHP SVN repository. Anyone know what’s going on there?

[tags]PHP, Prado, VCL4PHP[/tags]