Archive for March 2006

Volunteer Script Doing Its Job

Posted by: rkassissieh
March242006

signups
Two volunteer coordinators have given me some positive feedback on the signup script that has been running for a few weeks now.

"The staffing seems almost effortless with the on-line sign-up!"

"I am so empowered by the report features you have built into this system. I can easily see where the holes are and I can see, by comparing the sign on list with the parents roster, who has not volunteered for anything. I'm on a BIG campaign now to get parents to enlist."

I'm glad to hear it! It was my intention that volunteers would only be able to sign up for available slots, thereby distributing themselves throughout the schedule. It seems to be working so far.

CMS Made Simple

Posted by: rkassissieh
March192006

I tried out three CMS's this weekend, in search of a backend for the new Maru a Pula web site I am building. Unlike the AFMAP site I built last year, this needs to be easy to manage, as I intend to give the keys to the Principal's assistant there.

I headed to OpenSourceCMS.com to review and try out different CMS software packages. On the one hand, I was impressed with the standardization around PHP/mySQL and the near-universal adoption of trendy features such as extensibility and RSS. However, I found it challenging to browse the list of top-rated tools, as considerably variety exists within this category. I did not want or need a suite of community features such as Drupal offers.

In the end, I downloaded and installed three packages: CMSMadeSimple, Joomla, and phpWebSite, based on ratings, front page design, and features. If you try it soon, you may visit the test sites by clicking on each image below.

CMS
CMSMadeSimple is the only one of the three that made it through the first day. As the name suggests, this package focuses on web site content. The admin interface prioritizes the creation and organization of content pages. It's easy to use, works, and doesn't get in the way of the site content. Hopefully, this one will carry me through the entire project.

Joomla is a rising star with potential for a site admin who wants more features. I found that the admin interface got in the way of simple content management.
Joomla
To post the first articles, I had to create a section, then a category, then a page, then a menu item, and I still couldn't get the content to actually show up in the home page. That's far more than the MAP users will be able to handle without the help of their computer staff.

phpWebSite was so promising to me at first. It was the only package that included an Edit link at the bottom of each article by default, an intuitive user interface element for novice admin users. Like CMSMadeSimple, it prioritizes content over features but has an active development community that has created a number of potentially useful modules. Unfortunately, installation was a disaster. If I installed only the core, then I could get it running. If I installed even one module, then the install script threw an error and the site broke. Check out the screen shot. Yup, the content doesn't appear. That won't do.

PHPWebSite

I thought that this process would allow me to develop content and install a graphic design (pro bono from a local firm) on three installations to really learn how well they ran. At the end of the first day, I am down to just one. Hopefully, CMSMadeSimple will be robust enough to get me through this project. Otherwise, I will be looking for another solution pretty soon! Let me know if you have other CMS suggestions that meet the criteria I have explained above.

Update Sep 10 2008

I realize from the comments posted to this item that this blog post does not tell the end of the story. After trying five different content management packages, I ultimately chose Website Baker and have since operated two web sites on the platform for two years. While not perfect, it has offered the best combination of simplicity and features that I have been able to find. I would still choose website baker if I were to fully hand over site administration to others. If I were to continue to administer the site myself but wanted content editors to have the best possible experience, I would choose Drupal. Check out some sites: Maru-a-Pula (Website Baker), San Diego Hat Co (Website Baker), and Shasta Mountain Guides (Drupal). Note, these platform choices are current as of Sep 10 2008 but may have changed if you are reading this post a long time since then.

Yahoo! User Interface Library: More AJAX

Posted by: rkassissieh
March192006

Yahoo!
I recently wondered whether I would need/be able to learn AJAX to enhance my web programming interfaces. Along comes announcement of the Yahoo! User Interface Library, which might make my life easier.

The Yahoo! User Interface Library is a set of utilities and controls, written in JavaScript, for building richly interactive web applications using techniques such as DOM scripting, HTML and AJAX. The UI Library Utilities facilitate the implementation of rich client-side features by enhancing and normalizing the developer's interface to important elements of the browser infrastructure (such as events, in-page HTTP requests and the DOM). The Yahoo UI Library Controls produce visual, interactive user interface elements on the page with just a few lines of code and an included CSS file. All the components in the Yahoo! User Interface Library have been released as open source under a BSD license and are free for all uses.


Now all I need is a lot of time.

Thanks to eHub for the tip.

p.s. Just read this Round-up of 30 AJAX Tutorials from mHub, a friend of eHub. "Make an AJAX Website in Less than 10 Minutes" sounds like my kind of tutorial.

A Small Moodle/Blackbaud Integration Example

Posted by: rkassissieh
March172006

Here the code we use to pull user name information from Education Edge into the Moodle user profile. This code starts at line 320 of moodle/user/edit.php. The bit about @sfuhs.org allows me to handle Moodle accounts for both AD users (students, faculty) and non-AD users (parents), who login with their personal email addresses.

// pre-fill user information
$user->email = $user->username;
if (!strpos($user->email, '@')) {$user->email .= '@sfuhs.org';}
$query = " SELECT
EA7RECORDS.FIRSTNAME, EA7RECORDS.NICKNAME, EA7RECORDS.LASTNAME
FROM
EA7RECORDS,
ADDRESSLINKS,
PHONELINKS,
ADDRESSLINKPHONES,
EA7ADDRESSOPTIONS
WHERE
NUM LIKE '" . $user->email . "' AND
ADDRESSLINKPHONES.PHONESID=PHONELINKS.PHONESID AND
PHONELINKS.ADDRESSLINKSID=ADDRESSLINKS.ADDRESSLINKSID AND
ADDRESSLINKS.PARENTRECORDID=EA7RECORDS.EA7RECORDSID AND
EA7ADDRESSOPTIONS.ADDRESSLINKSID=ADDRESSLINKS.ADDRESSLINKSID AND
EA7ADDRESSOPTIONS.PRIMARYADDRESS='-1'";

mssql_connect ( "$eesrv", "$eeuser", "$eepass" );
$result = mssql_query ( $query );
$row=mssql_fetch_array($result);
if ($row['NICKNAME']) {$row['FIRSTNAME']=$row['NICKNAME'];}
if ($row['FIRSTNAME']) {$user->firstname = $row['FIRSTNAME'];}
if ($row['LASTNAME']) {$user->lastname = $row['LASTNAME'];}
mssql_close();

include("edit.html");



I then modify the edit.html template so that the name fields are not editable, consistent with the idea of our users being fully identified by name within our web intranet. This goes hand in hand with automatically capturing the user login from the environment variables, which is subject matter for a separate post.

New Script: Course Requests

Posted by: rkassissieh
March092006

After two years of periodic discussion with the academic office, we are about to launch a new online course request form. Up to this point, a number of obstacles prevented us from moving forward:
  1. This is a critical school function that everyone uses. We had to get the user interface right.
  2. Only once we moved to Education Edge 7 (last spring) did it become possible to pull the current course list dynamically.
  3. Our registrar was concerned about losing valuable face-to-face discussions between students and advisors.
  4. The academic office didn't want to be the guinea pig for student online registration (I am reading between the lines).

Two years ago, it would probably have taken a month to write this script. This time, I wrote about 80% of it in a day! Granted, I did work at home, almost completely free from interruptions that normally make development work nearly impossible during the school day. The result is a tidy little script whose user interface hides much of the complicated work going on behind the scenes.

course requests image

Data is written to a mySQL database, from which the registrar can produce export files for import into a FileMaker database she uses to review requests before sending them to Blackbaud for scheduling. The MSSQL query that produces the course lists is especially cool. I reproduce it here in case you will find it useful:

$query = "SELECT DISTINCT
EA7COURSES.COURSEID,
EA7COURSES.COURSENAME,
EA7ATTRIBUTETYPES.DESCRIPTION AS ATTRIBUTE,
TABLEENTRIES_2.DESCRIPTION AS DEPARTMENT

FROM
EA7COURSERESTRICTIONS,
EA7ACADEMICYEARS,
EA7COURSERESTRICTIONSSTARTTERMS,
EA7TERMS,
TABLEENTRIES,
EA7COURSEGRADELEVELS,
TABLEENTRIES AS TABLEENTRIES_1,
EA7COURSEFILTERS,
FILTERVALUES7,
TABLEENTRIES AS TABLEENTRIES_2,
EA7COURSES
LEFT OUTER JOIN EA7COURSEATTRIBUTES ON EA7COURSES.EA7COURSESID = EA7COURSEATTRIBUTES.PARENTID
LEFT OUTER JOIN EA7ATTRIBUTETYPES ON EA7COURSEATTRIBUTES.ATTRIBUTETYPESID = EA7ATTRIBUTETYPES.ATTRIBUTETYPESID

WHERE
EA7COURSES.EA7COURSESID = EA7COURSERESTRICTIONS.EA7COURSESID AND
EA7COURSERESTRICTIONS.EA7ACADEMICYEARSID = EA7ACADEMICYEARS.EA7ACADEMICYEARSID AND
EA7ACADEMICYEARS.DESCRIPTION = '$currentacademicyear' AND
EA7COURSERESTRICTIONS.EA7COURSERESTRICTIONSID = EA7COURSERESTRICTIONSSTARTTERMS.EA7COURSERESTRICTIONSID AND
EA7COURSERESTRICTIONSSTARTTERMS.EA7TERMSID = EA7TERMS.EA7TERMSID AND
EA7TERMS.TERMID = TABLEENTRIES.TABLEENTRIESID AND
TABLEENTRIES.DESCRIPTION='$currentsemester' AND
EA7COURSES.EA7COURSESID = EA7COURSEGRADELEVELS.EA7COURSESID AND
EA7COURSEGRADELEVELS.GRADELEVEL = TABLEENTRIES_1.TABLEENTRIESID AND
TABLEENTRIES_1.DESCRIPTION='$student{'GRADELEVEL'}' AND
EA7COURSES.EA7COURSESID = EA7COURSEFILTERS.PARENTID AND
EA7COURSEFILTERS.FILTERSID = FILTERVALUES7.PARENTID AND
FILTERVALUES7.FILTERIDVALUE1 = TABLEENTRIES_2.TABLEENTRIESID AND
FILTERVALUES7.RECORDTYPE = '1098'";


The Departments designation for a course is stored in a strange place with a ton of other attributes, hence the "RECORDTYPE='1098' condition. We include COURSEATTRIBUTES as an optional join because we store the "signature required" course option there.

We will pilot this script with a small number of users next week and then hopefully roll it out to everyone in mid-April.