Jul 06 2009
Jul 06

By default Drupal loads modules, and executes their hook functions, based on where they are installed and then in alphabetical order.

To change the order that a particular module is loaded, the 'weight' value for that module needs to be changed in the 'system' table. By default the weight of all modules is set to 0. Changing the weight to less will make it load earlier, setting it to more will load it later.

The module weight can be set at the time it's installed, by adding this to the .install file:

/**


  * Implementation of hook_install().


  */


function foo_install() {


  // Set a low weight so the module is called before baa module.


  db_query("UPDATE {system} SET weight = -10 WHERE name = 'foo'");


}

In this example foo module would load earlier if the code above was added to foo.install

Jul 05 2009
Jul 05
For the Dutch but not from Holland webshop, running the Ubercart e-commerce module for Drupal, I created a payment gateway module that routes the payments to the PayDutch Group / WeDeal payment site. This module has now been publicly released, and can be found at http://drupal.org/project/uc_paydutch or http://www.ubercart.org/contrib/11822.
Jul 04 2009
Jul 04

A friend of mine contacted me about a problem he was having on his site. He was doing a lot of tests with login/logout and he had the login_security module enabled. This little module will ban users automatically if they enter the wrong password too many times.

My friend was getting redirected to a page not found when trying to login and he did not understand why. I looked into it and it took me some time to figure out that the problem was with the way drupal_goto() was being called.

read more

Jul 03 2009
Jul 03

designbump.new.logoDesignBump a popular social voting site for design related topics have just launched a great new modern looking design of their own. The new design which we think looks fantastic very much improves on previous versions and gives a cool modern look to the site.

DesignBump is a site we at Social CMS Buzz have been using since it’s initial launch as a Digg type site for Design based topics in July 2008. Since it’s launch DesignBump which is based on Drupal and uses the Drigg set of Modules has went through several design changes. The new design over at DesignBump we consider to be the best to date being clean, modern and easy on the eye as we are sure you will agree from the Hompage Screenshot Below.

designbump.new.home

Other cool things that have been added to design bump is contained on the story page where users can easily see stats from other social bookmarking sites and twitter relating to your story url. At the moment visitors/members can easily submit your url (Not the designbump submissions url) to Reddit, Digg, Twitter (Retweet), DesignFloat, a set of dynamic buttons showing number of retweets, diggs etc is displayed below your submitted article.

This is a great little improvement especially as others may digg or retweet your article on these sites ultimately gaining you some more traffic in the process. See the screenshot below to see the changes to the DesignBump story page.

designbump.new.story

Other notable changes are in Members profile pages that have had a complete overhaul and a new portfolio feature added aimed at designers to show off their work. See an image of the new DesignBump profile page below.

designbump.new.profile

We really like all the changes so far to DesignBump seeing them as a great improvement and it’s definitely a site we would recommend that you check out for yourselves.


If you enjoyed this post, make sure you subscribe to my RSS feed!

Jul 03 2009
Jul 03
Maarten Verbaarschot volunteered to take on a Microproject (thanks Maarten!) and for the past few weeks he has been working on interface design for a Media Library for Drupal. There is a great discussion going on in the Drupal.org issue queue that you might want to take a look at. Maarten is currently working on … Continue reading Media Library Microproject – Update & Feedback Please!
Jul 03 2009
Jul 03

Replacing FPSS with Views Slideshow in Drupal – Tutorial

Posted by Jeffrey Scott -TypeHost Web Development | Friday, July 3rd, 2009
, ,

I have been using FrontPage SlideShow from JoomlaWorks on a number of sites, and would recommend it as a good CSS/PHP route to building a featured slide section that links to promoted content, articles, blog posts, groups, etc. One problem is that it is not free, the cost is around $35 for a license to use it on 5 to 10 domains. A second problem is highlighted by the example of releasing an installation profile for Drupal. We can release all of the code under GPL for the project except for FPSS. So, I began working on a conversion of our FPSS slides into Views Slideshow views.

The easiest way is to create a new content type, for example “slide,” and disable comments, post information, front page promotion, etc. Decide which size you would like to standardize all the images at, and then create a simple div structure with the image only as content. You can create a “views slideshow” view, sort only the “slide” content type, save it as a block or create a panels views block and embed it on a panels page. Use block or panels permissions to control the display. This is fine if you are using only images or banners made in photoshop that combine text and images, but if you want the to be text editable, viewable by search engines, and style-able by CSS, you will need to build a more complex template for your “slide” content type.

TUTORIAL:

1. Goto admin “content types” – create new content type “slide”
+ disable comments, attachments, and front page promotion in the content type form
+ goto themes “configure” – disable display post information for slides
+ you may want to disable the WYSYWIG editor (if any) on the slide node create form.
+ FCKeditor Global Profile: admin/settings/fckeditor/editg
—> visibility settings, add to exclude: node/add/slide
+ set the permissions – or skip if you only want admin to be creating this content type

2. Create a new slide – use a consistent template for this content type to build Views Slideshow displays
+ you can use html, css, php, etc. to create a custom template
+ we are looking to replace the FPSS template we are using now, and will give the template + css as a sample

Template:
+ paste in slide node create form – edit the links & paths to be consistent with your information

<div id="viewslide">
        <div id="slideleft">
                <div id="slidetop">
                        <h2><a href="http://webdevnews.net/articles/second-life">Prototype of a Sustainable Virtual Reality</a></h2>
                </div>
                <div id="slidenote">
                        <p>Avatar: Elusyve Jewell</p>
                </div>
                <div id="slidedesc">
                        <p>Unlike any other site on the web, Second Life has transformed the internet into an immersive, 3-D virtual world, a collectively authored mindscape navigated by cyberpunk avatars. How long until the VR goggles appear and we log our first sessions on the holodeck? A look at the future evolution of Second Life. <a href="http://webdevnews.net/articles/second-life">Read more</a>.</p>
                </div>
        </div>
        <div id="slideright"><a href="http://webdevnews.net/articles/second-life"><img width="520" height="206" src="http://webdevnews.net/files/secondlife.jpg" alt="Second Life" /></a></div>
</div>

CSS – paste in style.css or equivalent
+ Note: in the Drupala theme this is in blocks.css

#viewslide {
        width: 698px;
        height: 240px;
        border: 1px solid #B0B0B0;
        margin: 0;
        margin-top: 5px;
        padding: 0;
}

#slideleft {
        float: left;
        width: 154px;
        margin: 0;
        padding: 10px;
        padding-right: 0;
        border-right: 1px solid #B0B0B0;
}

#slidetop {
        width: 134px;
        margin:0;
        margin-left: 5px;
        margin-top: -10px;
        padding:0;
}

#slidetop h2 {
        font-family: Arial,Verdana,sans-serif;
        font-size: 18px;
        line-height: 18px;
        color: #0088BF;
        font-weight:normal;
        letter-spacing:-1px;
        border: none;
        background: #fff;
}
div.block div#slidetop h2 {
        height: auto;
        margin-bottom: 10px;
        margin-top: 16px;
        padding-bottom: 3px;
        padding-left: 0;
        padding-top: 0;
}
#slidetop h2 a {
        font-family: Arial,Verdana,sans-serif;
        font-size: 18px;
        line-height: 18px;
        color: #0088BF;
}
#slidetop h2 a:hover {
        color: #CC3300 !important;
}

#slidenote {
        width: 134px;
        margin: 0;
        margin-top: -10px;
        margin-left: 5px;
        padding: 0;
}

#slidenote p {
        color:#28488C;
        height: 10px;
        font-family: Arial,Verdana,sans-serif;
        font-size: 8pt;
        font-weight: bold;
        line-height: 10px;
        margin: 0;
        padding: 0;
}

#slidedesc {
        width: 134px;
        margin-right: 0;
        margin-left: 5px;
        margin-top: 5px;
        margin-bottom: 12px;
        padding: 0;
}

#slidedesc p {
        font-family: Arial,Verdana,sans-serif;
        font-size: 8pt;
        line-height: 10px;
        color: #333333;
        margin: 0;
        padding: 0;
}

#slideright {
        float: right;
        width: 532px;
        margin: 0;
        padding: 0;
}

#slideright img {
        border: 0;
        margin: 0;
        margin-left: -1px;
        padding: 16px 0;
}

IE7 CSS Fix – paste in ie7.css
+ Note: in the Drupala theme this is in fix-ie2.css

#slidetop {
        margin-top: 10px;
}
#slidedesc {
        margin-bottom: 12px;
}
div.block div#slidetop h2 {
        margin-top: 6px;
}

IE6 CSS Fix – paste in ie6.css
+ Note: in the Drupala theme this is in fix-ie.css

#slidetop {
        margin-top: 10px;
}
div.block div#slidetop h2 {
        margin-top: 6px;
}

Note: this code is cross-browser tested in FF, IE7, IE6, Safari, Opera, & Chrome. It includes theme specific CSS fixes that may not be applicable to all theme code & CSS structures. It is configured to work with the Drupala & SEO-Mix themes for the Drupala installation profile.

3. To recreate the full effect of FPSS, you will need to open the images into an editor like photoshop and add a 20px background color: #CCCCCC (fade 64%) “tab” – use Arial font, change the alignment to vertical, and add a “read more…” text snippet along the bottom corner going up the side of the image.

4. Create a few of these “slide” content type nodes (full html) using the template, then goto views and create a Views Slideshow. Settings: page / block – views slideshow list view – fields: node body, no title, sort by random, and 10 nodes by page (filter to recommended 3 in panel settings), node: published, node-type: “slide”
+ Note: Views Slideshow also has its own configuration panels for fade settings, speed, etc.

5. Embed the Views Slideshow – goto panels – “views panes” and create a views block for the view just created (D5) – embed the block in any panels page or use admin/build/blocks to display in thee regions by path
+ You may want to “Set view URL to panel URL” additionally in the views pane settings

6. Goto “taxonomy” in admin and create a vocabulary for the “slide” content type if you want to create more views and sort the slideshows for particular pages.

Summary:

FPSS comes with 7 or 8 different templates at least and has quite a few features, very few of which are replicated here. We basically needed to change from the version of FPSS we were using to an open source alternative and Views Slideshow is a great module. Drupal designers who spend some time to create templates for Views Slideshow will find them extremely useful in serving multimedia content, or as a replacement for Flash in some situations. I also like and recommend FPSS and will probably continue to use it in some sites.

Example:

viewsslideshow_ex

Views Slideshow: http://drupal.org/project/views_slideshow
fpss_example

FrontPage Slideshow: http://www.frontpageslideshow.net/

Drupal Module: http://drupal.org/project/fpss

Pings/Trackbacks

Jul 03 2009
Jul 03

First of all, I’d like to say hello fellow drupalers! This is my first post here, (and also my first ever blog post!) since Greg opened up drupaler.co.uk as a collaborative blog for Drupal developers.

I’ve been playing around a bit with Panels 3 since the early alpha releases. In the initial stages of my explorations I encountered some frustrations, as a lot of the code was still in heavy development, but I’m pleased to report that the latest beta (beta2) seems much more stable, and I havent had many issues with it so far (fingers crossed).

It came to a point in the development of our site where we were happy with the layout and content in our panels and we wanted to move them out of the database and into code using the export feature - A similar feature which is also available in the views module. This post is going to cover exporting a custom panel page and a panel page and calling them from code. The methods for the two are slightly different so I’ll explain both.

Initially I spent a fair bit of time digging around drupal.org , but couldnt find much in the way of examples on how to go about calling panels from code. I did however stumble across this great tutorial from Michelle which was an excellent starting point, and I’ll use part of that tutorial in this example.

As a first step, prepare a module ready to accept the panel export code. To do this, First of all follow Step 1 from Michelle’s tutorial - create a new module, and inside your module’s directory create a file called MODULE_NAME.delegator_default.inc.

Next, We’ll also need Step 2 from Michelles tutorial – Go ahead and paste the following code into your .inc file –

<?php
/**
* Implementation of hook_default_delegator_handlers()
*/
function MODULE_NAME_default_delegator_handlers() {
$handlers = array();
// BEGIN HANDLER EXPORT ******************************************************/
  // PASTE YOUR HANDLER EXPORT IN HERE
// END HANDLER EXPORT ******************************************************/
 
$handlers[$handler->name] = $handler;
return
$handlers;
}
?>


We’re going to skip Step 3 of Michelle’s tutorial for now and go straight to step 4. Next add the following code to your .module file

<?php
function MODULE_NAME_ctools_plugin_api($module, $api) {
  if (
$module == 'delegator' && $api == 'delegator_default') {
   
$module_path = drupal_get_path('module', 'MODULE_NAME');
    return array(
'version' => 1, 'path' => $module_path . '/path/to/include/file');
  }
}
?>

The next step is to implement hook_default_delegator_pages() in your .inc file. Paste the following code:

<?php
/**
* Implementation of hook_default_delegator_pages();
*/
function MODULE_NAME_default_delegator_pages(){
 
$pages = array();
 
//include pages
  // BEGIN HANDLER EXPORT ******************************************************/
  // PASTE YOUR HANDLER EXPORT IN HERE
// END HANDLER EXPORT ******************************************************/ 
return $pages;
}
?>

Our module now has the base ready to handle the exported panel code.

Panel Page Export
On the Panel Page you wish to export click Operations and then Export. Copy the code from the following screen and paste it into MODULE_NAME_default_delegator_pages(). That’s it for normal panel pages! If you clear caches and refresh the panels admin page (admin/build/pages), if everything worked you should see the ‘Storage’ change from ‘Normal’ to Overridden’.

Custom Page Export
Custom pages are slightly different in that they also require you to export each task handler for the page as well as the page code. This is because a custom page may have multiple task handlers, whereas a normal panel page only has one.

To export a custom page you should follow the same steps as above (Panel Page Export) to export the page code and paste it into MODULE_NAME_default_delegator_pages().

To export the handler code, on the custom page you wish to export, click Operations then Task Handlers. This should take you to a page which shows a list of handlers for the current panel.

Note* - if you only initially specified the panel to have a single handler, you might be displayed with a screen that gives you 2 options – allow multiple handlers, or create a singler handler. In order to export the handler code, you must choose allow multiple and select finish.

If you had to choose allow multiple, go back in to the task handlers for your panel. Now you should see the list of handlers.

Now export each handler. Copy the code and paste it into MODULE_NAME_default_delegator_handlers() , and that’s you done! Again, on admin/build/pages the ‘Storage’ should change from Normal to Overridden. In task handlers for the panel, each task handler ‘type’ should also change from Normal to Overridden.

As a final step, if you want to delete the copies from the database for each page / handler click on Operations then Revert, and delete the copy in the database. This will mean that your panel page is now being called from Code. If you did this the ‘Storage’ and ‘type’ fields on the pages should change to Default.

Jul 02 2009
Jul 02

Ever wanted to show your Drupal contact form at every page using a Block? You can now by using the Contact form blocks module.

Description

  • Show your contact form at any place where you can show a Drupal Block. For every contact form category you get one block.
  • Use the Block visibility settings to control at which page(s) it should be shown.
  • Hide some of the contact form categories at the site-wide contact form.
  • Available for Drupal 5.x and 6.x.

The following screenshot demonstrates how to configure a contact form category and show it as a block:

How to configure a contact form category and show it as a block

Have a look at the documentation page at drupal.org.

Motivation

Some weeks ago I was looking for a solution to display one of the contact form categories at every page. Natural Drupal method would be to use a block. Showing the contact form as a block is possible by the help of the Form block module. Unfortunately it shows all contact form categories you configured in Administer > Site building > Contact form.

Because a patch to the Form block module apparently wasn't noticed by the developers of that module I decided to code it by myself. The result is the Contact form blocks module.

Jul 02 2009
Jul 02

Play Video

Movie link (right-click to download) Problem with this video? Contact me

When it comes to search, Drupal seems to do OK by itself. However, there are a number of supporting modules which will make your Drupal's default search even better. These include Porter-Stemmer (english only), Search 404, Search by Page, Similar By Terms and many others.

If you're seekign to help an advanced user out, then modules like Search config can help with that. But what about the user who won't dare go into the hidden area of 'Advanced Search'? This is where the power is - right?

It sure is. This is where you tell Drupal what content types and categories you want to limit the search to. This is where a user, simply looking for a job on your site, which lists information about jobs, news, blogs and other items, can focus their results.

So, why don't you stop expecting the user to figure this out, and just make it happen for them! That's what this video is all about. Using the default Drupal search box and forcing it to focus on specific content types or categories. You control what Drupal searches for and you control where it shows up!

Search Related Modules

The Apache Solr project is what is used on Drupal.org. You know, where you get the cool faceted results from a search request.

Of course, if you haven't heard about it already, the Acquia Search service make it quite easy to take advantage of the Apache Solr coolness.

Here's the code.

<?php
// All of the following code goes within template.php

/*
* Using one of the preprocess hooks in template.php, you create a
* variable which calls drupal_get_form on the function which creates
* the search form
*/

function THEME-NAME-HERE_preprocess_node(&$vars, $hook) {
 
$vars['focused_search'] = drupal_get_form('THEME-NAME-HERE_focused_search_form');
}
/*
* This function will create a search form which adds a validation
* handler which you use to append any custom search criteria
* Note to self: Context module could be used here?
*/
function THEME-NAME-HERE_focused_search_form(&$form_state, $keys = '') {
 
// Render the form to search a focused content type
 
if( module_exists('search')) {
   
$form = search_form($form_state, '/'. drupal_get_path_alias($_GET['q'])); // Use existing search form code
   
$form['#validate'] = array('search_form_validate', 'THEME-NAME-HERE_focused_search_validate');
   
$form['#submit'] = array('search_form_submit');
    return
$form;
  }
}
/*
* The validation handler added within the search form is where you make
* any adjustments to the search handled by Drupal. You can use any
* critera you wish, including the path or other variables available
* within Drupal.
*/
function THEME-NAME-HERE_focused_search_validate($form, &$form_state) {
 
// Using an array to determine which content type to search based on path from search form
 
$content_type = array_search($form['#action'], array(
                 
'vendor_item' => '/vendors',
                 
'job_item'    => '/jobs/sites',
                    )
                  );
 
$content_type = empty($content_type) ? '' : $content_type;
 
// Initialize using any existing basic search keywords.
  // taken from node.module node_search_validate() function
 
$keys = $form_state['values']['processed_keys'];
 
$keys = search_query_insert($keys, 'type', $content_type); // additional seach criteria added here
 
form_set_value($form['basic']['inline']['processed_keys'], trim($keys), $form_state);
}
?>
Jul 01 2009
Jul 01
  • Advisory ID: DRUPAL-SA-CORE-2009-007
  • Project: Drupal core
  • Version: 5.x, 6.x
  • Date: 2009-July-1
  • Security risk: Moderately critical
  • Exploitable from: Remote
  • Vulnerability: Multiple vulnerabilities

Description

Multiple vulnerabilities and weaknesses were discovered in Drupal.

Cross-site scripting

The Forum module does not correctly handle certain arguments obtained from the URL. By enticing a suitably privileged user to visit a specially crafted URL, a malicious user is able to insert arbitrary HTML and script code into forum pages. Such a cross-site scripting attack may lead to the malicious user gaining administrative access. Wikipedia has more information about cross-site scripting (XSS).

This issue affects Drupal 6.x only.

Input format access bypass

User signatures have no separate input format, they use the format of the comment with which they are displayed. A user will no longer be able to edit a comment when an administrator changes the comment's input format to a format that is not accessible to the user. However they will still be able to modify their signature, which will then be processed by the new input format.

If the new format is very permissive, via their signature, the user may be able to insert arbitrary HTML and script code into pages or, when the PHP filter is enabled for the new format, execute PHP code.

This issue affects Drupal 6.x only.

Password leaked in URL

When an anonymous user fails to login due to mistyping his username or password, and the page he is on contains a sortable table, the (incorrect) username and password are included in links on the table. If the user visits these links the password may then be leaked to external sites via the HTTP referer.

In addition, if the anonymous user is enticed to visit the site via a specially crafted URL while the Drupal page cache is enabled, a malicious user might be able to retrieve the (incorrect) username and password from the page cache.

This issue affects both Drupal 5.x and Drupal 6.x

Versions affected

  • Drupal 5.x before version 5.19.
  • Drupal 6.x before version 6.13.

Solution

Install the latest version:

  • If you are running Drupal 6.x then upgrade to Drupal 6.13.
  • If you are running Drupal 5.x then upgrade to Drupal 5.19.

If you are unable to upgrade immediately, you can apply a patch to secure your installation until you are able to do a proper upgrade. Theses patches fix the security vulnerability, but do not contain other fixes which were released in Drupal 5.19 or Drupal 6.13.

Reported by

The forum XSS issue was independently reported by Mark Piper of Catalyst IT Ltd, Sven Herrmann and Brandon Knight.
The user signature issue was reported by Gerhard Killesreiter of the Drupal security team.
The password in URL issue was reported by Sumit Datta.

Fixed by

The forum XSS issue was fixed by Heine Deelstra, Peter Wolanin and Charlie Gordon.
The user signature issue was fixed by David Rothstein, Charlie Gordon, Heine Deelstra and Gábor Hojtsy.
The password in URL issue was fixed by Damien Tournoud and Bart Jansens.

Contact

The security team for Drupal can be reached at security at drupal.org or via the form at http://drupal.org/contact.

Jul 01 2009
Jul 01
We’ve talked through the ‘strategy’ behind the proposed D7UX Information Architecture (IA), now let’s take a look at it in detail. What goes where. Let’s go through each major section in turn: Content The ‘Find Content’ page, showing a searchable, sortable, filterable list of all the content on your site is the ‘landing page’ for … Continue reading D7UX Information Architecture – A detailed view
Jul 01 2009
Jul 01

At last I can announce the release of my new six-hour video series from Lynda.com, "Drupal 6: Online Presentation of Data", which you can check out with a free one-day pass. (Of course it's also available to anyone with a Lynda.com subscription, starting at $25/month for all-you-can-stand training in over 600 topics.)

I first talked about this course in January and was able to implement at least one suggestion from your comments (about creating calendars). There are also videos about mapping, charting, and preparing data for tabular export, all built on a foundation of CCK and Views.

Since Lynda.com's audience is mostly graphic designers, the course starts out with an in-depth description of data structure: As you know, data planning is at least as important as implementation! And it's an essential subject whose subtleties elude most beginners.

One wag in IRC questioned the need for such a course. "Presentation of Data?," he said. "Isn't that what Drupal does anyway?" He's right -- in the same way that a car is a tool for going shopping. But I believe that many people who would benefit from Drupal's data-presentation features simply don't know about them, because their knowledge of it stops at Stories, Pages, users, and blocks. They need a bit more information to make the leap, and could become fierce advocates for Drupal when they see all it can do in this area.

Extra bonus: For giggles, check out the Introduction video, which includes some live-action video of me looking goofy. :)

Thanks, as always, to the Drupal community for both helping me to understand these topics myself, and for making Drupal the Web development powerhouse it is.

Jul 01 2009
Jul 01

I've been on the go so much that I haven't had the mental space to sit down and articulate a lot of the cool stuff that is going on. A few weeks ago I took part in a new open source conference, Writing Open Source (WOScon). The conference was born from conversations Emma Jane Hogbin and I had last fall, and she took the ideas and made it a reality in Owen Sound, Ontario. It was very small but packed with awesomeness, from people to ideas to food. There were quite a few exciting ideas for the Drupal community which will get written up and worked on down the road a bit. Lots of folks have written up summaries* of the event itself, but that single event has started something quite a bit bigger. The last day of the conference we transformed the conference website into a new community site and started a new Twitter/identi.ca hashtag for #wosdocs. We've started a new open source community to focus on documentation. That may not sound exciting to lots of people, but it is, even if you aren't a "writer" and here's why.

Open source growth

As a whole, open source has been gaining tremendous ground over the years. It is becoming more mainstream every month. Open source software is respected as a viable tool in today's world, but for most every project, the documentation lags behind the quality of the code. As people explore this "new" software, they need to feel like they can let go of the side of the pool and there will be a life raft in the middle if they need it. This generally takes two forms: paid support or community documentation. Open source is growing rapidly, but we are still a very small part of the bigger pie. To accelerate open source growth we need the coders to keep cranking with their bad selves, and we need to provide guidance and support for new users. Open source is an amazing model for making awesome software, there is no reason that we can't produce best of breed documentation with the same community passion.

Industry standards and quality

One of the big take-home points for me at the conference (amongst so many) was that we generally have a very high standard for the quality of our code, but we do not apply those same standards to our documentation. This is a disservice to both the docs and the code it supports. There are a lot of people out there who are documentation professionals; technical writers, editors, information architects, etc. and believe or not, a lot of them are using open source. We need to listen and learn from the pros, just like we do with code. One of the great things about documentation best practices and standards is that there is a whole industry that already looks at these things. We can learn from what is there, apply open source magic and share. The beauty of docs is that the same basic principles are going to apply to all projects, regardless of language (code or culture), structure, or size. Of course, each project will have its own resources and emphasis, but so much base ground can be laid down that is useful to everyone. We have started exploring this on the WOSdocs site by creating outlines for a sample open source style guide, documentation best practices guide and starting a persona library. This is just fricking awesome for everyone from single developer trying to write docs on their own to large teams wrangling complex projects.

Kicking ass

So basically this is good news for everyone and I truly believe that this new movement to make kick ass docs for all of open source is going to move us up to the next level in adoption around the world. As Paul said in one of his blog posts about the conference, I'm excited to know that I will be able to look back and say that I was "there when this began." If you want to be part of ass-kicking history, we are an open community, so head on over to WOSdocs, sign up and dig in. I also plan to be at WOScon next year and it'll be fun to see how much we've grown by then. Maybe we'll even share some of our insider jokes too. Where did that mammoth come from?

* Some posts about WOScon
http://live.gnome.org/DocumentationProject/Community/Woscon2009
http://emmajane.net/node/928
http://emmajane.net/node/929

Jul 01 2009
Jul 01
Designing an Information Architecture (IA) for Drupal is an incredibly challenging project – essentially you are trying to design an IA that allows just about anyone to do just about anything. Flexibility is very often the enemy of good design – people make good and fast decisions with fewer options not more – but how … Continue reading Information Architecture Strategies
Jul 01 2009
Jul 01
This is the first in a series of posts discussing the proposed information architecture (IA) for D7UX. Before we get into too much detail, be sure to check out this great video that Roy Scholten (Yoroy) posted recently that helps explain some of the key features and rationale of the IA and how it relates … Continue reading Understanding the D7UX Information Architecture Approach
Jul 01 2009
Roy
Jul 01

The modules page is a typical example of a long list that gets hard to manage pretty quick. The categorization is not ideal, with big modules providing their own category and a quickly growing 'misc' section.

The usability tests have shown that after installation, modules do not provide clear starting points to where you can find their configuration pages. Same goes for the new permissions a module might expose. No clear indication that there are new permissions and no clear pointers to where to find them.

  1. Finding functionality once a module is installed
  2. Finding functionallty a while after the module is installed
  3. Finding functionality (with no knowledge of modules whatsoever)

In general, this gives us two areas of attention:

  • Managing the big list of modules as a whole
  • Finding related tasks per individual module

For the latter, we need to show more info per module without cluttering the interface. Finding related tasks per module is something the accordion concept (yes, accordions, I mixed up my musical instruments there) could help fix this by showing links to configuration and permission pages from within the context of the module itself.

During the UX sprint we discussed ways to make it managing the big list itself easier. The main idea is to provide 3 top level boxes for modules to live in: New, Enabled and Disabled.

Let's take a look at how this would help solve some of the problems:

Box 1: New This would make it pretty easy to find the module you just installed on the page. You'd find both enabled and disabled modules living in this box. Of course, we'd still have to provide messages on other admin pages so that you know you have to visit the modules page at all. Box 2: Enabled It seems sensible that below the list of 'New' modules is the list with 'Enabled' ones, no? These are the ones that provide the parts you built your site with. Box 3: Disabled For the modules that are installed and fully configured or have been enabled before, but are (kept) disabled, well, you probably don't want to have them clutter the top part of your screen.

Yes, but…

What about the categories? It would still be handy to be able to filter on everything 'media' or 'ubercart' yes. Propose to make the categories a filter as a select list on top of the page. What about modules that consist of multiple modules, like panels, views, ubercart? What if I enable some of them, some not? Yes, the New/Enabled/Disabled segmentation would seperate these 'sub-modules' from each other. Currently these modules are grouped into their own category. I don't expect the seperation to be a real problem. On first usage (after installation) the module family would be shown in full in the 'New' box. After configuration, the category filter would allow you to see all panels, views, ubercart related modules together again. This would mix up core and contrib modules! From the users perspective, does that really matter? Again, the Category filter would come to the rescue in providing a filter to show 'Core modules' only. In itself it is not a very relevant disctinction to make. How would the modules within each box be sorted? Sorting alphabetically, although about as helpful as 'random' in most cases, seems to be the most logical option here for the New and Disabled boxes. For the enabled section, which would normally be the longest list, we can re-use the categories from the configuration page (the new name of what currently lives under /admin but reorganized).

Any other edge cases I missed? Any other problems that might arise from this new grouping? Point them out please and talk us through it. If the concept still holds after discussing them, then just this new grouping of modules in New / Enabled / Disabled boxes would be a worthwhile improvement for the modules page.

Jun 30 2009
Roy
Jun 30

Hi. My name is Roy Scholten. I'm a user experience designer based in the Netherlands. I make Drupal easier to use. I can do the same for you. Let's talk.

Jun 30 2009
Jun 30
Because she is amazing, Ann McMeekin has prepared for us a guide to designing accessibility into themes – it’s useful far beyond this project so we’re sharing it here and pls feel free to pass it on to other who might find it useful. You can download a PDF version of this document here. Before … Continue reading Designing Accessibility Into Themes
Jun 30 2009
Jun 30

Perkenalkan kami sebagai perusahaan pemrodukasi mebel jepara dengan nama Mebel Jepara ingin menawarkan produk produk unggulan khas jawa tengan indonesia yang cantik dan legant dengan harga yang tentunya relatif lebih terjangkau, Produk Mebel Jepara mulai saat ini sedang berkembang sangat pesat, kayu yang di produksi dengan sangat teliti dan terkontrol menghasilakn produk mebel yang sangat elegant dan cantik, produk produk tersebut meliputi Kursi Tamu Jati Jepara dengan model klasik, minimalis ataupun klasik modern yang sedang trend di beberapa tahun terakhir.

Tak ketinggalan produk produk Mebel Jepara Minimalis dengan model simple elagant juga sedang boaming saat ini, seiring berkembangnya hunian rumah dengan konsep minimalis, produk produk tersebut kini sudah di produksi Mebel Jati Jepara anda dapat memilih model model mebel tersebut untuk anda terapkan di ruangan rumah anda yang tentunya akan menambah kesan tersendiri untuk rumah anda. Kami selalu berupaya memasarkan produk produk kami agar lebih cepat terwujut ke anda dan sekarang kami sudah membuka pemasaran via online yang dapat anda temukan katalognya disini Mebel Jepara Online

Produk produk mebel tersebut semunaya kami rangkum dalam sebuah katalog, diantaranya produk produk mebel dari kayu jati atau yang biasa disebut Mebel Jati asli jepara. Dari segi tektur kayu, kontruksi pembuatan serta pahatan ukir yang khas jepara menjadikan nilai tersendiri yang dapat anda ( istilahnya ) pertontonkan kepada tamu tamu istimewa yang datang ke rumah anda. Produk Mebel Jepara selalu dijaga kualitasnya, karena kami tahu sendiri bahwa kualitas adalah nomor satu dari yang di inginkan oleh konsumen konsumen kami.

Kursi Tamu Jati yang biasa kami produksi 100% kayu jati asli perhutani, kami berani memberikan garansi uang kembali dua kali lipat jika memang produk yang kami jual tidak sesuai dengan yang kami ajukan. Furniture Jati dengan label Cv. Karya Priboemi Jepara memang dikenal sebagai salah satu perusahaan yang sudah berpengalaman, produkn ya pun bagus bagus dengan harga yang relatif lebih terjangkau. Mulai dari Kursi Tamu Jati anda dapat memesannya secara online via katalog website yang sudah saya berikan tadi, dengan menghubungi via bbm, whatsap, ataupun telephone dengan hanya memberikan kode produk.

Mebel jepara terkenal dengan kekokohan dalam pembuatan kontruksinya, kami sendiri selalu mengontrol produk produk yang akan kami jual ke pasaran, jika memang barang itu belum layak, maka kami akan benahi lebih lanjut, jadi anda tidak perlu khawatir lagi akan kualitasnya. Mebel jepara online memang sedang marak saat ini, oleh karena itu kami pun berusaha semaksimal mungkin untuk memberikan pelayanan yang lebih baik untuk anda konsumen konsumen setia kami Cv. Karya Priboemi Jepara. Toko Mebel

asli desain Cv. Karya Priboemi Jepara, sangat laris di pasaran, beberapa model meja makan tersebut tidak lupa kami lampirkan pada katalog produk kami, selengkapnya anda bisa lihat disini Mebel Jepara Online. Produk produk mebel jepara sekarang sudah banyak di copy di berbagai daerah hingga mancanegara, tetapi pada dasarnya adalah orang jepara sendiri yang mengajarkan kelihaian kontruksi ataupun ukiran di beberapa daerah tersebut, seperti halnya produk Kamar Set Produk tersebut sangat mudah dibuat dan ditiru, tetapi kualitas dari produk anda akan melihatnya sendiri jika anda sudah bisa membandingkan kualitas dari produk Kamar Set Salah satu yang menjadi produk andalan mebel jepara adalah kursi tamu, produk kursi tamu tersbut dengan gaya mewah asli mebel jepara dapan anda lihat dan pilih disini Kursi Tamu produk kursi tamu tersebut sangat laris dipasaran karena kebanyakan konsumen kami lebih cenderung suka model klasik modern yang mewah dan elegant, tak lupa juga saya sertakan produk yang memang sudah menjadi trend di pasaran mulai dari jaman dulu hingga sekarang yaitu gebyok jati jepara produk tersebut memang sudah menjadi etnik jawa khususnya kota jepara Meja Makan Minimalis memang sedang marak saat ini, oleh karena itu kami pun berusaha semaksimal mungkin untuk memberikan pelayanan yang lebih baik untuk anda konsumen konsumen setia kami Cv. Karya Priboemi Jepara. Furniture Jepara

Karena dibuat dengan menggunakan material kayu jati pilihan produk tersbut sangat kokoh karena di proses oleh tenaga tenaga Mebel Jati banyak sekali produk yang dikerjakan oleh tenaga tenaga ahli mebel kami diantaranya kursi tamu gebyok kamar set tempat tidur hingga Meja Makan dan untuk juga untuk anda yang sedang mencari perabot untuk ruang kamar dengan desain klasik ataupun minimalis anda bisa melihat katalog produk Tempat Tidur Jati memang sedang marak saat ini, oleh karena itu kami pun berusaha semaksimal mungkin untuk memberikan pelayanan yang lebih baik untuk anda konsumen konsumen setia kami Cv. Karya Priboemi Jepara. Mebel Jati

untuk katalog produk dengan desain klasik ataupun minimalis seperti meja makan ataupun yang lainnya anda juga bisa memilihnya di kolom produk dengan menu kategory Meja Makan Minimalis produk produk kami tentunya mempunyai nilai tersendiri yang tentunya berkualitas tinggi, karena kami proses dengan melalui kontol yang sangat teliti. Seperti produk produk kursi tamu misalnya, untuk membuat Kursi Tamu kami memakai bahan dengan kualitas grade A jadi anda tidak perlu ragu lagi akan kualitas dari produk produk mebel yang kami tawarkan kepada anda. Ada lagi produk yang tak kalah larisnya yang ada di jepara yaitu Tempat Tidur , produk ini merupakan produk paling penting yang harus ada dalam suatu hunian rumah. Apapun bentuk / model dari tempat tidur tersebut, yang terpenting adalah kita nyaman saat beristirahat tentunya. Selain menjual tempat tidur dalam satuan, kami juga menerima pemesanan produk untuk ruang kamar berupa set kamar tidur. Kamar Set itu sendiri nantinya akan terdiri dari tempat tidur lemari pakaian dua nakas dan meja rias, anda juga bisa memesannya terpisah. Mebel Jepara Minimalis selalu menjadi daya tarik tersendiri untuk turis asing yang ingin membuat usaha furniture, banyak sekali turis asling berbondong bondong ke jepara untuk memulai bisnisnya, tidak hanya itu banyak juga turis asing yang ingin mengisi rumahnya dengan membeli produk produk seperti tempat tidur kursi tamu meja makan yang asli dan khas Mebel Jepara kami juga menyediakan produk lain yang tak kalah pamornya di beberapa tahun terakhir, produk ini tentunya memiliki ciri khas tersendiri. Pada produk ini kayu jati kami olah sedemikian hingga menjadi produk Meja Makan Jati yang mewah dengan keaslian aksen ukiran khas mebel jepara jual mebel jati harga murah asli mebel jepara, kami menawarkan harga standart furniture jepara dengan kualitas yang tentunya terbaik Penerapan ruang yang akan anda isi mebel harus anda perhatikan terlebih dahulu sebelum membelinya, Mebel Jepara dalam hal ini saya ada rekomendasi untuk anda untuk berkonsultasi terlebih dahulu dengan pakarnya, anda bisa langsung menuju untuk saat ini mebel jepara memang sudah sangat berkembang, jepara terkenal hingga ke mancanegara sebagai pusat industri mebel terbesar di dunia, produk produknya sudah banyak yang di export ke mancanegara, salah satunya italy Mebel Jepara Kami menyediakan layanan online untuk pemesanan Mebel Jepara dengan sistem online. Ada juga produk unggulan lain seperti tempat tidur, meja makan, set meja makan dan banyak lainnya.
Oleh karena itu mulai dari lima tahun terakhir kami sudah mengembangkan untuk pembelian produk furniture dengan menawarkannya di Mebel Jepara memang sedang marak saat ini, oleh karena itu kami pun berusaha semaksimal mungkin untuk memberikan pelayanan yang lebih baik untuk anda konsumen konsumen setia kami Cv. Karya Priboemi Jepara. Furniture Jati

Toko Mebel Mebel Jepara Murah jual mebel jati harga murah asli mebel jepara, kami menawarkan harga standart furniture jepara dengan kualitas yang tentunya terbaik Mebel Jepara Online berkualitas asli produk mebel jepara yang dibuat oleh tangan tangan ahli pengrajin mebel jepara yang ada di perusahaan kami Furniture Jepara mulai dari meja makan jati, tempat tidur minimalis, meja makan jati, kursi tamu murah, kamar set minimalis semuanya tersedia termasuk gapura pintu gebyok jati, juga Kursi Tamu Minimalis banyak sekali kami menawarkan produk mebel jati yang kami gunakan sebagai bahan baku, juga tersedia bahan kayu mahoni untuk mebel dengan pewarnaan cat duco Meja Makan Minimalis hasil karya Cv. Karya Priboemi Jepara yang sudah dikenal hingga mancanegara salah satunya adalah pintu gebyok. produk ini sangat tenar dan etnik jawanya masih melekat pada produk Mebel Jepara Minimalis Ada juga produk unggulan lain seperti tempat tidur, meja makan, set meja makan dan banyak lainnya.
Oleh karena itu mulai dari lima tahun terakhir kami sudah mengembangkan untuk pembelian produk furniture dengan menawarkannya di Toko Mebel Minimalis Oleh karena itu mulai dari lima tahun terakhir kami sudah mengembangkan untuk pembelian produk furniture dengan menawarkannya di Mebel Jepara yang sangat cantik dengan keaslian ukiran khas mebel jepara yang terukir rapih dan halus di setip sudutnya. Ada juga produk unggulan lain seperti tempat tidur, meja makan, set meja makan dan banyak lainnya.
Oleh karena itu mulai dari lima tahun terakhir kami sudah mengembangkan untuk pembelian produk furniture dengan menawarkannya di Mebel Jepara memang sedang marak saat ini, oleh karena itu kami pun berusaha semaksimal mungkin untuk memberikan pelayanan yang lebih baik untuk anda konsumen konsumen setia kami Cv. Karya Priboemi Jepara. Mebel Minimalis

Jun 30 2009
Jun 30

Last Friday, Where It's At NYC website was launched with my design and Drupal theming, done by CivicActions - Strategic Internet & Drupal Consulting company, where I work.  Where It's At NYC is another great example of a mostly "out-of-the box" Drupal implementation.

The defining characteristic of the site's implemention is its principal navigation structure based on a large (200+ term) taxonomy written in the form of first person "I" statements like "I need emergency housing services", "I have questions about STI's HIV, AIDS and other related issues". These statements are organized into five "domains"--education, employment, health, housing, and social--reflecting the broadest categorization of the social service resources listed on the site. Users navigate the resources by drilling down in each domain through a series of these statements. As a user clicks into the hierarchy, a refined list of resources appears (powered by a Views). Each taxonomy term description appears as a sort of help text on each of these pages, and together with all the descriptions of all the other taxonomy terms in the same domain, constitutes a sort of glossary for that domain accessible through the domain's landing page. A few other contrib modules provide some of the other bells and whistles on the site. These include among others:

  • With the Avatar select module, users can choose from one of 40 avatars created by the client with their specific audience in mind, using www.faceyourmanga.com. Avatar differs for logged in user/anonymous visitor.
  • We used Node Import module to import content provided by the client.

  • The Location and Gmap modules were used to place maps on each page, and the location data stored in the Location module populates a direct link to a page on www.hopstop.com, a site widely used by youth in NYC for public transit directions.
  • For the site's administrators and contributors, the Hierarchical select module eases the selection of statements from the large vocabulary.

Read the full case study on CivicActions.com

Jun 30 2009
Jun 30

I am currently working on a project which uses the module site_user_list and I wanted to use some variables in my template. The documentation of the module said I could use the variables from the $r array but I discovered that was not working. I found someone discovered the same problem and opened an issue:
http://drupal.org/node/183379

That same person also contributed a patch but I was unhappy with it. I provided my own.

If you want to use drupal_eval() and allow the code inside that to access (read-only) some of your context variables, try this:

Let's assume you want to eval the PHP code found in the variable $code. You might consider doing like this:

$options = array('foo' => 'bar');
drupal_eval('<?php ' . $code . '?>');

This would mean that whatever PHP code found in $code would have no access to $options.

This is why I recommend this:

$options = array('foo' => 'bar');
drupal_eval('<?php $options = '. var_export($options, TRUE).'; ' . $code . '?>');

The var_export() function (php core) will create valid PHP code from your array. You assign that to another variable (could be called anything) and voila. This code will be executed and the values from your $options array becomes accessible (read-only) to your $code.
If the code inside $code tries to change the values of $options, it will NOT change the values of the real $options since it is a copy.

Jun 30 2009
Jun 30


Drupal
FleetThought uses the Drupal content management system to build full-featured, robust, scalable websites and is an individual member of the Drupal Association.


Clarksville and Nashville, TN
Based out of the Clarksville and Nashville, TN area, we love our community and enjoy building websites that help support the success of local businesses.

Jun 29 2009
Jun 29

A few weeks ago I posted a draft Drupal documentation roadmap on Drupal.org. In that post I attached the full roadmap of goals, but focused on the first two we are tackling: a new information architecture (IA) and recognition/reward for documentation contributors. We had a meeting in IRC shortly after and we discussed a number of questions and ideas. I've been on the road a lot since then, but things are still moving along and this post is to give a little nudge about what folks can do to get involved. We need folks to help with our survey, start up an interview process and give some advice on recording conversations. We are also in the process of scheduling our next meeting to talk about Drupal 7 documentation, so if you want to hop in on that, please fill out the Doodle to set a time.

Surveys

When we posted the roadmap we also opened up a survey to gather feedback on recognizing contributors. The survey is about saying "thank you" to contributors. I'm going to close the survey this Thursday, July 2, so if you haven't filled it out yet, take a few minutes to do that this week. Once we close the survey, we'll need to analyze the results, start to sketch out things we might implement and look at what other surveys may be useful. If you are interested in helping with the analysis, please let me know.

Interviews

The next big item that we need help with is to begin the IA stakeholder interviews. This is one of several ways that Becca is gathering data to construct a new architecture for our documentation. We need folks that are willing to interview, as well as be interviewed. We have a script that you can follow and Becca will provide instructions. The interviews can be done in person, on the phone or using Skype. If you would like to take part or learn more about the interview process, please sign up!

Recording Skype

One related issue we have is that we would love to have the Skype interviews recorded but we don't have good instructions for how to record both sides of a Skype conversation on multiple platforms, using free tools if possible. If you are familiar with recording Skype and have any tips or time to write up instructions for the tools you use, it would be a huge help to the docs team. Feel free to drop me a note, or just add your instructions directly to the handbook in the Content architecture section (click the Add child page link at the bottom and go nuts).

Jun 29 2009
Jun 29

Auckland's Sky Tower and city-scape illuminated in Christmas colours during December.  By Kahuroa, Courtesy of wikipedia.I'm going to be in Auckland this Friday and am meeting up with some other Drupalers to drink, dine and talk Drupal. Please see my post on groups.drupal.org for more details and to let us know if you're coming.

read more

Jun 29 2009
Jun 29
Penguins Crossing; LCA Wellington 2010 logoLinux Conference Australasia (aka LCA, linux.conf.au) will be in Wellington 18-23 January 2010 – 6 and a half months from now. This presents opportunities for the NZ Drupal community to;
  1. Promote Drupal in the wider FLOSS community (which is good for business)
  2. Run a DrupalCamp/Conference; which allows attendees to combine expenses if attending LCA, and organizers to share venue, admin, financial and other resources with LCA.
  3. Just hang out and drink & talk Drupal! Or perhaps (talk) and (drink drupal)!? :)
  1. Promote Drupal

    With the government moving away from Microsoft products and towards Open Source, and (hopefully) a FLOSS-friendly Patents Act in NZ, it is a very critical time to be making folk aware of Drupal and how it can empower them and their organisation/s.

    This is good for the Drupal marketplace, and good for anyone providing Drupal services in NZ – probably you!? (Conferences like this are also great places to grow your own business network directly!)

    Saturday 23 January is Open Day at LCA and is probably a good opportunity to set up a Drupal stand or similar. We would be able to use the Drupal banner from DrupalSouth for this.

  2. Run a DrupalCamp/Conference

    LCA is taking proposals for miniconfs during, before or after LCA. Given the prominence of Drupal in both the web and FLOSS communities it's likely a well–organised and well-written proposal would be accepted.

    Alternatively, we could organize our own DrupalCamp or mini-conference outside of LCA proper. Though LCA-miniconfs make admin easier and minimize the overhead of organizing a DrupalCamp or miniconf.

    Perhaps such an event could be DrupalSouth 2?

  3. Hang out and talk Drupal!

    With or without the above (or other Drupal events), it'd be great to meetup with other Drupalers and talk Drupal in the bars. Who else is planning on or thinking about attending?

I'm very keen to be involved in any/all of the above, but won't have enough bandwidth to be a driving force behind organizing anything big while living in Thailand (from September). I'm loosely planning on being back and living in NZ (maybe Wellington) in time for LCA. This is a cross-post from groups.drupal.org/new-zealand. Please discuss it there.
Jun 28 2009
Jun 28

Google Spreadsheets are cool, but their problem is that they are hosted at Google instead of in your intranet portal. That means that they don't integrate easily with your other Web documents, in terms of classification, indexing, permissions, etc. The API provided by Google does help there, it's true. But what about adding new features? Google Docs simply isn't open source, and therefore is not ideal.

Enter Dan Bricklin, co-author of Visicalc, the original spreadsheet application back in 1979. Dan has recently been working on SocialCalc, an open source spreadsheet engine written in Javascript. This engine is bundled with SocialText, an "Enterprise 2.0" collaboration tool, as well as the OLPC XO laptop. With these credentials, you can expect SocialCalc to be a neat piece of code. Well, it is, and it's open source!

Enter Drupal. To me, Drupal is the ultimate glue for Web technologies. Its flexible architecture allows pretty much any Web component or protocol to be integrated within a coherent framework, and that's why it powers a large percentage of the modern Web. Marketing aside, I decided to integrate SocialCalc into Drupal, and the Sheetnode module is the result. Here are some of its features:

  • Create nodes that are spreadsheets, complete with formulas and formatting
  • Refer to cells in other spreadsheet nodes
  • Use the standard Drupal search to find content inside cells
  • Save sheets as templates that can be reused when creating new spreadsheets
  • Import from / export to Microsoft Excel files
  • Export to OpenOffice.org Calc files
  • Import from Google Docs spreadsheets
  • Create views that show results in spreadsheets, complete with formulas, formatting and result expansion

This last point is the most exciting to me, as it allows for real-time reports to be created out of Drupal data. Simply create a new view, choose the Style to be "Spreadsheet", then you're shown a sheet where you place and format the fields that should be rendered, as well as the calculations needed. Invoking that view expands the results onto the sheet and you get your results!

Sheetnode is still hot off the oven at version 1.0. I'm excited to see it adopted as part of Drupal intranet installations. Your feedback is wanted!

Jun 28 2009
Jun 28
chris's picture

“Drupal for NGOs” is the bi-monthly bash held at Amnesty International in London and as the title suggests, it’s all about encouraging NGOs to harness Drupal powa!

There were 3 presentations interspersed with plenty of friendly banter, wine and nibbles. The focus? Creating powerful intranets with Drupal.

First up, Robert Castelo of Code Positive gave an informative “Introduction to Drupal” talk laying down the foundations and getting everyone up to speed on what Drupal is and what it does.

Joe Baker of Oxfam continued with a talk about the projects he’s working on at Oxfam and in particular about the challenges they’re facing regarding their intranet. He also mentioned he’d attended the Lullabot Do it with Drupal conference where Angie Byron (webchick) had built Basecamp using Drupal in a weekend, the resulting project code can be downloaded and a demo seen at http://www.doitwithdrupal.com/sessions/basecamp-built-drupal. Joe concluded by explaining that he was using that code as a base from which to develop an intranet for Oxfam India.

I particularly enjoyed Joe’s talk, it was really good to actually meet him in the actual flesh, actually face to face as we'd been chatting over Skype for the best part of 2 years...

Headlining the event was John King who had driven a staggering 7 hours to tell us about Skip which had recently moved to Drupal with the aim of organising it’s infrastructure and to aid communications. John explained that most of the Skip volunteers were away working on their summer projects but that the site would really start to get used once they returned.
John King paying tribute to Fintan Darragh
There was a poignant moment at the end of John’s presentation, the Skip site had been developed by Fintan Darragh who had tragically passed away in May. John paid tribute to his work and thanks to pledges of ongoing support and hosting from the Drupal community, it was clear that Skip’s site would continue to go from strength to strength.

So all in all a thoroughly terrific evening with hot hints and top tips on how build effective intranets. Keep an eye on things at http://drupal.org.uk, or better still, sign up to notifications at http://drupal.org.uk/events/drupal-ngos

Photo by Mori Sugimoto, see more at http://www.flickr.com/photos/diasporan/sets/72157620505206109

Jun 27 2009
Roy
Jun 27

Everybody seemed to have read and understood most of the briefing email and sprint website because there we were, 20+ Drupal peeps showing up at the lovely OneShoe office, on time.

As expected we took an hour or so getting settled, finding team mates, asking for wifi passwords etc. Bojhan ran us through the plan for today and then the teams sat together and started attacking their issues.

Around one hour in we got our first tiny patch committed by Dries. Always good for morale.

Damien, Gabor, Konstantin, Steve and Thijs had a room on their own. Paving the way for Form Builder to land in core as our Fields UI. As far as I understood this involved lots of making and breaking stuff. But, the D7 port of the form builder module is there and landing jQuery UI seems not too far away as well jQuery UI has landed. It's just great to have these guys in the same room and see how focussed they are in their approach. Excellent.

Marieke, Thomas, Berend and Willem worked on text improvements. Another great way to find out about Drupal functionality weirdness, even when you are a long time insider. Bojhan and I reviewed their work after lunch, mostly stressing the 'make it even shorter' point. Among others, the shorter content type descriptions got committed, changing them from lengthty paragraphs into shorter yet more helpful sentences. Also, fresh beginnings of a text style guide for the Drupal interface

Together with Leisa, Mark and Nasir we discussed the modules page. Yep, one of the bigger issues. As per usual, we needed to talk about two hours to get to the point where we could agree we were agreeing on the same things (mostly!). Leisa took that talking and worked on mockups and followup questions. Can we all agree that modules are weird things? Between adding just a single checkbox somewhere and installing something like Ubercart… It's nearly impossible to find an approach that works equally well for all scenarios. I do think we found ways to improve the page, even incrementally. We'll recap tomorrow and keep you posted.

More good stuff worked on for blocks, menus and taxonomies as well, we'll talk about these another time, ok?

All in all, a very productive day. Looking forward to the over-night reviews from over-seas.

Jun 27 2009
Jun 27

This week I went to CiviCRM Developer Camp in London, UK. I must admit I've never used CiviCRM and downloaded and installed it for the first time the day before! The camp, which was un-conference in style, was held over two days, and over 20 people attended. It was meant to be a camp for experienced users, but given the varying degrees of knowledge of the people attending, I think it was less techy or advanced than originally intended.

For me it was the perfect introduction to learning how CiviCRM was structured and how I could go about extending it. Day one started with an overview of its architecture, followed up by an introduction to its hooks system. Unlike Drupal it is object orientated in design, but does have a very similar, albeit in its infancy, hook system. This might be related to the fact that the majority of the larger developer community are working on integrating it with Drupal. Day two continued with more sessions on hooks and the API, as well as a brief discussion on using CiviCRM in a multi-lingual environment. Finally, it finished off with an interesting discussion on how to improve and grow the CiviCRM community.

After the two days my head was reeling with information. If you're using CiviCRM, or even just contemplating it, I would definitely recommend going to this or similar events if you can. It wasn't just that the various sessions were all good, but you got to talk with other users, see what sort of implementations they've done and how they overcame various problems. It was also helpful for finding out information, such as getting involved in the community, where to find the IRC channel and how to find my way around the documentation.

Kudos to Michael McAndrew for organising the event, and thanks to Donald Lobo and Kurund Jalmi for flying in especially for the camp and for their excellent presentations.

Useful links:

Jun 26 2009
mvc
Jun 26

While upgrading Open GreenMap from Drupal 5 to Drupal 6, we had to port the Taxonomy Limit module by codexmas, which restricts the number of taxonomy terms which can be chosen for a multiselect vocabulary. The author hasn't had time to create his own Drupal 6 version, so we at Openflows Community Technology Lab volunteered to become co-maintainers. The new Drupal 6 version of the module is now available, which also fixes a few small bugs from the issue queue. Most importantly, since the Open GreenMap site is available in English, Spanish, Brazilian Portuguese, and German (so far) we made the module's error messages translatable using multilingual variables (see README.txt for details). Enjoy!

Future plans for the module include adding a feature to also limit the length of a freetagging taxonomy term to a set number of characters, since it's been requested by a few users and no other module currently provides this feature. We look forward to being able to contribute this to the community.

Jun 26 2009
Jun 26

I moved the maintenance of this to http://qa.drupal.org/node/44. This is only here anymore to point you over there.

As root, execute the following on commandline for a fresh install of Debian 5.0 Lenny. You can copy/paste most right to your terminal except in cases where you might get prompted for input (i.e. apt-get install, mysqladmin, vi, crontab).

Known bug: the php5-suhosin deb module for PHP will cause ~31 failures and ~11 exceptions. Known bug: all three opcode caching extensions APC, eAccelerator, and xcache have a history of instability with PIFR clients.

Server configuration

apt-get update
apt-get upgrade
apt-get install build-essential mysql-server-5.0 apache2 apache2-threaded-dev php5 php5-cgi php5-cli php5-gd php5-common php-pear php5-curl php5-mysql cvs curl php5-dev libapache2-mod-php5 gawk patch htop rsync cron wget
apt-get purge mailx exim4 exim4-base exim4-config exim4-daemon-light postfix
a2enmod rewrite
a2enmod expires
perl -pi -e 's/(\s+AllowOverride)\s+None$/\1 All/g' /etc/apache2/sites-available/default
perl -pi -e 's/(\s+CustomLog \/var\/log\/apache2\/access.log combined)$/#\1/g' /etc/apache2/sites-available/default
perl -pi -e 's/(memory_limit =)\s+\d+M(.?)$/\1 384M\2/g' /etc/php5/apache2/php.ini
perl -pi -e 's/(short_open_tag =)\s+On$/\1 Off/g' /etc/php5/apache2/php.ini
perl -pi -e 's/(expose_php =)\s+On$/\1 Off/g' /etc/php5/apache2/php.ini
perl -pi -e 's/(mysql.allow_persistent =)\s+On$/\1 Off/g' /etc/php5/apache2/php.ini
perl -pi -e 's/(memory_limit =)\s+\d+M(.?)$/\1 384M\2/g' /etc/php5/cli/php.ini
perl -pi -e 's/(short_open_tag =)\s+On$/\1 Off/g' /etc/php5/cli/php.ini
perl -pi -e 's/(expose_php =)\s+On$/\1 Off/g' /etc/php5/cli/php.ini
perl -pi -e 's/(mysql.allow_persistent =)\s+On$/\1 Off/g' /etc/php5/cli/php.ini
perl -pi -e 's/#(skip-innodb)$/\1/g' /etc/mysql/my.cnf
/etc/init.d/apache2 force-reload
mysqladmin -u root -p create drupal
mysqladmin -u root -p create drupal_checkout
crontab -e

*/5 * * * * /usr/bin/wget -O - -q -t 1 http://localhost/cron.php

Drupal PIFR installation

cd /var/www
rm index.html
cvs -z6 -d :pserver:anonymous:[email protected]:/cvs/drupal checkout -r DRUPAL-6-14 drupal
cd drupal
mv * ..
mv .htaccess ..
cd ..
rmdir drupal
cd sites/all
mkdir modules
cd modules
cvs -z6 -d:pserver:anonymous:[email protected]:/cvs/drupal-contrib checkout -r DRUPAL-6--1 -d cvs_deploy contributions/modules/cvs_deploy
cvs -z6 -d:pserver:anonymous:[email protected]:/cvs/drupal-contrib checkout -d project_issue_file_review contributions/modules/project_issue_file_review
cd ../../default
cp default.settings.php settings.php
vi settings.php

$db_url = array(); $db_url['default'] = 'mysqli://username:[email protected]/drupal'; $db_url['pifr_checkout'] = 'mysqli://username:[email protected]/drupal_checkout';

mkdir files
chmod 777 files
cd ../..
ln -s ./sites/default/files/checkout .

The symbolic link will be broken because PIFR should create the checkout directory on its own during the testing process.

Using a RAM disk

Backup then either replace /etc/init.d/mysql with the attached version or use the patch to run the MySQL databases and checkout directory from RAM in tmpfs. Make sure the result init.d mysql script is still chmod 755. As of November 13, 2009, it takes about 71MB of space in /var/lib/mysql to run a basic test of Drupal 7 core, so keep that in mind if you change the tmpfs allocations provided in the setup patches.

Then execute the following so you can keep your Drupal configuration as long as you do clean starts and stops of MySQL.

mkdir /var/lib/.mysql
chown -R mysql:mysql /var/lib/.mysql
mkdir /var/www/sites/default/.files
touch /var/www/sites/default/.files/remove_me_later.txt
chown -R www-data:www-data /var/www/sites/default/.files
/etc/init.d/mysql stop
cd /var/lib/.mysql
rm ib*
cd /var/lib/mysql
rm -r *
cd /var/lib
/etc/init.d/mysql start
rm /var/www/sites/default/.files/remove_me_later.txt

Wrap-up

Reboot.

Interface configuration

  1. Get an account on the master server or have someone add your client test server and provide you an API key.
  2. If you create the account yourself on the master server, in your master server account, at user/#/pifr, add a client of type Test on the master and copy the key to the client at admin/pifr/configuration.
  3. On the client, enable CVS Deploy, PIFR, and PIFR Client modules.
  4. At admin/pifr/configuration on the client, add the API key and master server URL. The other client defaults are OK. For maximum performance, set concurrency to at least the number of CPU cores available for testing on the server. If unsure, check the output of htop, which was installed as part of the recommended deb packages.
  5. Make sure all the command line tools have output at admin/pifr/client on the client.
  6. Toggle the state on the client so it is enabled at admin/pifr.
  7. On the master server at user/#/pifr or admin/pifr/server, enable the client in the operations field.

The next cron on the client should start a self test. If the self test succeeds, it will start testing patches from the project server. The client will list the number of test assertions it has completed for a test at admin/pifr. Note the client will run a complete cycle of patch testing twice before becoming enabled for project patch testing. The first it to make sure the client correctly catches an intentional breakage of the checkout. The second is to make sure a clean checkout has no failures or exceptions.

Debugging

mysqladmin -u root -p drop drupal_checkout
mysqladmin -u root -p create drupal_checkout
rm -r /var/www/sites/default/files/checkout

I occasionally got "When requesting next test, server responded: Invalid server" errors on my client when I did have the right API key, so I altered the client xmlrpc file to include some extra debugging calls to watchdog. After many long tests, I realized my server was going beyond the default 45 minute limit set on the server to timeout a runaway test. I increased it to 200 and finally passed. If your client exceeds 20 minutes per test, it is probably undesirable as a production testing server.

Make sure your php.ini files for cli and apache have the following set, otherwise the client might have fatal errors that prevent it from completing all the tests.

display_errors = On
log_errors = Off
;error_log = syslog

Try mysqlreport from hackmysql.com for diagnosing speed issues with MySQL.

cd ~
wget hackmysql.com/scripts/mysqlreport
chmod +x mysqlreport
./mysqlreport --user=root --password=password

Jun 25 2009
Jun 25

This is a bit late but I've been extremely busy the past couple of weeks. On the 20th of May 2009 ArabTechies organized a code sprint for 3 days to solve problems related to processing Arabic. I, among other software developers from Arabtechies, worked for 3 days on several projects. I mainly worked on integrating the features of the Ar-php library into Drupal 6. You can find the resulting module on this project page on drupal.org.

Other than that, the code sprint resulted in some pretty cool tools and libraries. All of them can be found on the code sprint releases page here.

Jun 25 2009
Jun 25
firebug-xdebughelper.png

If you're a developer who uses the XDebug PHP debugger, you probably already use a Firefox extension called XDebug Helper, which provides a convenient toggle switch for enabling debugging. You probably have Firebug installed too. Here is a method for setting up keyboard shortcuts to toggle them on and off (I use F1 & F2).

First, install the keyconfig Firefox extension (unfortunately it doesn't have an official page). Click Tools->Keyconfig... and you should get the following window:

keyconfig-screenshot2.png

Changing the "Open Firebug" shortcut is easy: you should see it listed with a standard key binding of F12. Click it, type your new key into the edit box at the bottom of the window, and hit "apply".

To toggle XDebug Helper, you need to click "Add a new key". Fill out the popup window as follows:

xdebug-helper-toggle.png

Click ok and it will be added to the list. Then you can set the key binding in the same way as you did for Firebug, I set mine to F2. Don't forget to close and reopen Firefox. That's it!

If you're interested in setting up your own keyboard shortcuts for extensions that may not natively support them, here is the hack I used:

  1. Download the .xpi extension file, and extract it (it's just a zip file).
  2. Look through the source code for the main.js file.
  3. Find the function you'd like to call and set up a new shortcut for it in keyconfig.
Jun 23 2009
Jun 23

TypeHost Releases Three Open Source Themes for Drupal – Drigg 5.x

Posted by Jeffrey Scott -TypeHost Web Development | Tuesday, June 23rd, 2009
, , ,

TypeHost Web Development, a Drupal Solutions Provider and open source web design company, has released three free themes for Drupal 5.x installations using the Drigg module for social bookmarking sites. Drigg is an extensive set of modules that transforms a Drupal installation into a social bookmarking site similar to Digg, Del.icio.us, Reddit, Mixx, Propeller, etc. The following themes were developed specifically to integrate Drigg with Advanced Profile Kit and are free to download and use in your Drigg-based Drupal 5.x sites.

drupalascreenshot1


Drupala Theme for Drupal 5.x Drigg Install:
The main theme for our social bookmarking / blog portal / social networking installation profile. This theme is derived from the Drigg base theme, but changes the menu structure to allow for more flexibility in working with taxonomy & views when building portal sites. The Drupala theme is two columns, optimized for APK & Drigg, and cross-browser tested in FF, IE6, IE7, Chrome, Safari, and Opera. Uses bright blue gradients to define blocks & site sections, relatively clean, quick loading & scalable. Open Source / GNU Public License.

Download: http://www.typehost.com/free-downloads
Example site: http://drupala.com
Tutorial for Custom Login: WebDevNews.net

seo-mixscreen

SEO-Mix Theme for Drupal 5.x Drigg Install:
The Drupala and SEO-Mix themes are only different in the color of the top buttons in the GUI, and the SEO-Mix theme uses an “up only” voting button, while the Drupala theme uses a +/- system. Included with the download of the Drupala theme above & part of the Drupala profile. Open Source / GNU Public License.

Example site: http://www.seo-mix.com

EchodemicLogoEchodemic Theme for Drupal 5.x Drigg Install:
Nice dark blue and white theme with wide main menu for a social bookmarking & blog portal site based on Drigg which includes a set of custom voting icons. This theme is also optimized for an APK install and cross-browser tested. Uses the same WebDevNews tutorial for styling the user log-in block. Sponsored by Echodemic. Released under the Open Source / GNU Public License.

Download: http://www.typehost.com/free-downloads

Important Note:
These themes are intended to be used with a Drigg installation following these instructions:
http://www.drigg-code.org/pages/download_and_install

Both themes also use the Rounded Corners module: http://drupal.org/project/rounded_corners

typehostcom

About TypeHost Web Development:

TypeHost Web Development is a Drupal Solutions Provider of web design, graphic art, custom theme & module programming, project management, site installation & administration, security upgrades, SEO, and other services relating to the deployment of the Drupal community web site architecture over shared, dedicated, and cloud hosting environments. We create unique websites for our clients based on their personal ideas & collective vision, business needs, database & software requirements, registered user community, and target audience. Our clients range from some of the largest companies in the world to NGOs, small businesses, galleries, photographers, and artists.

TypeHost Web Development is a web design company specializing in CMS sites that combine social networking, social bookmarking, blog, wiki, & article publication, forums, ecommerce, and other Web 2.0 features (private messaging, SEO, embedded video, image archives, WYSIWYG editing, user profiles, classifieds, etc.) all built on the Open Source development platform Drupal, contributed modules, and themes. LAMP, CSS, PHP, mySQL, DHTML/XHTML, JavaScript, AJAX, XML, RSS, Atom, RDF, & other Semantic Web microformats supported. TypeHost is now listed on oDesk, Elance, GetAFreelancer, Scriptlance, and other freelance web development sites as a service provider.

Our current work involves continued development on the Drupal 5.x platform, particularly for social networking & social bookmarking sites, using Drupal 6.x and Acquia Drupal along with Ubercart for ecommerce, blog publishing, news and information sites. We are developing new themes and installation profiles for Drupal that include database exports of a typical site category structure, taxonomy portal content, pre-programmed Panels, Views, and module configurations for deploying and designing complex sites more quickly. Coming Soon: online demos, file downloads and feedback section, hosted web design solutions, full CMS web design packages, & site customization options.

References:

The Drigg Module: http://drupal.org/project/drigg

Advanced Profile Kit: http://drupal.org/project/advanced_profile

TypeHost Web Development: http://www.typehost.com

Jun 22 2009
Jun 22

In this final article about our recent adventures with the Google Maps API we will talk about how to deal with situations where markers are too plentiful and about creating beautiful customized info windows.

Note: this article is from 2009 and may not be up-to-date.

There are two client side problems with having lots of markers on a map. (Server side issues were discussed in the last article.) One, they can be hard to distinguish from each other if they're too densely distributed, and two, the burden on part of the browser to render a large number of markers at the same time can make a map really slow. The second problem of course gets worse on a slow machine, and it can be really bad if the browser also happens to spell "IE".

Lumping markers together

Both these problems can be helped by using clusters, that is, grouped markers representing a number of individual markers. There are several implementations of this idea. Google provides its MarkerManager as a solution to this problem, but there are better and faster methods out there, all provided as readymade add-ons to the Google Maps API. There is a brilliant article comparing some of the best ones – with performance tests – written by Gabriel Svennerberg.

The Gmap module described before has built-in support for MarkerManager and Clusterer2. However, we ended up using MarkerClusterer as it proved to have great performance and also because it displays the number of grouped markers per cluster and lets you customize them in a nice way. Since we were already adding markers to the map with custom JS code (rather than using something like Gmap) we could easily incorporate this library in the process. MarkerClusterer's docs has a couple of examples of how this is done.

Customized info windows

Performance isn't everything however. There are lots of other add-ons to the Google Maps API, and some of them are just meant to make things look decent, nothing else. Extinfowindow is a class that gives you an alternative to Google's native GInfoWindow. (Info windows are the bubbles that appear when you click on a marker on a Google map.) We used Extinfowindow to be able to implement a custom design for these windows. Again, this was only possible since we were using custom JS code for the map. No map modules in Drupal that we know of let you do this at the moment.

The examples page will tell you how Extinfowindow works, and this demo shows you the amazing variaty of styles you can achieve with this library.

Conclusion

This article has discussed a couple of add-ons for the Google Maps API that make maps look and behave better. These are a great testament to how powerful and flexible this API and web service actually is. We were able to build a beautiful dynamic map, customized to our needs, with relative ease.

One could wish for better support for these add-ons in the mapping modules available for Drupal. There doesn't seem to be any support for MarkerClusterer at the moment, but there is at least an issue for having Extinfowindow included in Gmap. On the other hand, we are happy that we were able to achieve so much with existing solutions, and only a limited amount of code, in a project as unique as this one.

Jun 22 2009
Jun 22

In Drupal, can you modify the author of all nodes of type 'Story' whose title contains the word 'News:' to be user 'editor', without going through each node manually (or programmatically) ?

Before Views Bulk Operations (VBO for friends), you couldn't.

VBO builds upon existing modules and APIs to perform the useful function of mass-editing nodes, users, comments, or any other Drupal object. It reuses the incredibly powerful query builder Views to list the nodes of interest, and it reuses the Actions API to allow users to apply operations upon all selected nodes at once.

A scenario: Administering a workflow

You've built a recruitment site that defines a content type "Applicant" and a workflow "Recruitment" that takes the applicant through several stages, from "application received" to "hired" or "rejected".

Later on in the lifecycle of your site, you discover that you need to add a new stage to the workflow. All existing applications that are "waiting for feedack" should first go to "applicant contacted". But you already have hundreds of applications and you don't want to go through every single one of them!

To do so, you quickly build a new view that lists nodes of type Applicant whose current workflow state is "waiting for feedback". This is standard Views stuff. But when you declare the Style of that view to be "Bulk Operations", you are now shown a checkbox in front of each result, allowing you to select the nodes you want, and then apply the operation called "Change workflow state of post to new state" to the nodes that you selected.

Where do actions come from?

The perceptive reader will notice that without actions that do what you need, VBO is pretty much useless. That's true! Thankfully, most modules that provide new functionality, such as Workflow, Flag, Organic Groups, Nodequeue, etc., also package their functionality as actions. VBO merely lists existing actions to let you apply them on selected nodes. You can also write your own actions that will automatically be listed by VBO by virtue of being found by Drupal.

Advanced features

  • VBO works with any object type supported by Views: nodes, users, comments, etc. Since Views allows for custom types to be defined, VBO also does the same.
  • VBO provides security features to prevent unauthorized users from modifying nodes they're not allowed to. Admins can set permissions on individual actions to limit the set of actions that can be seen by different user groups. VBO also respects node access permissions by limiting the view results to nodes that can actually be modified.
  • VBO can work with Batch API to provide visual feedback and avoid timeouts on large selections. It also works with the Job queue module to perform the operations during cron runs.

I want to start using it!

Jun 22 2009
Jun 22

22nd Jun
2009

Role Weights finally gets a bit of loving in the form of a 5.x-1.4 release with a couple of new features, namely Token support for a user's lightest and heaviest roles and the optional re-ordering of /admin/user/roles and /admin/user/access forms by role weight. These features were introduced in 5.x-1.3, however 5.x-1.4 also fixes a bug which left orphaned entries in the role_weights table after roles got deleted.

I've also branched for 6.x compatibility (at last) - snapshots from 6.x-1.x-dev should be functional and in line feature-wise with 5.x-1.4, bar Views 2 support. I'd love to improve Role Weights for 6.x: re-writing support for Views 2 and adding drag and drop re-ordering of roles being two areas that need some attention, but I'm just too darn short on time at the moment. As always, patches and reviews are welcome in the issue queue!

As a side note, I found this reference pretty useful regarding some function/API changes not mentioned elsewhere.

Pages

About Drupal Sun

Drupal Sun is an Evolving Web project. It allows you to:

  • Do full-text search on all the articles in Drupal Planet (thanks to Apache Solr)
  • Facet based on tags, author, or feed
  • Flip through articles quickly (with j/k or arrow keys) to find what you're interested in
  • View the entire article text inline, or in the context of the site where it was created

See the blog post at Evolving Web

Evolving Web