When there is a need for Drupal 7-based website, there is a need for the right set of Drupal modules. Carefully selected combination of modules may not only be required to build intended functionality, but also to decrease website complexity and improve its performance.
Lets think about it. When HTTP request arrives to your website Drupal goes through the full cycle of initialization. One part of it is to load all enabled modules into memory. Even if you don't need all of them for the requested page. In addition to that extra resources like CSS and JS files are also an overhead.
Performance is not an only problem up here. As I mentioned above, complexity will increase. This means maintenance of the website will become more difficult and more time consuming. You need to update all those modules, backup/restore bigger database and more files, translate if website is multilingual, ensure there is not conflicts between modules, etc.
I believe reasons to make right modules selection should be obvious now. Lets start.
This amazing module allows you to select what content to display and how. You can render data in a table, as a list, expose it as a block, with pager or without, expose filtering and sorting to users and so on. And Views allows to do that with the most content of your site. For example, Views can grab 15 latest articles created by a specific person, display them as a table and allow users to sort and filter this list. If you wish to see a real example you can have a look at the home page of our website. Recent blog posts, services and projects are done with Views. Each view selects 3/4 latest entities (blog posts, services, projects and everything else are entities) and displays as a list.
Views output can easily be styled with CSS thanks to configurable additional markup Views add automatically to resulting HTML.
Views module is also widely used by another modules. For example, Drupal Commerce (eCommerce module) uses Views to display Order and Product lists in admin interface.
You probably know that human-readable URLs are good for SEO. They are actually good for humans too :). So, instead of having URLs like: example.com/node/948 it's always better to have: example.com/article-title. And to avoid creating such URLs manually use Pathauto that will do this automatically. Just configure URLs creation patterns separately for different content types, taxonomies, etc.
Sometimes I recall those days of plain JS and, you know, I'm happy they passed. I use jQuery on all of my projects. It makes life much much easier. And to have jQuery included to your website without a headache jQuery Update module can be used. In order to use this module you just need to configure version you'd like to use, choose between CDN and local distributions and couple more things.
This is a purely administration module. It organizes modules list in an easy-to-use way. It will save you hours of scrolling up and down when configuring your Drupal website.
This module is a WYSIWYG (What You See Is What You Get) editor. It allows you to see how your content looks like when rendered as HTML. Basically, it allows you to format regular text with HTML markup without knowing anything about HTML and see these changes in real-time. For example, there is an HTML tag <b>. When text prefixed with <b>, suffixed with </b> and rendered as HTML it becomes bold. What if you don't know HTML and don't know this tag? You open text with WYSIWYG editor, select text you want to make bold and click a button in editor's interface. Editor will add <b> tag without bothering you. Cool, isn't it?
For those who are concerned about SEO this module is essential. It allows to configure patterns for automatic metadata generation. Basically you set title, description, keywords and similar metadata separately for content (per content type or even per node), front page, taxonomies and others.
If you have anything that allows user input on your website, you definitely need SPAM protection. Earlier the preferred SPAM protection method was CAPTCHA, but experience showed that it's not the best. Basically because simple CAPTCHAs are easily bypassed by bots and complex CAPTCHAs are difficult for humans. Alternative proven methods are based on timestamps and hidden fields.
First method is about setting a minimum time required for the form to be filled by user. For example, you have 10 fields in your form including email, comments and several select boxes. It is impossible for a human to fill all these fields in 3-5 seconds. This much time might be required just to find the first field and read its title, right? SPAM bots do not take so long, they will fill up the whole form within a second or two. So, by blocking forms submitted too fast we can fight bots that usually do not wait long as this significantly decrease their efficiency.
Second method is based on adding input fields and hiding them with CSS. Humans won't see hidden fields and will ignore them. Bots on other hand, will fill up these fields as they usually do not parse CSS (this dramatically increases amount of traffic and time). So, by checking values of hidden fields we can determine if it was filled by human or a SPAM bot.
Honeypot is good in both above methods, but always remember that SPAM protection method should be tested on a particular environment and may vary from application to application.
This module allows to create workflows of many different types. To create a workflow you should go through the following steps:
- Select event(s) workflow gets activated on (content is created, user logs in, comment is added, CRON job is executed, etc.)
- (optional) Define conditions workflow has to pass before executing (specific entity exists, entity field value is equal to something, user that requests operation is assigned to role, etc.)
- Set actions that workflow performs (send email, publish content, create entity, etc.)
When created you can also define an order workflows are executed in.
This module allows to insert small portions of text into Drupal nodes (articles, basic pages, blog posts, etc.) and entities of other modules through API (menus, views, etc.). Text that can be inserted is either a user defined string or a field value from other modules (i.e. article title, website name, commerce product price, menu path, etc.). Text insertions are made by adding placeholders that will be dynamically replaced with the real text by Token module. These placeholders look like this: [site:current-user], [node:title], [term:name], [user:name], etc.