Upgrade Your Drupal Skills

We trained 1,000+ Drupal Developers over the last decade.

See Advanced Courses NAH, I know Enough

The Finest of Drupal 8 Modules Popular for Website Development in 2020

Feb 28 2020
Feb 28
Dec 07 2019
Dec 07

There have been a lot of people that are very much interested in the “DevOps” concept and when I sat down with some of these, the direction of the conversation went down to many interesting paths. 

They started talking about deployment best practices, rollbacks, hot deployment etc. 

Two blue screws placed vertically where the middle text has dev in one and ops in other

But, when there were some mentions about “Blue-Green Deployment” - complete silence. 

Therefore, this gave me an idea to tell the rest of the world that with all the microservices, native cloud and what not technology, blue-green deployment is not a silver bullet, but it is an element to usefulness.


Well, you got to read ahead. 

What do we understand by blue-green deployment?

A blue-green deployment is a management approach for releasing software code. 

Two identical hardware environments are configured in the exact same way in Blue-green deployments, which is also known as A/B deployments 

Only one of the environments is live at a single time, where the live environment serves all the production traffic. For example, if blue is currently live then green would be idle and vice-versa.

Blue-green deployments are usually utilized for consumer-facing applications and the applications which have critical uptime requirements. The new code is delivered to the inactive environment, where it is completely tested. 

How it reduces the risk?

Achieving automation and continuous delivery at any level of production is a holy grail, and avoiding downtimes and risks are high up on the list of priorities. Blue-green deployment provides you with simple ways of achieving these goals by eliminating risks that are witnessed in the deployment. 

  • You will never encounter surprise errors

When you fill a particular form online, what all credentials do you fill? Your name, phone number, address, street and probably your bank details if you are making an online purchase. Right?

You press the “pay now” button and check on the “receive spam emails” but unfortunately, your order wasn’t able to get processed as you desired. If you are lucky enough you get an error message equivalent to “application is offline for maintenance” all your efforts and time goes in vain. But with blue-green deployment, you never have to worry about this maintenance screen. 

There is a list of item’s upon one click and upon next click, you are eligible to see the new menu that you add. This would keep furious emails about error screen from flooding your inbox. 

  • Testing the production environment 

Ensuring that your pre-production environment is as close to your production environment as possible is not only important but essential too. With the help of blue-green deployment, this task is easily achievable. The user can test any application while it is disconnected from the main traffic. The team has the eligibility to even load the test if they desire too. 

  • Makes sure that the traffic is seamless 

Customer needs and desires are more global than ever and there is no longer an essential good time to do deployment, especially if you work in an enterprise where the business needs to be running around the clock. If you have a customer facing application then there are chances that they might switch their platform to some other website, if they don’t find what they desire. This means a decrease in sale and business. 

Blue-green deployment assures that your traffic never stops. That customer can place their order just fine without disruption. Which means that the employees overseas continue to do their job without any interruption, saving companies money. 

  • Easy Recovery 

You might witness times where you would get introduced to bugs and viruses. We can either spend a lot of money on its fix or we can inevitably find them and recover them. With the help of blue-green deployment, we have our older and more stable version of our applications to come back online at a moment’s notice by evading the pain to roll back a deployment.

Image of an object that is connected to a yellow object that says router which is connected to a chart that is divided into three halves.Source: Martin Fowler

How does this process work?

As we know that blue-green deployment technique involves running two identical production environments where they are configured in the same way, therefore, let us assume that the current deployment is in the green environment in 2.3 release. The next deployment which would take place would be in a blue environment that would be in 2.4 release.  

The environment would then be tested and evaluated until it is confirmed to be stable and responding. Once it is in production the server would be redirected, thus becoming the new production environment that the users are routed to.

The entire design is used to provide fast rollbacks in a case a deployment fails or does not pass a QA. When deployment fails or critical bugs are identified, a rollback to the green environment will be initiated. Once the bugs are fixed the version is re-deployed to the blue environment and the traffic is rerouted back the moment it is stable. 

While deploying the preceding version i.e version 2.5, the deployment would switch to the green environment and would be extensively be tested and evaluated. Traffic would be rerouted to the green zone once it passes the quality assessment.

This way both green and blue environment are regularly cycled between live versions and staging to the next version. 

Image of five blue-green boxes that are placed horizontally which are pointing to the blue-green boxes on the other sidesSource: Medium 

Blue-Green Deployment helping your Drupal websites

Let us imagine that you constructed a website with the help of Drupal, now you are getting high traffic in it. Normally for developing, updating and testing a website (without risking the live integrity), you follow these steps:

Development: The development process starts with developers working on new features, bug fixes, theming and configuration in the local environment. It makes it possible to easily roll back to the previous stage of development.
Testing: Typically this environment is not available for client viewing and it is intended for testing developmental work against a lateral host. 

Staging: This stage is used for presenting the changes to the client for approval. QA (quality assurance) and UAT (user acceptance testing) are most often carried out on the staging stage. 

Production: This is the live site on the web available visitors. It contains new features that have been proven safe to go live. 

As you can see that this process can be long and time-consuming, maintaining and constructing site can be irritating therefore blue-green deployment rescues you at times like these. 

It would provide near to zero downtime and would present easy rollbacks capabilities. The fundamental idea behind blue/green deployment is to shift traffic between two identical environments that running differently in different applications. 

 Image of a blue and green square in two different images. The first one shows request in the blue box and the second pictures show the sameSource: NewGenapps

Some of the implementations for Your Drupal Website 

Blue-Green Deployment for Drupal websites with Docker 

Drupal Deployments are hard. The user has to make sure that that the code is deployed, composer dependencies are pulled, schema updates are pulled, scheme updates are performed and all the caches are cleared. 

All with keeping the website up and responsive to the users. But if anything goes wrong and you wish to rollback? Do you stop the deployment? Well, no blue-green deployment is the answer to it. 

Docker makes it easy to build, shift and run applications. On the EC2 instance, there are always two raised docker containers of “blue” and “green”, and ngnix works as a reverse proxy on the same instance. The user can build a Drupal site that is running parallelly in the “blue” and “green” environment and serve both from MySQL database. we install Apache, PHP, and Drupal in baseimage-docker.

 Image of a square box that says nginxconnected to blue-green boxes. These boxes are connected to MySQL boxSource: Nulab

Drupal with Blue-Green Deployment in AWS Beanstalk 

Within the help of ECS, the user can create task definitions, which are very similar to a docker-compose.yml file. 

A task definition is a collection of the container, each of which has a name, the Docker image runs, and have the option to override the image’s entry point and command. The container definition is also where the user can define environment variables, port mappings, volumes to mount, memory and CPU allocation, and whether or not the specific container should be considered essential, which is how ECS knows whether the task is healthy or needs to be restarted.

The Amazon web service solution allows the user to quickly and easily manage the deployment and scalability of web platforms. The deployment helps in configuring a high-availability environment that seamlessly runs a Drupal website. Running a DB instance that is external to Elastic beanstalk decouples the database from the lifecycle of the environment, and lets the user connect to the same database from multiple environments, swap out one database from another and perform a blue-green deployment without affecting the database.

The below image shows how green-blue deployment work in AWS environment. 

An image divided into two halves where both have a cloud at the top connected to a security group which in turn is connected to the EC2 security group. Source: CloudNative

Some of the best practices for smooth release 

Now that we understand how blue-green deployment works, let’s cover some of the best practices that are related to it:

Load Balancing

Load balancing helps you to automatically set a new server without depending on any other mechanism, without depending on the DNS mechanism. The DNS record will always point to the Load Balancer and the user would only modify the servers behind it. This way they can be absolutely sure that all traffic comes to the new production environment instead of the old one.

Rolling Update

To avoid downtime the user can execute rolling update which means instead of switching from all blue server to all green server in a single cut-off you are eligible to work with an integrated environment. This indicates that rather than switching from all blue servers to all green servers in a single cut-off, the user can control with an integrated environment

Monitoring the environment 

Monitoring the productive as well as the non-productive environment is important. Since the same environment can play both as production and as non-production, all you would need is to toggle the alerting between the two states. 


The user can script as many actions as possible in the witch process, instead of doing a manual set of actions. This brings huge benefits. The process becomes quicker, easier, safer and enables self-service.

Deployment in cloud

If your servers run in the cloud, there is an interesting variation of the Blue-Green method in which instead of going back and forth between two static environments, you can just create the next environment from scratch.

This process is also valuable for avoiding the danger of servers becoming snowflakes, which are servers that have a unique configuration set that isn’t documented anywhere.  Once these snowflakes get erased for some reason, you have no easy way to properly recreate them. Whatever may be the choice it is important to keep the newest test and release technology to ensure that the release is smooth.


Deployments are one of the most important parts of the software development lifecycle, therefore all the activities involved should thoroughly be researched and tested to ensure that they are a perfect fit for your system architecture and business. 

At OpenSense Labs, we have a pool of Drupal developers and experts that work on technologies that use these tools and services. Contact us now at [email protected], our experts would guide you with the queries and questions that are related to this topic. 

Move on to Drupal 8, Be Ready for Drupal 9!

Jun 11 2019
Jun 11
Apr 29 2019
Apr 29

Using Drupal as your default CMS undoubtedly has advantages, however it also comes with its negative sides. The price you have to pay for its customizability, is the complexity and steep learning curve. Here at Sooperthemes, we have thought of you and developed an easy-to-use solution for you: Glazed Builder. With this visual Drupal page builder, you and your team of content creators and marketeers will be able to create rich content and beautiful web pages for your business, without having to touch a line of code.

In this article, I present to you 8 ways through which a visual page builder like Glazed Builder can further create value for your business.


1. Cut in half your landing page costs and time-to-market

Having a good landing page is paramount to the success of your business. However, it takes plenty of time and money to find the right people and tools to do it. With Glazed Builder as your Drupal 8 page builder however, creating a landing page has never been easier, cheaper and faster. Content creators and marketeers will be able to to create a visually stunning landing page in a matter of minutes, without having to rely on the IT department.

2. Stress less: Reduce employee turnover in your content team with true WYSIWYG

Are your employees stressed that the webpage they are building is going to look completely different than they imagined? Well, with Glazed Builder, your content creators will experience true WYSIWYG (what you see is what you get). That means that whatever they have imagined for your webpage is going to be their final result. No more senseless stress for your content creating team.

3. Get twice as much Drupal site-building work done by your most expensive staff: Developers

Developers, they are the most expensive members of your staff. However, they do not get work done as fast as you would like. The way to increase productivity is to have developers use Glazed Builder as your default Drupal page builder to build dynamic pages and dashboards that leverage drupal's block and views systems. This way, you will make their job easier while also increasing their productivity.

4. Same-day web design and publishing by using the pre-built templates

You need to launch a webpage in a matter of hours and you don’t have the inspiration necessary to design a layout? Fret not, Glazed Builder, the Drupal page builder, has you covered. With a plethora of templates available, you just have to select the right template for your business, insert your content, and post it. It has never been easier.

5. Content creators will produce better, more effective content than your competitors.

Do you want to stand-out from your competition in terms of content creation? Glazed Builder can help you and your content creators unleash their creativity. With an endless amount of customizability, Glazed Builder is sure to provide the right tools and power for your content creators to achieve their wildest dreams. When it comes to customizability, with Glazed Builder, the sky's the limit.

6. Reduce onboarding time and training costs: Reduce Drupal’s steep learning curve for content creators and marketeers

Every time there is a new tool introduced to your business, you have to pay a large amount of money for training your employees. The same is applicable for Drupal, since it is a highly complex CMS, it has a steep learning curve and requires highly skilled developers to be able to make it truly shine. However, Glazed Builder was engineered to be able to be used by even the most non-tech savvy of its users. This way, your staff will be able to quickly understand how to operate the visual builder and you will be able to reduce the time and money spent on training your personnel.

7. Save thousands on cloud hosting costs with a frontend tool that runs in your browser, not in your cloud

If you're thinking that a Drupal 8 website with the additional features of Glazed Builder requires a beefy server, you're wrong! 90% of Glazed Builder's magic is happening in the browser. Even our Drupal 8 demo sites with hundreds of demo content items run perfectly fine on affordable shared hosting solutions like our favorite Drupal hosting A2Hosting.

8. Better performance attracts a bigger number of visitors on your webpage

Even if you have top-notch content on your website, it’s irrelevant when it takes a long time to load. Most site visitors don’t have patience when it comes to loading a webpage, they would simply exit and visit the next one if it takes too much time. However, Drupal is the fastest out of the bunch when it comes to speed. It takes the least amount of time to load a page, which means that the likelihood of visitors leaving significantly drops.


Conclusion on Drupal Page Builder

Now that you know all of this, what are you waiting for?

Start improving your business today by using our visual page like Glazed Builder.

What is govCMS?

Mar 27 2019
Mar 27
Jan 16 2019
Jan 16

When loading or interacting with entities in Drupal 8, we often use the EntityTypeManagerInterface interface, which is the brains behind the entity_type.manager service that is provided in many of the Drupal core base classes.

This often appears in one of the following ways:



Either approach returns an instance of EntityStorageInterface. Each entity type can define a class that extends EntityStorageBase and adds additional custom methods that are applicable to a given entity type.

The node entity type uses this pattern in \Drupal\node\NodeStorage to provide many of its commonly used methods such as revisionIds() and userRevisionIds().

The benefits of adding custom storage methods becomes more apparent when you begin to work with custom entities. For example, if you have a recipe entity type, you could have a loadAllChocolateRecipes() method that abstracts the query and conditions needed to load a subset of Recipe entities.

The resulting call would look like this:

/* @var $recipes \Drupal\recipe_module\Entity\Recipe[] */
$recipes = $this->entityTypeManager

A custom storage handler class is integrated with an entity via the annotated comments in the entity class.


 * Define the Recipe entity.
 * @ContentEntityType(
 *   id = "recipe",
 *   label = @Translation("Recipe"),
 *   handlers = {
 *     "storage" = "Drupal\recipe_module\RecipeStorage",

Then in the storage handler class, custom methods can be added and existing methods can be overridden as needed.

 * Defines the storage handler class for Recipe entities.
class RecipeStorage extends SqlContentEntityStorage {

   * Load all recipes that include chocolate.
   * @return \Drupal\example\Entity\Recipe[]
   * .  An array of recipe entities.
  public function loadAllChocolateRecipes() {
    return $this->loadByProperties([
      'field_main_ingredient' => 'chocolate',

Manual SQL queries can also be performed using the already provided database connection in $this->database. Explore the Drupal\Core\Entity\Sql\SqlContentEntityStorage class to see the many properties and methods that you can override or leverage in your own methods.

Again, the NodeStorage and TermStorage offer many great examples and will demystify how many of the “magic” methods on these entities work behind the scenes.

For example, if you ever wondered how the Term::nodeCount() method works, this is where the magic happens.


 * {@inheritdoc}
public function nodeCount($vid) {
  $query = $this->database->select('taxonomy_index', 'ti');
  $query->addExpression('COUNT(DISTINCT ti.nid)');
  $query->leftJoin($this->getBaseTable(), 'td', 'ti.tid = td.tid');
  $query->condition('td.vid', $vid);
  return $query->execute()->fetchField();

The next time you need to write a method that returns data specific to an entity type, explore the use of a storage handler. It beats stuffing query logic into a custom Symfony service where you are likely violating single responsibility principles with an overly broad class.

This potentially removes your dependency on a custom service, removing the need for extra dependency injection and circular service dependencies. It also adheres to a Drupal core design pattern, so it is a win, win, win, or something like that.

Our dearest, Drupal, turns 18!

Jan 16 2019
Jan 16

2018 - A ‘Year’ full of Smiles, Stronger Bonds & Success!

Dec 31 2018
Dec 31

2018 - A ‘Year’ full of Smiles, Stronger Bonds & Success!

Dec 31 2018
Dec 31
Dec 21 2018
Dec 21

Continuous Delivery - A trending word in the world of technology. Continuous Delivery(CD), along with Continuous Integration(CI), is becoming a popular term even with the non-technical people. And hence, every IT company is seeing a flood of clients coming with the demand of both of them. Both of these techniques - CI/CD are closely associated with the quality-oriented work methodologies - Agile and DevOps. And so are we!

Team AddWeb has been for years been associated with and following Agile and DevOps. Just as we’re associated with Drupal. No wonder, we have been ardently following continuous delivery with Drupal for years now. So let us first throw some light on this popular concept of ‘Continuous Delivery with Drupal’.

What is Continuous Delivery?

Continuous Delivery is a process of automatically deploying all your changes made on development stage, directly to the production stage. This kind of delivery is done by accepting all the unit-cases followed by coding standards. Once the code is merged with the stage branch from the development branch, the same stage branch also gets an automatic update with the help of Jenkins and git-webhook, which is triggered by merging the branches. A similar process of automatic delivery is also followed on the production site; where the code is merged with the master branch from stage branch, which is later deployed to the production servers.

Team AddWeb, as we mentioned previously, has been persistent followers of CD with Drupal via Jenkins, Ansible, and RocketChat. We believe, in today’s day and age, CD, and CI hold so much of significance because one can define repetitive tasks for one time and then on every build the same mentioned steps will run in order to update the new content. And when we speak of so much so of its importance, let us also share the tools, block diagram and process that we, at AddWeb, choose to follow for Continuous Delivery.

CD/CI Tools Used by Team AddWeb:

There are multiple tools that can we used to follow the process of Continuous Delivery. Let us share the ones that we, at AddWeb, have been using for years. You can consider this as a recommendation from us, for the amount of experience we hold in using them successfully for all these years.

  1. Git

  2. Docker

  3. Jenkins

  4. Ansible

  5. Rocket-chat

Block Diagram Used by Team AddWeb:

Just as a picture is worth a thousand words, a diagram for us - the techies, is worth a hundred written words. We at AddWeb, do understand and empathise with this fact and hence, here’s the block diagram that we personally use for Continuous Delivery.

Process Followed by Team AddWeb:

Every developer has their own process to be followed for Continuous Delivery. Here’s the one that team AddWeb choose to follow:

  1. As soon as the developer pushes code into the git repo, a webhook will be triggered. This will call Jenkins, which will further run the Ansible playbooks. These Ansible playbooks comprise of the code of delivery process, which is eventually followed by sending a push notification to the RocketChat server once the code is successfully built. One also receives this push notification in case of built failure condition.

  2. Pipeline code is written in Ansible playbook for a continuous delivery process:
    - Create a backup of code and database
    - Pull the latest code on the server by git pull
    - Run composer install for Drupal-8 sites to install new modules, libraries
    - Run drush updb -y
    - Run drush cim -y
    - Run drush cr
    - Send notification of successful build or failed build job details into Rocketchat

Hope the overall understanding and the provided guideline regarding the much-talked about and significant Continuous Delivery has proven helpful to you. In case, you have something to add on to the above information or even correct anything, feel free to contact us. Also, you can share what do you want us to share in our next blog. We’re all ears for suggestions and recommendations.

Continuous Delivery With Drupal - The Need Of The Hour!

Dec 21 2018
Dec 21
Nov 03 2018
Nov 03

Team AddWeb has worked for a distinctive list of industries counting from hospitability to technology and retailers to an online lottery purchase system based website. Yes, we recently collaborated with a Japan-based company to build their website with lottery purchase system, using Drupal 8. We’ve been Drupal-ing even before our inception and have been an active member of the Drupal community, globally. Our association and experience of Drupal were the base of the client’s immense faith in us and we knew that we’re going to stand true to that.

About the Project
The project requirement of the client was to build a website for them in Drupal 8. The website is basically an online lottery purchase system. Due to confidential reasons, we can not share the name of the company/client but would like to share that the experience of working on this project was new and enriching.


Major Features/Functionalities
We personally love experimenting and implementing innovative features to enhance the client’s website. Plus, we get a little more excited when its a Drupal 8 website. We integrated a host of futuristic features to this very website too. But since, it’s an online lottery purchase system we knew that the integration of the Payment Gateway is going to be one of an integral part. Hence, we created three types of Payment Gateway, as follows:

  • GMO Payment

  • Coins Payment

  • WebMoney Payment

The user is an integral part of this entire online lottery system and hence several functionalities are crafted around them. Like, a user can purchase coins by WebMoney Payment method and can also buy lottery from choosing any product bundle. A user also has an option to select the quantity of the product or go for the complete set. The payment for either of it can be done by the coins, GMO credit card or points.

Draw system is used for the selection of the lottery winner. Other than the lottery prize, the user also stands a chance to win the Kiriban Product as a prize. The Kiriban Product is based on the product bundle configuration, which is an additional product that a user gets as defined by an admin user.

The Problem

Any e-commerce website will definitely have multiple users buying for the same product. In this situation, the backend technicalities should be as such that it updates the quantity left of the product after the last purchase is made. Issues occur when two or more users place the order at the same time. This is an issue that is involved in concurrent shopping. In this case, the lottery opened for some specific time. Hence, the issue occurred in showcasing the updated quantity. This problem came to our notice when the site went live and around 7-8 users made the transaction at one specific time. We immediately started working on the issue.

Challenges Faced:

We quickly picked up the problem and started searching for the resolution. We have had several times, prior to this, created an e-commerce website. Hence, we used multiple methods to resolve the issues, mentioned below, but none of them worked in this particular case.

  • Initially, we tried using a Drupal lock to resolve the issue, but in vain.

  • We, later on, used the MySQL lock but this too didn’t work, due to the involvement of multiple quantities inside for loop.

  • The usage of sleep time with random sleep time also did not work, because it created the nearby value and not the exact one.

Though the method of random sleep time did not work in this case, it gave birth to the final resolution that worked. And hence, we did a minor modification to the same and divided the sleep time in a range of 3. Also, to avoid the possibility of any further clash, we adopted a table of 100.

The Final Resolution:

After trying out a handful of methods, we finally came up with a method that did work out in our favor. Let us share what steps did finally help us in addressing the problem of concurrent shopping that we faced:

  • A table consisting of 1 to 100 numbers was taken, with the sleep time by a range of 3.

  • Later, a random number was picked and a flag value for the same was set.

  • Then, a greater number from those numbers with the range of 3 was picked.

Below is the table that was created to bring out the final solution:

‘Flag’ was used to 0 by default, which will be automatically set to 1 every time the number is in use.

How it works:

  • At the beginning of the transaction, the max sleep_time will be checked where flag=1.

  • The sleep_time for the first user will be 0.

  • After this, a random number from max sleep_time is selected with a range of 3.

  • The first user’s range is 1-3.

  • In the case of the second user, one number will be skipped after the max time and will be started after that number.

  • In case a user gets the max sleep_time in 3 then the range for the random number will be 5-7.

  • If the second user gets the random number as 6 then the random number range for the third user will be 8-10.

  • The flag value will be updated as 1 for this random number.

  • In the end, the flag value of the transaction will be updated with 0.

The Final Say:

“All is well, that ends well.” And that’s exactly we have to say for this particular project. Yes, though we had coded and created many e-commerce websites before, this was the first time that we picked up a project to create a Drupal 8 website with an online lottery system. And believe us, it was a monumental success for us and satisfying project for the client.

Nov 03 2018
Nov 03

March 14, 2019

Often, during local Drupal development (or if we’re really unlucky, in production), we get the dreaded message, “Unable to send e-mail. Contact the site administrator if the problem persists.”

This can make it hard to debug anything email-related during local development.

Enter Mailhog

Mailhog is a dummy SMTP server with a browser GUI, which means you view all outgoing messages with a Gmail-type interface.

It is a major pain to install, but we can automate the entire process with the magic of Docker.

Let’s see how it works, and discuss after. Follow along by installing Docker Desktop – no other dependencies are required – and installing a Drupal 8 starterkit:

git clone https://github.com/dcycle/starterkit-drupal8site.git
cd starterkit-drupal8site

This will install the following Docker containers: a MySQL server with a starter database, a configured Drupal site, and Mailhog. You wil see something like this at the end of the output:

If all went well you can now access your site at:

=> Drupal:
=> Dummy email client:

You might be seeing different port numbers instead of 32791 and 32790, so use your own instead of the example ports.

Now, the magic

(In my example, DRUPAL_PORT is 32791 and MAILHOG_PORT is 32790. In your case it will probably be different.)

As you can see, all emails produced by Drupal are now visible on a cool GUI!

So how does it work?

A dedicated “Mailhog” docker container, using on the Mailhog Docker image is defined in our docker-compose.yml file. It exposes port 8025 for public GUI access, which is mapped to a random unused port on the host computer (in the above example, 32790). Port 1025 is the SMTP mailhog port as you can see in the Mailhog Dockerfile. We are not mapping port 1025 to a random port on the host computer because it’s only needed in the Drupal container, not the host machine.

In the same docker-compose.yml, the “drupal” container (service) defines a link to the “mail” service; this means that when you are inside the Drupal container, you can access Mailhog SMPT server “mail” at port 1025.

In the Starterkit’s Dockerfile, we download the SMTP modules, and in our configuration, we install SMTP (0, in this case, is the module’s weight, it doesn’t mean “disabled”!).

Next, configuration: because this is for local development, we are leaving SMTP off in the exported configuration; in production we don’t want SMTP to link to Mailhog. Then, in our overridden settings, we enable SMTP and set the server to “mail” and the port to 1025.

Now, you can debug sent emails in a very realistic way!

You can remove the starterkit environment by running:

docker-compose down -v

Please enable JavaScript to view the comments powered by Disqus.

Oct 29 2018
Oct 29

Cloning is a concept that runs in almost every industry that exists, for ages. And the world of website development is no different from others. Multiple tools are available to clone a website, be it a command line or GUI. Being in the business of coding for years now, we at AddWeb have cloned a number of websites/website pages to fulfill the requirement of our client.


Over a span of 6+ years of our existence in the industry as a leading IT company, we have worked with a host of international clients. Similarly, this time too a client, whose name we can not disclose due to legal & ethical reasons, came up with a requirement of cloning multiple pages for their Drupal-based website. And we, buckled-up to deliver our expertise and stand true to the client’s requirement.

The Client’s Requirement:
Simple cloning is not an extraordinary task since the modules for the same are easily available from the community. But this one required us to clone multiple pages at a time, where the original page is not affected. Also, the pages had to be cloned in such a manner that the components of the same are thoroughly included. Scrutinizing the nature of the requirement, we realized that this type of cloning required us to either custom-create a module or make alterations to the existing module available for cloning. The website was in Drupal 8 and we knew, it’s about time to show some more love for our most loved tech-stack.

The Process of Cloning:
Drupal 8 has always been our favorite sphere to work on. So, all excited and geared up with the tool of our experience over the same we searched out the available module for cloning from the community site of Drupal - Drupal.org. The name of this module is ‘Entity Clone Module’. 

The Emergence of Challenge:
But as they say, “Calm waters does not make a good sailor”. The water was not calm for us either. Because as we said the cloning module that we found from the community came with a limitation, which was that only one page can be cloned at a time. So, now was the time to bring our expert knowledge of Drupal to use and create a custom module that fulfills the requirement of the client.

Overcoming the Challenge:
We have had made a couple of modules in Drupal earlier and hence, we knew we would be able to create a fine custom module for cloning. And we did it! Yes, we created a custom module which came with multiple page templates, group-wise. One just needs to select the required page-template, submit the form to clone it and it’s done. Every single selected page gets cloned along with the components. This process turned out to be immensely useful for the editor. Because it saved both the admin’s time as well as energy to clone the pages. This process was otherwise quite tedious and time-taking since the admin had to clone one page at a time; whereas here just one single click and multiple pages are cloned together. And we’ll definitely share the credit of creating this custom module for cloning with the ‘Entity Clone Module’; since we used their script and made some alterations and addition to it in order to make the multiple-page cloning feature possible.

The Final Word:
We, at AddWeb Solution Pvt. Ltd., believe the ultimate achievement of any work that we do lies in the satisfaction that the client feels on delivering the final product. And we don’t whether we’re just lucky or too good with our work that like others, this client too responded to us with the appreciation - not just for the quality of the work that we deliver but also for the ‘Artful Agile’ process that we choose to follow for our work!

Oct 15 2018
Oct 15

A Drupal event is one such destination that I long to visit, each year. Plus, this one happening in Germany was a special one. Yes, you got it right, I’m talking about the Drupal Europe that took place last month at the Darmstadt, Germany. And to answer what apparently made this one a special Drupal event for me is that it was a community-driven event, the scale of which matches with that of a DrupalCon. Such enthusiasm and such efforts! Applauds and appreciation to the entire Drupal community of Europe and worldwide for having shown such a withstanding support for Drupal and making #DrupalEU such a massively successful event.


We Volunteer! 
Yes, did volunteer and contribute in order to do our share in supporting this massive and enthusiastic community-driven event called the Drupal Europe 2018. Isn’t that what is expected out of a hardcore Drupaler like us, who’s been a working aggressively for the community ever since 2012. We’re involved with the website part of the event and came up with a few bug fixes too. We intended to contribute on a way larger scale, but alas the time constraint and the work commitment. While not trying to redeem ourselves, but isn’t working on a Drupal project for a client is too a form of contribution done for the community?! Did just heard a yes from you!

Drupal Email

The Enthusiastic Event & Visually-Stunning Venue! 
Drupal Europe is said to be the biggest European Drupal event, by far. The event was organized at the Darmstadtium - a beautiful structure of modern architecture with a mark of history living in it. Yes, amidst the exceptionally designed modern Darmstadtium stands an old wall from history. 

Drupal Europe, 2018

The five-day event at this exceptional structure had almost 1000 Drupalers from across the world. The event was divided into three major areas; one, where the booths were set up by different Drupal sponsors, two, where the sessions were being conducted by the Drupal experts, and third, where the Bird Of Feather(BOF) sessions were organized.


Entire CMS Community Under One Roof! 
Drupal Europe spoke for and promoted Drupal extensively and dedicatedly. But that does also not mean shunning away from the entire open source community. Hence, a concept of ‘Open Web Lounge’ was also implemented at  Drupal Europe, like other open source community events. Here people from the entire open source community come under one roof to brainstorm and discuss relevant topics of the community. It’s an informal gathering where a bunch of like-minded people tries and contribute to the community with their solutions & suggestions. This is one of the healthiest things happening across all the community-based events.


Sessions, Booths & BOFs
A Drupal event is always about a host of things to do and programs to attend. So much so that one always misses out on several such things. So did I! But thankfully I also got to attend a series of sessions, which I completed cherished. Like the one on the ‘Autosave and concurrent editing in Drupal 8’ by Hristo Chonov,  ‘Drupal Diversity & Inclusion’ by Tara King & Elli Ludwigson, ‘The Way We Work’ by Kevin Bridges and Elli Ludwigson, and many more! Apart from this I also attended a couple of BOFs and walked through different stalls and connected with different people from the Drupal community.

Drupal Europe, 2018

A Perfectly Creative Prenote!
Yes, this time I’ll prefer sharing details about the prenote prior to that of the Driesnote. The prenote topped the list of fun events at Drupal Europe, 2018. Jeffrey A. McGuire, along with Campbell Vertesi, Adam Juran and others came up with the most creative and innovative Prenote ever. And the part that stole my heart was the recreation of ‘Imagine’ with a touch of Drupal in it. Just Phenomenal!

Drupal Europe, 2018

The Driesnote
One of the most awaited parts of any Drupal event has to be the #Driesnote, by the founder of Drupal - Dries Buytaert. He started with a goal to build a Drupal that people love, and shared the roadmap he has structured to reach this goal. He went ahead sharing the updates regarding the initiatives taken so far with the community members present at Drupal Europe. He also spoke about the marriage of React UI and Drupal, in order to improve the overall administration experience of the site. Like always, Driesnote was an insightful session to attend. Here’s the link to the entire Driesnote, for those who missed out on it.


The #DrupalCEO Dinner!
Last but certainly not the least! It was a night to remember with the senior level executives of the companies actively working for the Drupal community and the founder of Drupal himself - Dries Buytaert. And we feel privileged to be a part of this exclusive and prestigious dinner night. It’s a new initiative, initially started by a handful of CEOs of Drupal companies, which later got widely popular. Though an informal event, the DrupalCEO dinner is an event that brings out the best of suggestions and surveys from the leading Drupal-ers around the world.

The #DrupalCEO Dinner, Drupal Europe, 2018

This one was my first Drupal community-driven event and believe me, it was a phenomenal experience in itself. The enthusiasm and efforts of the community were soaring aloud of the strength of the Drupal community at large, which apparently translated into such a progressive vibe at the event!

Sep 06 2018
Sep 06

Drupal, the most favoured open source platform, took a huge leap with the launch of its latest version - Drupal 8. Today, it is not a mere open source platform; rather an enterprise level web content management that is pledged to provide an ambitious digital experience. Despite of being the best on the technical front, Drupal 8 is facing issues in terms of visibility on a larger level. Today, the digital world is not just reigned by the technical people. A whole lot of non-technical and new decision makers has arrived, which affects and influences the market. This is where Drupal 8 was lagging behind and was missed from the eyes of these key influencers. And hence, arose the need of promoting it globally. Hence, ‘Promote Drupal Initiative’ came into the picture.

DrupalCon, Nashville, 2018 was when the founder of Drupal talked about the ‘Promote Drupal Initiative’ extensively. Highly suggested by the technical experts, Drupal 8 now needed to touch the base of non-technical influencers of the market and influence them. A hell lot of marketing, promotion, and upgradations was needed to be done in order to penetrate the radar of non-technical influencers of today. And Dries shared his plan to promote Drupal, divided into 4 different phases:

  1. Strategy and Planning

  2. Drupal.org Improvements

  3. Public Relations

  4. Events & Advertising

Drupal 8 has seen an impressive rise of 51% increase in its adaption over past 1 year. The technical experts were aware of the strength of Drupal 8, but the absence of the 3rd ‘P’ of marketing i.e. ‘Promotion’ made the non-technical decision makers unaware of what Drupal 8 is capable of doing. Dries in his keynote at the DrupalCon, Nashville mentioned that ‘Drupal Promote Initiative’ aimed at gathering the support of $100,000. The enthusiastic supporters of Drupal had already contributed, as a result of which the initiative had already yielded $54,000. Addweb too has contributed to this growth-oriented initiative with a very humble contribution, alongside other eminent contributors from across the globe.

This voluntary-based initiative has gained a huge momentum so far, which is enough to prove the robustness and competence level of Drupal 8. As a member of the most ambitious digital experience that Drupal 8 is, each member of the community is inclined towards fostering the ‘Promote Drupal Initiative’ and Drupal at large. Destined to meet the goal, the ‘Promote Drupal Initiative’ is going to elevate the market of Drupal 8 and eventually raising the bar of open source community a notch higher!

Aug 31 2018
Aug 31

‘Think of the technologically best content-management framework, think of Drupal!’

The statement stands true and its adaptation by the big-shots of every industry possible acts as a strong confirmation for it. Drupal has anyway been the most favored platform by experts of the community. And the release of Drupal 8 has just been accelerated this demand. The rich and robust open-source community of Drupal has always been a reason to choose Drupal over any other framework. But now with the length of futuristic and competent upgradations that Drupal 8 has come with, the popularity has taken an unbelievable rise and extended reach. In fact, now, even the non-technical decision makers around the world have been citing the strength of Drupal 8.

At AddWeb, we have been Drupal-ing every day - ever since our inception. So from the experience that we’ve gathered in all these years, let us give you some epoch-making reasons to upgrade your site to Drupal 8. Have a look at them!

1) Multilingual Feature

The admin panel of Drupal 8 offers extensive multilingual features, along with multiple built-in features for translation. It enables you to have a page-wise filtration for choosing different languages. The Drupal community is wealthy enough to provide you with automatic translation updates. Businesses/website having a multilingual audience is no more a hassle with Drupal 8.

2) Magic done with HTML 5

Simplifying HTML5 coding is the next best thing done by Drupal 8. This brings in more clarity and direct access to different input fields like date, phone, email, et al. Even the compatibility and functionality with the other related devices like smartphones and tablets is increased. The theme based templates for writing HTML5 coding is like a cherry on the cake since it helps the budding web designers in doing their job.

3) Template Engine - ‘Twig’

Twig is a PHP based theme template engine that now comes as an inbuilt with Drupal 8. This brings in a lot of benefits since Twig is much more flexible, secure and fast-paced as compared to its other counterparts. And despite Twig templates being high on security, it is also the simplest since it is written in syntax.

4) Built-in Web Services

Drupal 8 has a robust open source community at its back and now it also comes with output content in several formats viz. JSON, XML, et al. The RESTful web API is a service that helps in exposing entities and other resources. The modified version of Drupal also lets you use the Hypertext Application Language.

5) Mobile Friendly

Designed in a mobile-first approach, Drupal 8 is a thoroughly mobile-friendly platform. Drupal 8 themes are designed in such a manner that it can easily be adapted by devices of different sizes. It also comes with a ‘Back to Website’ Button so that one can also have the experience of a website’s desktop view on their mobile device itself.

6) New Configuration Management

Drupal 8 also comes with a built-in configuration system that smoothens the task of carrying different elements like the type of content, fields, and views, etc. Every single change is minutely recorded by this very version of Drupal, which immensely helps in bettering the control and responsibility sharing.

7) Authoring with Ease

Powerful authoring tools are introduced to support and enhance Drupal 8. The content editor tools are WYSIWYG Editor and CKEditor, along with some draft creation tools. Elevation with the place editing, that comes with the core module, is done impressively. A simple editing window and you can now do your content editing in the simplest of manner.

8) Built-in Fields  

The recent most and trending field types like entity reference, email, telephone, link, et al, comes included in the core of the Drupal 8. Hence, no further formatting and coding is required for all these new fields.

9) Easy Download

In Drupal 8, almost every entity of the website is cached and required Javascript gets downloaded. The cache memory is stored, when the page is visited for the first time; so that the next that page is visited the process of download need not be repeated and the page can be viewed quickly. All this to make the entire process smooth and easy going.

10) Accessibility Integration

A range of accessibility and support techniques gets a magnificent scope to elevate, which includes WAI-ARIA, Aria Live Announcements, TabManager, et al. All these techniques also enhance the internet supporting applications. Accessibility is one such facet of Drupal 8, which remains untouched and is unparalleled to any of its counterparts.

Today, Drupal 8 is much more than a mere content management system; especially after the plethora of features that this version of Drupal comes with. We’ve shared only a handful of such features that needed your immediate attention. And of course, the official site of Drupal 8, will help you gain specific details about the richness of Drupal 8. But one more thing that you need to know now, is that Drupal 8 is a full-fledged enterprise cloud-based web CMS. Plus, the scope and ease to connect with the 3rd party frameworks like Javascript, boosts the

Are you also planning to upgrade to Drupal 8 and looking for the best of team to do it for you? Well then, hire AddWeb’s expert team of Drupal 8 developers, because only a true Drupal-er can bring justice to your expectations!

Aug 17 2018
Aug 17

‘Coexistence is the key to our survival’, they say about humanity. The same law applies to and therefore is adapted by the technological world too. ‘Decoupled Drupal’ is the outcome of the same law, coming from the field of web architecture. After years of following the traditional web architecture, Drupal came up with something that was not ‘monolithic’ - something that we call as ‘Decoupled Drupal’ today. Let us explore and decode in detail the web architecture that ‘Decoupled Drupal’ is!

Understanding, Decoupled Drupal

Understanding, Decoupled Drupal

Freeing the front-end from the control of the content management system and focusing on the just back-end development. The presentation layer, themes, templates - everything front-end is taken care by the adopted front-end framework. This also implies that Drupal has chosen to do what it does the best - building and bettering the content part. The decoupled Drupal exposes the content to other systems such as native applications, JavaScript application, core REST API, IoT devices, et al, which clearly states the fact that every system can easily consume content from Drupal.

Decoupled Drupal, also known as Headless Drupal, in simpler words is about not letting go the core and robustness of Drupal by having the control over all the core content management related responsibilities. And yet opening up the door for the productive change on the part of content appearance. Decouple Drupal is a promise of omnichannel delivery for the marketers and publishers.

Pick your approach!

Approach Decouple Drupal

1) Coupled Drupal

This is the most appropriate approach to be adopted for a site that does not demand much rendering and state management from the client’s end. Drupal’s built-in twig templating system is used instead of the huge and heavy JavaScript framework. The help of JQuery can also be taken if needed. Since this approach doesn’t block content marketers by the front-end developers, extra marketing expense could be cut down.

2) Progressively Decoupled Drupal

A website that requires client-side interaction, Progressively Decoupled Drupal is being used. Under this approach the core strength of Drupal - its HTML generation is not eliminated and yet the benefits of the Javascript framework is adapted. The best of both the frameworks raises the quality of interactive experience plus a robust back-end. Usage of JavaScript enables the content marketers to freely gather the experience and benefit from it, without much of the developer’s support.

3) Fully Decoupled Drupal

The entire structure here is separated in terms of the content and the presentation, where the former one is taken care by Drupal and the later one is prominently undertaken by JavaScript frameworks. With both the advantages and disadvantages attached to this approach, it is not a highly recommended one. Independence on the underlying CMS and usage of the richness of JavaScript and its community, is one of the major advantages of the fully decoupled Drupal, while the addition of complexity to the technology stack is one of the major disadvantages.

Why should you be adapting Decoupled Drupal?

Adapting Decoupled Drupal

The popularity of the Decoupled Drupal is a reason enough to confirm how beneficial it has proven to be, so far. Let us share some prominent reasons why adopting the decoupled Drupal will prove to be advantageous for you:

1) Intact Security

Security - the key benefit of using Drupal is kept intact since the content management and back-end is taken care of by Drupal itself. The administrative CMS is kept far from the public eye is also something that helps in keeping the security level high.

2) Elevated Team Performance

Drupal CMS development requires more technical expertise as compared to that of some other front-end framework. So, when an expert of Drupal has more time and scope to focus on the segment that he has an expertise upon, the outcome would naturally be of that stature. In addition, the front-end developer will also have the freedom to work on his expertise and hence would be able to give better justice to your website with an overall elevation in the team’s performance.

3) Broader Approach

Drupal has always been broad with its approach, be it any website or organisation. In addition, Drupal now also has the publishing functionality that streamlines the experience for content creation. Under this architecture, it’s easier to push and manage the content to other places. This widens the possibility of the same content being spread and published on multiple channels.

4) Flexibility

Decoupled Drupal enables and accelerates the scope flexibility, whenever the website is in need of some change or upgradation. The independence to work and focus upon one single aspect, the developers and designers are granted the flexibility to dedicate their time to their respective jobs. The elimination of dependency of the back-end developers/tools from the front-end developers/system is what lifts up the scope of flexibility.

Already thinking of adapting the highly-trending and powerful architecture - Decoupled Drupal? Well, our Drupal-expert team might help you get a detailed and better understanding of the same. A customized viewpoint of Decoupled Drupal for your website surely makes a huge difference. Let our Drupal developers make that difference for you!

I hope this blog helps you to expand your Decoupled Drupal knowledge …Thanks! If you need more assistance regarding Drupal Development Services, feel free to contact us now.

Aug 09 2018
Aug 09

What is ReactJS?

Created to enhance speed, simplicity, and scalability, ReactJS has been doing wonders ever since its initial release in 2013. It was basically created by Jordan Walke, a software engineer at Facebook. And its first deployment on Facebook’s newsfeed turned out to be so successful that it was later on adopted by Instagram too. Amongst all the open-source platforms used today for front-end web-application development, ReactJS is the library which is reaching heights these days. And there are multiple reasons for such a booming popularity in such a short period of time. Each adding to the enhancement of current front-end UI scenario. No wonder it looks like, ReactJS is here to stay!

What is Drupal?

Drupal is the big name from the open-source community for web content management. Prominent names from journalism leaders like ‘The Economist’ to ‘The Royal Family’ of Britain. The security and scalability of Drupal are so high that it has made it the most trusted platform for web development.

Even after being a not-too-easy-to-use platform that requires technical expertise for building and maintaining it; Drupal has been chosen by the top-notch players from various industries like Harvard University, Tesla Motors, ABS-CBN News, Warner Bros. Records, et al. In addition, the Decoupled Drupal is the concept where Drupal can be used for building a strong back-end and opening up the doors for upscaling the front-end scenario even more by letting it being build with some other framework. And this is one of the best things ever happened to Drupal.

The Marriage of ReactJS & Drupal:

Now, ReactJS is gaining immense popularity and the marriage of ReactJS and Drupal has become the talk of the town. In fact Dries Buytaert, the founder of Drupal, has also shared he's planning on Drupal adopting React. Though the news has received mixed opinions from the experts of the open-source community, it’s definitely something to be given an ear to.

ReactJS and Drupal are supposedly called the marriage made in heaven. ReactJS is one of the most evolved front-end frameworks from the house of JavaScript. But like every other JavaScript framework, this one too needs and a service-based back-end for storing the data and working on the business logic. Drupal being the strongest platform with built-in RESTful services; it serves as an apt companion for this amazing front-end framework that ReactJS is.

The uprising need for using a modern framework with a robust back-end platform is also a reason behind the buzz created around the combination of ReactJS and Drupal. In fact, Dries has quoted in his blog that JavaScript wasn’t his first choice. Rather he considered Angular and Ember over JavaScript. But citing the ever-evolving market of JavaScript, he realized that the combination of Drupal and ReactJS was what the modern web needed the most.

The community behind ReactJS is also one of the major reasons for taking it into high consideration over other good frameworks. Also, whether it is about ornamenting the current page and few of its elements or it’s about creating a full-fledged single page app (SPA), this very combination is the sure-shot success. Lullabot shares some insightful information about the same, click here to know more.

Some hardcore Drupal Monolithic-ians have also publically discarded the official union of ReactJS and Drupal. But since the world is ever changing and the possibilities, endless; the acceptance of the same can be foreseen. Of course, it is a matter of conflict and controversy. But then, only time can tell how things turn and what reigns the open-source community!

I hope this blog helps you to expand your ReactJS and Drupal knowledge …Thanks! If you need more assistance regarding Drupal Development Services, feel free to contact us now.

Jun 25 2018
Jun 25

Drupal meetups are all about gathering up the Drupal-ers around the local community and helping the community grow at large. AddWeb Solution Pvt. Ltd. recently took up this initiative and organised a Drupal Meetup in Ahmedabad - India’s first heritage city declared by UNESCO.

A little about AddWeb and its association with Drupal

AddWeb is an outsourcing agency, based out of Ahmedabad with its clientele spread across the globe. Being an active member and contributor of Drupal community, AddWeb has been doing its bit for Drupal community from time to time. The recent one, being this Drupal Meetup held on 9th June 2018 at AddWeb premises.

AddWeb Drupal Meetup

About of the Meetup

The meetup was organised with the primary goal of elevating the local Drupal community and the secondary goal of promoting new ideas to strengthen Drupal in our area. The meetup was designed and divided under 3 different sessions, each session meant to bring us closer to our goals. Below is the brief hint on what each of these sessions was about:

1) Decoupled Drupal

An open discussion about the most talked thing coming from the house of Drupal. In the meetup, several aspects of Decoupled Drupal were discussed.

Drupal Meetup- Decoupled Drupal

2) Component-Driven Front-end Development

Drupal is bringing in some major changes and innovation to its existing format. Component driven front-end development is one such innovation that needs your attention.

Drupal Meetup: Component-Driven Front-end Development

3) Decoupled React Editorial Experiences

A remotely setup session that was supposed to be taken by Ruben Teijeiro from 1XInternet, did not happen due to last minute urgency of the speaker.


Though the third session couldn’t be conducted, AddWeb has promised to incorporate it in the next meetup that we organise. All in all 50+ Drupal-ers joined us in the meetup and shared their insights on both the conducted sessions. Overwhelmed by their active participation and enthusiasm for the event, we’re motivated to plan more such Drupal Meetups in future. Let’s unite and keep on making efforts to build the Drupal scenario is our respective geographical setups. Because Drupal-ing is fun!


Event Sponsor: AddWeb Solution Pvt. Ltd.

Venue Sponsor: AddWeb Solution Pvt. Ltd.

Event Organizer: Ashish Jain

May 17 2018
May 17

“When the bond is strong, relationships lasts long!” said no one in specific because some facts are too true to be cited in words. But why are we talking about this in here and not Drupal? Well, because it is about Drupal; to be precise, our relationship with Drupal!

We realised this quite recently while on the way to our 10th Drupal event, ever since our inception in the year 2012. In these 5 years, we’ve attended 9 Drupal events, sponsored 5 of them and volunteered in 8 of them. Then how could we miss this one in Nashville?! And here we’re, back from the DrupalCon, Nashville 2018, with a bagful of memories and experiences to share. So, if you weren’t there, read on to discover all that was there!


Quick Overview of the Event Timeline

The five-day event, that DrupalCon was, had been traditionally divided into three major sections - Summits, Sessions and Contribution. Business Summit, Sessions & Contribution Day.

  • The opening day had summits and training sessions, along with the opening reception.
  • Day two had programming summits and sessions planned, along with the much-anticipated session of Dries’ Keynote. 
  • The third and fourth day was when multiple sessions were held followed by special events in the evening and trivia nights. 
  • The closing day of the event was all about Drupal contributions, just as it is at any other Drupal event.

But what made this particular event stand out for me, from the previous ones, were the booths of both - Joomla and WordPress. Now that’s how we see the competitors coming together for the sake of saving open source community from their counterparts. 

Major Takeaway from the Event

1) Business Summit:
As a regular attendee of Drupal events, we knew the significance of the paid business summits held on the first day of the event. So, we had priorly registered for the same. After attending them, we realised that the core of these summits lied in two major things. One, that Drupal alone was not enough and second, the need to promote that Drupal is not merely a CMS platform for building websites but a wide and highly ‘Ambitious Digital Experience’ in itself. 

2) Dries Keynote:
Amidst the commencement of several sessions, the second day at DrupalCon, Nashville 2018 most of us waited for that one crucial session; #Driesnote - the keynote by Dries Buytaert, founder of Drupal. It revolved around three prime agendas - Drupal 8 update, Growing adoption of Drupal and Fostering the Drupal Community. He confirmed the fact that how Drupal is capable of doing everything digital and called it to be the most ‘Ambitious Digital Experience’ of our time. Plus, the decoupled Drupal had opened up the opportunity to get the best of Drupal and collate it with any other user-friendly front-end framework. 

He also declared to take Drupal 8 in the right directions it has become necessary to take up marketing techniques for promotion. And hence, the Drupal Association has launched the ‘Promote Drupal Initiative’ for raising $ 100,000 of which they’ve already bagged $ 54,000 so far. 

Many such significant stuff was shared in the Dries Keynote and to watch its entire recording click here.

3) Sessions:
The third and fourth day consisted of multiple sessions running parallelly. We attended quite a lot of sessions and re-bonded with old Drupal friends over a cup of coffee. ‘Delegating Work: A Zippy Guide to Releasing Your Death Grip on Control’ by Hannah Del Porto from Brick Factory, ‘Debugging Effectively’ by Colin O’Dell from Unleashed Technology and ‘Beyond Websites: Drupal as Data Pipeline for Digital Signage’ by Mike Madison from Acquia - are few of the sessions that we thoroughly enjoyed.

And of course, on both the nights had bumper social events to end the day, along with our fun fellow-Drupalers. Since we met many old friends from Drupal community, we made quite some memories with those fellas! 

DrupalCon, Nashville 2018 had one more day to go to conclude, which was the Contribution Day. But unfortunately, our already planned schedule did not permit us to stay back and be a part of the concluding day. One does feel this loss, especially when they’ve been a contributor in past and know the importance of being a part of such a day. But anyways, the experience that we earned in the previous 4 days was quite enriching. It has opened up a lot of hope and opportunities for people like us, who are hardcore Drupal enthusiasts! 

May 11 2018
May 11

The concept of a global village is getting more and more real with the advancement of ‘online’ world. And online shops share a major part in this advancement. But with the elevated need of building an online store, the options offering platforms to build these stores has also elevated.

Here’s where our experience and expertise come in picture. After 500+ man hours spent over building about 10+ Ecommerce websites, we’ve come to a conclusion that Drupal is indeed the best choice for building an Ecommerce website. So, here are the 11 realistic reasons to guide you through while choosing the best platform for building an Ecommerce website for you; which is undoubtedly Drupal Commerce

1. An Array of Inbuilt Features 
Drupal is priorly loaded with all the features that are required for building a website viz., product management system, payment modes, cart management, et al.

2. Time-Saving 
Development time reduces since the time consumed in first developing and then custom integrating two separate systems is eliminated.

3. SEO Friendly 
Drupal is SEO friendly and hence, helps your website rank higher in the search engine

4. Negligible Traffic Issues 
Heavy traffic is never an issue with Drupal since it is backed by a wealthy system to support the traffic.

5. Social Media Integration 
Social Media platforms like Facebook, Instagram, Twitter, LinkedIn, etc comes priorly integrated with Drupal. 

6. High on Security 
Drupal is high on security grounds and hence, comes up with an inbuilt solution for securing your data/information on the website. 

7. Super Easy Data Management 
Data management becomes easy with Drupal since it is the best content management system. 

8. Feasible for E-Commerce Websites
Easy to built and run a Drupal-based eCommerce website, whether it is a small size enterprise or large business houses. 

9. Inbuilt Plugins for Visitor Analysis  
The inbuilt plugins for visitor reporting and analytics help you to easily evaluate your website without any external support. 

10. Customization
Drupal is flexible enough to make your website a customized one. 

11. Every Single Code is Free!
Drupal firmly believes in maintaining the integrity, the core of Open Source Community, where nothing is chargeable and every single code is for everyone to use. 

And you thought we’re trying to sell it just because ‘We Drupal Everyday’? Well, good that now you’re aware of the selfless efforts we make to solve your tech-related confusions! We at AddWeb are Friends of Drupal Development.

Feb 14 2018
Feb 14

In one of our project, we have to list all post of a content type with search and sort functionality. And the main thing was search form was in the header whereas sort fields were a location in another region.
Therefore when we explore search and sort fields from view, both the fields were coming up together.
There are two options to overcome this situation:

  • Block Clone module

There is one contrib module “Block Clone” is available.
Using this module you can set single block at multiple places.
To solve our above problem we can set expose fields block at two places. and using CSS/jQuery we need to hide/show relative fields as per the block position (like for search block, hide sort fields).

  • Search API Sorts

As we already have used Search API module, we go with Search API Sorts contrib plugin.

This module is dependent on Search API module. This module creates a separate block only for sort fields.

  • We need to follow below steps to configure this module:
  • Install and activate this module
  • After activating this module, you can able see link in admin i.e. configuration >> Search and Metadata >> Search API. Select it.
  • You need to create an index first over there.
  • After creating Index, there will be a tab named "SORTS".
  • In that tab, you can able to select fields which you want to make it sortable.

By doing this, it will create a separate block for sorting fields & you can place that block where you actually need it.

Hope this helps you well, feel free to add your comments/feedbacks. Need more assistance regarding Custom Drupal Development Get in touch today!

Jan 11 2018
Jan 11

The world is painted in the mood of celebrations. As the end of the year comes closer, the more clearer visuals of the passing year comes in front of our eyes. Believe it or not, all of us a nostalgic bunch of souls wrapped in the fancy dreams and ambitions of the coming year. Even while reading this you’re nodding your head yes with a nostalgic smile on your face and moisty glow in your eyes. Don’t worry, we all are sailing in the same boat. So, instead of keeping it all within we thought to share our 2017 story with our loved ones. Hope, our story will leave you motivated to write your story too and share it with us! 

The outset of 2017

Like every coming year, 2017 too came with a bundle of surprises for us to unfold with time. We kicked off the year with yesteryear’s memories in our hearts and a lot of dreams to be accomplished through the year. We’re more than 4+ years old with 110+ man-years of experience, 25+ teammates, and  500+ - small, medium and large-scale projects. We knew we had a long way to go in order to give justice to the mark 2016 had left us with. And hence, we’re all geared up to plunge into the pool of challenges and surprises that 2017 had in the store for us.

Paramount Projects of the Year 

The year had just started and we got lucky with a high-ranking project on board. The client asked us to create a gateway for the Bitcoin for their OctoberCMS based website. It was the first time that we forayed into the field of Cryptocurrency. And our enthusiastic troupe of coders, successfully closed it like a pro! We also expanded our skill-set by exploring and working on a few more tech stacks viz. Lumen, Bitusu, Catalyst, DevOps/docker implementation, et al. Meanwhile, we also got a firm hold over OctoberCMS and of course Drupal 8. 


AddWeb Turns 5!

We were still engrossed in coding new things, little did we realised that it was about time for some celebration - A birthday celebration! Yes, AddWeb turned 6 during July 2017 and we celebrated the birthday of our little one with lots of fun activities and a scrumptious cake. We’re - “One more year older. One more year wiser.” In fact, by that that we even grew bigger as a team and hence gifted ourselves with a whole new, creative office! 

AddWeb's Birthday

Proud Moments! 

Being a Drupal-er, since our very inception, contributing something huge was sort of a dream for us. And finally, 2017 gifted us with one such opportunity. We finally contributed an Admin Theme to the Drupal community. And if that was not enough of a joy to be felt proud of, Dries Buytaert overwhelmed us by mentioning us in his blog. In that blog, based on the credits earned by the contribution made towards the Drupal community, we got listed at the 27th position in the list of world’s top companies contributing towards Drupal community. Also, by elevating the quality of our contribution we took a huge leap from being amongst the world’s top 100 companies at Drupal marketplace during the start of 2017 to securing a place in the top 20 Drupal companies by the end of the year. Can their be a bigger joy for a hardcore Drupal-er like us?!


We Code. We Create. We Celebrate! 

By the way, did we tell you? Celebrations are as much as a part of AddWeb as coding is. We like to be in the celebration mood throughout the year. Being the true Indians, we don’t miss even a single opportunity to celebrate. From celebrating the festival of colors - Holi in the office to celebrating the festival of lights - Diwali, we proactively plan and participate in every such event. We go out during Garba nights for swirling and twirling together and also sometimes plan a terrace party to get grooving on the dance floor. We twin by wearing same outfits and sometimes code together with a dress code of checks and polkas. And oh! How can we forget our Udaipur trip! It was one hell of a trip that will remain in memories forever. 


And also, ‘We Care’!

While celebrations kept the mood and mind of our AddWeb family in a happy zone, we introduced a series of physiotherapy sessions to make sure their health also remains very much in that happy zone. They are the asset of AddWeb and hence, caring and doing a bit for their health, make us happy!

We Care

AddWeb on Expedition

Some more memories that we made through the year, were from our trips to the DrupalCamps that we attended worldwide. Like 2016 was all about sponsoring every such event that we attended, 2017 was all about attending the event as a speaker. We spoke about ‘Women in Tech/Drupal’ at both - DrupalCamp Mountain Camp 2017 Switzerland and DrupalCamp Frankfurt 2017. Around the end of the year, we also attended the New England Drupal Camp 2017 and one of biggest and our very first WordCamp - WordCamp US 2017. It was not just memories but also a shedload of learnings that we brought back home with us. 

Aj Trip Aj Trip

Atithi Devo Bhava! 

We weren’t just visiting the faraway lands, but also welcoming our clients from distant places and helping them explore our city and culture. 2017 brought home Rainer & Lutz, our German clients, to our office. And we proclaim, “Atithi Devo Bhava”, treated him with a very humble hospitality and took them on a tour around the city. On the tour, they tasted some local spicy Indian food, visited the city’s must-visits like Gandhi Ashram and ended their tour with some authentic food, again. And it’s needless to say, how much they relished the entire tour! 

Client Visit

We Work the Smart Way!

Every year, such expedition of ours introduces us to a million new things. We explore a few interesting ones from them and then come back home, mould them to fit in our environment and bring them to practice. And 2017’s one such customised creation is ‘Artful Agile Process’. Artful, because we have artistically melded it retain the deliverance of quality and at the same time managing the resource in a very street-smart way. Every single project of 2017 was done under this process and guess what?! It turned out to be one of the most fruitful creations of ours, so far. 


In fact, not just how we work but we have also molded the method of how we hire. A smart filtering flow has been formed in order to select only the best ones and that too in the least expected time. And under this newly introduced ‘Smart Hiring Process’ we’ve also made a lot of rejections. All of these, just to keep up on the route of maintaining quality and progressing! 

Agile Hiring

Giving Back to the Community at large! 

We believe in giving back to the community. And hence, have came up with a new in-house concept of ‘AddWeb Academy’. The academy is ready to roll out with the commencement of the new year. It intends to provide the freshers with a thorough professional training of Web Development and coding, which can further help them build their career.


Waiting to Welcome 2018!

Looking back through the year, we realised that we’ve achieved a lot and yet there’s a long way to go! And as the year is about to end with some nostalgic feelings and celebrations, we’re all set to bid it a beautiful goodbye with loads of love and gratitude. We’re all waiting to welcome 2018 with our 50+ member AddWeb family, over 200+ man-years of experience and a shedload of enthusiasm. Here we go to chase bigger dreams with an even bigger team. Happy celebrating 2017 and welcoming 2018!

Year End
Dec 28 2017
Dec 28

“We Drupal Everyday” - this very catchphrase of AddWeb is enough to portray our love and dedication for Drupal. And it is our this love for Drupal that has taken us on the tour of DrupalCamp, across the world. This time our Drupal-destination was NEDCamp, held in Worcester city of the United States of America.


Our excitement and enthusiasm being at its peak, brought us to the city a little earlier before the camp commences. Though we’ve been attending, volunteering and sponsoring Drupal Camps ever since 2015, our curiosity and zest remained as high as the first-timers. And like every time, this time too we wanted to attend every single session. But alas! We could only make it up for just a few to them. Amongst which Kelly Albrecht’s session on Agile Design, Jason Pamental’s session on variable fonts and the future of web design, AmyJune Hineline’s session on the simplicity of Git-in, et al were high on our list. And oh! How can we forget Drupal 8!! NEDCamp brought us a galore of opportunities learn about Drupal 8. And then there were BOF (Bird Of Feather) sessions, where we got to sit and discuss our queries and concerns around Drupal with the like-minded Drupal-ers around the world.


Every Drupal camp we visit, bring us a new perspective and motivation to contribute even more towards Drupal. And do you know, what part of Drupal Camp brings us the maximum amount of motivation? It’s the social gatherings that they organise like lunch sessions and dinner nights. We look forward to them not just because we get to meet and greet fellow Drupal-ers, but also because it’s here where we get to meet some old friends and make a few new ones! All of us, coming from diverse countries and cities, brings a diverse range of cultural perspective. We get a chance to get exposed to a whole new sociological aspect of different beings, ranging from food, customs, languages, beliefs, et al - all under one single roof. Believe us, this gives us a different high!


Of course, it’s needless to say but NEDCamp 2017 was indeed a very fruitful experience, alike every other DrupalCamp that we have been a part of. It would be unfair if we wouldn’t thank all the sponsors, organisers and of course the volunteers - who selflessly contributed their time and energy for the betterment of the community. Thank you guys, you made it happen once again!


Many more #DrupalCamps to attend, sponsor and volunteer! Many more contributions to be made towards the most robust open source framework - Drupal!

Nov 13 2017
Nov 13

The hunt for a decent Drupal developer has never been a child’s play. One, because Drupal in itself is a complex tool that requires a high-end expertise and hence Drupal developers are less in number as compared to others. And second, one also has to be technically literate to a certain extent, in order to sense their expertise and hire accordingly. 


Well, you need not be scared, if you aren’t that well-versed about the tech-world. Especially, when you have AddWeb Solution to your rescue. We, being a pack of powerful Drupal-ers since 2012 and currently ranked at the 24th position in the marketplace of Drupal Service Provider, you know that you can put faith in our words. And as always, we’re more than happy to guide you through your search of a good Drupal developer.


Let us share a few pointers that have to be on your checklist while shortlisting a Drupal developer for yourself.


1) Profile on Drupal community:
What better recommendation of a Drupal developer than the one coming from Drupal’s official website itself?! And guess what, Drupal doesn’t bluff! It purely works on the merit basis, where the Drupal developers’ activeness in the community and their contribution is displayed. If one doesn’t have a profile on Drupal Community, you know you’ve to think twice before hiring them! 


2) Certification:
“Skills, not degrees, take you far.” True. But when in the ever-changing techno-world, you can’t shun the significance of certificates that these software companies give. So, if you come across a certified Drupal developer by Acquia, you know you’ve found the best champ to hire.


3) Work Profile:
Remember, that work speaks for itself! Well, don’t let some fraud deceive you with pretty presentations and flattery words. Ask for their work profile and invest your time and energy over analyzing them. And you’ll soon be a judge yourself, whether to trust the person or not. No wonder why a lot of companies goes all boastful about their clientele. 


4) Coding Languages:
“The more the merrier” is the mantra you need to follow while choosing a Drupal Developer with the knowledge of multiple coding languages. Since Drupal is built with the PHP language, it becomes mandatory for a Drupal developer to be well-versed in it. But knowing just PHP is also not enough, he needs to be multilingual when it comes to coding languages; majorly, SQL, MYSQL, JQuery, et al. And of course, not to forget ‘English’. It may not have any technical benefit attached to it, but it will surely enhance your communication with him!


5) Activeness on Drupal Community:
Drupal is a high-end open-source content-management framework, which is available free of cost. But the prominent reason behind its growth and flourishment is its community. People from all across the world, gather-up here and share their knowledge and queries here. A Drupal developer’s activeness here in this community also speaks for the wealth of his Drupal-related knowledge.


There may not be a guaranteed checklist to help you hire only the best of Drupal developers, but a few tips like these can always prevent you from a disastrous selection. And in case, you’re still stuck in your search; remember, our super-skilled Drupal developer’s team is just a call away! 


May you have a happy ride, searching a decent Drupal developer!

Aug 08 2017
Aug 08

In this post we’ll see how to save temporarily values from a form and how to retrieve or process them later in a controller. To do that, we’ll use the Form API and the private tempstore (the temporary store storage system of Drupal 8).

The use case is the following: we need to build a simple RSS reader (a form) where the user could introduce the URL of an RSS file and the number of items to retrieve from that file.  Next, in a new page (a controller), the application should display the list of items with a link to each syndicated page .

The easiest way to achieve it would be to retrieve the values in our buildForm() method, process them and display the result thought a specific field of the form. But that’s not our use case.

To process the form’s values and to display the results in another page, we’ll first need to store the form's values and retrieve them later in a controller. But how and where to store and retrieve those values?

Long story short: Store and retrieve data with the Private Tempstore System of Drupal 8

Drupal 8 has a powerful key/value system to temporarily store user-specific data and to keep them available between multiple requests even if the user is not logged in. This is the Private Tempstore system.

// 1. Get the private tempstore factory, inject this in your form, controller or service.
$tempstore = \Drupal::service('tempstore.private');
// Get the store collection. 
$store = $tempstore->get('my_module_collection');
// Set the key/value pair.
$store->set('key_name', $value);

// 2. Get the value somewhere else in the app.
$tempstore = \Drupal::service('tempstore.private');
// Get the store collection. 
$store = $tempstore->get('my_module_collection');
// Get the key/value pair.
$value = $store->get('key_name');

// Delete the entry. Not mandatory since the data will be removed after a week.

Fairly simple, isn't it? As you can see, the Private Tempstore is a simple key/value pair storage organized with collections (we usually give the name of our module to the collection) to maintain data available temporarily across multiple page requests for a specific user.

Now, that you have the recipe, we can go back to our use case where we are now going to figure out, how and where we could store and retrieve the values of our form.

Long story: Illustrate the Private Tempstore system in Drupal 8

For the long story part, we are going to create a module with a form and a controller to first get the data form the user, store the form’s data in a private tempstore and redirect the form to a controller where we’ll retrieve the data from the tempstore and process them.

This is the form.


And this is the controller.


You can find and download the code of this companion module here.

Types of data storage in Drupal 8

In Drupal 8 we have various APIs for data storage:

Database API  - To interact directly with the database.
State API - A key/value storage to store data related to the state or individual environment (dev., staging, production) of a Drupal installation, like external API keys or the last time cron was run.
UserData API - A storage to store data related to an individual environment but specific to a given user, like a flag or some user preferences.
TempStore API - A key/value storage to keep temporary data (private o shared) across several page requests.
Entity API - Used to store content (node, user, comment …) or configuration (views, roles, …) data.
TypedData API - A low level API to create and describe data in a consistent way.    

Our use case refers to user-specific data we need for a short period of time, data that is also not specific to one environment, so the best fit is certainly the TempStore API but in its private flavour because the data and the results are different for each user.

The only difference between private and shared tempstore is that the private tempstore entries strictly belong to a single user whereas with shared tempstore, the entries can be shared between several users.

Storing the form's values with the Private TempStore storage

Our goal is to build a form where user can introduce an RSS file URL and a number of items to retrieve from that file, next we need to store temporarily those values to retrieve them later in a controller.

Let’s now take a closer look at how we could store (or save) our form’s values. As we get the data (url and items to retrieve) from a form, it’s clear that we are going to store the data in the submitForm() method since this method is called when the form is validated and submitted.

Here is the code of our form.

namespace Drupal\ex_form_values\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
// DI.
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Messenger\MessengerInterface;
use Drupal\Core\Logger\LoggerChannelFactoryInterface;
use Drupal\Core\TempStore\PrivateTempStoreFactory;
 * Class WithControllerForm.
 * Get the url of a RSS file and the number of items to retrieve
 * from this file.
 * Store those two fields (url and items) to a PrivateTempStore object
 * to use them in a controller for processing and displaying
 * the information of the RSS file.
class WithStoreForm extends FormBase {
   * Drupal\Core\Messenger\MessengerInterface definition.
   * @var \Drupal\Core\Messenger\MessengerInterface
  protected $messenger;
   * Drupal\Core\Logger\LoggerChannelFactoryInterface definition.
   * @var \Drupal\Core\Logger\LoggerChannelFactoryInterface
  protected $loggerFactory;
   * Drupal\Core\TempStore\PrivateTempStoreFactory definition.
   * @var \Drupal\Core\TempStore\PrivateTempStoreFactory
  private $tempStoreFactory;
   * Constructs a new WithControllerForm object.
  public function __construct(
    MessengerInterface $messenger,
    LoggerChannelFactoryInterface $logger_factory,
    PrivateTempStoreFactory $tempStoreFactory
  ) {
    $this->messenger = $messenger;
    $this->loggerFactory = $logger_factory;
    $this->tempStoreFactory = $tempStoreFactory;
   * {@inheritdoc}
  public static function create(ContainerInterface $container) {
    return new static(
   * {@inheritdoc}
  public function getFormId() {
    return 'with_state_form';
   * {@inheritdoc}
  public function buildForm(array $form, FormStateInterface $form_state) {
    $form['url'] = [
      '#type' => 'url',
      '#title' => $this->t('Url'),
      '#description' => $this->t('Enter the url of the RSS file'),
      '#default_value' => 'https://www.drupal.org/planet/rss.xml',
      '#weight' => '0',
    $form['items'] = [
      '#type' => 'select',
      '#title' => $this->t('# of items'),
      '#description' => $this->t('Enter the number of items to retrieve'),
      '#options' => [
        '5' => $this->t('5'),
        '10' => $this->t('10'),
        '15' => $this->t('15'),
      '#default_value' => 5,
      '#weight' => '0',
    $form['actions'] = [
      '#type' => 'actions',
      '#weight' => '0',
    // Add a submit button that handles the submission of the form.
    $form['actions']['submit'] = [
      '#type' => 'submit',
      '#value' => $this->t('Submit'),
    return $form;
   * Submit the form and redirect to a controller.
   * 1. Save the values of the form into the $params array
   * 2. Create a PrivateTempStore object
   * 3. Store the $params array in the PrivateTempStore object
   * 4. Redirect to the controller for processing.
   * {@inheritdoc}
  public function submitForm(array &$form, FormStateInterface $form_state) {
    // 1. Set the $params array with the values of the form
    // to save those values in the store.
    $params['url'] = $form_state->getValue('url');
    $params['items'] = $form_state->getValue('items');
    // 2. Create a PrivateTempStore object with the collection 'ex_form_values'.
    $tempstore = $this->tempStoreFactory->get('ex_form_values');
    // 3. Store the $params array with the key 'params'.
    try {
      $tempstore->set('params', $params);
      // 4. Redirect to the simple controller.
    catch (\Exception $error) {
      // Store this error in the log.
      $this->loggerFactory->get('ex_form_values')->alert(t('@err', ['@err' => $error]));
      // Show the user a message.
      $this->messenger->addWarning(t('Unable to proceed, please try again.'));

In the submitForm() method we can see two lines where we deal with the private tempstore in step 2 and 3.

$tempstore = $this->tempStoreFactory->get('ex_form_values');
$tempstore->set('params', $params);

In the first line we call the PrivateTempStoreFactory to instantiate a new PrivateTempStore object trough its get() method. As you can see, we get the factory by DI. We also define the name of our collection (ex_form_values) with the same name as our module (by convention) and pass it to the get() method. So, at this time we created a new PrivateTempStore object for a collection named "ex_form_values".

In the second line we use the set() method of the PrivateTempStore object which will store the key/value pair we need to save, in our case, the key is 'params' and the value is the $params array that contains our form’s values.

The PrivateTempStoreFactory uses a storage based on the KeyValueStoreExpirableInterface, this storage is a key/value storage with an expiration date that allows automatic removal of old entities and this storage uses the default DatabaseStorageExpirable storage to save the entries in the key_value_expire table.

Here is the structure of this table:


The PrivateTempStore object has the following protected properties, all passed to the form by DI:
$storage - The key/value storage object used for this data.
$lockBackend - The lock object used for this data.
$currentUser - The current user who owned the data. If he's anonymous, the session ID will be used.
$requestStack - Service to start a session for anonymous user
$expire - The time to live for the entry in seconds. By default, entries are stored for one week (604800 seconds) before expiring as defined in the KeyValueStoreExpirableInterface.

We can’t set any of those values, they are all set by the KeyValueStoreExpirableInterface when we instantiate the new PrivateTempStore object.

The PrivateTempStore object method we are interested at this time is the set() method which will store the key/value we need to save, in our case, the key is 'params' and the value is the $params array that contains our form’s values. You can find the code of this method here and below, the beginning of this method:

public function set($key, $value) {

  // Ensure that an anonymous user has a session created for them, as
  // otherwise subsequent page loads will not be able to retrieve their
  // tempstore data.
  if ($this->currentUser
    ->isAnonymous()) {

    // @todo when https://www.drupal.org/node/2865991 is resolved, use force
    //   start session API rather than setting an arbitrary value directly.
      ->set('core.tempstore.private', TRUE);
  // ....

As you can see at the beginning of this method, we ensure that an anonymous user has a session created for him, thanks to this, we can also retrieve a session ID that we will use to identify him. If it’s an authenticated user, we will use his UID. You can confirm that in the getOwner() method of the PrivateTempStore object.

When we submit the form, thanks to these two lines, we’ll save the form's values in the database. If you look at the key_value_expire table, you can see that there are other records, most of them with update information of our app., but also new records with the collection value of tempstore.private.ex_form_values. Here is a query on this collection when an anonymous and the admin user use the form.


We didn’t output the column 'value' because it’s too large. But you can see now how our form's values are stored in the database and particularly for anonymous users with their session ID.

At this time, we know how to store temporarily the values of a form in the privatetempstore of Drupal. This was not so hard, wasn’t it? Yes, Drupal is a great framework and it saves us a lot of time when developing a web application.

Now let’s see how to retrieve and process the values in a controller.

Retrieve our form's values from the privatetempstore

To retrieve the data, process them and display the results, we’ll need to redirect our form to a controller. Here is the code of this controller.

namespace Drupal\ex_form_values\Controller;
use Drupal\Core\Controller\ControllerBase;
// DI.
use Drupal\Core\Messenger\MessengerInterface;
use Drupal\ex_form_values\MyServices;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\TempStore\PrivateTempStoreFactory;
use GuzzleHttp\ClientInterface;
// Other.
use Drupal\Core\Url;
 * Target controller of the WithStoreForm.php .
class SimpleController extends ControllerBase {
   * Tempstore service.
   * @var \Drupal\Core\TempStore\PrivateTempStoreFactory
  protected $tempStoreFactory;
   * GuzzleHttp\ClientInterface definition.
   * @var \GuzzleHttp\ClientInterface
  protected $clientRequest;
   * Messenger service.
   * @var \\Drupal\Core\Messenger\MessengerInterface
  protected $messenger;
   * Custom service.
   * @var \Drupal\ex_form_values\MyServices
  private $myServices;
   * Inject services.
  public function __construct(PrivateTempStoreFactory $tempStoreFactory,
                              ClientInterface $clientRequest,
                              MessengerInterface $messenger,
                              MyServices $myServices) {
    $this->tempStoreFactory = $tempStoreFactory;
    $this->clientRequest = $clientRequest;
    $this->messenger = $messenger;
    $this->myServices = $myServices;
   * {@inheritdoc}
  public static function create(ContainerInterface $container) {
    return new static(
   * Target method of the the WithStoreForm.php.
   * 1. Get the parameters from the tempstore for this user
   * 2. Delete the PrivateTempStore data from the database (not mandatory)
   * 3. Display a simple message with the data retrieved from the tempstore
   * 4. Get the items from the rss file in a renderable array
   * 5. Create a link back to the form
   * 6. Render the array.
   * @return array
   *   An render array.
  public function showRssItems() {
    // 1. Get the parameters from the tempstore.
    $tempstore = $this->tempStoreFactory->get('ex_form_values');
    $params = $tempstore->get('params');
    $url = $params['url'];
    $items = $params['items'];
    // 2. We can now delete the data in the temp storage
    // Its not mandatory since the record in the key_value_expire table
    // will expire normally in a week.
    // We comment this task for the moment, so we can see the values
    // stored in the key_value_expire table.
    try {
    catch (\Exception $error) {
      $this->loggerFactory->get('ex_form_values')->alert(t('@err',['@err' => $error]));
    // 3. Display a simple message with the data retrieved from the tempstore
    // Set a cache tag, so when an anonymous user enter in the form
    // we can invalidate this cache.
    $build[]['message'] = [
      '#type' => 'markup',
      '#markup' => t("Url: @url - Items: @items", ['@url' => $url, '@items' => $items]),
    // 4. Get the items from the rss file in a renderable array.
    if ($articles = $this->myServices->getItemFromRss($url, $items)) {
      // Create a render array with the results.
      $build[]['data_table'] = $this->myServices->buildTheRender($articles);
    // 5. Create a link back to the form.
    $build[]['back'] = [
      '#type' => 'link',
      '#title' => 'Back to the form',
      '#url' => URL::fromRoute('ex_form_values.with_store_form'),
    // Prevent the rendered array from being cached.
    $build['#cache']['max-age'] = 0;
    // 6. Render the array.
    return $build;

First we inject all the services we need and also a custom service MyServices.php used to retrieve the RSS file and the required number of items.

This controller has a simple method called showRssItems(). This method performs six tasks:

1. Get the data we need from the PrivateTempstore
2. Delete the PrivateTempStore data from the database (not mandatory)
3. Display a simple message with the data retrieved from the tempstore
4. Get the items from the rss file in a render array
5. Create a link back to the form
6. Render the array.

The tasks that interest us are the first and the second one, where we deal with the tempstore.

$tempstore = $this->tempStoreFactory->get('ex_form_values');

This line is now straightforward for us, since we know that the get() method of the PrivateTempStoreFactory instantiate a new PrivateTempStore object for the collection 'ex_form_values'. Nothing new here.

$params = $tempstore->get('params');

In the line above, we just retrieve the value of the key 'params' from the storage collection into the variable $params. Remember that we are using the privatetempstorage, as we retrieve the value, we’ll also check if it's the same user with the getOwner() method of the PrivateTempStore object.

The second task is deleting the data from the tempstore, this is not mandatory since we are working with a temporary store where the data will be deleted automatically after a week by default. But if we expect a heavy use of our form, it could be a good idea since we won’t normally need the data anymore.

try {
catch (\Exception $error) {
  $this->loggerFactory->get('ex_form_values')->alert(t('@err',['@err' => $error]));

As the delete() method of our privatetempstore object can trow an error, we’ll catch it in a 'try catch' block. For learning purpose I’ll suggest to comment those lines to see how the data are stored in the key_value_expire table.

The rest of the controller is pretty straightforward, we are going to pass the data to small methods of our custom service to retrieve the RSS file and the number of items we need, build a render array with the results as you can see in task number four. Next, we’ll create a simple link back to our form and render the entire array. Nothing strange here.


We wanted, trough a form, to get a RSS file URL, the number of items to retrieve from, and display this information in a controller. To do so, we needed to store the information of the form, retrieve it and process it later in a controller.

We decided to use the Private TempSore system of Drupal because:
- The information doesn’t belong to a specific environment or a particular state of our application (see State API for that case)
- The information is not specific to a user and doesn’t need to be stored with its profile (see UserData API for that case). On the other hand, anonymous users should also have access and use the form
- We need the information temporarily, for a short period of time
- It has to be private because the information belongs to each user (anonymous or authenticated)

To store the data, we used the submit() method of our form and the following lines:

$tempstore = $this->tempStoreFactory->get('ex_form_values') - to instantiate a new PrivateTempStore object with a collection name 'ex_form_values' that refers to our module in this case.

$tempstore->set('params', $params) - to save the value of the variable $params in the database with the key 'params'. Remember that as we use a private storage, Drupal will retrieve the user ID or its session ID if anonymous, and concatenate it with the key value in the 'name' row of the 'key_value_expire' table.

To retrieve the information in our controller’s showRssItems() method, we used the following code:

$tempstore = $this->tempStoreFactory->get('ex_form_values') - to instantiate a new PrivateTempStore object with a collection name 'ex_form_values' that refers to our module in this case.

$params = $tempstore->get('params') - to retrieve the value stored in the keyed 'params' record of this collection and for this particular user.

Yes! Once again, through this simple example, we can see how powerful Drupal is, and how its framework is easy to use.

And you? In which situation do you think we could use the privatetempstore? Please, share your ideas with the community.

Introduction To Bootstrap Paragraph Drupal 8

Aug 08 2017
Aug 08
Jul 12 2017
Jul 12

Customization is nowadays common in Drupal site. Here you may need to save node programmatically at any time. For saving node programmatically we use node_save() hook which will save the whole node though we want to update only one field.

A Drupal function field_attach_update() will replace node_save() in some way. It will update only that field which you want to update.

Benefits of field_attach_update()

  1. Reduces load time.
  2. Not update CCK fields.
  3. Easy to use.

Below is the code to use field_attach_update() hook.

// $arr_nids is array of node id that you want to update
$arr_nodes = node_load_multiple($arr_nids);
foreach ($arr_nodes as $key => $node) {
$node->field_fieldname1[LANGUAGE_NONE][0]['value'] = 'field1 value';
$node->field_fieldname2[LANGUAGE_NONE][0]['value'] = 'field2 value';
$node->field_fieldname3[LANGUAGE_NONE][0]['value'] = 'field3 value';

field_attach_update('node', $node);

entity_get_controller('node')->resetCache(array($node->nid)) is used to clear cache for the entity.

For example:

Values before using field_attach_update():

Guidelines for Updating Node Fields Without node_save() In Drupal

Update Fields using field_attach_update():

$nid = '29';
$node = node_load($nid);
$node->field_fname[LANGUAGE_NONE][0]['value'] = 'Johnny1';
$node->field_lname[LANGUAGE_NONE][0]['value'] = 'Harper1';
$node->field_address[LANGUAGE_NONE][0]['value'] = '405, Silicon Tower, Above Freezland Restaurant, Law Garden, Off C.G. road, Ahmedabad, Gujarat - 380009 India.';

field_attach_update('node', $node);

Values after using field_attach_update():

Guidelines for Updating Node Fields Without node_save() In Drupal

Hope this helped you to get most out of the system. Need more assistance for Drupal Development Services then get in touch with us. Feel free to share your reviews and pick the best answer for your requirements. #WeDrupalEveryday

Introduction To Paragraphs Drupal 8

Jul 08 2017
Jul 08

Introduction To Paragraphs Drupal 8

Jul 08 2017
Jul 08

Create Custom Multistep Form Using Ajax

Jun 21 2017
Jun 21

Create Custom Multistep Form Using Ajax

Jun 21 2017
Jun 21
Jun 13 2017
Jun 13

As a Drupal solution provider, our passion for contributing to Drupal community started from Drupal Camp Brighton 2015, which continues and has brought us today attending Drupal Camp Frankfurt 2017 as well. Frankfurt is one of the world’s leading financial center with historic, ethnic and cultural diversity like the Paulskirche, the Römer, and the “Museumsufer”, captivating skyline, big fair, traditional restaurants and the list is endless.

Drupal Camp Frankfurt 2017 took place at University of Frankfurt, Bockenheim on 22nd and 23rd April 2017, owing to its large campus the sessions and sprints were conducted with utmost ease. Germany Drupal Community was very welcoming and their effort was commendable to promote Drupal in the German market. It was a camp by the community for the community so that beginners can learn and develop an insight into Drupal technology and experience the depth of the community.

Drupal Camp Frankfurt was spread over two days with interesting sessions, sprints, social gathering, and discussions to exchange knowledge and experiences of the community members. We were more excited as we could contribute by conducting a session on “Women in Tech/Drupal” by #dcffm17 speaker Mr. Ashish Jain.

Day 1:
On 22nd April, the day started with a welcome session followed by a keynote by Antje Lorch on “Why you will be contributing to Drupal”, which cleared everyone’s thoughts about giving back to the community as much as they take advantages. This was followed by various sessions, out of which some interesting topics were Media & Drupal – Modules and Workflows for Publishers, deGov - Building a Distribution based on Acquia Lightning and Get the most out of display mode. And the day ended with an open-ended session and at last with an incredible social night at the restaurant and bar Depot 1899, which helped us know each-each other beyond Drupal.

Day 2:
The second day kick started fresh with interesting sessions and various discussions with the community members that even included newbies, who had good knowledge and that created a great atmosphere. After the lunch break, Mr. Ashish Jain presented a session on “Women in Tech/Drupal” in which he highlighted the position women have achieved, global stats about women’s position in the tech world and about the position of women in AddWeb Solution that has lead to change in work environment and increase productivity. All the attendees of the session appreciated our attempt for #genderdiversity.

On the whole, it was a great learning experience and it's always a delight to meet the community members anytime to boost up the Drupal quotient and share personal experiences. The event was memorable and a big thank you to the organizers, sponsors, volunteers and all community members for such a great event.

Feel free to view some cool snapshots from here

AddWeb Solution can’t wait for the next community meeting, so as to contribute even more to the Drupal community and show the love for Drupal!!

May 12 2017
May 12

Display modes are one of the core functionalities of Drupal 8. They are easy to create and provides great flexibility in terms of theming at entity viewing and editing level. Display modes are available for content, comment, contact messages, custom blocks, taxonomy terms, users. They are also available to views adding more power to views.

Display modes are located at Admin -> Structure -> Display modes -> View mode.

Two types of display modes are available: "view modes" and "form modes."  Both these are example of configuration entities.

View modes allows site builder to request a field to be rendered in a certain way. For example, we can have an article that has doctors field has entity reference. On article full mode display, we can request few details of doctor to be displayed. We can create a new display mode (“Doctor details”) to do so. On Doctor’s full view, we can include a brief summary of articles associated with them. 

To create View mode 

Navigate to Admin -> Structure -> Display modes -> View mode

1. Click on “Add view mode” to add new view mode

2.  Created view mode is available on content types. Navigate to manage display of the content type and enable view mode.

Once enabled, this mode can be used on referenced field.

Once view modes are enabled, we can theme it as per requirements. To get template suggestions, you need to turn on debug property from services.yml. 

You can find theme suggestion in inspect element.

Display modes can also be used based on conditions and we can switch mode based on conditions.

function hook_entity_view_mode_alter(&$view_mode, Drupal\Core\Entity\EntityInterface $entity, $context) {
  // For nodes, change the view mode when it is teaser.
  if ($entity->getEntityTypeId() == 'node' && $view_mode == 'teaser') {
    $view_mode = 'my_custom_view_mode';

Hope this helped you to understand Display Modes in Drupal 8, Feel free to drop us a line for any Drupal 8 related work/queries/tasks, or Need any assistance regarding Drupal 8 Web design & Development. Always ready to help :) 

Display Modes In Drupal 8

May 12 2017
May 12

Everything You Need To Know About Drupal Mail System

Apr 24 2017
Apr 24
Apr 24 2017
Apr 24

As Community Liaison, I find it important to liaise face-to-face whenever I can, and an opportunity presented itself to visit a community I have not been able to spend time with until now; that in India.

This was going to not only be the first time I’ve worked with the community in India but also my first time in India. I couldn’t help but wonder, “Will I see any elephants?”

Think Indian!

I found myself sat on a motorbike at the side of a road in Goa, India and about to plunge into the traffic for the first time. At home, I’m an experienced motorcyclist but here, everything is different. I have to learn fast…

Waiting for a gap in the stream of vehicles that will never come, I shout at myself, “Come on Rachel, think Indian!” I just need to adjust how I think and accept that the traffic conditions here are not better or worse, just different, and to “go with the flow”. I take the plunge and catch up with Surabhi Gokte and Manjit Singh (the extremely generous community member who loaned me his beautiful Royal Enfield, pictured here) on their scooter and we disappear into the night.

Manjit's beautiful Royal Enfield Classic 350
Manjit's beautiful Royal Enfield Classic 350 - quite a change from my own BMW...

I learned a lot about India riding Manjit’s motorbike over the next couple of days (yes, sorry Manjit - I may have added another 250Km to the clock!) and at the marvellous Drupal Camp Goa that I had flown out to join.

Drupal Camp Goa was a great place to meet the Drupal community in India and I was determined to find out as much as I could about what was going on there. What I learned was that the community is hugely vibrant and doing amazing things —at a scale I simply never grasped before.

I was invited to do an opening talk at the beginning of the weekend and I chose to speak about community, as is my want, and how we can ensure that the whole World is aware of the community here. It is well documented in Dries’ blog posts that the contributions to the project from India are significant; they are, after all, the second most prolific country in code contributions after the USA, and then only by a small margin.

Graph showing the most active countiries contributing code to Drupal
Code contributions to Drupal, by country. Taken from https://dri.es/who-sponsors-drupal-development-2018 

What struck me, though, was that I didn’t know the amazing individuals here and I don’t see them featured enough in the global Drupal conversation. I talked about how we recognise the contributions made but we all have a responsibility to ensure that we facilitate people outside of places like the USA and Europe moving into “positions of influence” in our global community; places like the track chairs of global Drupal conferences, our many working groups and so on. I would very much like every lead of every Drupal working group to be asking themselves, “If 13% of our code contributions come from India, do we have at least 13% of our group’s leadership represented by Indians and, if not, why not?”

I was particularly struck at the quality of the sessions that I attended, and the scope of the things they were discussing.

Two sessions stuck out in my mind: The first was one on machine learning and its applications in Drupal, by Akanksha Singh. She not only described much of the history behind machine learning and explained how it may be used for many applications, she described a Drupal module she is finishing developing (on drupal.org/projects very soon!) that will allow sentiment analysis of content via tools like IBM Watson. I can think of a thousand uses for this!!

I very much enjoyed a session on “college leaver” education in Drupal by Sharmila Kumaran. It seems that she has developed a system by which they spend time exposing a lot of students to Drupal and then identify those who they think have potential to move into Drupal careers. Pretty standard stuff but then they mentioned the scale of the operation and I sat up: In 2019, they are expecting to have exposed over 6,000 (yes, six thousand) college-aged people to Drupal and how it works. Is there anyone else, anywhere in the World, educating people in Drupal at this scale??

The whole camp was full of people doing amazing things. The organisers were doing a fantastic job, the food was awesome, and I left with an overwhelming feeling that region including India will power the growth of Drupal for a long time.

Shout out to all the Volunteers and Speakers of @DrupalcampGoa 2019 - We are happy to give you credits on https://t.co/Ip1TSC0VnA as you have contributed to #DCG19. Here is the link - https://t.co/hhXnXEB5Xx, please add comments to justify your contribution :) pic.twitter.com/tlCApvXhQJ

— DrupalCamp Goa (@DrupalcampGoa) March 12, 2019

In the Mountains

We all highly appreciate the contributions Drupal community members make by becoming individual members of the Drupal Association, especially as it directly finances my ability to see people face to face at camps and meetups. I make every possible effort to spend that contribution wisely. So, on the return from India, I called off at Drupal Mountain Camp in Switzerland, where I had been invited to moderate a keynote panel on “The Future of Communities”, also involving Nick Veenhof, Imre Gmelig Meijling, Yauhen Zenko and Vincent Maucorps.

A recurring theme of the panel discussion was one of collaboration between the local associations, their members and each other. At the Drupal Association, we are working to aid that collaboration as much as possible and I was hugely impressed by the panel conversations. I learned more about how the local associations in Europe work with their members and each other to promote Drupal and facilitate growth. Truly a model to emulate across our global community.

One other thing - I very much appreciate that the event, thinking about its location, supplied a wonderful woolly hat rather than the usual t-shirt as a freebie. I know I'm not the only one who is aggrieved every time she is told "Oh, we only have straight fit t-shirts". Thanks Drupal Mountain Camp!

Drupal Mountain Camp woolly hat

But what about the elephants?

I never did manage to find any elephants whilst exploring India, or even in Switzerland. I did learn about a two “elephants in the room”, though:

  1. The Drupal community in India is extraordinary, doing great things, and I wasn’t aware enough of this. That is my fault and I intend to change that. I think we should all be looking to how we can learn more, too. It is very obvious that Drupal is in a state of growth in India and we should be cultivating that - I wouldn’t be surprised at all if the next webchick or xjm is already in India. We all gain by helping her grow.

  2. The Drupal communities in Europe are organising themselves in some really professional ways; using their established local associations to promote the project and members through tools like press releases, hosting local Splash Awards etc. These local associations in Europe are shining examples to other countries around the World.

Apr 21 2017
Apr 21

Commerce coupon module adds Commerce coupon facility to Drupal commerce.

Commerce coupon 7.x-2.x is recommended version. This version depends on Commerce Discount. Commerce coupon 7.x-2.x has many architectural improvements and new features which include integration with commerce discount, multiple discounts per coupon, integration with inline conditions. There are no fixed amount coupons or percentage coupons with this version. Instead, we use discounts and use them with coupons. 

Upgrading from Commerce coupon 7.x-1.x to Commerce coupon 7.x-2.x is not directly supported. It is two step process. As per module page on drupal.org,

"Commerce Coupon 7.x-2.x-beta2 has an upgrade path from 1.x to 2.x. It works for upgrading relatively simple coupon 1.x sites; mileage may vary if you have a lot of custom coupon functionality though."

So in order to upgrade to latest commerce coupon, we first need to upgrade to beta2 and then upgrade to latest version. 

Below are the steps to upgrade normal commerce coupon setup without any additional customization.

  • First things first, take a backup.
  • Upgrade to Commerce coupon 7.x-2.x-beta3 following standard upgrade process. You will need to add commerce discounts and inline conditions modules installed before upgrading commerce coupon.
  • Once updates are run, you will see your old coupons converted into new coupon and discount systems. Discounts are created for previous fixed and percentage coupons. 
  • Upgrade to latest commerce coupon version following standard upgrade process.
  • Make sure to give permission to required user roles to "Redeem coupon".

This process assumes that there is no custom coupon functionality is added and no additional modules are used along with commerce coupon. The Success of upgrade process largely depends on how coupon module is used and customization is done on it.  

Below are the steps to upgrade commerce coupon with Commerce Coupon by product reference module installed.

  • Take a backup.
  • Delete product reference fields from coupons.
  • Disable Commerce Coupon by product reference module.
  • Upgrade commerce coupon as outlined in steps 2,3 and 4 in upgrade normal commerce coupon.
  • Edit required discounts and add products.

This makes sure that this discount applies to specific products only. 

  • Give appropriate user roles permission to "Redeem coupon".

Since inline conditions are also installed, you can create coupons while creating discounts. 

You can also consider adding Commerce discount Extra module which provides various common discount condition and offer types.

Need more assistance regarding Drupal Commerce Module Development Contact us now and Feel free to share your views/feedback for any further queries.

Apr 10 2017
Apr 10

My Takeaways from the Drupal Mountain Camp Event, 16-19 February 2017, Davos, Switzerland.

~Climb mountains, not so that the world can see you but so you can see the world!~ And I was blessed to get the opportunity in the most beautiful place on earth! Imagine attending a Drupal Event in the scenic Swiss Alps (with temperatures plummeting to as low as minus 11)! The sights were no less than a fairy tale, and the Drupal learning – truly out of this world. No words can describe, no camera can ever capture the beauty of the place (and the learning from the event) - one has to live it, experience it and boy were I lucky! 

The 4-day Drupal Mountain Camp Event was held at Davos – a valley in Eastern Switzerland and surrounded by snow-clad, picturesque mountains. My hotel was located at an altitude, with the very relatively low level of oxygen. The experience was truly exhilarating – almost like Drupal coding while hiking! The venue of the Mountain Camp Event is an International Congress Center, host to many International conferences. The 4-day event, held from 16-19 February 2017 was a perfect combination of coding and (winter) chill, events and entertainment, food and fun. 

The first day began with a warm welcome of a delicious chocolate mountain – the Swiss are known for their chocolates, and the mountain was truly a finger-licking experience. While the days were spent in workshops and sprints – with extraordinary learning, evenings were fun-filled. On the Thursday evening, we got to try our hands at ice skating! Having only seen people skate in movies, it was a great chance for us to feel no less than movie stars! On the next evening, we got to enjoy an incredible sledge ride in the Alps - spinning down the slopes (at what feels like a million kilometers an hour) resulted in a great adrenaline rush. On Saturday night, we got to see a live ice hockey match between Davos and Zurich – thanks to the sponsors. And on Sunday, after a day spent in sprints, we could also ski and snowboard – god was I living a dream?

I was very lucky to have heard some great keynotes (especially on Open Source & API first Drupal), some eye-opening talks and sessions in the Drupal community, in addition to education, research, and Agile process tips for attendees of all levels (technical developers, business owners, and project managers). 

With this event, I experienced my many firsts! My 1st time in Switzerland, my 1st time as a speaker, my 1st sledging adventure, the 1st time I witnessed snowfall, and my 1st Live Hockey match! I was also privileged to attend the Speaker Dinner (don’t forget to catch the pictures on Twitter and Flickr). The social nights were fab – I thoroughly enjoyed the Swiss beer, made some great new friends, and danced to some peppy Indian and Bollywood numbers. 

I thought I was the farthest travelled attendee, all the way from India, while there was Lauri who came from across the world – Australia.  A memory: Signing on the Drupal Love board was fun, and it has been safely stashed by Ursin Cola.

All in all, a marvelous event! I would like to thank the organizers, sponsors, and speakers from the bottom of my heart, and also to those innumerable strangers who helped me find my way in a German speaking country, a place where English is not even an option! 


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