Note: The link for this project is a demo page, where you are automatically logged in as me.

PANDA is actually two components, a web framework for creating pages with different functionality easily and extensibly, and extra code that is only meant to be used internally at ITA (note: I have nothing to do with the public site).

I envision PANDA as being similar to Ruby on Rails, in the sense that RoR was extracted from Basecamp. I definitely don’t plan on this being as popular, or having as great an effect on the web as RoR! But the idea is similar.

The genesis of PANDA was a need for an easily maintainable, extensible system for managing test scores, projects, and the certifications that could be earned by a student. There was also a great impetus for me, as it was (and is) a great learning experience and challenge.

PANDA works very similar to DokuWiki, in that everything is routed through a central script, index.php. Each page in PANDA is actually a separate PHP class file, which upon instantiation runs whatever functions are needed specific to that page. There is also a separate JavaScript file and CSS file, to further organize.

PANDA also has permissions per page, namespace, and user groups, allowing for pretty cool control over where users are allowed to go.

One of the best features of PANDA is the HTML helper functions. As each page of PANDA is a separate class, it’s very tedious to keep escaping HTML, or drop out of PHP. In my opinion, it can make for very messy code. So PANDA lets you make a table row like this (the row is holding scores):

echo row(2);
	echo cell_h(3, "Flash",	array('class' => 'topictitle'));
	echo cell(3, 90,	array('class' => 'btw score'));
	echo cell(3, 78.87,	array('class' => 'permit score'));
	echo cell(3, 80, 	array('class' => 'rt score'));
	echo cell(3, 248.87,	array('class' => 'total score'));
echo row_close(2);

The array argument at the end allows for any html attribute to be set to a value. Here’s another example with a table cell containing a text input area:

echo cell(3,
    input(4, 'text', 'nameIdOfInput', null, array(
	'maxlength' => '10',
	'size' => '10',
	'value' => 'some value',
	'class' => 'input class'), true),
    array('class' => 'cell class'));

The boolean argument determines if the input is enabled or disabled. While it may look confusing at first, it quickly makes for more organized code.