Most of what I have learned about Drupal I learned ala crash course working for this company. We started on 5, quickly moved to 6, and where just starting to shift to 7 when I had to make the choice to leave and go to Realtruck.com. While working here I built a few modules, and created the themes.RETS:
We built websites for real estate agents and needed to build a system that would allow visitors to search the agent's available listings. To accomplish this we needed to be able to download the property data from a third party database, and store that data locally. We also needed to download all of the images, and store those locally as well. To accomplish this we used PHRETS, a PHP library for RETS. This library handled connecting to the third party database and querying for the specific data we required. It returned that data in an array, and by looping through the array we constructed a csv file putting the data pulled into the same order as our db expected to receive it. We also constructed several functions to ensure the data is up to date, to remove properties that were sold or otherwise rendered inactive. This all operates by cron.
For the images we use an S3 account. We again use the PHRETS to query for the image information, and then store those images on S3 using an S3 php class. We store information about those images on a local table as well for the purposes of maintenance, but when it comes to displaying the images we simply came up with a naming convention and an image count for each property is logged in the db for that property so we don't have to perform joins when trying to display data. We found this sped up the sites quite a bit.
When it came to the search and display of the properties we used the Views module. First we had to map the listing tables to views using a views.inc file. We also utilized .views_default.inc to establish a default look and feel for these views when the module is turned on.
A slightly modified version of the PHP/jQuery slideshow script I have displayed on this site under code is also used to display the images. This is made possible with a contributor module that allows us to use php in the filters for views.
We have another tie in module that grabs the clients information and uses hooks to add filters to the views for displaying featured properties. These are properties specifically owned by the client. This is done automatically in the background so we don't have to spend a whole lot of time manipulating the views for every site.Save Search / Favorite Property
When a user creates an account on the site they gain some additional functionality. They can perform a search, and then save it and re-run it or optionally be emailed any time that search generates new results. This is a custom module I built, again using some of the View hooks to gather information about the most recent search they performed and storing that data in session variables until they hit save and then storing it in the DB.
They can also add individual properties to a 'favorites' list and keep an eye on those properties any time they login in. Drupal's AHAH functions are used to make it as simple as clicking a button without a page refresh.Craigslist
I also made a simple module that allows clients to generate the html code to display property data in a craigslist friendly tabled layout using predefined templates. They just have to copy paste it into craigslist. It also allows for printing and emailing the generated.Theming Default Generator
In order to speed up the theming process I built a PHP script that took in the name and path of the theme in order to generate the various base php files required. The script generated the page-front.tpl, the page.tpl, the front and secondary css files, and the template files. The css also searched the images folder and determined the size of the background images to fill out the width and height of the div elements they would be set too, and of course if the images actually existed. This way when I went in to do the final touches I had a standard set of files. This proved be far easier and faster than simply cloning the previous theme and modifying from there. It also makes it easier to establish defaults in our themes, like if we decided from now on we wanted a certain standard text font or whatever I can make the change to the files generated by this php script. The new defaults will be generated with every new theme put together, without relying on my memory.Other Modules:
We had a client with an odd sort of request. They wanted there registers to be able to select from a variety of email templates, that they would use when emailing them. They wanted to be able to have different templates per month, so the registered user would select the template they want for each month. So what I did was install a module that managed an upload folder, so the client could upload jpg files of each template and put them in a folder structure of Year->Month->Template.jpg. The form would then compile based on that folder structure, and display the Year/Month as a header and all the images within that folder would appear as radio buttons. The client then just needed to upload, and remove photos to manage the form. I also added blocks that would inform the registered user if one of their selections became invalid, and one to inform the client of new form submissions.