Friday, February 6, 2009

AHAH Helper Module For Drupal

The ahah helper module provides a neat function ‘ahah_helper_path’ to let drupal know about new field elements. This way you can set the path “magically” and the helper module takes care of how the new fields will be rendered. You can use it like this:


$form[’slide_form’][‘new_field’] = array
// field properties …
The ahah property path will be:
‘#ahah’ = array (
‘path’ => ahah_helper_path(array(’slide_form’, ‘new_field’)),
// other properties
);


This helper module makes it very easy to update a form with your own ajax-driven field addtions. It helps memorizing the form so your new fields are known by drupal. At the form api reference link, we can see which fields can trigger this behavior: button, checkbox, image button, password, radio, select, submit, textarea, textfield.

An extra advantage of using the ahah helper module is that when javascript is disabled, the same function will be called with a normal post and this will work just fine. Sometimes it can be helpfull to check #first_time parameters in callbacks to see if the data was previously saved.

Sunday, February 1, 2009

Theming Drupal 6 from the module

You start with creating a DOT info file for your module. The name of which would be in our case special_page.info.

;$Id$
name = Special Page
description = Provides a template file for my content type CONTENT_TYPE.
core = 6.x

Then you go about creating your DOT module file, ie: special_page.module.

// $Id$
/**
* @file
* Module that provides a special template for pages that show
* ONE node of content type CONTENT_TYPE_NAME.
*/

You probably should implement HOOK_help() in your module, but I will skip that, and cut the chase to what we really need.

At this point, you need to tell the theme system to use your template, and to use it only in certain situations. Your 'situations' will differ from mine. In my case, I wanted the theme system to use my template on a node page, hence any page with path node/nid, yet only on pages that show the node in view 'mode', so I did not want the template to be used when the path is node/nid/edit for example. There are many ways to skin the cat here. I decided to use the fact that a $node object is passed to the page.tpl.php template only when the page is a node page, as you will see in the following code snippet. Here, I will make use of a preprocess function to pass on to the theme system a suggestion about a new module-supplied template.

function special_page_preprocess_page(&$variables) {
// If this is a node page (not a list of nodes page) and
// the node is shown in 'view' mode rather than 'edit' or whatever.
if (isset($variables['node']) && (arg(2) === NULL)) {
// If the content type of that one node is 'CONTENT_TYPE_NAME'.
if ($variables['node']->type == 'CONTENT_TYPE_NAME') {
$variables['template_file'] = 'page-CONTENT_TYPE_NAME';
}
}
}

Then feel free to create such template file. As a reminder, no need to add the tpl.php extension to the value you assign to $variables['template_file']. Also, that name can be anything, I am just following conventions here by prefixing with page, as in page-SOMETHING.tpl.php. Make sure that the name you provide here matches the name of your template file.

Then, you are faced with a small problem: the template file will need to be placed in the theme folder in order to be picked up by Drupal's theme system. But you don't want that. So what to do? Here comes a situation where we can use the module hook HOOK_theme_registry_alter(). For the theme hook you want to provide special theming for (hook in theme parlance here), you will have to tell Drupal Hey, Drupal, please look in my module folder over here, you may find a template file you will need.

function special_page_theme_registry_alter(&$theme_registry) {
$theme_hook = 'page'; // my hook name
// Get the path to this module
$modulepath = drupal_get_path('module', 'special_page');
// Add the module path on top in the array of paths
array_unshift($theme_registry[$theme_hook]['theme paths'], $modulepath);
// dsm($theme_registry[$theme_hook]['theme paths']);
}

And you are done.

Friday, January 30, 2009

Drupal Sites

Below is a very short list of other companies who have chosen the drupal framework recently.
All the links are to the Drupal sites.

1) FedEx : A very well known express delivery company


2)The United Nations : A site that supports and inspires people from around the world to take action in support of the Millennium Development Goals.


3) Nike : A well known sports site with a large database


4) Warner Brothers Records : A huge site with a very different Theme for drupal.


5) Freshbrain: A safe enviroment for high school students [where they ] will be able to do activities and projects using our state of the art platform, tools, training and with the support communities and advisors!


6) Team Sugar : Womens social network and community


7) Lifetime TV : massive Drupal site with a movie database,television schedule, videos,photos, editor-produced articles,
user-produced stories, games, tag clouds, topic-based search, and beautiful theme.


8) Project Opus : Local music community.Music events and people where you live; free music hosting and play list.


9) Adrenaline Hub : The action sports community site with news aggregation and video upload.


10) SonyBMG : Britney Spears Blackout Magazine: Videos, events, photos,Lyrics etc.

Monday, January 26, 2009

Drupal's File Download

10 things about file download in drupal:

1. The problem : Using Drupal’s in-core upload module, and no “node access control” contributed module, anonymous users can either download all files attachments, or none of them. The trick : in the case where anonymous users are forbidden access to uploaded files, automatically generate a message to inform them that one or more files are attached to a post. Involves : modifications to node.tpl.php and the use of Drupal’s function format_plural(). This section provides sample code safe to copy from the pdf to your template file in your favorite text editor. download permission

2. The problem : Drupal’s core upload module does not keep track of file downloads, even when the download method is set to private. The trick : install the contributed module download_count. This module writes a descriptive message in your logs whenever a person or robot is attempting to download an attached file. The module also keeps a record of total download hits, and last download time, to display on a dedicated page and in nodes (to which these files are attached). In your tracking of file downloads, you can chose to disregard file attachments with particular extensions. download statistics

3. This third point explains when, why and how to use the hook function file_download. Using this function, we can :
* Keep track of file downloads — and this section tells us what files the function can do bookkeeping of.
* Allow files that aren’t recorded in the upload module’s table {files} to be downloaded by returning an appropriate HTTP header for them.
* Block the download of particular files of our chosing.

This section provides two code examples : one in which we allow the download/display of an image that sits outside the web root, and an other in which we allow the download of any file through an “open or save to disk” prompt. module development

4. This point describes 5 Drupal functions to use when dealing with file download :
* file_directory_path()
* variable_get('file_downloads')
* file_create_url($relativepath)
* file_create_path($relativepath)
* theme_image() should be called through the rooter function theme()

The section explains when to use these functions and what to expect from them. It also provides sample code. file path

5. This section explains how to use private download — and why we should use the ../privateFolder notation when specifying our File System Path. File System Path for private download.

6. Challenge : we need to change when and how the attachment table is displayed. The solution : we use the themeable function theme_upload_attachments($files) to print the table in node.tpl.php — hence printing the value returned by theme('upload_attachments', $files) — or we override that function in template.php. This section provides sample code, and it reminds us of the difference between the variables $teaser and $node->teaser in the template file node.tpl.php : $teaser is a boolean, TRUE if we are to display the teaser as content, while $node->teaser is the content of that teaser. attachment table

7. What we should know about uploading two files with the same name when using the Drupal core upload module. filename versus filepath.

8. This section explains what hot linking is, and presents 3 different methods to try and prevent it. However, I only recommend the first method, and explain why the others are flawed (these others use the value $_SERVER['HTTP-REFERER']). leaching

9. The problem : when clean URLs is enabled, we cannot use relative paths to files and images in our html markup. This problem has been discussed on Drupal.org. There are at least 4 solutions to this problem :
* Use an absolute path, possibly resorting to a subdomain or a virtual host.
* Use the contributed filter module pathfilter, which has been ported to Drupal 6.
* Set the input format to php and use the function base_path().
* Set the input format to php and use the function file_create_url() — when the file we want to link to is inside the File System Path.
relative versus abolute path with clean URLs

10. This section provides a recipe to scan directories for particular files using the Drupal function file_scan_directory. It provides sample code on how to pick a random image from a folder and all its subfolders. scanning the file system path folder.

Thursday, January 22, 2009

Optimizing Drupal database

There are two easy ways to optimize the tables in your Drupal database.
The easiest way is to install the DB Maintenance module. Information on how to install a Drupal module is available in our Drupal tutorial.
After the module is installed and activated, you can access it from your Drupal admin area > Administer > Site configuration > DB maintenance. Select the tables which you wish to optimize and click Optimize now.

The other, slightly more complicated way, is to create a php script with the sql query. The code you should include in the php file should be similar to this:

$db = mysql_connect('localhost','user','password');
if(!$db) echo "cannot connect to the database";
mysql_select_db('user_drpl1');
$result=mysql_query('OPTIMIZE TABLE accesslog,cache,comments,node,users,watchdog;');
echo mysql_error();
?>

Change user, password and user_drpl1 to reflect your Drupal MySQL username, password and database.
This will optimize the tables accesslog, cache, comments, node, users and watchdog. Feel free to add or remove tables from the query.

Once you have inserted the code, save the file. For the purposes of this example, we'll assume that the file is called optimize.php. Once the file is saved in your Drupal folder, you can execute it directly from a browser:
http://www.yourdomain.com/drupal/optimize.php
If you get a blank page without any errors, this means that the tables have been successfully optimized :)
You can also set a cron job in order to execute the optimization script at regular intervals. The cron job you set should be similar to this:

php /home/user/public_html/drupal/optimize.php

Make sure you don't set the cron to be executed too often. Once a week should be more than enough to keep your tables optimized

Friday, January 16, 2009

Simple Test Module - Drupal

Drupal is currently lacking a test suite to be run by developers before submitting important patches. The simpletest module shows some great promise but it is unfortunately not widely adopted yet and there aren't many tests written. See here for a tutorial on how to write tests for your module.

The following setup isn't really a test suite but it is a start to avoid the most embarrassing errors.

Proceed as follows:

1. Enable the menu module and disable the 'log out' link.
2. If you have the image module installed, enable the image module and set permissions so images can be written for the userid running the link check. This will avoid image creation errors when crawling with image enabled.
3. Run
wget --mirror --delete-after http://example.com/

where example.com is your development site. This command will crawl your site very quickly which can put a large stress on the site. You can add --wait=5 to the options if you don't want to perform the stress test.
4. If you want to test as an authenticated user you first should login to the site using a browser and get the authenticated cookie. Then do
wget --mirror --delete-after --load-cookies=/path/to/cookies.txt http://example.com/

where /path/to/cookies.txt is the cookie for your site inside your cookie directory. The exact location of this cookie depends on which browser you are using.
5. You can repeat for each of your roles on your site, and look for errors users with different roles might experience.

Note that this can take some time. wget will access every Drupal page linked from anywhere on your site. You can later have a look at the error logs and find out if any errors where caused. This will not test submitting forms. You can test submitting forms through simple test module.

Wednesday, January 14, 2009

Drupal - Like or Dislike

The review written by Justin James for Drupal is in an article titled, A product review of the Drupal Content Management System, does it make the grade? The author states that "Drupal does not make the grade". He bases his opinion on issues with usability and ease of installation. With regards to usability he says:

Drupal fails on these measures. There were links to create content, which I happily followed. I was immediately presented with an interesting dilemma: do I want to create a "page" or a "story?" The system explained that a "page" is for something like an "About Us" page, and a "story" contained content like a blog. This did not make any sense to me...Every other system I have used (that I can recall) lets you define a particular "page" as a blog, and then just add content to the blog.

I decided to try to make a "page." I was confronted by a plain area to enter text, with no WYSIWYG editing capabilities. I actually considered this to be good, because I have had so many problems with Web-based WYSIWYG editors. However, less than advanced users will be pretty helpless putting content into Drupal.

Ouch! The author also concludes that "Drupal may be a decent choice for an ISP, but its difficult installation, lack of simple on-line content management, and failure to provide asset management make it too hard to use for the average user for anything above and beyond basic site creation." Double ouch!

Most of my early complaints centered over some of the "special" privileges needed when accessing the MySQL database. Database privileges such as LOCK TABLES are not provided by all host providers. There are time when potential Drupal users talk about what they don't like about Drupal. Instead of acknowledging the user's remarks may have validity, there were those that who replied with what. Their simple reply would be that "Drupal isn't for everyone".Drupal's strength is understood not with the first impression it gives users, but with the final impression it leaves users. IBM's project development series involving Drupal and other open source projects should become a good read and the start of some great discussions ahead.

Tuesday, January 13, 2009

Create Link From Drupal To Moodle

This assumes that a) you have CCK and Computed Field installed

First, give every DrupalEd course an automatic alias that is the same as your Moodle short-course name. (Yes, right now, we have to do that by hand. That needs to change eventually.)

Then, in Content Management -> Content Types -> Course -- create a new field called field_moodle_link (or something like that) and select Field Type -- Computed and create the field.

In the next page that pops up, fill in the Label with whatever you want the label to be on the Drupal Group page. Then I chose "Required" under data settings, but I'm not 100% sure that's necessary. And under Computed Code, enter this:

$db = mysql_connect("", "", "");
mysql_select_db("",$db);

#Enter base moodle website here
$website = "http://www.yourwebsitehere.org/moodle";

$nodepath = "node/";
$nodepath .= arg(1);
$shortname = drupal_get_path_alias($nodepath);

$query = "SELECT id,fullname from mdl_course where shortname='$shortname'";

# Standard debug test
# print("
$query");

$idquery = mysql_query($query);
if ($idarray = mysql_fetch_array($idquery))
{
$id = $idarray["id"];
$fullname = $idarray["fullname"];
$node_field[0]['value'] = "
$fullname";
}
else
{
$node_field[0]['value'] = "No Moodle Course w/ shortname: $shortname";
}
?>

Make sure "Display this field" is checked, and I use this as my display format:

$display = $node_field_item['value'] . "

";

And then save it.

Once it's saved, click "Manage Fields" and make sure that your new field has a lower numerical value than the Highlighted Content Field, so that it's at the top of the Drupal page.

Drupal Data Migration Services

Standard Data Migration into Drupal

If your moving from one technology to another one of the hardest areas to get right is the data migration. We have years of experience in migrating data from old systems into Drupal. Frequently we find that we are requested not to merely migrate from data from one application to Drupal but from multiple applications, this is where our knowledge and expertise in data architecture really come into play. We can take the headaches our of even the most complex data migrations.

Drupal SEO Website Migration / upgrades

It is imperative that you understand that moving from website technology to another that you don't lose your current SEO value. Many companies plough ahead and change their sites making what they think are great SEO improvements, but actually damage their position in Google and other Search engines by not doing the move properly. We have migrated countless sites without losing any of the existing search positions and still gaining by improving the seo.

Saturday, January 10, 2009

PHP Zend

Zend Platform is the only PHP Web application server for that supports the enterprise reliability and comprehensive performance features organizations need for business-critical applications. Platform PS provides the performance and management functions needed for every PHP deployment. Platform ES is the ultimate PHP solution incorporating enterprise-grade functionality for multi-server environments.Today's Web applications deliver diverse services including static content and rich media. By providing a multi-layered approach Zend Platform lets you easily optimize your application, according to the services you provide. Code acceleration, content caching, download optimization and configurable off-line processing capabilities give you the maximum performance options needed to get the most out of your business-critical applications.