<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-11122824</id><updated>2011-04-21T19:07:59.087-04:00</updated><title type='text'>osCommerce - Bobby Easland's (aka Chemo) Blog</title><subtitle type='html'>This is the blog of Bobby Easland aka "Chemo".  Content of this blog will be dedicated to osCommerce material and links.  Don't like it straight up?  This is not the blog to read...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://oscommerce-chemo.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://oscommerce-chemo.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Bobby</name><uri>http://www.blogger.com/profile/08578836045856841442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_oiuj-d5AYlE/SYXF8Z-WenI/AAAAAAAAAAM/d4bRnEPD27w/S220/bobby-250-250.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>24</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-11122824.post-5042981282176137591</id><published>2009-03-07T03:09:00.001-05:00</published><updated>2009-03-07T03:09:15.921-05:00</updated><title type='text'>Community Development Server Online</title><content type='html'>It has always been a goal to shift the paradigm from a small development team to a large, distributed, team.&amp;nbsp; Of course we have thought about coding standards, quality assurance, and security audits.&amp;nbsp; I am truly excited to announce the inevitable release of the Community Development Server to the public where they can peer review the code, download snapshots, and offer advice and/or code.&lt;br&gt; &lt;br&gt; We plan on tying the forum member base into repository access routines so that if one were a forum member that person could potentially be a community contributor as well.&lt;br&gt; &lt;br&gt; Stay tuned as we should have this completed in the next few days (or weeks at the maximum)!&lt;br&gt; &lt;br&gt; Bobby&lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11122824-5042981282176137591?l=oscommerce-chemo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/5042981282176137591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/5042981282176137591'/><link rel='alternate' type='text/html' href='http://oscommerce-chemo.blogspot.com/2009/03/community-development-server-online.html' title='Community Development Server Online'/><author><name>Bobby</name><uri>http://www.blogger.com/profile/08578836045856841442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_oiuj-d5AYlE/SYXF8Z-WenI/AAAAAAAAAAM/d4bRnEPD27w/S220/bobby-250-250.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-11122824.post-6534056062279751703</id><published>2009-02-10T08:41:00.001-05:00</published><updated>2009-02-10T08:48:24.752-05:00</updated><title type='text'>osCommerce is Dead, Long Live osCommerce</title><content type='html'>&lt;font face="Helvetica, Arial, sans-serif"&gt;For anyone that has been active with the osCommerce project for a couple of years it is obvious that it is near abandonment.&amp;nbsp; There has been very little to no progress on the milestones and the MS3.x release is already a corpse.&amp;nbsp; It completely breaks backward compatibility with MS2.2 contributions which is the real strength of the project:&amp;nbsp; the shear number of community contributions.&amp;nbsp; Hence, MS3.x has lost the momentum of MS2.2 and is starting from scratch like the other shopping cart startups.&lt;br&gt; &lt;br&gt; Luckily, there are some high functioning software engineers that will not let osCommerce die and have started &lt;a  href="http://www.oscommerceproject.org/"&gt;The osCommerce Project&lt;/a&gt;.&amp;nbsp; This is not a fork of the project but rather is skipping the MS3 and heading straight for MS4 which will support PHPv5.2x natively.&amp;nbsp; In addition, the shopping cart will use an eCommerce framework that can be upgraded without having to reinstall contributions, plugins, modules, or themes.&amp;nbsp; &lt;br&gt; &lt;br&gt; We have a dedicated development server (a Quad core demon) with a SourceForge clone installed.&amp;nbsp; It natively supports CVS and also Subversion.&amp;nbsp; We are using this development server for the core framework and also the shopping cart that will be built on top of the framework.&lt;br&gt; &lt;br&gt; Another upside is the version control of community contributions.&amp;nbsp; Yes, we are opening the development server to any developer that is familiar with CVS or Subversion.&amp;nbsp; The biggest drawback to creating osCommerce contributions is that there is no version or quality control which makes it hard to support especially when there are more unstable than stable forks.&lt;br&gt; &lt;br&gt; At any rate, stop by the &lt;a href="http://forums.oscommerceproject.org/"&gt;osCommerce Discussion Forum&lt;/a&gt; and read up.&amp;nbsp; I'll see you there!&lt;br&gt; &lt;/font&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11122824-6534056062279751703?l=oscommerce-chemo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/6534056062279751703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/6534056062279751703'/><link rel='alternate' type='text/html' href='http://oscommerce-chemo.blogspot.com/2009/02/oscommerce-is-dead-long-live-oscommerce.html' title='osCommerce is Dead, Long Live osCommerce'/><author><name>Bobby</name><uri>http://www.blogger.com/profile/08578836045856841442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_oiuj-d5AYlE/SYXF8Z-WenI/AAAAAAAAAAM/d4bRnEPD27w/S220/bobby-250-250.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-11122824.post-116157908740219884</id><published>2006-10-23T00:51:00.000-04:00</published><updated>2006-10-23T00:51:27.713-04:00</updated><title type='text'>Ten Commandments for Programmers</title><content type='html'>&lt;ol&gt;
  &lt;li&gt; &lt;b&gt;Thou shalt not worry about bugs. &lt;/b&gt;&lt;/li&gt;
  &lt;blockquote&gt;
    &lt;p&gt;&lt;i&gt;Bugs in your software are actually special features. &lt;/i&gt;&lt;/p&gt;
  &lt;/blockquote&gt;
  &lt;li&gt; &lt;b&gt;Thou shalt not fix abort conditions. &lt;/b&gt;&lt;/li&gt;
  &lt;blockquote&gt;
    &lt;p&gt;&lt;i&gt;Your user has a better chance of winning state lottery than getting the same abort again.&lt;/i&gt;&lt;/p&gt;
  &lt;/blockquote&gt;
  &lt;li&gt; &lt;b&gt;Thou shalt not handle errors. &lt;/b&gt;&lt;/li&gt;
  &lt;blockquote&gt;
    &lt;p&gt;&lt;i&gt;Error handing was meant for error prone people, neither you or your users are error prone. &lt;/i&gt;&lt;/p&gt;
  &lt;/blockquote&gt;
  &lt;li&gt;&lt;b&gt; Thou shalt not restrict users. &lt;/b&gt;&lt;/li&gt;
  &lt;blockquote&gt;
    &lt;p&gt;&lt;i&gt;Don't do any editing, let the user input anything, anywhere, anytime. That is being very user friendly. &lt;/i&gt;&lt;/p&gt;
  &lt;/blockquote&gt;
  &lt;li&gt; &lt;b&gt;Thou shalt not optimize. &lt;/b&gt;&lt;/li&gt;
  &lt;blockquote&gt;
    &lt;p&gt;&lt;i&gt;Your users are very thankful to get the information, they don't worry about speed and efficiency. &lt;/i&gt;&lt;/p&gt;
  &lt;/blockquote&gt;
  &lt;li&gt;&lt;b&gt; Thou shalt not provide help. &lt;/b&gt;&lt;/li&gt;
  &lt;blockquote&gt;
    &lt;p&gt;&lt;i&gt;If your users can not figure out themselves how to use your software than they are too dumb to deserve the benefits of your software anyway.&lt;/i&gt;&lt;/p&gt;
  &lt;/blockquote&gt;
  &lt;li&gt; &lt;b&gt;Thou shalt not document. &lt;/b&gt;&lt;/li&gt;
  &lt;blockquote&gt;
    &lt;p&gt;&lt;i&gt;Documentation only comes in handy for making future modifications. You made the software perfect the first time, it will never need modifications. &lt;/i&gt;&lt;/p&gt;
  &lt;/blockquote&gt;
  &lt;li&gt; &lt;b&gt;Thou shalt not hurry. &lt;/b&gt;&lt;/li&gt;
  &lt;blockquote&gt;
    &lt;p&gt;&lt;i&gt;Only the cute and the mighty should get the program by deadline. &lt;/i&gt;&lt;/p&gt;
  &lt;/blockquote&gt;
  &lt;li&gt;&lt;b&gt; Thou shalt not revise. &lt;/b&gt;&lt;/li&gt;
  &lt;blockquote&gt;
    &lt;p&gt;&lt;i&gt;Your interpretation of specs was right, you know the users' requirements better than them. &lt;/i&gt;&lt;/p&gt;
  &lt;/blockquote&gt;
  &lt;li&gt;&lt;b&gt; Thou shalt not share. &lt;/b&gt;&lt;/li&gt;
  &lt;blockquote&gt;
    &lt;p&gt;&lt;i&gt;If other programmers needed some of your code, they should have written it themselves.&lt;/i&gt;&lt;/p&gt;
  &lt;/blockquote&gt;
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11122824-116157908740219884?l=oscommerce-chemo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/116157908740219884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/116157908740219884'/><link rel='alternate' type='text/html' href='http://oscommerce-chemo.blogspot.com/2006/10/ten-commandments-for-programmers.html' title='Ten Commandments for Programmers'/><author><name>Bobby</name><uri>http://www.blogger.com/profile/08578836045856841442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_oiuj-d5AYlE/SYXF8Z-WenI/AAAAAAAAAAM/d4bRnEPD27w/S220/bobby-250-250.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-11122824.post-116156202178958441</id><published>2006-10-22T20:07:00.000-04:00</published><updated>2006-10-22T20:07:02.736-04:00</updated><title type='text'>osCommerce Users Group on MySpace</title><content type='html'>&lt;p&gt;&lt;a href="http://groups.myspace.com/oscommerce"&gt;osCommerce Users Group on MySpace&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For everyone that has a MySpace account a member named Mark has started a users group.  Stop by, join, and network with osC users, developers, designers, and other people interested in the platform.&lt;/p&gt;
&lt;p&gt;See you there!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11122824-116156202178958441?l=oscommerce-chemo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://groups.myspace.com/oscommerce' title='osCommerce Users Group on MySpace'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/116156202178958441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/116156202178958441'/><link rel='alternate' type='text/html' href='http://oscommerce-chemo.blogspot.com/2006/10/oscommerce-users-group-on-myspace.html' title='osCommerce Users Group on MySpace'/><author><name>Bobby</name><uri>http://www.blogger.com/profile/08578836045856841442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_oiuj-d5AYlE/SYXF8Z-WenI/AAAAAAAAAAM/d4bRnEPD27w/S220/bobby-250-250.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-11122824.post-116131076441853395</id><published>2006-10-19T22:19:00.000-04:00</published><updated>2006-10-20T19:44:43.386-04:00</updated><title type='text'>Zend Certified Engineer</title><content type='html'>&lt;p&gt;&lt;a href="http://www.zend.com/store/education/certification/authenticate.php?ClientCandidateID=ZEND004405&amp;amp;RegistrationID=217586457"&gt;Bobby Easland, Zend Certified Engineer&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;The &lt;a href="http://www.zend.com/education/zend_php_certification" target="_blank"&gt;Zend Certified Engineer exam&lt;/a&gt; has some very tough questions but is well within reach. Programming eCommerce platforms tend to utilize only a small number of core functional areas of the PHP language (file functions, cURL/sockets, DB, etc.) but the exam is very balanced. Anyone that is looking to take the exam should purchase the &lt;a href="http://www.zend.com/store/book/zend_php_4_certification_study_guide" target="_blank"&gt;study guide&lt;/a&gt; and maybe even the &lt;a href="http://www.phparch.com/shop_product.php?itemid=73" target="_blank"&gt;practice questions&lt;/a&gt; book. Both of these helped me to understand the key areas that would be addressed and highlight those areas that I needed to brush up on.&lt;/p&gt;
&lt;p&gt;I highly encourage my fellow osCommerce and eCommerce developers to look into the certification exam. It is very satisfying to obtain the certification directly from the architects of the PHP language and also brush up on the skills that may not be commonly used.&lt;/p&gt;
&lt;p&gt;I would rate my experience with this certification as a 9 out of 10. Good luck to everyone on their path to certifying your skills and experiences!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11122824-116131076441853395?l=oscommerce-chemo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.zend.com/store/education/certification/authenticate.php?ClientCandidateID=ZEND004405&amp;RegistrationID=217586457' title='Zend Certified Engineer'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/116131076441853395'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/116131076441853395'/><link rel='alternate' type='text/html' href='http://oscommerce-chemo.blogspot.com/2006/10/zend-certified-engineer.html' title='Zend Certified Engineer'/><author><name>Bobby</name><uri>http://www.blogger.com/profile/08578836045856841442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_oiuj-d5AYlE/SYXF8Z-WenI/AAAAAAAAAAM/d4bRnEPD27w/S220/bobby-250-250.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-11122824.post-116007254245359087</id><published>2006-10-05T14:22:00.000-04:00</published><updated>2006-10-19T23:53:59.220-04:00</updated><title type='text'>1 Billion Queries Served in 10 days</title><content type='html'>&lt;p&gt;I've been working on a high volume client completing a very customized platform. They needed such things as support for 10K+ concrete products and virtualization to bring that total up to 100K+. The core modifications for this were extensive but not only did it need to accomodate functional requirements but also scale with enterprise level traffic (10,000+ concurrent users). As if that weren't enough they also needed to integrate seamlessly with their distributor servers for regular XML inventory and orders updates. &lt;/p&gt;
&lt;p&gt;The solution for the product virtualization entailed that I first remove the stock osC attrbutes system since IMO it is useless for large catalogs. The shear amount of administration for each product setup would have been several thousand man hours and taken weeks if not months. Another requirement was that inventory be tracked per option. For example, let's say that there is a costume called &amp;quot;Test Costume&amp;quot;. There are several attributes (or options) such as size, color, etc. As each one is sold out it needed to be removed from customer display. All of these were easily handled with the highly customized options core.&lt;/p&gt;
&lt;p&gt;The next task that was approached was the XML integration with the distributor. Basically this is a complete backoffice integration that syncs not only the inventory levels but also the orders. As the order goes through received, picking, and finally shipped it updates the orders status with customer notifications. In addition, it is fault tolerant with queue redundancy. &lt;/p&gt;
&lt;p&gt;Now the fun problem to work on...high traffic volume. For this I naturally selected a clustered configuration with multiple web, load balancers, and DB servers. The cluster currently can support 5K concurrent users without breaking a sweat. In the future if the site encounters a traffic spike (AdWords campaign, etc.) scaling is as easy as adding another node and a fast configuration change in the load balancer.&lt;/p&gt;
&lt;p&gt;Since the cluster went live 10 days ago it has served almost 1 billion queries and climbing by about 100 million queries daily. All the while it is sustaining sub .1 second page render times. &lt;/p&gt;
&lt;p&gt;...so...for all those people that have been asking me what I've been working on there you go. Want to see the site? Here you go: &lt;a href="http://www.halloweenexpress.com/"&gt;Halloween Costumes&lt;/a&gt;  &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11122824-116007254245359087?l=oscommerce-chemo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/116007254245359087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/116007254245359087'/><link rel='alternate' type='text/html' href='http://oscommerce-chemo.blogspot.com/2006/10/1-billion-queries-served-in-10-days.html' title='1 Billion Queries Served in 10 days'/><author><name>Bobby</name><uri>http://www.blogger.com/profile/08578836045856841442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_oiuj-d5AYlE/SYXF8Z-WenI/AAAAAAAAAAM/d4bRnEPD27w/S220/bobby-250-250.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-11122824.post-115255810561002070</id><published>2006-07-10T15:01:00.000-04:00</published><updated>2006-07-10T15:01:45.776-04:00</updated><title type='text'>How to remove session ID appended URLs from the search engine index</title><content type='html'>&lt;p&gt;A common scenario is for store owners that were not aware of the &amp;quot;Prevent Spider Sessions&amp;quot; option to have several URLs indexed by spiders with the session ID appended. This situation is troublesome and there are a few options to handle referrals sent through the &amp;quot;wild&amp;quot; session ID URL.&lt;/p&gt;
&lt;p&gt;However, the true solution to the problem is to REMOVE THE SESSION ID's from the search engine index! So, how hard is it? Pretty easy!&lt;/p&gt;
&lt;p&gt;In includes/application_top.php find this code:&lt;/p&gt;
&lt;textarea cols="76" rows="4"&gt;
// include the language translations
  require(DIR_WS_LANGUAGES . $language . '.php');
&lt;/textarea&gt;
&lt;p&gt;Under that paste this code:&lt;/p&gt;
&lt;textarea cols="76" rows="9"&gt;
 if ( $spider_flag == true ){
  if ( eregi(tep_session_name(), $_SERVER['REQUEST_URI']) ){
   $location = tep_href_link(basename($_SERVER['SCRIPT_NAME']), tep_get_all_get_params(array(tep_session_name())), 'NONSSL', false);
   header("HTTP/1.0 301 Moved Permanently"); 
   header("Location: $location"); // redirect...bye bye  
  }
 }
&lt;/textarea&gt;
&lt;p&gt;This code will redirect the spider to the non-SID URL with a 301 header and over time will remove the session appended URL from the index.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11122824-115255810561002070?l=oscommerce-chemo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/115255810561002070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/115255810561002070'/><link rel='alternate' type='text/html' href='http://oscommerce-chemo.blogspot.com/2006/07/how-to-remove-session-id-appended-urls.html' title='How to remove session ID appended URLs from the search engine index'/><author><name>Bobby</name><uri>http://www.blogger.com/profile/08578836045856841442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_oiuj-d5AYlE/SYXF8Z-WenI/AAAAAAAAAAM/d4bRnEPD27w/S220/bobby-250-250.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-11122824.post-115051336815488155</id><published>2006-06-16T23:02:00.000-04:00</published><updated>2006-06-16T23:02:48.760-04:00</updated><title type='text'>[CONTRIBUTION] Google Sitemap Generator for osCommerce MS-2.2 stores - Categories</title><content type='html'>&lt;p&gt;After posting the latest version of the Google Sitemap Generator for the catalog products there have been several people request that I also post the one for categories.&lt;/p&gt;
&lt;p&gt;So, I have also posted the latest sitemap script for the categories on Digital Point forum as well!&lt;/p&gt;
&lt;p&gt;I posted the code inline with the post so that you can inspect it and see how it works. However, I have also attached the file so as to eliminate copy-and-paste errors that will inevitably occur.&lt;/p&gt;
&lt;p&gt;If you register on the forum to directly download the file be sure to fill in my screen name (Chemo of course!) so that they know who sent you :-) &lt;/p&gt;
&lt;p&gt;Get the new script here:  &lt;a href="http://forums.digitalpoint.com/showthread.php?t=96997"&gt;Google Sitemap Generator v1.1 - Categories&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11122824-115051336815488155?l=oscommerce-chemo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://forums.digitalpoint.com/showthread.php?t=96997' title='[CONTRIBUTION] Google Sitemap Generator for osCommerce MS-2.2 stores - Categories'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/115051336815488155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/115051336815488155'/><link rel='alternate' type='text/html' href='http://oscommerce-chemo.blogspot.com/2006/06/contribution-google-sitemap-generator.html' title='[CONTRIBUTION] Google Sitemap Generator for osCommerce MS-2.2 stores - Categories'/><author><name>Bobby</name><uri>http://www.blogger.com/profile/08578836045856841442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_oiuj-d5AYlE/SYXF8Z-WenI/AAAAAAAAAAM/d4bRnEPD27w/S220/bobby-250-250.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-11122824.post-115004584285896289</id><published>2006-06-11T13:10:00.000-04:00</published><updated>2006-06-11T13:10:42.970-04:00</updated><title type='text'>PHP4/MySQL Error Handling with an Observer design pattern</title><content type='html'>I put up an article on Digg.com just to see what kind of response it gets.  If people find it useful I'll post more articles on PHP design patterns and some interesting solutions to common problems.  Here's the link: &lt;a href="http://digg.com/programming/PHP4_MySQL_Error_Handling_with_an_Observer_design_pattern"&gt;PHP4/MySQL Error Handling with an Observer design pattern&lt;/a&gt;.  If you dig the article...be sure to give me a DIGG! :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11122824-115004584285896289?l=oscommerce-chemo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://digg.com/programming/PHP4_MySQL_Error_Handling_with_an_Observer_design_pattern' title='PHP4/MySQL Error Handling with an Observer design pattern'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/115004584285896289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/115004584285896289'/><link rel='alternate' type='text/html' href='http://oscommerce-chemo.blogspot.com/2006/06/php4mysql-error-handling-with-observer.html' title='PHP4/MySQL Error Handling with an Observer design pattern'/><author><name>Bobby</name><uri>http://www.blogger.com/profile/08578836045856841442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_oiuj-d5AYlE/SYXF8Z-WenI/AAAAAAAAAAM/d4bRnEPD27w/S220/bobby-250-250.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-11122824.post-115003750539357870</id><published>2006-06-11T10:51:00.000-04:00</published><updated>2006-06-11T10:51:45.680-04:00</updated><title type='text'>Google Sitemap Generator v1.2 (osCommerce MS-2.2) - by Chemo</title><content type='html'>&lt;p&gt;I have recently joined the &lt;a href="http://forums.digitalpoint.com/" target="_blank"&gt;Digital Point forum&lt;/a&gt; and will be releasing never before published scripts for osCommerce based stores. In addition I'm going to post articles on PHP design patterns, application architecture, and of course example scripts.&lt;/p&gt;
&lt;p&gt;The first script that I'm releasing is the followup to my &lt;a href="http://www.oscommerce.com/community/contributions,3233" target="_blank"&gt;Google Sitemap Generator contribution&lt;/a&gt;. As some quick history...exactly 12 hours after I released the v1.0 script I was &lt;a href="http://mesoimpact.com/haraldpdl.html" target="_blank"&gt;banned by Harald and the osCommerce team&lt;/a&gt; from the community. As a result I never had the change to properly support the contribution and of course was not able to release further developements.&lt;/p&gt;
&lt;p&gt;Get the new script here: &lt;a href="http://forums.digitalpoint.com/showthread.php?t=94821" target="_blank"&gt;Google Sitemap Generator v1.2&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11122824-115003750539357870?l=oscommerce-chemo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://forums.digitalpoint.com/showthread.php?t=94821' title='Google Sitemap Generator v1.2 (osCommerce MS-2.2) - by Chemo'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/115003750539357870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/115003750539357870'/><link rel='alternate' type='text/html' href='http://oscommerce-chemo.blogspot.com/2006/06/google-sitemap-generator-v12.html' title='Google Sitemap Generator v1.2 (osCommerce MS-2.2) - by Chemo'/><author><name>Bobby</name><uri>http://www.blogger.com/profile/08578836045856841442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_oiuj-d5AYlE/SYXF8Z-WenI/AAAAAAAAAAM/d4bRnEPD27w/S220/bobby-250-250.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-11122824.post-112588660306109124</id><published>2005-09-04T22:16:00.000-04:00</published><updated>2005-09-07T19:56:22.760-04:00</updated><title type='text'>PHP4/MySQL Error Handling with an Observer design pattern</title><content type='html'>&lt;p&gt;I've had several emails from developers about the last blog entry and they all wanted more details on how to implement the Observer pattern for error handling. So, I have started writing an article that will be published by &lt;a href="http://www.devshed.com/c/b/PHP/" target="_blank"&gt;DevShed&lt;/a&gt; sometime in the near future.&lt;/p&gt;
&lt;p&gt;You can read through the article and stay up to date with the creation. Right now the content is  enough for any competent coder to abstract the concept and implement the solution into their application. I'll be adding content to the article as time allows and will hopefully have it finished soon.&lt;/p&gt;
&lt;p&gt;While I'm adding content you can always read through it here: &lt;a href="http://mesoimpact.com/articles/errorHandling.html" target="_blank"&gt;PHP4/MySQL Error Handling with an Observer design pattern&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11122824-112588660306109124?l=oscommerce-chemo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://mesoimpact.com/articles/errorHandling.html' title='PHP4/MySQL Error Handling with an Observer design pattern'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/112588660306109124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/112588660306109124'/><link rel='alternate' type='text/html' href='http://oscommerce-chemo.blogspot.com/2005/09/php4mysql-error-handling-with-observer.html' title='PHP4/MySQL Error Handling with an Observer design pattern'/><author><name>Bobby</name><uri>http://www.blogger.com/profile/08578836045856841442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_oiuj-d5AYlE/SYXF8Z-WenI/AAAAAAAAAAM/d4bRnEPD27w/S220/bobby-250-250.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-11122824.post-112579050552638157</id><published>2005-09-03T19:35:00.000-04:00</published><updated>2005-09-03T19:35:05.550-04:00</updated><title type='text'>Object registry and Observers...</title><content type='html'>&lt;p&gt;The build on Chris's application is going well and we have finished implementing the core tiered architecture!&lt;/p&gt;
&lt;p&gt;The first step was to construct a simple object registry so that the individual components can be shared via a composite pattern. In a nutshell, it is a basic text book Singleton with a twist. The code looks like this:&lt;/p&gt;
&lt;h1&gt;Singleton object registry class &lt;/h1&gt;
&lt;table&gt;
  &lt;tr&gt;
    &lt;td valign="top"&gt;&lt;code&gt;&lt;font color="#999999"&gt;001&amp;nbsp;&lt;br /&gt;
      002&amp;nbsp;&lt;br /&gt;
      003&amp;nbsp;&lt;br /&gt;
      004&amp;nbsp;&lt;br /&gt;
      005&amp;nbsp;&lt;br /&gt;
      006&amp;nbsp;&lt;br /&gt;
      007&amp;nbsp;&lt;br /&gt;
      008&amp;nbsp;&lt;br /&gt;
      009&amp;nbsp;&lt;br /&gt;
      010&amp;nbsp;&lt;br /&gt;
      011&amp;nbsp;&lt;br /&gt;
      012&amp;nbsp;&lt;br /&gt;
      &lt;/font&gt;&lt;/code&gt;&lt;/td&gt;
    &lt;td valign="top"&gt;&lt;code&gt;&lt;font color="#000000"&gt; &lt;font color="#0000BB"&gt;&amp;lt;?php&lt;br /&gt;
      &lt;/font&gt;&lt;font color="#007700"&gt;class &lt;/font&gt;&lt;font color="#0000BB"&gt;Singleton&lt;/font&gt;&lt;font color="#007700"&gt;{ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function &amp;amp;&lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for getInstance" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=getInstance" target="_blank"&gt;getInstance&lt;/a&gt; &lt;/font&gt;&lt;font color="#007700"&gt;(&lt;/font&gt;&lt;font color="#0000BB"&gt;$class&lt;/font&gt;&lt;font color="#007700"&gt;, &lt;/font&gt;&lt;font color="#0000BB"&gt;$name &lt;/font&gt;&lt;font color="#007700"&gt;= &lt;/font&gt;&lt;font color="#DD0000"&gt;''&lt;/font&gt;&lt;font color="#007700"&gt;){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static &lt;/font&gt;&lt;font color="#0000BB"&gt;$registry &lt;/font&gt;&lt;font color="#007700"&gt;= array(); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$_instanceName &lt;/font&gt;&lt;font color="#007700"&gt;= &lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for notNull" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=notNull" target="_blank"&gt;notNull&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(&lt;/font&gt;&lt;font color="#0000BB"&gt;$name&lt;/font&gt;&lt;font color="#007700"&gt;) ? &lt;/font&gt;&lt;font color="#0000BB"&gt;$name &lt;/font&gt;&lt;font color="#007700"&gt;: &lt;/font&gt;&lt;font color="#0000BB"&gt;$class&lt;/font&gt;&lt;font color="#007700"&gt;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ( !isset(&lt;/font&gt;&lt;font color="#0000BB"&gt;$registry&lt;/font&gt;&lt;font color="#007700"&gt;[&lt;/font&gt;&lt;font color="#0000BB"&gt;$class&lt;/font&gt;&lt;font color="#007700"&gt;][&lt;/font&gt;&lt;font color="#0000BB"&gt;$_instanceName&lt;/font&gt;&lt;font color="#007700"&gt;]) || !&lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for is_object" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=is_object" target="_blank"&gt;is_object&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(&lt;/font&gt;&lt;font color="#0000BB"&gt;$registry&lt;/font&gt;&lt;font color="#007700"&gt;[&lt;/font&gt;&lt;font color="#0000BB"&gt;$class&lt;/font&gt;&lt;font color="#007700"&gt;][&lt;/font&gt;&lt;font color="#0000BB"&gt;$_instanceName&lt;/font&gt;&lt;font color="#007700"&gt;]) ) { &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$registry&lt;/font&gt;&lt;font color="#007700"&gt;[&lt;/font&gt;&lt;font color="#0000BB"&gt;$class&lt;/font&gt;&lt;font color="#007700"&gt;][&lt;/font&gt;&lt;font color="#0000BB"&gt;$_instanceName&lt;/font&gt;&lt;font color="#007700"&gt;] =&amp;amp; new &lt;/font&gt;&lt;font color="#0000BB"&gt;$class&lt;/font&gt;&lt;font color="#007700"&gt;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return &lt;/font&gt;&lt;font color="#0000BB"&gt;$registry&lt;/font&gt;&lt;font color="#007700"&gt;[&lt;/font&gt;&lt;font color="#0000BB"&gt;$class&lt;/font&gt;&lt;font color="#007700"&gt;][&lt;/font&gt;&lt;font color="#0000BB"&gt;$_instanceName&lt;/font&gt;&lt;font color="#007700"&gt;]; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;
      }&lt;br /&gt;
      &lt;/font&gt;&lt;font color="#0000BB"&gt;?&amp;gt;&lt;/font&gt; &lt;/font&gt; &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;The code above is the backbone of the application since it is completely object oriented. The benefit is that the code (classes or objects) are reusable and are able to be shared among all yet only instantiated once. This adds tremendous flexibility while keeping system resource utilization to a minimum as the registry contains only &lt;b&gt;references&lt;/b&gt; to the objects and NOT copies of the objects.&lt;/p&gt;
&lt;p&gt;The bottom line is that the category pages are rendering in less than .03 seconds with .005 total MySQL time (of course, no caching yet). Almost forgot...only 5 queries! The performance is blistering fast and infinitely scalable * to the limits of MySQL*. The reason for the outstanding performance is that the application was coded from the bottom up with an eye on performance. Since we are sharing objects we eliminated a lot of redundant database queries and processing overhead with multiple instantiation.&lt;/p&gt;
&lt;p&gt;In addition, we have implemented an Observer / Listener pattern. This will form the backbone of the first plug-and-play eCommerce shopping cart! Admittingly, our beta code is far from perfect but has tremendous potential. The idea is the place strategic hooks in the business logic (and maybe objects) which will enable notification to event Listeners. Thus far we have implemented 2 core systems that use the Observer pattern: error logging and also script/performance timers. Here is the base class:&lt;/p&gt;
&lt;h1&gt;Observer pattern class &lt;/h1&gt;
&lt;table&gt;
  &lt;tr&gt;
    &lt;td valign="top"&gt;&lt;code&gt;&lt;font color="#999999"&gt;001&amp;nbsp;&lt;br /&gt;
      002&amp;nbsp;&lt;br /&gt;
      003&amp;nbsp;&lt;br /&gt;
      004&amp;nbsp;&lt;br /&gt;
      005&amp;nbsp;&lt;br /&gt;
      006&amp;nbsp;&lt;br /&gt;
      007&amp;nbsp;&lt;br /&gt;
      008&amp;nbsp;&lt;br /&gt;
      009&amp;nbsp;&lt;br /&gt;
      010&amp;nbsp;&lt;br /&gt;
      011&amp;nbsp;&lt;br /&gt;
      012&amp;nbsp;&lt;br /&gt;
      013&amp;nbsp;&lt;br /&gt;
      014&amp;nbsp;&lt;br /&gt;
      015&amp;nbsp;&lt;br /&gt;
      016&amp;nbsp;&lt;br /&gt;
      017&amp;nbsp;&lt;br /&gt;
      018&amp;nbsp;&lt;br /&gt;
      019&amp;nbsp;&lt;br /&gt;
      020&amp;nbsp;&lt;br /&gt;
      021&amp;nbsp;&lt;br /&gt;
      022&amp;nbsp;&lt;br /&gt;
      023&amp;nbsp;&lt;br /&gt;
      024&amp;nbsp;&lt;br /&gt;
      025&amp;nbsp;&lt;br /&gt;
      026&amp;nbsp;&lt;br /&gt;
      027&amp;nbsp;&lt;br /&gt;
      028&amp;nbsp;&lt;br /&gt;
      029&amp;nbsp;&lt;br /&gt;
      030&amp;nbsp;&lt;br /&gt;
      031&amp;nbsp;&lt;br /&gt;
      032&amp;nbsp;&lt;br /&gt;
      033&amp;nbsp;&lt;br /&gt;
      034&amp;nbsp;&lt;br /&gt;
      035&amp;nbsp;&lt;br /&gt;
      036&amp;nbsp;&lt;br /&gt;
      037&amp;nbsp;&lt;br /&gt;
      038&amp;nbsp;&lt;br /&gt;
      039&amp;nbsp;&lt;br /&gt;
      040&amp;nbsp;&lt;br /&gt;
      &lt;/font&gt;&lt;/code&gt;&lt;/td&gt;
    &lt;td valign="top"&gt;&lt;code&gt;&lt;font color="#000000"&gt; &lt;font color="#007700"&gt;&amp;lt;?&lt;/font&gt;&lt;font color="#0000BB"&gt;php&lt;br /&gt;
      &lt;/font&gt;&lt;font color="#007700"&gt;class &lt;/font&gt;&lt;font color="#0000BB"&gt;Observer&lt;/font&gt;&lt;font color="#007700"&gt;{ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var &lt;/font&gt;&lt;font color="#0000BB"&gt;$_observers&lt;/font&gt;&lt;font color="#007700"&gt;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var &lt;/font&gt;&lt;font color="#0000BB"&gt;$_message&lt;/font&gt;&lt;font color="#007700"&gt;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function &lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for Observer" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=Observer" target="_blank"&gt;Observer&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$this&lt;/font&gt;&lt;font color="#007700"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#0000BB"&gt;_observers &lt;/font&gt;&lt;font color="#007700"&gt;= array(); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$this&lt;/font&gt;&lt;font color="#007700"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#0000BB"&gt;_message &lt;/font&gt;&lt;font color="#007700"&gt;= &lt;/font&gt;&lt;font color="#0000BB"&gt;NULL&lt;/font&gt;&lt;font color="#007700"&gt;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;/font&gt;&lt;font color="#FF8000"&gt;# end constructor &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#007700"&gt;function &lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for attach" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=attach" target="_blank"&gt;attach&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(&amp;amp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$observer&lt;/font&gt;&lt;font color="#007700"&gt;){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$this&lt;/font&gt;&lt;font color="#007700"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#0000BB"&gt;_observers&lt;/font&gt;&lt;font color="#007700"&gt;[] =&amp;amp; &lt;/font&gt;&lt;font color="#0000BB"&gt;$observer&lt;/font&gt;&lt;font color="#007700"&gt;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;/font&gt;&lt;font color="#FF8000"&gt;# end function &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#007700"&gt;function &lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for detach" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=detach" target="_blank"&gt;detach&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(&amp;amp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$observer&lt;/font&gt;&lt;font color="#007700"&gt;){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach ( &lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for array_keys" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=array_keys" target="_blank"&gt;array_keys&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(&lt;/font&gt;&lt;font color="#0000BB"&gt;$this&lt;/font&gt;&lt;font color="#007700"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#0000BB"&gt;_observers&lt;/font&gt;&lt;font color="#007700"&gt;) as &lt;/font&gt;&lt;font color="#0000BB"&gt;$key &lt;/font&gt;&lt;font color="#007700"&gt;){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (&lt;/font&gt;&lt;font color="#0000BB"&gt;$this&lt;/font&gt;&lt;font color="#007700"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#0000BB"&gt;_observers&lt;/font&gt;&lt;font color="#007700"&gt;[&lt;/font&gt;&lt;font color="#0000BB"&gt;$key&lt;/font&gt;&lt;font color="#007700"&gt;] === &lt;/font&gt;&lt;font color="#0000BB"&gt;$observer&lt;/font&gt;&lt;font color="#007700"&gt;){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unset(&lt;/font&gt;&lt;font color="#0000BB"&gt;$this&lt;/font&gt;&lt;font color="#007700"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#0000BB"&gt;_observers&lt;/font&gt;&lt;font color="#007700"&gt;[&lt;/font&gt;&lt;font color="#0000BB"&gt;$key&lt;/font&gt;&lt;font color="#007700"&gt;]); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;/font&gt;&lt;font color="#FF8000"&gt;# end if &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#007700"&gt;} &lt;/font&gt;&lt;font color="#FF8000"&gt;# end foreach &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#007700"&gt;} &lt;/font&gt;&lt;font color="#FF8000"&gt;# end function &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#007700"&gt;function &lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for notify" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=notify" target="_blank"&gt;notify&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach ( &lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for array_keys" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=array_keys" target="_blank"&gt;array_keys&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(&lt;/font&gt;&lt;font color="#0000BB"&gt;$this&lt;/font&gt;&lt;font color="#007700"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#0000BB"&gt;_observers&lt;/font&gt;&lt;font color="#007700"&gt;) as &lt;/font&gt;&lt;font color="#0000BB"&gt;$key &lt;/font&gt;&lt;font color="#007700"&gt;){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$observer &lt;/font&gt;&lt;font color="#007700"&gt;=&amp;amp; &lt;/font&gt;&lt;font color="#0000BB"&gt;$this&lt;/font&gt;&lt;font color="#007700"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#0000BB"&gt;_observers&lt;/font&gt;&lt;font color="#007700"&gt;[&lt;/font&gt;&lt;font color="#0000BB"&gt;$key&lt;/font&gt;&lt;font color="#007700"&gt;]; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$observer&lt;/font&gt;&lt;font color="#007700"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for update" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=update" target="_blank"&gt;update&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(&lt;/font&gt;&lt;font color="#0000BB"&gt;$this&lt;/font&gt;&lt;font color="#007700"&gt;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;/font&gt;&lt;font color="#FF8000"&gt;# end foreach &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#007700"&gt;} &lt;/font&gt;&lt;font color="#FF8000"&gt;# end function &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#007700"&gt;function &lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for getState" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=getState" target="_blank"&gt;getState&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return &lt;/font&gt;&lt;font color="#0000BB"&gt;$this&lt;/font&gt;&lt;font color="#007700"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#0000BB"&gt;_message&lt;/font&gt;&lt;font color="#007700"&gt;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;/font&gt;&lt;font color="#FF8000"&gt;# end function &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#007700"&gt;function &lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for setState" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=setState" target="_blank"&gt;setState&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(&lt;/font&gt;&lt;font color="#0000BB"&gt;$info&lt;/font&gt;&lt;font color="#007700"&gt;){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$this&lt;/font&gt;&lt;font color="#007700"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#0000BB"&gt;_message &lt;/font&gt;&lt;font color="#007700"&gt;= &lt;/font&gt;&lt;font color="#0000BB"&gt;$info&lt;/font&gt;&lt;font color="#007700"&gt;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$this&lt;/font&gt;&lt;font color="#007700"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for notify" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=notify" target="_blank"&gt;notify&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;/font&gt;&lt;font color="#FF8000"&gt;# end function&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
      &lt;/font&gt;&lt;font color="#007700"&gt;} &lt;/font&gt;&lt;font color="#FF8000"&gt;# end class&lt;br /&gt;
      &lt;/font&gt;&lt;font color="#0000BB"&gt;?&amp;gt;&lt;/font&gt; &lt;/font&gt; &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;h1&gt;...example instantiation of Observer object and attachment of event hander&lt;/h1&gt;
&lt;table&gt;
  &lt;tr&gt;
    &lt;td valign="top"&gt;&lt;code&gt;&lt;font color="#999999"&gt;001&amp;nbsp;&lt;br /&gt;
      002&amp;nbsp;&lt;br /&gt;
      003&amp;nbsp;&lt;br /&gt;
      004&amp;nbsp;&lt;br /&gt;
      005&amp;nbsp;&lt;br /&gt;
      006&amp;nbsp;&lt;br /&gt;
      007&amp;nbsp;&lt;br /&gt;
      008&amp;nbsp;&lt;br /&gt;
      009&amp;nbsp;&lt;br /&gt;
      010&amp;nbsp;&lt;br /&gt;
      011&amp;nbsp;&lt;br /&gt;
      012&amp;nbsp;&lt;br /&gt;
      013&amp;nbsp;&lt;br /&gt;
      014&amp;nbsp;&lt;br /&gt;
      015&amp;nbsp;&lt;br /&gt;
      016&amp;nbsp;&lt;br /&gt;
      017&amp;nbsp;&lt;br /&gt;
      018&amp;nbsp;&lt;br /&gt;
      019&amp;nbsp;&lt;br /&gt;
      020&amp;nbsp;&lt;br /&gt;
      021&amp;nbsp;&lt;br /&gt;
      022&amp;nbsp;&lt;br /&gt;
      023&amp;nbsp;&lt;br /&gt;
      024&amp;nbsp;&lt;br /&gt;
      025&amp;nbsp;&lt;br /&gt;
      026&amp;nbsp;&lt;br /&gt;
      027&amp;nbsp;&lt;br /&gt;
      028&amp;nbsp;&lt;br /&gt;
      029&amp;nbsp;&lt;br /&gt;
      &lt;/font&gt;&lt;/code&gt;&lt;/td&gt;
    &lt;td valign="top"&gt;&lt;code&gt;&lt;font color="#000000"&gt; &lt;font color="#007700"&gt;&amp;lt;?&lt;/font&gt;&lt;font color="#0000BB"&gt;php&lt;br /&gt;
      &lt;/font&gt;&lt;font color="#FF8000"&gt;///////// &lt;br /&gt;
      // This code is in application_top.php &lt;br /&gt;
      ///////// &lt;br /&gt;
      /* &lt;br /&gt;
      * Initialize the error handler (observer) class as a Singleton &lt;br /&gt;
      * and attach the screen output object &lt;br /&gt;
      */ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$errorHandler &lt;/font&gt;&lt;font color="#007700"&gt;=&amp;amp; &lt;/font&gt;&lt;font color="#0000BB"&gt;Singleton&lt;/font&gt;&lt;font color="#007700"&gt;::&lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for getInstance" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=getInstance" target="_blank"&gt;getInstance&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(&lt;/font&gt;&lt;font color="#DD0000"&gt;'Observer'&lt;/font&gt;&lt;font color="#007700"&gt;, &lt;/font&gt;&lt;font color="#DD0000"&gt;'ErrorHandler'&lt;/font&gt;&lt;font color="#007700"&gt;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$errorHandler&lt;/font&gt;&lt;font color="#007700"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for attach" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=attach" target="_blank"&gt;attach&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(&lt;/font&gt;&lt;font color="#0000BB"&gt;Singleton&lt;/font&gt;&lt;font color="#007700"&gt;::&lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for getInstance" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=getInstance" target="_blank"&gt;getInstance&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(&lt;/font&gt;&lt;font color="#DD0000"&gt;'ScreenOutputErrorLogger'&lt;/font&gt;&lt;font color="#007700"&gt;)); &lt;br /&gt;
      &lt;br /&gt;
      &lt;/font&gt;&lt;font color="#FF8000"&gt;/* &lt;br /&gt;
      * Set the custom error handler function &lt;br /&gt;
      */ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for set_error_handler" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=set_error_handler" target="_blank"&gt;set_error_handler&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(&lt;/font&gt;&lt;font color="#DD0000"&gt;'observerErrorHandler'&lt;/font&gt;&lt;font color="#007700"&gt;); &lt;br /&gt;
      &lt;br /&gt;
      &lt;/font&gt;&lt;font color="#FF8000"&gt;///////// &lt;br /&gt;
      // This code is a general (callback) function &lt;br /&gt;
      ///////// &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#007700"&gt;function &lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for observerErrorHandler" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=observerErrorHandler" target="_blank"&gt;observerErrorHandler&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(&lt;/font&gt;&lt;font color="#0000BB"&gt;$errno&lt;/font&gt;&lt;font color="#007700"&gt;, &lt;/font&gt;&lt;font color="#0000BB"&gt;$errstr&lt;/font&gt;&lt;font color="#007700"&gt;, &lt;/font&gt;&lt;font color="#0000BB"&gt;$errfile&lt;/font&gt;&lt;font color="#007700"&gt;, &lt;/font&gt;&lt;font color="#0000BB"&gt;$errline&lt;/font&gt;&lt;font color="#007700"&gt;, &lt;/font&gt;&lt;font color="#0000BB"&gt;$errcontext&lt;/font&gt;&lt;font color="#007700"&gt;){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$handler &lt;/font&gt;&lt;font color="#007700"&gt;=&amp;amp; &lt;/font&gt;&lt;font color="#0000BB"&gt;Singleton&lt;/font&gt;&lt;font color="#007700"&gt;::&lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for getInstance" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=getInstance" target="_blank"&gt;getInstance&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(&lt;/font&gt;&lt;font color="#DD0000"&gt;'Observer'&lt;/font&gt;&lt;font color="#007700"&gt;, &lt;/font&gt;&lt;font color="#DD0000"&gt;'ErrorHandler'&lt;/font&gt;&lt;font color="#007700"&gt;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$handler&lt;/font&gt;&lt;font color="#007700"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for setState" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=setState" target="_blank"&gt;setState&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;( array(&lt;/font&gt;&lt;font color="#DD0000"&gt;'number' &lt;/font&gt;&lt;font color="#007700"&gt;=&amp;gt; &lt;/font&gt;&lt;font color="#0000BB"&gt;$errno&lt;/font&gt;&lt;font color="#007700"&gt;, &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#DD0000"&gt;'msg' &lt;/font&gt;&lt;font color="#007700"&gt;=&amp;gt; &lt;/font&gt;&lt;font color="#0000BB"&gt;$errstr&lt;/font&gt;&lt;font color="#007700"&gt;, &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#DD0000"&gt;'file' &lt;/font&gt;&lt;font color="#007700"&gt;=&amp;gt; &lt;/font&gt;&lt;font color="#0000BB"&gt;$errfile&lt;/font&gt;&lt;font color="#007700"&gt;, &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#DD0000"&gt;'line' &lt;/font&gt;&lt;font color="#007700"&gt;=&amp;gt; &lt;/font&gt;&lt;font color="#0000BB"&gt;$errline &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#007700"&gt;) &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;
      &lt;/font&gt;&lt;font color="#0000BB"&gt;?&amp;gt;&lt;/font&gt; &lt;/font&gt; &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;h1&gt;ScreenOutputErrorLogger event handler class&lt;/h1&gt;
&lt;table&gt;
  &lt;tr&gt;
    &lt;td valign="top"&gt;&lt;code&gt;&lt;font color="#999999"&gt;001&amp;nbsp;&lt;br /&gt;
      002&amp;nbsp;&lt;br /&gt;
      003&amp;nbsp;&lt;br /&gt;
      004&amp;nbsp;&lt;br /&gt;
      005&amp;nbsp;&lt;br /&gt;
      006&amp;nbsp;&lt;br /&gt;
      007&amp;nbsp;&lt;br /&gt;
      008&amp;nbsp;&lt;br /&gt;
      009&amp;nbsp;&lt;br /&gt;
      010&amp;nbsp;&lt;br /&gt;
      011&amp;nbsp;&lt;br /&gt;
      012&amp;nbsp;&lt;br /&gt;
      013&amp;nbsp;&lt;br /&gt;
      014&amp;nbsp;&lt;br /&gt;
      015&amp;nbsp;&lt;br /&gt;
      016&amp;nbsp;&lt;br /&gt;
      017&amp;nbsp;&lt;br /&gt;
      018&amp;nbsp;&lt;br /&gt;
      019&amp;nbsp;&lt;br /&gt;
      020&amp;nbsp;&lt;br /&gt;
      021&amp;nbsp;&lt;br /&gt;
      022&amp;nbsp;&lt;br /&gt;
      023&amp;nbsp;&lt;br /&gt;
      024&amp;nbsp;&lt;br /&gt;
      025&amp;nbsp;&lt;br /&gt;
      026&amp;nbsp;&lt;br /&gt;
      027&amp;nbsp;&lt;br /&gt;
      028&amp;nbsp;&lt;br /&gt;
      &lt;/font&gt;&lt;/code&gt;&lt;/td&gt;
    &lt;td valign="top"&gt;&lt;code&gt;&lt;font color="#000000"&gt; &lt;font color="#007700"&gt;&amp;lt;?&lt;/font&gt;&lt;font color="#0000BB"&gt;php&lt;br /&gt;
      &lt;/font&gt;&lt;font color="#007700"&gt;class &lt;/font&gt;&lt;font color="#0000BB"&gt;ScreenOutputErrorLogger&lt;/font&gt;&lt;font color="#007700"&gt;{ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var &lt;/font&gt;&lt;font color="#0000BB"&gt;$_errors&lt;/font&gt;&lt;font color="#007700"&gt;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function &lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for ScreenOutputErrorLogger" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=ScreenOutputErrorLogger" target="_blank"&gt;ScreenOutputErrorLogger&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$this&lt;/font&gt;&lt;font color="#007700"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#0000BB"&gt;_errors &lt;/font&gt;&lt;font color="#007700"&gt;= array(); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;/font&gt;&lt;font color="#FF8000"&gt;# end constructor &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#007700"&gt;function &lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for update" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=update" target="_blank"&gt;update&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(&amp;amp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$error_handler&lt;/font&gt;&lt;font color="#007700"&gt;){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$error &lt;/font&gt;&lt;font color="#007700"&gt;= &lt;/font&gt;&lt;font color="#0000BB"&gt;$error_handler&lt;/font&gt;&lt;font color="#007700"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for getState" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=getState" target="_blank"&gt;getState&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$this&lt;/font&gt;&lt;font color="#007700"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#0000BB"&gt;_errors&lt;/font&gt;&lt;font color="#007700"&gt;[] = &lt;/font&gt;&lt;font color="#0000BB"&gt;$error&lt;/font&gt;&lt;font color="#007700"&gt;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;/font&gt;&lt;font color="#FF8000"&gt;# end function &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#007700"&gt;function &lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for errorCount" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=errorCount" target="_blank"&gt;errorCount&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return &lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for sizeof" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=sizeof" target="_blank"&gt;sizeof&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(&lt;/font&gt;&lt;font color="#0000BB"&gt;$this&lt;/font&gt;&lt;font color="#007700"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#0000BB"&gt;_errors&lt;/font&gt;&lt;font color="#007700"&gt;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;/font&gt;&lt;font color="#FF8000"&gt;# end function &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#007700"&gt;function &lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for output" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=output" target="_blank"&gt;output&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(&lt;/font&gt;&lt;font color="#0000BB"&gt;$hidden &lt;/font&gt;&lt;font color="#007700"&gt;= &lt;/font&gt;&lt;font color="#0000BB"&gt;false&lt;/font&gt;&lt;font color="#007700"&gt;){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (&lt;/font&gt;&lt;font color="#0000BB"&gt;$hidden&lt;/font&gt;&lt;font color="#007700"&gt;) echo &lt;/font&gt;&lt;font color="#DD0000"&gt;'&amp;lt;!--' &lt;/font&gt;&lt;font color="#007700"&gt;. &lt;/font&gt;&lt;font color="#DD0000"&gt;"\n"&lt;/font&gt;&lt;font color="#007700"&gt;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo &lt;/font&gt;&lt;font color="#DD0000"&gt;'&amp;lt;h1&amp;gt;Errors:&amp;lt;/h1&amp;gt;' &lt;/font&gt;&lt;font color="#007700"&gt;. &lt;/font&gt;&lt;font color="#DD0000"&gt;"\n"&lt;/font&gt;&lt;font color="#007700"&gt;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo &lt;/font&gt;&lt;font color="#DD0000"&gt;'&amp;lt;pre&amp;gt;' &lt;/font&gt;&lt;font color="#007700"&gt;. &lt;/font&gt;&lt;font color="#DD0000"&gt;"\n"&lt;/font&gt;&lt;font color="#007700"&gt;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for print_r" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=print_r" target="_blank"&gt;print_r&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(&lt;/font&gt;&lt;font color="#0000BB"&gt;$this&lt;/font&gt;&lt;font color="#007700"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#0000BB"&gt;_errors&lt;/font&gt;&lt;font color="#007700"&gt;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo &lt;/font&gt;&lt;font color="#DD0000"&gt;'&amp;lt;/pre&amp;gt;' &lt;/font&gt;&lt;font color="#007700"&gt;. &lt;/font&gt;&lt;font color="#DD0000"&gt;"\n"&lt;/font&gt;&lt;font color="#007700"&gt;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (&lt;/font&gt;&lt;font color="#0000BB"&gt;$hidden&lt;/font&gt;&lt;font color="#007700"&gt;) echo &lt;/font&gt;&lt;font color="#DD0000"&gt;'//--&amp;gt;' &lt;/font&gt;&lt;font color="#007700"&gt;. &lt;/font&gt;&lt;font color="#DD0000"&gt;"\n"&lt;/font&gt;&lt;font color="#007700"&gt;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;/font&gt;&lt;font color="#FF8000"&gt;# end function &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
      &lt;/font&gt;&lt;font color="#007700"&gt;} &lt;/font&gt;&lt;font color="#FF8000"&gt;# end class&lt;br /&gt;
      &lt;/font&gt;&lt;font color="#0000BB"&gt;?&amp;gt;&lt;/font&gt; &lt;/font&gt; &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;The basic operation is that once an Observer is instantiated other objects can register as an event handler. The great benefit is that there can be multiple event handlers for each! So, the ErrorHandler object is instantiated and then directly after that the ScreenOutputErrorLogger is attached. Thus, every non-fatal error that is triggered will send the Listener state to every object that is registered for notification (right now only the screen logger). The flexibility in this system is that other objects can be registered as well. As an example, we will create the email object next which can be registered as an event handler and email the administrator on database errors (instead of killing the script). In fact, we can create as many event handlers as we want. There could easily be a logger event handler that saves the errors to database or text file. The point is that event handlers can be attached and detached as needed without affecting the function of the others.&lt;/p&gt;
&lt;p&gt;Another development milestone is the true tiered architecture. We have implemented a classic 4 tier architecture: presentation (template engine), business logic (meat and bones manipulating object interaction), accessor (database access), and persistence (database). We have tested the architecture by placing each tier on a different server that is physically separate from the others. The application performed beautifully and is confirmation the tiered architecture is complete and bug free. &lt;/p&gt;
&lt;p&gt;This ground-up build has enabled me to finally implement my custom rolled template engine! There is no PHP in the templates and is completely separate from the code. Thus, inexperienced webmasters can tweak and modify the templates all they want without ever corrupting the core code. In addition, I feel a robust templating engine will afford more designers to quickly create skins. Here is the template class code:&lt;/p&gt;
&lt;h1&gt;Template engine class&lt;/h1&gt;
&lt;table&gt;
  &lt;tr&gt;
    &lt;td valign="top"&gt;&lt;code&gt;&lt;font color="#999999"&gt;001&amp;nbsp;&lt;br /&gt;
      002&amp;nbsp;&lt;br /&gt;
      003&amp;nbsp;&lt;br /&gt;
      004&amp;nbsp;&lt;br /&gt;
      005&amp;nbsp;&lt;br /&gt;
      006&amp;nbsp;&lt;br /&gt;
      007&amp;nbsp;&lt;br /&gt;
      008&amp;nbsp;&lt;br /&gt;
      009&amp;nbsp;&lt;br /&gt;
      010&amp;nbsp;&lt;br /&gt;
      011&amp;nbsp;&lt;br /&gt;
      012&amp;nbsp;&lt;br /&gt;
      013&amp;nbsp;&lt;br /&gt;
      014&amp;nbsp;&lt;br /&gt;
      015&amp;nbsp;&lt;br /&gt;
      016&amp;nbsp;&lt;br /&gt;
      017&amp;nbsp;&lt;br /&gt;
      018&amp;nbsp;&lt;br /&gt;
      019&amp;nbsp;&lt;br /&gt;
      020&amp;nbsp;&lt;br /&gt;
      021&amp;nbsp;&lt;br /&gt;
      022&amp;nbsp;&lt;br /&gt;
      023&amp;nbsp;&lt;br /&gt;
      024&amp;nbsp;&lt;br /&gt;
      025&amp;nbsp;&lt;br /&gt;
      026&amp;nbsp;&lt;br /&gt;
      027&amp;nbsp;&lt;br /&gt;
      028&amp;nbsp;&lt;br /&gt;
      029&amp;nbsp;&lt;br /&gt;
      030&amp;nbsp;&lt;br /&gt;
      031&amp;nbsp;&lt;br /&gt;
      032&amp;nbsp;&lt;br /&gt;
      033&amp;nbsp;&lt;br /&gt;
      034&amp;nbsp;&lt;br /&gt;
      035&amp;nbsp;&lt;br /&gt;
      036&amp;nbsp;&lt;br /&gt;
      037&amp;nbsp;&lt;br /&gt;
      038&amp;nbsp;&lt;br /&gt;
      039&amp;nbsp;&lt;br /&gt;
      040&amp;nbsp;&lt;br /&gt;
      041&amp;nbsp;&lt;br /&gt;
      042&amp;nbsp;&lt;br /&gt;
      043&amp;nbsp;&lt;br /&gt;
      044&amp;nbsp;&lt;br /&gt;
      045&amp;nbsp;&lt;br /&gt;
      046&amp;nbsp;&lt;br /&gt;
      047&amp;nbsp;&lt;br /&gt;
      048&amp;nbsp;&lt;br /&gt;
      049&amp;nbsp;&lt;br /&gt;
      050&amp;nbsp;&lt;br /&gt;
      051&amp;nbsp;&lt;br /&gt;
      052&amp;nbsp;&lt;br /&gt;
      053&amp;nbsp;&lt;br /&gt;
      054&amp;nbsp;&lt;br /&gt;
      055&amp;nbsp;&lt;br /&gt;
      056&amp;nbsp;&lt;br /&gt;
      057&amp;nbsp;&lt;br /&gt;
      &lt;/font&gt;&lt;/code&gt;&lt;/td&gt;
    &lt;td valign="top"&gt;&lt;code&gt;&lt;font color="#000000"&gt; &lt;font color="#007700"&gt;&amp;lt;?&lt;/font&gt;&lt;font color="#0000BB"&gt;php&lt;br /&gt;
      &lt;/font&gt;&lt;font color="#007700"&gt;class &lt;/font&gt;&lt;font color="#0000BB"&gt;Template&lt;/font&gt;&lt;font color="#007700"&gt;{ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var &lt;/font&gt;&lt;font color="#0000BB"&gt;$template&lt;/font&gt;&lt;font color="#007700"&gt;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var &lt;/font&gt;&lt;font color="#0000BB"&gt;$variables&lt;/font&gt;&lt;font color="#007700"&gt;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function &lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for Template" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=Template" target="_blank"&gt;Template&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(&lt;/font&gt;&lt;font color="#0000BB"&gt;$template &lt;/font&gt;&lt;font color="#007700"&gt;= &lt;/font&gt;&lt;font color="#DD0000"&gt;''&lt;/font&gt;&lt;font color="#007700"&gt;){&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$this&lt;/font&gt;&lt;font color="#007700"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#0000BB"&gt;template &lt;/font&gt;&lt;font color="#007700"&gt;= &lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for notNull" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=notNull" target="_blank"&gt;notNull&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(&lt;/font&gt;&lt;font color="#0000BB"&gt;$template&lt;/font&gt;&lt;font color="#007700"&gt;) ? &lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for file_get_contents" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=file_get_contents" target="_blank"&gt;file_get_contents&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(&lt;/font&gt;&lt;font color="#0000BB"&gt;$template&lt;/font&gt;&lt;font color="#007700"&gt;) : &lt;/font&gt;&lt;font color="#0000BB"&gt;NULL&lt;/font&gt;&lt;font color="#007700"&gt;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;/font&gt;&lt;font color="#FF8000"&gt;# end class constructor &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#007700"&gt;function &lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for Add" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=Add" target="_blank"&gt;Add&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(&lt;/font&gt;&lt;font color="#0000BB"&gt;$var_name&lt;/font&gt;&lt;font color="#007700"&gt;, &lt;/font&gt;&lt;font color="#0000BB"&gt;$var_data&lt;/font&gt;&lt;font color="#007700"&gt;){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$this&lt;/font&gt;&lt;font color="#007700"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#0000BB"&gt;variables&lt;/font&gt;&lt;font color="#007700"&gt;[&lt;/font&gt;&lt;font color="#0000BB"&gt;$var_name&lt;/font&gt;&lt;font color="#007700"&gt;] = &lt;/font&gt;&lt;font color="#0000BB"&gt;$var_data&lt;/font&gt;&lt;font color="#007700"&gt;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;/font&gt;&lt;font color="#FF8000"&gt;# end fucntion Add() &lt;br /&gt;
      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#007700"&gt;function &lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for AddMulti" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=AddMulti" target="_blank"&gt;AddMulti&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(&lt;/font&gt;&lt;font color="#0000BB"&gt;$var_data&lt;/font&gt;&lt;font color="#007700"&gt;){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (&lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for is_array" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=is_array" target="_blank"&gt;is_array&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(&lt;/font&gt;&lt;font color="#0000BB"&gt;$var_data&lt;/font&gt;&lt;font color="#007700"&gt;)){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach ( &lt;/font&gt;&lt;font color="#0000BB"&gt;$var_data &lt;/font&gt;&lt;font color="#007700"&gt;as &lt;/font&gt;&lt;font color="#0000BB"&gt;$name &lt;/font&gt;&lt;font color="#007700"&gt;=&amp;gt; &lt;/font&gt;&lt;font color="#0000BB"&gt;$data &lt;/font&gt;&lt;font color="#007700"&gt;){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$this&lt;/font&gt;&lt;font color="#007700"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#0000BB"&gt;variables&lt;/font&gt;&lt;font color="#007700"&gt;[&lt;/font&gt;&lt;font color="#0000BB"&gt;$name&lt;/font&gt;&lt;font color="#007700"&gt;] = &lt;/font&gt;&lt;font color="#0000BB"&gt;$data&lt;/font&gt;&lt;font color="#007700"&gt;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;/font&gt;&lt;font color="#FF8000"&gt;# end fucntion Add() &lt;br /&gt;
      &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#007700"&gt;function &lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for ResetVars" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=ResetVars" target="_blank"&gt;ResetVars&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$this&lt;/font&gt;&lt;font color="#007700"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#0000BB"&gt;variables &lt;/font&gt;&lt;font color="#007700"&gt;= &lt;/font&gt;&lt;font color="#0000BB"&gt;NULL&lt;/font&gt;&lt;font color="#007700"&gt;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;/font&gt;&lt;font color="#FF8000"&gt;# end function &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#007700"&gt;function &lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for EvaluateTag" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=EvaluateTag" target="_blank"&gt;EvaluateTag&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(&lt;/font&gt;&lt;font color="#0000BB"&gt;$data&lt;/font&gt;&lt;font color="#007700"&gt;, &lt;/font&gt;&lt;font color="#0000BB"&gt;$tag&lt;/font&gt;&lt;font color="#007700"&gt;, &lt;/font&gt;&lt;font color="#0000BB"&gt;$params &lt;/font&gt;&lt;font color="#007700"&gt;= &lt;/font&gt;&lt;font color="#0000BB"&gt;NULL&lt;/font&gt;&lt;font color="#007700"&gt;){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$_tag &lt;/font&gt;&lt;font color="#007700"&gt;= &lt;/font&gt;&lt;font color="#DD0000"&gt;'&amp;lt;' &lt;/font&gt;&lt;font color="#007700"&gt;. &lt;/font&gt;&lt;font color="#0000BB"&gt;$tag&lt;/font&gt;&lt;font color="#007700"&gt;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (&lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for notNull" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=notNull" target="_blank"&gt;notNull&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(&lt;/font&gt;&lt;font color="#0000BB"&gt;$params&lt;/font&gt;&lt;font color="#007700"&gt;)){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$_tag &lt;/font&gt;&lt;font color="#007700"&gt;.= &lt;/font&gt;&lt;font color="#DD0000"&gt;' ' &lt;/font&gt;&lt;font color="#007700"&gt;. &lt;/font&gt;&lt;font color="#0000BB"&gt;$params&lt;/font&gt;&lt;font color="#007700"&gt;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$_tag &lt;/font&gt;&lt;font color="#007700"&gt;.= &lt;/font&gt;&lt;font color="#DD0000"&gt;'&amp;gt;' &lt;/font&gt;&lt;font color="#007700"&gt;. &lt;/font&gt;&lt;font color="#0000BB"&gt;$data &lt;/font&gt;&lt;font color="#007700"&gt;. &lt;/font&gt;&lt;font color="#DD0000"&gt;'&amp;lt;/' &lt;/font&gt;&lt;font color="#007700"&gt;. &lt;/font&gt;&lt;font color="#0000BB"&gt;$tag &lt;/font&gt;&lt;font color="#007700"&gt;. &lt;/font&gt;&lt;font color="#DD0000"&gt;'&amp;gt;' &lt;/font&gt;&lt;font color="#007700"&gt;. &lt;/font&gt;&lt;font color="#DD0000"&gt;"\n"&lt;/font&gt;&lt;font color="#007700"&gt;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return &lt;/font&gt;&lt;font color="#0000BB"&gt;$_tag&lt;/font&gt;&lt;font color="#007700"&gt;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;/font&gt;&lt;font color="#FF8000"&gt;# end function &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#007700"&gt;function &lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for Remove" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=Remove" target="_blank"&gt;Remove&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(&lt;/font&gt;&lt;font color="#0000BB"&gt;$vars&lt;/font&gt;&lt;font color="#007700"&gt;){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ( &lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for is_array" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=is_array" target="_blank"&gt;is_array&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(&lt;/font&gt;&lt;font color="#0000BB"&gt;$vars&lt;/font&gt;&lt;font color="#007700"&gt;) ){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach ( &lt;/font&gt;&lt;font color="#0000BB"&gt;$vars &lt;/font&gt;&lt;font color="#007700"&gt;as &lt;/font&gt;&lt;font color="#0000BB"&gt;$index &lt;/font&gt;&lt;font color="#007700"&gt;=&amp;gt; &lt;/font&gt;&lt;font color="#0000BB"&gt;$varname &lt;/font&gt;&lt;font color="#007700"&gt;){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unset( &lt;/font&gt;&lt;font color="#0000BB"&gt;$this&lt;/font&gt;&lt;font color="#007700"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#0000BB"&gt;variables&lt;/font&gt;&lt;font color="#007700"&gt;[&lt;/font&gt;&lt;font color="#0000BB"&gt;$varname&lt;/font&gt;&lt;font color="#007700"&gt;] ); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;/font&gt;&lt;font color="#FF8000"&gt;# end foreach &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#007700"&gt;} else { &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unset(&lt;/font&gt;&lt;font color="#0000BB"&gt;$this&lt;/font&gt;&lt;font color="#007700"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#0000BB"&gt;variables&lt;/font&gt;&lt;font color="#007700"&gt;[&lt;/font&gt;&lt;font color="#0000BB"&gt;$vars&lt;/font&gt;&lt;font color="#007700"&gt;]); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;/font&gt;&lt;font color="#FF8000"&gt;# end fucntion Add() &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#007700"&gt;function &lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for Evaluate" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=Evaluate" target="_blank"&gt;Evaluate&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(&lt;/font&gt;&lt;font color="#0000BB"&gt;$direct_output &lt;/font&gt;&lt;font color="#007700"&gt;= &lt;/font&gt;&lt;font color="#0000BB"&gt;false&lt;/font&gt;&lt;font color="#007700"&gt;){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#0000BB"&gt;$template &lt;/font&gt;&lt;font color="#007700"&gt;= &lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for addslashes" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=addslashes" target="_blank"&gt;addslashes&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(&lt;/font&gt;&lt;font color="#0000BB"&gt;$this&lt;/font&gt;&lt;font color="#007700"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#0000BB"&gt;template&lt;/font&gt;&lt;font color="#007700"&gt;);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach ( &lt;/font&gt;&lt;font color="#0000BB"&gt;$this&lt;/font&gt;&lt;font color="#007700"&gt;-&amp;gt;&lt;/font&gt;&lt;font color="#0000BB"&gt;variables &lt;/font&gt;&lt;font color="#007700"&gt;as &lt;/font&gt;&lt;font color="#0000BB"&gt;$variable &lt;/font&gt;&lt;font color="#007700"&gt;=&amp;gt; &lt;/font&gt;&lt;font color="#0000BB"&gt;$data &lt;/font&gt;&lt;font color="#007700"&gt;){ &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$&lt;/font&gt;&lt;font color="#0000BB"&gt;$variable &lt;/font&gt;&lt;font color="#007700"&gt;= &lt;/font&gt;&lt;font color="#0000BB"&gt;$data&lt;/font&gt;&lt;font color="#007700"&gt;; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;/font&gt;&lt;font color="#FF8000"&gt;# end foreach&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#007700"&gt;eval(&lt;/font&gt;&lt;font color="#DD0000"&gt;"\$template = \"$template\";"&lt;/font&gt;&lt;font color="#007700"&gt;);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ( &lt;/font&gt;&lt;font color="#0000BB"&gt;$direct_output &lt;/font&gt;&lt;font color="#007700"&gt;) echo &lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for stripslashes" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=stripslashes" target="_blank"&gt;stripslashes&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(&lt;/font&gt;&lt;font color="#0000BB"&gt;$template&lt;/font&gt;&lt;font color="#007700"&gt;); &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else return &lt;/font&gt;&lt;font color="#0000BB"&gt;&lt;a class="code" title="View manual page for stripslashes" href="http://www.php.net/manual-lookup.php?lang=en&amp;amp;pattern=stripslashes" target="_blank"&gt;stripslashes&lt;/a&gt;&lt;/font&gt;&lt;font color="#007700"&gt;(&lt;/font&gt;&lt;font color="#0000BB"&gt;$template&lt;/font&gt;&lt;font color="#007700"&gt;);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;/font&gt;&lt;font color="#FF8000"&gt;# end function Evaluate() &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
      &lt;/font&gt;&lt;font color="#007700"&gt;} &lt;/font&gt;&lt;font color="#FF8000"&gt;# end class&lt;br /&gt;
      &lt;/font&gt;&lt;font color="#0000BB"&gt;?&amp;gt;&lt;/font&gt; &lt;/font&gt; &lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;As you can see, we are making good progress on the build and will soon move onto finalizing the beta version of the shopping cart! However, there is still much left to do in order to launch this project. I still need to coordinate the acquisition of a dedicated server to host the project &lt;a href="http://subversion.tigris.org/" target="_blank"&gt;Subversion&lt;/a&gt; server. In addition, we need to attract a community to help in the beta testing. It is almost time to launch!&lt;/p&gt;
&lt;p&gt;...almost there...stay tuned! &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11122824-112579050552638157?l=oscommerce-chemo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/112579050552638157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/112579050552638157'/><link rel='alternate' type='text/html' href='http://oscommerce-chemo.blogspot.com/2005/09/object-registry-and-observers.html' title='Object registry and Observers...'/><author><name>Bobby</name><uri>http://www.blogger.com/profile/08578836045856841442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_oiuj-d5AYlE/SYXF8Z-WenI/AAAAAAAAAAM/d4bRnEPD27w/S220/bobby-250-250.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-11122824.post-112446898050486364</id><published>2005-08-19T12:29:00.000-04:00</published><updated>2005-08-19T12:29:40.530-04:00</updated><title type='text'>Application tiers, SOAP interfaces, and XSL transformations </title><content type='html'>&lt;p&gt;I get a lot of instant messages asking me how the shopping cart project is coming along so thought a quick post about progress would be in order.&lt;/p&gt;
&lt;p&gt;First, I have agreed to help a close friend (&lt;a href="http://clarocque.com/" target="_blank"&gt;Chris Larocque&lt;/a&gt;) code his application and in return he has agreed to help with foundation coding of the shopping cart. The great benefit to both of us is that the two applications are nearly identical in architecture and use of design patterns. For example, one requirement for Chris's project is a fully tiered application with tight integration of local versus SOAP gateway interface for the accessor tier.&lt;/p&gt;
&lt;p&gt;So, we have identified core architecture features of both applications:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt; Traditional tiers (presentation, business logic, accessor, and persistence)&lt;/li&gt;
  &lt;li&gt;Gateway interface between tiers that support local and remote access (via SOAP) &lt;/li&gt;
  &lt;li&gt;Robust template engine for complete separation of presentation and business logic&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In addition, we are going to implement a modular structure that will provide for hooks and may in the future be developed into a plug-n-play feature that is common with a CMS. However, right now it will be coded for data presentation modules as core modules will inevitably have code clashes.&lt;/p&gt;
&lt;p&gt;A primary focus will be on performance and scalability. The tiered architecture with remote data access will provide the ability to physically separate the tiers on different servers and will also allow for clustered server load balancing. The end result is an infinitely scalable application that can handle Ebay or Amazon traffic volumes yet realize an insignificant degradation in page rendering performance. Of course if all the tiers are local to the same server it can save the overhead of creating web services and run faster with local access.&lt;/p&gt;
&lt;p&gt;A secondary focus will be on the templating. I am seriously considering using &lt;a href="http://www.tonymarston.co.uk/xml-xsl/reusable-xsl.html" target="_blank"&gt;XML data / XSL server side transformation&lt;/a&gt; for the actual templating but there is a learning curve. I'm most used to traditional templating engines but the power of XSL transformations are apparent. &lt;/p&gt;
&lt;p&gt;OK. so now let's talk about timeframes. We expect to complete Chris's application within a week or two and then move on to polishing the various functions. Thus, once Chris's application is built it will serve as a guide for the shopping cart. Hopefully, this will decrease development time and give an indication of areas that need special attention. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11122824-112446898050486364?l=oscommerce-chemo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/112446898050486364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/112446898050486364'/><link rel='alternate' type='text/html' href='http://oscommerce-chemo.blogspot.com/2005/08/application-tiers-soap-interfaces-and.html' title='Application tiers, SOAP interfaces, and XSL transformations '/><author><name>Bobby</name><uri>http://www.blogger.com/profile/08578836045856841442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_oiuj-d5AYlE/SYXF8Z-WenI/AAAAAAAAAAM/d4bRnEPD27w/S220/bobby-250-250.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-11122824.post-112419767811806656</id><published>2005-08-16T09:07:00.000-04:00</published><updated>2005-08-16T09:07:58.133-04:00</updated><title type='text'>PHP Design Patterns</title><content type='html'>&lt;p&gt;Would this be more efficient with a Singleton, Iterator, Factory, Strategy, or Model-View-Controller design pattern?&lt;/p&gt;
&lt;p&gt;The basic question of whether a design pattern will fit a particular task better than the usual prcedural script method is one asked by many coders over the course of any application build. Unfortunately, it has been some 7 or 8 years since I took the C++ class in college that covered patterns. Thus, I have found that my knowledge is really out of date with current patterns. &lt;/p&gt;
&lt;p&gt;I started my search on a good reference for current PHP design patterns and found a great book: &lt;a href="http://www.phparch.com/shop_product.php?itemid=96" target="_blank"&gt;php|architect's Guide to PHP Design Patterns&lt;/a&gt; ($32.99 USD)&lt;/p&gt;
&lt;p&gt;This book is one of the best references for PHP design patterns that is in my library. There are many examples for not only PHP5 but also PHP4 adaptations. The problem with PHP4 is that a lot of traditionally OOP features are not implemented...but there are a few workarounds. If you are into high level or professional PHP coding I highly recommend you get a copy.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11122824-112419767811806656?l=oscommerce-chemo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.phparch.com/shop_product.php?itemid=96' title='PHP Design Patterns'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/112419767811806656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/112419767811806656'/><link rel='alternate' type='text/html' href='http://oscommerce-chemo.blogspot.com/2005/08/php-design-patterns.html' title='PHP Design Patterns'/><author><name>Bobby</name><uri>http://www.blogger.com/profile/08578836045856841442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_oiuj-d5AYlE/SYXF8Z-WenI/AAAAAAAAAAM/d4bRnEPD27w/S220/bobby-250-250.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-11122824.post-111590447706670418</id><published>2005-05-12T09:27:00.000-04:00</published><updated>2005-05-12T09:27:57.093-04:00</updated><title type='text'>Owner of osc-help.net identified!</title><content type='html'>The site owner of the &lt;a href="http://www.osc-help.net/"&gt;osCommerce contribution help&lt;/a&gt; website has been identified as &lt;a href="http://forums.oscommerce.com/index.php?showuser=61134"&gt;Rigadin&lt;/a&gt;!  I can't stress enough the usefullness of the site for osCommerce store owners since it provides a level of service and features concerning contributions that is seriously lacking in the community. 

Great job Chris!  Keep up the good work!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11122824-111590447706670418?l=oscommerce-chemo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://forums.oscommerce.com/index.php?showuser=61134' title='Owner of osc-help.net identified!'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/111590447706670418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/111590447706670418'/><link rel='alternate' type='text/html' href='http://oscommerce-chemo.blogspot.com/2005/05/owner-of-osc-helpnet-identified.html' title='Owner of osc-help.net identified!'/><author><name>Bobby</name><uri>http://www.blogger.com/profile/08578836045856841442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_oiuj-d5AYlE/SYXF8Z-WenI/AAAAAAAAAAM/d4bRnEPD27w/S220/bobby-250-250.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-11122824.post-111586600305020576</id><published>2005-05-11T22:46:00.000-04:00</published><updated>2005-05-11T22:46:43.080-04:00</updated><title type='text'>osC Help - The site that helps you choosing your osCommerce contributions</title><content type='html'>I just stumbled across the &lt;a href="http://www.osc-help.net/"&gt;osC Contribution Help&lt;/a&gt; website and must say that I'm THOROUGHLY impressed by their completeness of service.
&lt;fieldset&gt;
&lt;legend&gt;From their homepage:&lt;/legend&gt;
&lt;ul&gt;
&lt;li&gt;Automatic notification of contribution update.&lt;/li&gt;
&lt;li&gt;Screenshots display when available.&lt;/li&gt;
&lt;li&gt;Many categories to group the contributions.&lt;/li&gt;
&lt;li&gt;Cross-reference between related contributions.&lt;/li&gt;
&lt;li&gt;Contribution rating and reviews system.&lt;/li&gt;
&lt;li&gt;Weekly newsletter with new and updated contributions.&lt;/li&gt;
&lt;li&gt;Link to original osCommerce contribution page.&lt;/li&gt;
&lt;li&gt;Link to support forum thread.&lt;/li&gt;
&lt;li&gt;But: no contribution download from this site.&lt;/li&gt;
&lt;/ul&gt;
&lt;/fieldset&gt;
I highly recommend all osCommerce store owners stop by and take a look at the services offered by this website.  I have no idea who is behind the genius idea but will give them full credit when I do find out!

In my opinion, this is one of the best osCommerce resource sites for store owners.  Don't be caught with your pants down...visit this site!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11122824-111586600305020576?l=oscommerce-chemo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.osc-help.net/' title='osC Help - The site that helps you choosing your osCommerce contributions'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/111586600305020576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/111586600305020576'/><link rel='alternate' type='text/html' href='http://oscommerce-chemo.blogspot.com/2005/05/osc-help-site-that-helps-you-choosing.html' title='osC Help - The site that helps you choosing your osCommerce contributions'/><author><name>Bobby</name><uri>http://www.blogger.com/profile/08578836045856841442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_oiuj-d5AYlE/SYXF8Z-WenI/AAAAAAAAAAM/d4bRnEPD27w/S220/bobby-250-250.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-11122824.post-111473986597389309</id><published>2005-04-28T21:57:00.000-04:00</published><updated>2005-04-28T21:57:45.973-04:00</updated><title type='text'>osCommerce MS-2.2 API Documentation</title><content type='html'>&lt;a href="http://oscommerce.calimeross.com/ms2/doc_catalog/"&gt;osCommerce MS-2.2 API Documentation&lt;/a&gt; is published and maintained by &lt;a href="http://forums.oscommerce.com/index.php?showuser=33440"&gt;Carine&lt;/a&gt; who is a very active and helpful support forum member.  She has published several well coded &lt;a href="http://www.oscommerce.com/community?contributions=&amp;search=carine&amp;category=all"&gt;contributions&lt;/a&gt; and is also a &lt;a href="http://www.oscommerce.com/about/sponsors,community"&gt;community sponsor&lt;/a&gt;.

The osCommerce API documentation is generated by &lt;a href="http://www.phpdoc.org/"&gt;phpDocumentor&lt;/a&gt; which does a nice job of creating a cross-referenced structure.  The only shortcoming is that it creates the documentation based on comments in the scripts...which are hardly not present in the stock code.  I wish Carine the best of luck developing this resource as it will serve many novice osCommerce coders well!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11122824-111473986597389309?l=oscommerce-chemo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://oscommerce.calimeross.com/ms2/doc_catalog/' title='osCommerce MS-2.2 API Documentation'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/111473986597389309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/111473986597389309'/><link rel='alternate' type='text/html' href='http://oscommerce-chemo.blogspot.com/2005/04/oscommerce-ms-22-api-documentation.html' title='osCommerce MS-2.2 API Documentation'/><author><name>Bobby</name><uri>http://www.blogger.com/profile/08578836045856841442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_oiuj-d5AYlE/SYXF8Z-WenI/AAAAAAAAAAM/d4bRnEPD27w/S220/bobby-250-250.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-11122824.post-111452657660879678</id><published>2005-04-26T10:42:00.000-04:00</published><updated>2005-04-26T10:42:56.606-04:00</updated><title type='text'>Ultimate SEO URLs v3.0 Features</title><content type='html'>&lt;a href="http://forums.oscommerce.com/index.php?showtopic=148108"&gt;Ultimate SEO URLs v3.0 Development&lt;/a&gt; was posted today as an open call to the community to offer their feedback as to requested features of the next generation of SEO URLs.  It is so much easier to add features while in development than to add then later in maintenance releases.

Planned development for v3.0 series:
&lt;ul&gt;
&lt;li&gt;Abstract the code&lt;/li&gt;
&lt;li&gt;Integration of automatic 301 redirect script&lt;/li&gt;
&lt;li&gt;Introduce more cache features&lt;/li&gt;
&lt;li&gt;More scalable code&lt;/li&gt;
&lt;li&gt;Better regex for HTML characters&lt;/li&gt;
&lt;li&gt;Ability to choose URL keywords&lt;/li&gt;
&lt;li&gt;Improved install/un-install script for database settings&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11122824-111452657660879678?l=oscommerce-chemo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://forums.oscommerce.com/index.php?showtopic=148108' title='Ultimate SEO URLs v3.0 Features'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/111452657660879678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/111452657660879678'/><link rel='alternate' type='text/html' href='http://oscommerce-chemo.blogspot.com/2005/04/ultimate-seo-urls-v30-features.html' title='Ultimate SEO URLs v3.0 Features'/><author><name>Bobby</name><uri>http://www.blogger.com/profile/08578836045856841442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_oiuj-d5AYlE/SYXF8Z-WenI/AAAAAAAAAAM/d4bRnEPD27w/S220/bobby-250-250.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-11122824.post-111445430808726168</id><published>2005-04-25T14:38:00.000-04:00</published><updated>2005-04-25T14:39:11.890-04:00</updated><title type='text'>Ultimate SEO URLs - by Chemo [support thread]</title><content type='html'>&lt;a href="http://www.oscommerce.com/community/contributions,2823"&gt;Ultimate SEO URLs - by Chemo contribution&lt;/a&gt; has been released since mid January 2005 and already up to 50 pages of support!  Most people don't realize the amount of work it takes to create, release, support, and maintain a good contribution...epecially one as active and popular as Ultimate SEO URLs. I've invested huge amounts of time on this contribution in particular since it is an area that the osCommerce application is lacking.  The traditional SEF option merely creates an atificial directory structure that will put the product pages 6 or 7 levels deep!  The farther away from the domain root the less relevancy of that page (or so the theory goes). 

Creating contributions is a thankless job.  I've released more than I can count and have received countless "this is broken" or "your code broke my site" nasty-o-gram emails and only 4 genuine and heartfelt &lt;b&gt;THANK YOU's&lt;/b&gt;.  Nobody releases a contribution to get rich or even make enough money from donations to buy a cup of coffee...however, we sure as hell don't do it to get the negative feedback either.  However, as of late there have been a few store owners posting very positive feedback on how the contribution affected their traffic.  It is very satisfying to read these as it reminds me of why I support the osCommerce community -&gt; &lt;b&gt;helping store owners&lt;/b&gt;.

So, the next question is what to do with the contribution in terms of future development?  The code is mature and production ready in it's current state.  I have even offered an automatic redirect script that sends 301 headers for old URLs to new URLs thereby preserving the established page seniorities.  It is feature rich, easy to install, and very functional.  Can I improve it?

I would like to create a base class for the code instead of embedding it into the tep_href_link() function.  This will make for easier upgrades and offer a level of abstraction.  Both of these are important since 95% of store owners think PHP reads like Latin.  By creating a class that can easily be upgraded by simply overwriting the file I will surely eliminate the extra support from those that error in cut-n-paste directions.  The main benefit is that once abstacted it can be used on the admin side for scripts that create URLs for datafeeds (Froogle, etc).  There have been a lot of store owners report postiive benefits from the contribution on the catalog side but their data feed URLs still use old parameter driven ones.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11122824-111445430808726168?l=oscommerce-chemo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://forums.oscommerce.com/index.php?showtopic=130999' title='Ultimate SEO URLs - by Chemo [support thread]'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/111445430808726168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/111445430808726168'/><link rel='alternate' type='text/html' href='http://oscommerce-chemo.blogspot.com/2005/04/ultimate-seo-urls-by-chemo-support.html' title='Ultimate SEO URLs - by Chemo [support thread]'/><author><name>Bobby</name><uri>http://www.blogger.com/profile/08578836045856841442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_oiuj-d5AYlE/SYXF8Z-WenI/AAAAAAAAAAM/d4bRnEPD27w/S220/bobby-250-250.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-11122824.post-111379655065697159</id><published>2005-04-17T23:55:00.000-04:00</published><updated>2005-04-17T23:55:50.656-04:00</updated><title type='text'>Custom Coding &amp; Contributions</title><content type='html'>What would my blog be without mentioning Chris's website?

This is the site for &lt;a href="http://forums.oscommerce.com/index.php?showuser=13763"&gt;Chris Larocque&lt;/a&gt; who is one of the fastest rising stars of the osCommerce coder community.  There are not many that have the talent and potential as Chris does.

We have worked on several projects collaboratively such as the &lt;a href="http://www.oscommerce.com/community/contributions,3064"&gt;JS Infobox contribution for osCommerce&lt;/a&gt;.  If anyone needs subcontract programming done I highly recommend Chris for their needs.  Chris is the only person in the world that has ever received FTP and admin credentials to my &lt;a href="http://mesoimpact.com/"&gt;osCommerce development server&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11122824-111379655065697159?l=oscommerce-chemo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.clarocque.com/' title='Custom Coding &amp; Contributions'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/111379655065697159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/111379655065697159'/><link rel='alternate' type='text/html' href='http://oscommerce-chemo.blogspot.com/2005/04/custom-coding-contributions.html' title='Custom Coding &amp; Contributions'/><author><name>Bobby</name><uri>http://www.blogger.com/profile/08578836045856841442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_oiuj-d5AYlE/SYXF8Z-WenI/AAAAAAAAAAM/d4bRnEPD27w/S220/bobby-250-250.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-11122824.post-111369721190045664</id><published>2005-04-16T20:20:00.000-04:00</published><updated>2005-04-16T20:20:11.900-04:00</updated><title type='text'>John Colascione on Website Marketing</title><content type='html'>This is one of the most informational articles on beginning website marketing and should be required reading for all new store owners.  It has a thorough presentation of search engine and algo basics as well as some more advanced theories.

Highly recommended reading!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11122824-111369721190045664?l=oscommerce-chemo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.website-marketing.org/' title='John Colascione on Website Marketing'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/111369721190045664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/111369721190045664'/><link rel='alternate' type='text/html' href='http://oscommerce-chemo.blogspot.com/2005/04/john-colascione-on-website-marketing.html' title='John Colascione on Website Marketing'/><author><name>Bobby</name><uri>http://www.blogger.com/profile/08578836045856841442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_oiuj-d5AYlE/SYXF8Z-WenI/AAAAAAAAAAM/d4bRnEPD27w/S220/bobby-250-250.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-11122824.post-110953802365906398</id><published>2005-02-27T16:00:00.000-05:00</published><updated>2005-02-27T16:00:23.660-05:00</updated><title type='text'>Chemo's Corner</title><content type='html'>&lt;a href="http://mesoimpact.com/"&gt;Chemo's Corner&lt;/a&gt;
Of course the second entry in this blog will have to cover my osCommerce development server!

This is the domain that I use for development of contributions, client custom coding, or just to try new stuff out.

Here are some quick links to important parts of the site:
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://mesoimpact.com/oscommerce_contributions_list.php"&gt;osCommerce Contribution List&lt;/a&gt;
This page has a list of my publicly released osCommerce contributions. Also, each entry has a short description.
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mesoimpact.com/oscommerce_portfolio.php"&gt;osCommerce Programming Portfolio&lt;/a&gt;
This page has a quick list of sites that I have modified code for. I have plastered everywhere the fact that I'm NOT a designer yet some people still don't grasp the facts.

The sites listed on the portfolio page are NOT my design but have been modified, optimized, or otherwise "fixed" by my hand.
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mesoimpact.com/spider/"&gt;Chemo's Search Engine Simulator - Beta&lt;/a&gt;
This tool is currently under development as a future replacement for the stock osCommerce search function. As the number of contributions installed by a store owner increases the less relevant the search becomes.

Currently, it can be used to check a stores meta and page content. In addition, it has a selectable user agent (Googlebot, Chemo's Spider, and Firefox) and is a highly effective test for osCsid settings.
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mesoimpact.com/highlight/"&gt;Chemo's PHP Code Pastebin&lt;/a&gt;
This tool allows developers to exchange code easily. Simply paste the code into the bin and allow someone to submit revisions.
&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11122824-110953802365906398?l=oscommerce-chemo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://mesoimpact.com/' title='Chemo&apos;s Corner'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/110953802365906398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/110953802365906398'/><link rel='alternate' type='text/html' href='http://oscommerce-chemo.blogspot.com/2005/02/chemos-corner.html' title='Chemo&apos;s Corner'/><author><name>Bobby</name><uri>http://www.blogger.com/profile/08578836045856841442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_oiuj-d5AYlE/SYXF8Z-WenI/AAAAAAAAAAM/d4bRnEPD27w/S220/bobby-250-250.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-11122824.post-110953739188652569</id><published>2005-02-27T15:49:00.000-05:00</published><updated>2005-02-27T16:01:18.690-05:00</updated><title type='text'>osCommerce Profile - Chemo</title><content type='html'>&lt;a href="http://forums.oscommerce.com/index.php?showuser=9196"&gt;osCommerce Profile - Chemo&lt;/a&gt;
This is a link to my osCommerce support forum profile.  The list of contributions and contact information should be current no matter when you read this blog.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11122824-110953739188652569?l=oscommerce-chemo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://forums.oscommerce.com/index.php?showuser=9196' title='osCommerce Profile - Chemo'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/110953739188652569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/110953739188652569'/><link rel='alternate' type='text/html' href='http://oscommerce-chemo.blogspot.com/2005/02/oscommerce-profile-chemo.html' title='osCommerce Profile - Chemo'/><author><name>Bobby</name><uri>http://www.blogger.com/profile/08578836045856841442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_oiuj-d5AYlE/SYXF8Z-WenI/AAAAAAAAAAM/d4bRnEPD27w/S220/bobby-250-250.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-11122824.post-110953703590912201</id><published>2005-02-27T15:43:00.000-05:00</published><updated>2005-02-27T15:43:55.910-05:00</updated><title type='text'>osCommerce, Open Source E-Commerce Solutions</title><content type='html'>&lt;a href="http://www.oscommerce.com/"&gt;osCommerce, Open Source E-Commerce Solutions&lt;/a&gt;
The first post of the blog has to be a quick note to the osCommerce development team: reorganize the team.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11122824-110953703590912201?l=oscommerce-chemo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/110953703590912201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11122824/posts/default/110953703590912201'/><link rel='alternate' type='text/html' href='http://oscommerce-chemo.blogspot.com/2005/02/oscommerce-open-source-e-commerce.html' title='osCommerce, Open Source E-Commerce Solutions'/><author><name>Bobby</name><uri>http://www.blogger.com/profile/08578836045856841442</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_oiuj-d5AYlE/SYXF8Z-WenI/AAAAAAAAAAM/d4bRnEPD27w/S220/bobby-250-250.jpg'/></author></entry></feed>
