Drupal is both content management system and blogging engine. It is fully featured and provides you with the great apportunity to create your own website without any design or script programming knowledge. It is free to use and has a great community support.
Monday, October 12, 2009
Basic Drupal Notes
1. After installation, it is a good idea to set site configuration by going to Administer -> Settings -> Site Information to set email address, slogan, footer, greeting for anonymous user, etc.
2. Create an administer role and assigning permissions.
3. Enables the modules that you want to use by going to Administer -> Site Building -> Modules.. The Path module allows users to create URL alias to pages, which can benefit SEO when pages are named appropriately. These alias can be viewed at Administer -> Url Aliases.
4. Clean URL feature eliminates the query string parameters in the URL path and is recommended for SEO and can be done by Administration - > Settings -> Clean URLs . For this to work, your server must be Apache servers which have the LoadModule rewrite_module and mod_rewrite configured in httpd.conf. In the settings page, there is a test for you to run to see if your server is configured correctly or not. If you enable Clean URL without proper server configuration, you can get back to the admin page to disable the feature by using the non-clean URL of the form http://www.yourdomain.com/?q=admin/settings
5. Whether or not to allow users to post comments to your stories is controlled by Administer -> Content Management -> Content Type -> Edit.
6. You can configure your Contact form by Administer -> Site Building -> Menu -> Contact.
7. If you site is having problems because you are installing Drupal in a subdirectory, you might need to adjust the $base_url property in sites/default/settings.php.
Template Writing
1. Don't use relative image paths in the tpl files. Instead use ...
'< img src="/images/yourimage.gif" />'
2. Drupal caches on the server for non-registered users. So when you make changes to the template, one way to force Drupal to update its cache is to click on "Save Configuration" in Admin -> Site Building -> Modules. Also refresh your browser cache as well. Or you can run "DELETE * FROM cache;" on your database. Also your webhost may be caching. To mitigate that, you can do http://www.yourdomain.com/?dsfkds where the query string is some random characters.
3. If you want to change the User Login block, try to change it with CSS first. If you really want to get to the code, the function starts at user_login_block() in user.module and traces to drupal_render_form() and theme_form_element() and theme_button() in form.inc.
4.
Misc Notes
5. The MySQL username and password access can be found in sites/default/settings.php in the form...
$db_url = 'mysql://username:password@localhost/databasename';
6. If you don't want the login box to be displayed, you can disable the block and use the following to login...
http://www.yourdomain.net/user
or
http://www.yourdomain.net/?q=user
7. You can determine which node id a page is by printing out ...
nid); ?>
Then you can write PHP if condition and apply them to specific pages such as ...
nid == 33) { ?>
< style >
< /style >
Thursday, April 23, 2009
FileField and ImageField for Drupal 6 Released
Hook file support
Other modules can use FileField's hook_file() implementation to help determine when and where a file is in use. This means modules like the new FileField Sources module can reuse existing images on multiple nodes, even use IMCE to browse existing images and reuse them (as long as the files are assigned an FID in the database).
Sunday, February 22, 2009
Google Maps in Drupal
Step 1. Create a map with macro creator
Each site includes a macro to create a map that you can customize it as you see fit. You can see the GMap Macro on my site here. To create a map:
* Scroll to the bottom of the macro to define the Map Height and Map Width. This is in pixels (try "500px" by "500px" to start with) and make sure you include the "px" after the number. Scroll back to the top and you will see the template map has automatically resized.
* Move the map around with the mouse to the area you want to include. Also adjust the zoom control to achieve the level of magnification you want. You can choose between a basic map, a Satellite map or a hybrid version by switching between the buttons.
* You can add points, lines or circles by (single) clicking on the map. You can switch between these options with the pull down menu where it says Click Map. Experiment by clicking around a map to see what happens.
* Some of the line/polygon settings are a little temperamental, but the marker options work well allowing you to change the marker type. It is possible to link one marker to another.
* To remove a marker make sure the Click Marker option is set to "remove" and then click the marker to be removed on the map.
* Each map needs a different name or identifier (set to "map" by default). Type this in to the Map id attribute field. This can only contain numbers letters and the "-" symbol, and must be unique for each map that will appear on the same page.
* The Control feature (None|Large|Small) allows you to specify whether there is a zoom control on the map and what size it is.
* There are all sorts of advanced options available for customizing your map. The most important of these is the ability to have feeds that take information from a local RSS feed with geolocation data and dynamically plot this on the map. I'll blog about this separately when I have figured out how to do it!
Step 2. Put the map on a webpage (node) in your site
Scroll down to the bottom of the macro and copy the Macro Text that appears in the text box. You then need to paste this into the body field of a new page (node). When you do this make sure to disable rich text (just underneath the text box) and under Input Format select the GMap Filter option. You can add any other information to the page with HTML or the rich text editor.Just do not change the GMap Macro text. When you are done, click Submit and the new page with your Google Map and any plotted points, lines or polygons will appear.
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
;$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
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
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
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
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.