There are typically only two types of forms that tend to get squeezed into tight quarters in page layouts: login, and search. For this reason, web designers are often tempted to save space by hiding the labels on these forms and assuming that a user will intuitively know what to type into each textbox. With a simple search form, this is logical because you have a textbox next to a button that says “Search”, “Go”, or perhaps “I’m feeling Lucky”. Login forms are a little trickier. For most of us, seeing two text boxes and a “login” button is all we need to play McGyver, but the average user often needs those “Username:” and “Password:” labels to know what to enter.
A common solution to this problem is to use javascript to show and hide “hints”. This is one of those tasks that has a dozen different (perfectly acceptable) methods, and everyone tends to stand behind their choice as boldly as they do their favorite presidential candidate. I’ve tried a few of these methods, but because I tend to do it a bit differently, I thought I’d share.
Most of the solutions out there either insert a value into the textbox or they move around a label. Inserting a value into a textbox is the most obvious/common solution and has its pros and cons, but the deal breaker is the fact that a value inserted into a password box will still display as dots/asterisks. As far as I know, you can’t dynamically change the type of an input from password to text, so that solution is out. Moving around a label tag is something I first read about on the ALA article: Making Compact Forms More Accessible. It’s an ingenious idea really, but:
With those things in mind, I decided to try using a background image for on the textbox instead of the label. Also, I tend to incorporate jQuery into most projects lately, so it made sense for me to write it in that - although it could just as easily be rewritten as straight Javascript if necessary.

Of all the context menus in Firefox, my second most-clicked item (behind View Page Source) is View Background Image. This stock functionality is one of the many reason I still prefer to use Firefox over Safari, even though Safari’s rendering is notably faster. The problem I have with View Background Image though is that the image I want to view is often associated with a link element. When you right-click on a link though, this menu item is sadly missing.
The only alternative I’ve found, short of digging around in the page source and CSS, involves the Web Developer Toolbar. If you have this extension installed, you can click on Images » View Image Information to see a list of all background images that are associated with the page you are viewing. That usually does the trick, but it would be much more ideal if there were an extension that just makes View Background Image work on links. After all of my searching and discussions with friends and coworkers I’ve concluded that there is no extension out there that can make this happen. I’ve never made a Firefox extension before, but I have toyed around with Javascript/XUL and could probably figure it out if I get desperate enough. Before I attempt this though, I figured I’d ask, “What do you do when you want to see the background image of a link?”
OK, so I’m working on a MySQL database of tour reservations that has time values stored as strings in an AM/PM time format. The hour portion of the value does not contain a leading 0, so “6:00 AM”, “11:35 AM”, “4:45 PM” are all possible values. I’ve written a query to pull a sorted list of the unique tour times from the database that looks something like this:
SELECT DISTINCT reservation_time, FROM reservations WHERE DATEDIFF(reservation_date, '2006-12-11')=0 AND is_canceled=0 ORDER BY SUBSTRING(reservation_time, -2), CAST(SUBSTRING_INDEX(reservation_time,':',1 ) AS UNSIGNED), CAST(SUBSTRING(reservation_time,-5, 2) AS UNSIGNED);
My problem is what follows the ORDER BY statement. I’m sorting the list of time values 3 times: first by the last 2 digits of the time (AM or PM), then by the hour, then by the minutes. I can’t use SUBSTRING( reservation_time, 2 ) to get the hour value because some have one digit and some have 2. This also means I have to get the minutes by counting from the right side instead of from the left. My question, to all my SQL fluent friends out there is whether or not this is the best way to get this data. Ordering the data 3 times seems a bit inefficient, but then I’m no SQL wizard.
Are all of your client sites April 11th Compliant? I’ve spent much of my day so far going through client websites (many of which we didn’t even build) looking for instances of applet, object and embed tags (mostly flash) to make sure they won’t break on April 11th. On that day, Microsoft will be releasing a security update for IE containing a particularly annoying ActiveX update. Any ActiveX control that a user interacts with will now need to be activated. For instance, if you have a flash movie or multimedia object and a user clicks on it, they will get a nice message like this:

So why is all this happening and who should we blame? You guessed it. Micro$oft:
A jury in 2003 found that Microsoft’s Internet Explorer browser infringed on a patent owned by Eolas and the University of California. The software vendor was ordered to pay $521 million in damages. Microsoft has vowed to fight the ruling, but so far has been unsuccessful in getting the patent invalidated. - Click here to read the full story at Top Tech News
Thank you Microsoft! To read more about making your sites April 11th compliant, visit the msdn page: Activating ActiveX Controls.
I wanted to be able to take a string of text, a blog entry in this case, and crop it down to the nearest sentence to a given maximum length value. I am sure this function exists in php, but I couldn’t find it so I wrote my own and figured some of you might find this handy:
function nearestSentence($s) {
//Max length of string before
//looking for last sentence.
$maxL = 350;
//Strip html tags and convert
//html entities (like &)
//to single characters before counting.
$toCount = strip_tags(html_entity_decode($s));
//Crop the string down to the max length.
if (strlen($toCount) <= $maxL) {
$s2 = $s;
} else {
$s2 = substr($toCount, 0, $maxL);
}
//Look for position of the last ., ?, or !
$lastPunct = max(strrpos($s2, '.'), strrpos($s2, '?'), strrpos($s2, '!'));
//Crop the string again down to the nearest punctuation.
$s3 = substr($s2, 0, $lastPunct+1);
//Return string with html entites re-inserted.
return htmlentities($s3);
}
So, if you had some text like:
Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat? Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis! At vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla?
Then, you would get:
Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat?
If you have some flexibility for the length of your blurb, I think this looks a lot better than just cropping your string down to a particular length and adding… but maybe that’s just me.
At work, we’re about to get started on a pretty straightforward reservation application. We have a client that offers tours of their facility and they need a web app to take and manage reservations for said tours. I know that I could code this out in php/mysql pretty easily, but it seemed like the perfect opportunity to give Ruby on Rails a shot.
I have to admit here that I’m pretty excited about the possiblity of using rails. I’ve heard so much from so many of my colleagues about it’s ease of use and flexibility that I was chomping at the bit to give this puppy a whirl. I followed Dan Benjamin’s EXCELLENT installation guide for OS X Tiger, and carefully (making a few mistakes along the way) followed the “Using Ruby on Rails for WebDevelopment on OS X” tutorial. Now, as a graphic designer, the majority of my college career was spent learning how to draw, paint, take pretty pictures, and be able to differenciate between the Madonna paintings of Cimabue and Giotto. I took some basic programming classes, but never learned anything about models, controllers, and views. Regardless, I was still able to walk through the installation, and basic app creation described in the tutorials above.
At the end of the day, I’ve got a sweet little expense tracking application (that was explained in the using rails tutorial), and one simple problem: how to deploy it. At work, we use CVS for out repository, but I guess I’m going to have to get friendly with SVN because Capistrano (aka SwitchTower) seems to require it, and I haven’t seen any other options for deployment. I did see this little guide at nubyonrails (fun name) about deploying to Dreamhost, but it too uses Capistrano and Subversion. Is this the way to go? Do I really have to source control my tiny little example app in order to stick it up on a subdomain of my site? I’m not REALLY expecting answers on all this. This is more just a journal on my thoughts and progress on the topic, but SOMEBODY ;) out there has to be able to tell me if I’m on the right trail.
I always thought it was funny to see websites that are regularly updated that have an outdated copyright notice in the footer. It’s even funnier when the page in question is serverside. Now, I’m not the most programming savvy person in the world, but when you’re writing the footer include for your next project, do yourself a favor and insert an automagically updating year next to that © symbol.
PHP:
<?= date(Y) ?>
ASP:
<%response.write Year(Now())%>
JS:
<script language = 'JavaScript'> var today = new Date(); document.write(today.getFullYear()); </script>
In other news, Ames and I are still down in Vero enjoying the time with our families and the warm weather. We had a great Christmas, and even though I’ve been working for these last 3 days, I’ve had 3 great lunch breaks. On Monday, BReese stopped off of I-95 to meet Amy and I at Big Apple Pizza on his way back to Orlando from his hometown of West Palm. On Tuesday, I grabbed Firehouse subs and met with my dad for lunch at his Cabinet shop, and today Ames and I went out to Panera and ran into Chrissy Giddens of all people…and of course, I was wearing my nerdy XHTML fist shirt from A List Apart.
Update - I’ve gotten 8 more of these non blacklistable comment spams since I made this post. Apparently my little random letter doohickey didn’t do the trick. I think I need to go ahead and upgrade to MT 3.2. In the mean time, I’ll be deleting comments. Argh.
I’ve been having a lot of comment spam slipping past MTBlacklist lately and the bummer is that most of it is non-blacklistable. If you have a blog, you’ve probably seen a lot of it too. Comments like this:
Interesting site, and very organized too. Good work. About a year ago I started: http://matrixsynth.com/blog/index.php/2005/09/06/ exclusively_analogue_sequencer_on_the_ba_1 , hours drive from where
and this:
It’s been a long time since I so enjoyed reading posts in the net. Two thumbs up! Naked truth: http://www.andrewsblog.net/?p=40 , Extensive methods for this
These comments usually have a generic sounding and random name like Christopher Freeman, Thomas Davis, or Jacob Chapman. The email address is always a random first name at msn, gmail, or yahoo. And the link is always to a real blog entry at a real blog, like Marco’s Mint Review. I’m not sure if this is some backwards way of linking to sites that link to sites of linkspammers to increase google rank, or if they’re just trying to piss off people like me who are using off-the-shelf spam prevention measures. Either way, I’m pissed off.
I wanted to come up with a custom, but easy to setup/change spam blocking solution that didn’t require my visitors to go through some drawn-out authorization or a separate comment preview. My original idea was to have visitors type a random word. I figured somebody had to have already done this, so I Googled around and found this post. Their solution was simple. Look for the code in (mt cgi folder)/lib/MT/App/Comments.pm that validates whether the text field is populated and add another if statement that checks to see if a new text box contains the secret letter. That filled most of my requirements, but I wanted to have a question whose answer wasn’t hard coded on to the comments.pm file, and I wanted a question wasn’t static. I added a little php to my individual archive pages to generate a random letter:
$spoon = mt_rand(0, 25); $alphabetSoup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; $randomLetter = $alphabetSoup[$spoon];
I then added two new inputs to my comment form. One was the textbox for the user to enter a letter, and one was a hidden field, both with a value populated with $randomLetter. I know, I know…this isn’t so secure, but if it stops all comment spam for a week, I’ll be happy. When (if?) I do get comment spam again, I’ll be ready to change it again. Now that I’ve got this authentication built in, I can think of all kinds of fun ways to change it to throw off the commentspam engines. Until then…it’s late, Amy just finished her homework (Yes, she was working on homework till midnight on Sunday.), and I think we’re off to bed.
Ames and I had a great move from Gainesville to Columbia! Everything between packing and closing when smooth, and although we’ve been working really hard on fixing the place up, we’re really happy with our first home. In fact, I wanted to spend my free time before work this morning finishing up my do-it-yourself post on removing popcorn ceilings, but I when I checked my gmail, I had over 100 comment spams to delete from mister aaa@aaa.com. If you have a Movable Type blog, you probably know him well…all he ever says is “Interesting!”, “WOW Nice Site!” I’ve had problems from him since before I moved to Dreamhost, but since then I haven’t been able to get MTBlacklist working to block him. Well, after deleting all those comments, I was pretty set on getting that fixed. Just as I figured, it was a permissions issue. After chmodding some mt files back to 755, I was up and running again with my spam filters, and just for good measure, I installed the latest version of Blacklist as well.
Since I was already in troubleshooting mode, I decided to tackle my Smart 404/Search problems. I kept getting “URL file-access is disabled in the server configuration” error whenever I tried to search or go to a non-existing url. I knew it all worked before, so I started snooping through my code and eventually figured out that Dreamhost has disabled the PHP option allow_url_fopen…which in turn kills file_get_contents. Argh! Fortunately, they’ve setup a workaround using curl.
I know Mike Davidson must have fixed this issue on his site because he’s a dreamhost user too, but I didn’t find anything on the related post or comments, so if you’ve followed his method too, here’s a fix:
In your 404.php page, change:
$full_page = file_get_contents($full_search_url);
$ch = curl_init(); $timeout = 5; curl_setopt ($ch, CURLOPT_URL, $full_search_url); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); $full_page = curl_exec($ch); curl_close($ch);
…and in your search.php page, change:
$search_results = implode('', file($link));
$ch = curl_init();
$timeout = 5;
curl_setopt ($ch, CURLOPT_URL, $link);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$file_contents = curl_exec($ch);
curl_close($ch);
$search_results = implode('', array($file_contents));
How much fun is THAT!?!? I don’t think I know anyone who this applies to, but I thought I’d write it up anyway in case I ever need it again. Hopefully I’ll get that popcorn removal post up sometime next week, cause I know you’re ALL dying to get rid of the popcorn ceilings in your houses.
In the process of househunting, Ames and I have spent a lot of time on Realtor.com checking and rechecking for listings that match our criteria and budget. This process has been fun, but frustrating as well because the technology doesn’t quite meet my expectations. In particular, the map views on realtor.com are quite the annoyance. In the past, if I wanted to see where a listing was, I’d copy and paste the address into Google Maps and navigate using their much more user-friendly interface. Not anymore.
Enter Greasemonkey, an extension for Mozilla browsers that lets you define “user scripts” to specified webpages. Thanks to Greasemonkey and Birdman (programmer extraordinnaire), there is know a handy link to the Google Map of each house I look at. Since this is a functionality we thought a lot of other people could really use, we posted it up on the GreaseMonkeyUserScripts Wiki. There are literally hundreds of user scripts that have been written for Grease Monkey in the last few months, and the creators of the extension are planning to create a proper script directory at http://userscipt.org which will be much more searchable. In the mean time, be sure to check out book burro, Geocaching.com scripts, and of course our Greased Realtor script.
I feel compelled to reiterate once again that I am really not a programmer, but it is so gratifying when I'm able to solve a problem with a bit of code. So, here's the code...any ideas on what this does or what my problem was? If you're good with PHP and see any problems, please let me know!
$calurlyear = date(Y);
$calurlmonth = date(m);
$calurl = ($calurlyear . '/' . $calurlmonth . '/calendar.php');
$i=0;
do {
$i++;
$calurlmonth = str_pad($calurlmonth-1, 2, "0", STR_PAD_LEFT);
if ($calurlmonth < 1){
$calurlmonth = 12;
$calurlyear = $calurlyear-1;
}
$calurl = ($calurlyear . '/' . $calurlmonth . '/calendar.php');
if (file_exists($calurl)){
include $calurl;
$i = 10;
}
}
while ($i < 10);
It know that this is just sooo 3 years ago, but when I redesigned Jasongraphix, style switching was one of my highest priorities. I’ve been in love with the idea since I was first offered presentation options by “techno-facist” Eric Meyer on his personal site, meyerweb.com.
Those days were the start of revolutionary new techniques, and although CSS Zen Garden level style switching is less common these days, influential folks like Douglas Bowman, and Mike Davidson are definitely keeping the idea alive. Don’t get me wrong, a lot of people effectively use style switching to accomplish simple usability tasks like changing font size and font family, but full design swapping is pretty uncommon.
If you’ve been to this site before, you’ll notice a new little drop-down widget in the sidebar on the homepage. I plan to add more style options as time goes by, but if you have cookies enabled, you might want to try going bucknaked: it’s the stripped down, fluid flavor of this layout. I’ve also added an option for stlyeless as well, which basically does the same thing as the zap stylesheets bookmarklet - but sets a cookie to maintain the sylessness. All this happiness is brought to you by php. Knowing that I wanted to implement style switching, I created an include that contains all of the “linkrel” data for the site. When you select a style from the menu, it sends you to a php page that sets a cookie called stylename. Once you have this cookie, there is a switch statement on the “linkrel” file that changes which stylesheet links that get posted based on your stylename cookie. It ends up looking like this:
<?php
switch ($stylename) {
case "1900":
case "":?>
<link rel="stylesheet" type="text/css" href="http://www.jasongraphix.com/css/1900/1900.css" media="all" title="1900" />
<link rel="alternate stylesheet" type="text/css" href="http://www.jasongraphix.com/css/bucknaked/bucknaked.css" media="all" title="bucknaked"/>
<link rel="stylesheet" type="text/css" href="http://www.jasongraphix.com/css/sIFR.css" media="screen" />
<link rel="stylesheet" type="text/css" href="http://www.jasongraphix.com/css/sIFRprint.css" media="print" />
<script src="http://www.jasongraphix.com/includes/sIFR/sifr.js" type="text/javascript"></script>
<?php break;
case "bucknaked":?>
<link rel="stylesheet" type="text/css" href="http://www.jasongraphix.com/css/bucknaked/bucknaked.css" media="all" title="bucknaked"/>
<link rel="alternate stylesheet" type="text/css" href="http://www.jasongraphix.com/css/1900/1900.css" media="all" title="1900" />
<?php break;
case "styleless":
break; }?>
See, that wasn’t so bad. I do have a headache right now, but really, it wasn’t that difficult.
While perusing through the countless design/development blogs out there I came across Pointless Existence, and a very easy to implement method for reducing bandwidth usage for sites with Apache/PHP servers.
Basically, the following code is placed at the top of your PHP pages:
<?php ob_start("ob_gzhandler"); ?>
When the page is requested, the server will remove whitespace and compress the document to the tune of 25-75% depending on the density of the code. Inspired by this post, I did some Googling and found “The Definitive Post on Gzipping your CSS” at Fifty Four Eleven from June 13th. How did I not know about this before? In the spirit of the ongoing inside joke in our office - “Hello, and Welcome to LAST WEEK!”
I have to agree with Blake Ross’ opinion that cookies are delicious delicacies. I eat, I mean use them as often as possible. I must admit that at first, I was afraid to touch the things, but now I can’t get enough of them. Most movable type users recognize the javascript on their individual entry archive template that bakes a cookie whenever a commenter wants to be remembered, but there are so many other great uses for cookies.
The portfolio section of my website is one place I knew that I would be using a cookie. The entire section consists of only 2 dynamic pages (portfolio.php, and portfoliobig.php) that pull all of the content on the page from a couple tables in a MySQL database. The default destination for the Folio link on my main navigation bar is the portfolio.php page displaying content from the latest item in my webdesign category. When you click on one of the icons at the bottom, the id for that item is passed through the query string to the portfoliobig.php page. When you click on one of the categories on the right side navigation though, you are sent to a page that uses the header() function in php to direct you back to the portfolio.php page while setting a cookie that lets the page know what category you would like to see. If that sounds too complicated, check out what it looks like:
<?php
setcookie("folioCat", 5, time()+60*60*24*30, "/", "jasongraphix.com" );
header("Location: http://www.jasongraphix.com/portfolio.php");
exit;
?>
All I have to do is throw the setcookie function out there and put in the name of the cookie, folioCat; the value of the cookie, which is the id of the category I want to pull; the amount of time till it expires, which is the current time plus the number of seconds in a minute times the number of minutes in an hour times the number of hours in a day times 30 to make the cookie last 30 days; the directory the cookie will work for on the site, in this case it’s root (/); and the site which the cookie will work on, jasongraphix.com.
Now that we have a cookie, the next line tells the browser to go to the portfolio.php page (it’s always a good idea to use the full URL here), and then we exit. The true beauty of the cookie is that if a visitor leaves the portfolio or closes the window, they will get the same category they were looking at when they return. See!? CoOoKiEs GoOD!!!
For my next cookie trick: I have a php include called linkrel which is what I am using to add the stylesheets to my site. As soon as I can whip up another fancy style for my site, I’m going to give you all a choice of which style you would like to greet you when you visit. I know, I know…it’s been done, but don’t spoil my fun.
I had a very specific idea of how I wanted the homepage on my site laid out. I wanted either the entire latest post front-and-center in my content area, and below that I wanted to have 2 columns with excerpts from the two previous posts. I know there's probably a way to do this with Movable Type, but the easier solution to me seemed to be writing a PHP page that grabbed the info I needed from my Movable Type database.
The only problem with that concept was that I couldn't use the excerpt tag if I wasn't building the page through movable type. Well, I knew I could shorten the post to a specified number of characters by using the LEFT string function in my SQL query.
LEFT(mt_entry.entry_text, 500)
The only problem this left (no pun intended) was that I didn't want to see any images, pre tags, links, etc. in these "Recollections". What I needed was a way to remove all the html from these strings. I was really close to writing a regular expression to do this when I ran across a very useful PHP function: strip_tags. With strip_tags, all I had to was change:
<?php echo $row_Recollection1['entry_text'];?>
to...
<?php echo strip_tags($row_Recollection1['entry_text']);?>
I'm still a few more weeks away from re-launching the new jasongraphix, but I've been making great progress with Movable Type and learning lots of new tricks. One of my goals with the re-design was to make the site as dynamic as possible by breaking the design into independent php modules that I can include anywhere. One such module, actually contains the menu for my site, and I ran into a minor problem last night. The menu is actually an unordered list that depends on an id="active" identifier to change it's style.
If the menu was actually copied onto every page, I would only have to place the identifier on whatever li was active and be done with it. With the menu in a php file that is included on every page this is a little more difficult. I originally thought I could pass a variable to the include to let it know what menu item to affect, but I knew there had to be a better way, to contain everything in the menu include.
The first idea that came to mind was the php function PHP_SELF. PHP_SELF can be used to get the URL of the page that the browser is on. For Instance, if we were at
http://www.jasongraphix.com/archive/directory/directory/index.php and used:
<?php echo ($_SERVER[PHP_SELF]); ?>
We would see the string:
/archive/directory/directory/index.php
Ok, so that's a neat trick. The problem was breaking a good variable like "archive" out of that mess. I know I could do this by writing a regular expression, but I REALLY don't like regular expressions. I infact loath regular expressions. Sorry Nathan.
The solution: explode()
My inner B&B voice says "Fire,fire,fire heh,heh,heh".
Explode actually takes a string (like our long URL) and brakes it into an array of values by a specified character. In our case that character is "/".
With that in mind, I was able to write up a function to get the variable I needed:
<?php
$target = $_SERVER[PHP_SELF];
$foo = explode('/', $target);
$menupage = $foo[1];
?>
With menupage defined, I can then write up my menu like:
<ul id="navlist">
<li<?php if($menupage==""){echo(' id="active"');}?>>
<a href="/">Home</a></li>
<li<?php if($menupage=="archive"){echo(' id="active"');}?>>
<a href="/archive/">Archive</a></li>
<li<?php if($menupage=="portfolio"){echo(' id="active"');}?>>
<a href="/portfolio/">Folio</a></li>
<li<?php if($menupage=="artwork"){echo(' id="active"');}?>>
<a href="/artwork/">Artwork</a></li>
<li<?php if($menupage=="about"){echo(' id="active"');}?>>
<a href="/about/">About</a></li>
<li<?php if($menupage=="resume"){echo(' id="active"');}?>>
<a href="/resume/">Resume</a></li>
</ul>
And viola! A completely dynamic menu include that automagically finds out where it's at, and makes my menu reflect it by inserting a much needed id="active" identifier.
Nathan Bird, one of the brilliant programmers here at acceleration came up with a new bookmarklet/favelet that he calls Link Runaway. You can only use it in a browser that works (ie. Firefox) but it's great fun! I don't consider myself a programmer by any means, but I changed the bookmarklet code to make divs runaway instead of links. It doesn't do much for most sites, but it's pretty fun playing with it on my site.
Try it out: Click Here (When Done, Click Refresh!)
My plans for a complete redesign of this site are still on the backburner for now as I wait patiently for my current hosting plan to run out, but that doesn't mean I've completely abandoned all personal projects. My latest goal has been to produce a database driven website for the Young Marrieds group at my church. I want to create a site that will allow each couple to maintain personal info for the other young marrieds to see, and provide a central place to post news and events. For the news and events side of the site, I'm relying on blogger. I would have used the code I created for this blog, but blogger will make it much easier for the not so tech-savvvy folks to get in on the action. Blogger also helps because I can start with a basic css layout from the templates section rather than creating a design from scratch while I'm trying to work out the database of the site. For the whole database/user authentication/content management thing I'm starting from scratch with a custom php/MySQL solution. To see where I'm at so far, goto http://youngmarrieds.jasongraphix.com. It's been a while since I've done any of this, so right now I'm just taking baby steps. These may not be the accepted programming way of doing things, but the necessary steps that I see in getting this bird up in the air. Remember: I am not a programmer.
I don't know how many programmers ever find my blog, but if you are a PHP programmer, you may find this useful. I have been doing most of my programming for this site from within Dreamweaver.
At work I do stuff in Visual Studio though, so I know the environment and features are much more superior. I wanted to do a global find and replace, and that was the straw that broke the camel's back. So I started searching for PHP plugins for Visual Studio .NET 2003.
If you know what I'm talking about, and feel my pain, check out: