Upgrade Your Drupal Skills

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

See Advanced Courses NAH, I know Enough
Oct 28 2020
Oct 28

It is difficult and interesting to observe how products of intellectual work exist after their creation. Is anyone reading the written book? Is somebody enjoying the painted picture? Are people listening to the new song? Let's assume that is true. But is anyone commenting on the book on the forums or citing it on Goodreads.com? Is the price of painting going up? Are hundreds of thousands making TikTok videos on the song? With such metrics, authors of the work can get an insight into how their works change people's lives and the world's fate.

The same thing goes for scientific publications. Some research results can prompt some scientists to an in-depth study of the issue or even force politicians to give an update on laws. How will scientists, institutes, and funders understand that the hours of research have been well spent? They need specific quantitative and qualitative indicators that lie outside the realm of personal oral discussion.

The approach to popularity assessment of scientific research has changed with the advent of the Internet into our life. All this and much more make the scientific article headway: a link in a Wikipedia article, a post on a social network, an entry on someone's blog, a comment on that blog. Therefore, there emerged a necessity to expand the range of tools for measuring this success. Altmetrics was designed for that purpose.

How is ADCI Solutions related to science and measuring such metrics? We have our Bibliography & Citation product, which solves the problems of exporting and importing bibliographic data on Drupal CMS websites for institutes, research centers, and libraries. In this article, we will talk about the historical development of statistical methods for analyzing scientific publications, and how you can control the growth in popularity of such publications through an altmetrics badge.

From bibliometrics to altmetrics

Where did that all begin - the idea that any information can be assessed by the vestige it leaves behind?

In 1926, the American mathematician Alfred Lotka described the power-law distribution of publication productivity of authors belonging to any field of research. The linguist George Zipf as well as Lotka developed an interest in statistics and discovered another pattern - the word frequency law in natural language in 1932. In 1934, another discovery was made by the British librarian Samuel Bradford, who described the first application of Bradford's law of distribution to identify core scientific journals. And finally, in 1936, the American sociologist Robert Merton graduated with his doctoral dissertation at Harvard on the topic "Science, Technology, and Society in 17th Century England", which was important for the development of the scientific discipline of infometrics. Discoveries listed above laid the foundation for this discipline in the 20th century. But the main researchers of this field found the roots of infometrics at the end of the 18th and the beginning of the 19th century.

Infometrics is the study of quantitative aspects of information. It takes a little bit from each of the disciplines. Let's look at what disciplines we are talking about.

Bibliometrics investigates the quality and impact of the work for scientists and institutes in the scientific world via indicators such as the Hirsch index, citation index, impact factor, and efficiency index. Scientometrics uses the same bibliometric indicators and explores the development of science. Webometrics looks into the quantitative aspects of the construction and use of information resources, structures, and technologies on the Web, and drawing on bibliometric and informetric approaches.

Altmetrics: the manifesto by Jason Priem

Altmetrics takes a little bit from each of the disciplines above. It evaluates the contribution of scientists and institutions to science, as well as bibliometrics, but uses alternative metrics relevant to the Internet environment for this.

The term came from a hashtag on Twitter. Тhe co-founder of Impactstory - Jason Priem, was the first to use it. He considers his overriding goal is to provide the maximum availability of scientific articles online. In October 2010, Priem and his colleagues released Altmetrics: a manifesto. It says that ways of assessing the impact of articles on research activities remain valuable in practice, but they are slow and outdated therefore they don’t fit the present. The impact factor and other metrics became insufficient.

The need for a new methodology was urged on by the fact that:

  • articles are discussed in blogs and social networks,
  • articles are not embodied in the paper form only anymore,
  • now, their digital copies can be stored and processed in reference management software such as Zotero and Mendeley.

And such activities give rise to new ways to measure the impact of scientific work - altmetrics.

Jason Priem writes: “Altmetrics are fast, using public APIs to gather data in days or weeks. They’re open – not just the data, but the scripts and algorithms that collect and interpret it. Altmetrics look beyond counting and emphasize semantic content like usernames, timestamps, and tags“.

How and whom does Altmetrics help?

The year after Jason Priem's manifesto came out, the Digital Science company released Altmetrics. Product developers have taken on the role of those who look for information about mentions of research works in various alternative sources, process this information, and give it to their clients: researchers, institutes, publishers, organizations, foundations, and other interested parties. The collected information is visualized in a colored badge, such as a donut in which every color corresponds to a specific source.

The service monitors the following sources for the mention, citation, and links from scientific articles: 

  • Public policy documents,
  • Mainstream media,
  • Blogs,
  • Citations,
  • Online reference managers (Mendeley, Zotero, etc.),
  • Post-publication peer-review platforms,
  • Research highlights,
  • Wikipedia,
  • Social Media,
  • Open Syllabus Project,
  • Patents,
  • Multimedia and other online platforms.

The benefits that scientists and organizations received from the Altmetrics service is confirmed to have benefited by numerous cases. For example, Altmetric data helps the Biodiversity Heritage Library to identify its most popular content to better tailor its posts and the content the Library shares to ensure maximum engagement. “Springer Nature”, a British-German academic publishing company, is keen to transform the way it offers services to authors and readers, and to make sure they maximize the value of the new technologies they bring in - as a result, they found the solution in Altmetric too. With Altmetrics, MIT Press got the opportunity to gather data that helped them identify their most popular articles. And these are just some examples.

There are some conditions for Altmetrics to track citations:

  1. this publication should exist at least;
  2. work is assigned an identifier such as DOI, ISBN, PubMedID, etc. You can find your type of identifier in the list of identifiers tracked by Altmetrics. Special services are involved in the assignment of identifiers;
  3. work was cited in one of the sources which Altmetrics works with.

If any of these conditions are not met, then the donut will show nothing.

Let's move on from theory to practice.

How to add an altmetrics badge to the website

The badge with Altmetrics will be displayed on the website if you connect the Altmetrics service to the JavaScript library page:

<script type='text/javascript' src='https://d1bxh8uas1mnw7.cloudfront.net/assets/embed.js'></script>

You also need to add an HTML markup to the page, which will be replaced later with a badge:

<div class='altmetric-embed' data-badge-type='donut' data-doi="10.1038/nature.2012.9872"></div>

Pay attention that the HTML markup contains an attribute that includes the ID of the publication, which in our example is the DOI. Examples of using other identifiers, detailed instructions for pasting the badge are available on the Embeddable badges page.

The Altmetrics badges can be free to display on their academic websites for individual researchers. Institutional repositories are also permitted to display the Altmetrics badges for free. Altmetrics departments, academic websites, and subject repositories require a license. Please see this page for more information.

What is the Altmetrics module and how does it work?

The Altmetrics module is the part of the Bibliography & Citation (or BibCite) Drupal project, developed and supported by ADCI Solutions. BibCite helps to organize and save bibliographic data about the content ranging from web pages to books and scientific research works. The project also helps to design citation of sources according to thousands of standards that have been accepted at different times in different organizations.

The module solves a simple but important problem - adds a donut with its citation information to the page of a Drupal site with an article.

The module does not track anything and does not collect any statistics. It's just an easy way to insert the JavaScript code and the markup into your site.

How to set up an Altmetrics badge using the module

When you have one or two badges, it is not a problem to configure the markup yourself, and the instructions above will be useful. But when one bibliography contains hundreds of references imported from one place to another, then a dynamic component arises - this is an identifier (DOI, ISBN, PubMedID, or other) that needs to be inserted into the markup. In this sense, the Altmetric module makes life easier. It connects the JavaScript library of the Altmetrics service and itself configures the HTML markup for the donut. Without it, you would have to write code or use third-party modules such as Display Suite.

Oct 13 2020
Oct 13

Distributions and modules for an eLearning website on Drupal

In our list, you will find only those profiles (a website draft with dummy content) and modules that do not have a lock-status or “outdated” status, they are still supported by the community.

Opigno LMS

Opigno is a Drupal-based distro allowing to turn a CMS into an LMS.

Opigno LMS is fully compliant with SCORM 1.2, SCORM 2004 v3 и xAPI. It integrates with the JavaScript technology H5P, making it possible to create rich interactive training content.

Opigno Messaging and Opigno Forum modules provide opportunities for debate among students.

The Opigno instructor-led Trainings module is needed to simulate the presence of a teacher and to monitor attendance and rate students.

The system has its application store where apps can be downloaded and installed without having to update LMS.

BigBlueButton API

Since 2007, the BigBlueButton open-source system has been used in distance learning for video conferences. Teachers and students can share pictures, videos, PDFs, Word documents, show presentations, communicate in chat rooms, and even "raise a hand" if one wants to speak up. BigBlueButton API was released in 2010. It can be integrated with many systems, including LMS Moodle, the project management system Redmine, CMS Drupal, Wordpress, and Joomla.

Opigno Webex App

The WebEx is another conference service belonging to the Cisco organization. Developers give organizers of the instructional process the ability to create classes schedule and send invites to students by including Webex as an add-on tool in Opigno using the Opigno Webex App module.


Course allows you to build a course with any number of steps and consisting of any content entities, that is an item of data that includes text, images, attachments, etc.

Course credit is used to give students the record book.


One of the ways that teachers and students can monitor the progress and effectiveness of the curriculum - is to take tests and surveys. Quiz allows you to create multiple choice questions and save the results in a database. Progress and results can be displayed both during and after them.


The presentation of a diploma or certificate confirms the completion of the course, so this is a mandatory functionality for distance learning websites. The Certificate module Interface helps to format such documents as a PDF file, which is facilitated by HTML templates and integration with WYSIWYG.

Open Digital Badging

The digital badges on the student's profile are proof of their success during the learning phase. The Mozilla Open Badges program is responsible for creating badges, and the Open Digital Badging module is a provider for Drupal websites. If the website works on Opigno, then the Opigno Mozilla Open Badges App will help to befriend one and Mozilla Open Badges.

Social Login и Social Share

Registering through Facebook, Twitter, Linkedin, other social media networks, and sharing content and learning achievements through them is already the default option for most websites. Social Login and Social Share are solving these problems on a Drupal website.

Oct 06 2020
Oct 06


Can you hear this sound? That noise coming behind your back - this is a popular CMS for website building overtaking the other one. The website should be fast, simple, and user-friendly. Drupal is perfect for many types of websites. Earlier, we discussed the advantages of using Drupal for a university website, e-Commerce websites, and considered the creation of a food delivery application on Drupal. And today we have selected for you a few examples of healthcare Drupal websites, including the one created by ADCI Solutions.

Why Drupal is so popular in healthcare?

Let's take one step back to 1996. Congress passed the Health Insurance Portability and Accountability Act (HIPAA), which sets national standards for the exchange and security of protected health information (PHI). In May 2018, Europe dug a little deeper and added a General Data Protection Regulation (GDPR) that changes the way organizations collect, store, and transmit the personal data of EU citizens and residents. Essentially, GDPR grants EU citizens expanded control of their personal data.

In this reality, these new regulations are a problem for medical healthcare providers. Their websites must follow these guidelines and protect their patients properly.

The number of exposed records more than doubled between 2017 and 2018, and more than tripled between 2018 and 2019. In 2019, healthcare data breaches were reported at a rate of 1.4 per day, according to the HIPAA Journal. So, why do we recommend you the website based on Drupal? Drupal is a perfect fit for websites for medical websites! Why is this CMS often chosen by healthcare organizations?

  • The most secure option for organizations working with highly secure data. Drupal can boast of top-notch security for your website. The Drupal encryption system is HIPAA compliant to protect sensitive patient’s data.
  • A lot of modules. Drupal has thousands of modules and themes that provide the ability to customize user experience and deliver personalized data to patients and doctors online for improving patient experience and satisfaction. For example, Drupal's integration with the Electronic Health Records (EHR) system helps providers communicate with patients through a secure portal. Custom modules and plugins can also be created for unique business rules and needs. With minimal technical knowledge, they are easy to install and configure.
  • Intuitive administrative part. Moreover, many processes can be automated. Also, it has a certain logic and structure. It greatly facilitates the work of representatives of medical clinics, pharmacies, and other similar institutions.
  • Personalization. Thanks to flexible parameters, the website interface can be quickly customized as you need.
  • No royalties fee. It is open-source software.
  • Outside the control of the supplier. Drupal is a large active developer community. It is widely supported by a large number of qualified agencies and developers beyond the control of the supplier.

Drupal also has modules that can translate the websites into over 90 languages, which helps to improve communication with patients. Drupal's mobile-centric design allows healthcare professionals to use tablets to collect medical information and access records. This had affected the workflows and made additional changes to the user interface, to improve its interaction with patients and supplier satisfaction.

The latest version of Drupal is considered one of the richest and flexible Content Management System (CMS) platforms ever created. Drupal is used by hundreds of hospitals and healthcare systems today, including some of the most famous and effective hospital websites. So let's finish the theory and move on to live examples.

Jan 23 2019
Jan 23

The concept of the Internet of things is a trending topic and it has found implementation in numerous aspects. Computers, laptops, mobile phones, and other non-internet-enabled physical devices like cars, or smart grids can interact with each other. To do it they need a standardized interface called API (application programming interface). The advantage of using a unified interface is once you implement such a web service on your server, it can interact with a variety of client devices. In addition, it gives the ability to build a web application with separate back-end and front-end parts. You may use modern JS frameworks to make user interfaces more dynamic and achieve good UX. Many organizations integrate their mobile applications with back-end CRM, ERP, EAM, and other tools to improve their productivity.

We considered how to create API using the headless Drupal 8 approach in our previous articles, find them in the Useful links block. However, the functionality of a CMS may not have enough flexibility for the projects with complex business logic. In such cases, using a PHP framework may become a more preferable option. 

Symfony is one of the most popular Open Source PHP frameworks consisting of separate components. They are used in many large projects, such as Drupal 8 or Laravel. Symfony has an active community and stable support. Also, it has the expandable architecture of reusable components called “bundle”, it extends the functionality of the framework. The latest Symfony version has a lot of improvements, such an automatic configuration of bundles with Symfony Flex and simplified folder structure increase the speed of development.

In this Symfony 4 tutorial, we will create a basic server back-end structure for your application using the REST API architecture style. We will use a 'FOSRestBundle' bundle as a basis, implement 'get' and 'post' methods to create and show the list of resources respectively. Besides that, we will add the OAuth2 authentication with FOSOAuthServerBundle.

Create a Rest API

Firstly, make sure you have installed PHP 7.1 or a higher version and the Composer package manager to create a new Symfony application. After that, create a new project by executing the following command in the terminal:

Sep 19 2018
Sep 19

Here are some insights which were shared during the Dries’ session:

  • Drupal 9 will be released in 2020.
  • The next DrupalCon Europe will be held in Amsterdam 28 Oct - 1 Nov 2019.
  • Drupal became the fastest technology to install! Before it took 20+ clicks and 15 minutes but now you do only 3 clicks and spend 1.27 minutes! You may find a table of full comparison with other technologies on a slide in the gallery.
  • Dries also spoke about the Javascript Modernization initiative. Now the Drupal Community is trying to build a bridge to the JavaScript Community and modernize Drupal through API-first and JavaScript.

In the gallery below, you may see a full list of initiatives which will be implemented into practice soon.

Also, It was incredible to be among the top 30 companies which did the most of all contributions to the development of the Drupal CMS.

One more event which our team members had an honor to visit was Round Table with Dries and other partners and supports. There were a big number of business owners and representatives of different Drupal companies.

A variety of questions were discussed there. The main ones were: how to compete with other CMSs and how to promote Drupal. It was an almost two-hour discourse where everybody could tell about problems that Drupal has and suggest solutions.

The ADCI Solutions team wasn’t only a listener but had prepared our own activities: BoF on Drupal marketing and a session “How to boost your team members performance”.

There was a dynamic discussion at BoF. All places were taken and we were happy to see so many people who feel passionately about Drupal promotion as we do. A lot of Drupalers joined us and it was great to hear a big number of ideas, life hacks, and thoughts from people working with this CMS in different countries.

The main points which were touched during BoF were Drupal positioning, competition with other CMSs and between different Drupal companies, how to explain what Drupal is to non-tech people, and how to hire a Drupal prof.

The BoF’s participants determined the primary advantages of the Drupal CMS:

  • It allows you to see a result right away.
  • It is powerful and fast, as well as completely suitable for content-heavy projects.
  • It is an open source technology.
  • It is the best variant if you need a long-term solution because Drupal is highly scalable. You can change it in the future when your business is bigger.
Sep 11 2018
Sep 11

But there is one more point. What for we do all of it? We will list the main reasons for holding such an event.

Firstly, an educational conference helps to grow professionals. You can train your future employee or find somebody who will satisfy all your work demands.

Secondly, it will help you in building and developing your HR brand. Web developers and newcomers will know your company as a highly attractive place for work. It guarantees a constant flow of great staff to you.

Thirdly, Drupal Global Training Day is an amazing possibility to tell people about the Drupal CMS, show them its advantages, and explain how to work with this technology. We boost the Drupal adoption and increase the awareness of this brand. What’s even better, we see the result of our efforts: the beginners’ interest in Drupal.

Finally, we can pass on the tips and tricks which will help you to organize GTD in your country. Some of them can be obvious but they are essential.

  1. Get in touch with other GTD organizers. They can provide you with advice, info, and even some documentation which will help you to hold GTD.

  2. If there is an active Drupal community in your country, find Drupal enthusiasts who are ready to tell about their expertise at GTD.  

  3. Ask your team members if they want to prepare a report.

  4. When you choose speakers and report’s topics, don’t forget about the knowledge level of your attendees. For example, if they are beginners, don’t tell them about Headless Drupal, it is too complicated.

  5. Invite participants who are interested in web development and the Drupal CMS. It can be students of a computer department.

  6. Don’t hold more than 4-5 reports. It will be awesome if you find so many speakers but you should remember that it is hard to absorb a lot of information in a single shot.

  7. Make a coffee-break. It will help your attendees to understand all reports better and discuss them with each other.

  8. If you want to teach your attendees some practical aspects, try to organize such a workshop for them the next day.

Now you know everything: what our GTD 7 was like, why we (and other companies) do it, and even learn tips on holding your own event.

We wish you good luck! 

Check the photos in the gallery below.

Aug 17 2018
Aug 17

It feels fantastic when your work gets recognition! And we know what we are talking about.

The ADCI Solutions’ Drupal and Vue.js project got 7 (and 0.09!) points at Awwwards. You know, it is one of the most respectable rankings for web design and web development agencies. During the voting, 4 criteria are taken into account: project's content, design, usability, and creativity.

Our project wasn’t created especially for this competition or for a portfolio. And what is even more remarkable, it's not a typical creative agency website listed at Awwwards.

We made it for one of our client - a hurricane and security shutter manufacturer Alutech United Inc. They let our imagination run wild and we played with the design and chose an atypical concept.

We hope that our project will give an inspiration to web design and development professionals all over the world.

It is our first experience of taking part in such competitions, and we were on the edge of our seat right from the beginning. We want to say thanks to all who evaluated our work with credits, these 7 points have become a great start.

Aug 07 2018
Aug 07
 "id": "backstop_default",
 "viewports": [
     "label": "phone",
     "width": 320,
     "height": 480
     "label": "tablet",
     "width": 1024,
     "height": 768
 "onBeforeScript": "puppet/onBefore.js",
 "onReadyScript": "puppet/onReady.js",
 "scenarios": [
     "label": "BackstopJS Homepage",
     "cookiePath": "backstop_data/engine_scripts/cookies.json",
     "url": "https://garris.github.io/BackstopJS/",
     "referenceUrl": "",
     "readyEvent": "",
     "readySelector": "",
     "delay": 0,
     "hideSelectors": [],
     "removeSelectors": [],
     "hoverSelector": "",
     "clickSelector": "",
     "postInteractionWait": 0,
     "selectors": [],
     "selectorExpansion": true,
     "expect": 0,
     "misMatchThreshold" : 0.1,
     "requireSameDimensions": true
 "paths": {
   "bitmaps_reference": "backstop_data/bitmaps_reference",
   "bitmaps_test": "backstop_data/bitmaps_test",
   "engine_scripts": "backstop_data/engine_scripts",
   "html_report": "backstop_data/html_report",
   "ci_report": "backstop_data/ci_report"
 "report": ["browser"],
 "engine": "puppeteer",
 "engineOptions": {
   "args": ["--no-sandbox"]
 "asyncCaptureLimit": 5,
 "asyncCompareLimit": 50,
 "debug": false,
 "debugWindow": false
Jun 28 2018
Jun 28

Our formal recognition by Clutch is the direct result of those clients who took the time to interview with the firm in order to provide feedback based on the tasks accomplished alongside us. Here’s what a couple of ADCI Solutions’ clients had to say about their experiences:

“ADCI has a proven track record of consistency and responsiveness. Their developers are talented, driven, and dedicated to customer satisfaction.”

“ADCI continues to prove themselves a talented, professional, and affordable partner. Their budget and timeline estimates are remarkably accurate.”

“The enhanced product now includes more robust coding and reliable quality, thanks to ADCI Solutions’ existing proficiencies and eagerness to develop their skills even further. Their responsiveness, reasonable pricing, and ability to exceed expectations earned top marks across the board.”

We would like to reach out and thank our amazing clients who took the time to review us on Clutch. Thanks to their feedback, ADCI Solutions is also recognized as a top web development company in Russia by Clutch’s sister website, The Manifest.

Jun 19 2018
Jun 19


University websites need rich functionality. Often, they consist of a lot of pages with different types of content. It can be some lists of students, courses, books, a schedule of university events, just news, or a long-form article.  We will present you the list of Drupal modules you can add to your university’s site and get advanced opportunities to manage users’ data. Here they are. 


This module is a core which has narrow functionality itself but it provides flexible building blocks and APIs to create a custom e-learning system. Besides, Opigno has a lot of additional modules and you may choose the most suitable set of them corresponding to your expectations and goals. It means that companies are allowed to build their own simple solutions reducing the time of their creation. 

If you want to test and evaluate the Opigno module you may use their profile which provides a basic configuration. You won’t need a broad working knowledge of the Drupal 7 system for checking it. 

Room Reservations

The Room Reservations module was developed specifically for universities’ websites which need to manage the access to their study rooms and the use of them.
You may set it up according to your requirements and put a reservation system together in a short time. 

Bibliography & Citation

Bibliography & Citation allows keeping, outputting, exporting, and importing bibliographic data. Also, it has related modules which expand the BibCite possibilities: 

Bibliography & Citation - Migrate - migrate your bibliographic data from the Bibliography (biblio) module.

Bibliography & Citation - Altmetric - adds the Altmetric badges to BibCite reference entities. It allows you to display the mentions of your content on various social networks or different sites.

Google Scholar - provides the number of meta tags to help with
indexing of scholarly content/articles in Google Scholar.

User Progress API

The User progress API module was sponsored by the Pennsylvania State University. It has been developed for charting students’ progression throughout a system. 

In addition, this project provides views integration. It means that you can look through all collected data or export this information to any format you want. 


E-learning is one of the most suitable modules for online interactive courses for students. One of the features of the E-learning module is tracking all users’ results and answers. So, you will understand needs of the students better, and based on these results, you can make a personal offer or give them a detailed feedback more rapidly. 


With the help of the Certificate module, you may create and award PDF certificates. It has an interface for managing custom certificate templates and mappings. Besides, you may choose a particular criterion and this module will award students with certificates depending on those criteria. 

And one more feature is PDF outputting. 


This module allows creating online courses on your website. You may add any type of content and any number of graded or ungraded course objects. There is an opportunity to connect this module to the previous one to create a tokenized PDF certificates on a course completion.  


This module provides tools for authorizing and managing quizzes through Drupal. For example, you can use this module to create a test for students. All points will be stored in a database and you can look through them whenever you want. There are a lot of different question types which you can use. For instance, multiple choice, a short or a long answer, scale, etc. 

H5P - Create and Share Rich Content and Applications

If there is a large amount of content on your website, you definitely should look at this module. Using H5P, you will able to create interactive videos, question sets, presentations, flashcards, etc. 

You can create tasks or tests for students, add some video for watching, upload informative presentations and more. 


The Drupal CMS is great for university websites. It is very flexible and suitable for working with Big Data and a big amount of content. Find more common Drupal advantages here

You can add a lot of functionality and useful features to your site using these Drupal modules. As a result, it will become more convenient and user-friendly. 

It is worth saying, that most of them are appropriate only for Drupal 7. But don’t worry: if you need a module for a Drupal 8 website, we can update any of them to the last version of Drupal.

And one more useful thing. We have other interesting lists of Drupal modules. Have a look at them, too: 
1. 10 Drupal modules for quizzes;
2. 10 Drupal modules for communication with users;
3. Drupal modules for ratings;
4. 10 free Drupal modules for integration with Social Media.

Jun 05 2018
Jun 05


A release of new versions of programming software is fraught with considerable difficulties - there always may be unexpected errors in the process of deploying a web application to the environment that leads to a non-working application in production. In order to minimize these risks, the methodology of continuous deployment is used. The basis of this methodology is the deployment pipeline, that allows us to automate testing and deployment of the application, thereby increasing the speed of the deployment and reducing the risks in a process of releasing a new version.

If you are using the Gitlab platform for your project, it already has a built-in CI/CD support. Together with free private repositories, a bug tracker, and other features, it makes the cloud-based service useful not only for storing code but also for testing and deploying. 

In this article, we will look at the configuration of the pipeline using Gitlab, configure necessary files, learn how to run building of the application and unit tests on a separate docker image, as well as automatically send the built application to a staging or production server. And all of this we can do just using a couple of lines in the configuration file! Sounds interesting? Let's start!

Configuring GitLab continuous delivery

First of all, you need 3 things to start using Gitlab CI: 

1. The working instance of gitlab or gitlab.com.
2. The configuration file with the description of the pipeline .gitlab-ci.yml in the root directory of your project.
3. The configured gitlab task runner, which executes the commands described in the pipeline.

Gitlab Runner is the project that is used for execution of jobs described in the .gitlab-ci.yml file and also it communicates with Gitlab using its own API.

In addition to installing an own runner on a custom hosting, you can use ready shared runners hosted on Digital Ocean. To do this, on a Gitlab project page go to settings-CI/CD-runner settings-enable shared runners in the settings of your project. There you can also find the documentation on installing your own runner on a dedicated server.

After we've finished with the runner, let's take a closer look at the deployment process. The pipeline of Gitlab consists of several stages, by default it is build, test, and deploy, each of them consists of 1 or more ci jobs. Jobs in Gitlab are independent tasks that can be performed in parallel. After completing all the jobs at one stage, the runner starts to execute the next stage.

Build and test stage

Let's create the .gitlab-ci.yml file in the root of the project and specify our custom stages: 

May 25 2018
May 25

Also, from the report of Artyom, our listeners learned that it's possible to get to DrupalCon! There are several variants on how to visit such an amazing Drupal meeting! You can become a speaker, win a grant, save up money for this trip, and win a whole trip covered by the organizational team, like it happened prior to DrupalCon Nashville. All you need is a bit of obstinacy and everything will work out.

Then came the turn of serious technical reports. Anton shared his thoughts on the CKeditor and Paragraphs: which one is better in his opinion and why. Anton told about the differences in all aspects: settings, work, layout. Also, he showed how you can add any type of content on a website page using one of these tools.

May 08 2018
May 08

How to get Drupal 8 site data to a mobile app

Imagine a situation: your mobile application needs to get some information from your site on Drupal 8 using JSON. How to do it without much effort and installing additional modules, how to change the JSON array programmatically, and send the JSON data with and without using Views - all of these you will learn from this article.

Several ways to create and send data in the JSON format in Drupal 8

Good news! You do not need to write code or download additional modules to configure the sending of a JSON data using REST and to customize a JSON array. Everything you need is already in the core of Drupal 8. First of all, you need to install the Views and Rest modules and determine an exported content type. If you have never worked and are not familiar with the Rest module, I recommend that you familiarize yourself with this guide before reading the rest of the article.

Send the JSON data with REST and Views

Step 1

Create a new view. At this step, you just select a name, content type, click “REST EXPORT SETTINGS”, and set a path via which you will later get the data in the JSON format.

Apr 29 2018
Apr 29

There’s the book about givers and takers that I’m reading right now. Adam Grant, the author, claims the good will conquer the evil, a poor girl will find her prince, the givers will triumph over the takers and exchangers. That sounds too sweet, but Adam wins me step by step with his statistics and researchers. Here’s my little feedback on what I’ve seen during 4 days at DrupalCon Nashville: as a volunteer and a grant receiver, as an attendee and a Drupal team member. The little feedback on the Community of givers. 

Drupal team member and an attendee experience

I work for the great team ADCI Solutions and it’s the place where I’m becoming the person and the professional I want to be. That was them who motivated (and pushed haha) me to apply for DrupalCon Vienna and DrupalCon Nashville. Eventually, it worked out! 

I knew what DrupalCon is like but it didn’t cease to impress me. Music City Center embraced me with all its countless rooms and people, people, people around me! If you haven’t been to DrupalCon this year or haven’t been keeping an eye on it, this time there were several more session tracks like Building Community, Technical Leadership, Ambitious Digital Experiences - everybody is welcome, literally. 

My colleague Marina was chosen to deliver the session on leadership - more than 80 people came if my counting skills don’t give up on me. And all together - me, Marina, our CEO Alex and team lead Artyom initiated the marketing BoF. Check the outputs here. We were lucky to have a rather international gathering: Russia, Canada, the USA, the Netherlands. 

Besides the official schedule, how does DrupalCon feel like and look like? You are impatiently waiting for a morning to come to get up early and hit up the conference venue. There are so many Drupalers you still haven’t talked to. There are so many discussions and BoFs to participate. Especially I loved the First-Time Attendee Social. It charged me with energy for the whole week and let my fears go. 

Spice it all up with parties and Nashville’s big city lights - it feels magical (or probably I am still under the impression?). 

Apr 02 2018
Apr 02


Each category inside of a dashboard contains references to the documentation. Acquia provides extensive documentation and a number of articles about working with Cloud and Drupal, writing modules, working with drush aliases, ssh, cron, rsync, etc. - lots of useful things for the development process.

Acquia provides services that can be integrated into a site hosted on Cloud.

Acquia insight

Acquia Insight is a tool that looks through a site, evaluates its performance and security, and gives out Acquia Insight Score. A higher score means that fewer issues have been found. If you have ever struggled to explain to a client some technical problem the site has (e.g. why PHP code should be removed from blocks and panels), Insight may help you by highlighting these problems in a report and lowering the overall Acquia Insight score. Clients would like to see a nice green mark of “100%” there instead, so Acquia Insight can help you convince them to approve tasks on refactoring and optimization.

Acquia Search

Another service that works with Cloud is Acquia Search. It replaces a default site’s search through a database so it works faster. Acquia Search is a combination of Drupal module and software configuration on a server and it is based on Apache Solr and Facet API. However, you should be careful with the configuration of search indexes on different environments when using this module, otherwise, nodes from a dev site (or even a local machine) can make their way to search results on a live site. To prevent that, search indexes should be set in the read-only mode on all environments besides prod.


To sum up, Acquia Cloud is a hosting platform that integrates with a development workflow to help you spend time efficiently. By providing developers with isolated environments for different purposes, centralizing deployment in one interface and giving tools and documentation on how to use them, Acquia Cloud saves you time and effort.

Now you know some ways how cloud hosting can improve your work process, so you can test them yourself with a 30-day trial application on Acquia Cloud Free.

P.S. In case you have missed part one of this series of articles - check out what benefits you can get from another cloud platform - Pantheon.

Mar 20 2018
Mar 20

This spring weekend was really fruitful. And all of this because of Drupal Global Training Day which we have held for the 6th time. We are proud of the opportunity to be a part of this amazing event. The ADCI Solutions team is still the only one who holds GTD in the whole Russian Federation! So our participants had the really unique possibility.

This time we decided to make this event even more interesting and useful and divided the programme into 2 days. The first day was a theory day, and the second was full of practical tasks.  But let’s dive into the details of Drupal GTD in Omsk.

On the first day, newcomers listened to 5 reports on web development team’s work. Our speakers told about each part of a project work from the beginning till the end.
From the Denis’ speech, the audience learned how a whole project is designed. Denis narrated about each role in a web development team and how they should work for the successful finish.

Tanya told about web designers’ responsibilities and tasks in the project. She shared all of her favorite work tools with Drupal GTD participants. Also, Tanya referred to the question of empathy and said how it’s important to love your colleagues.

Then, Artyom and Sasha showed the back-end part of work. They explained the value of it. “If something breaks in the back-end part, the user will notice it because the site simply doesn’t work”, - Artyom said.

Guys from the front-end department - Maksim and Dima - told about their job. They shared tools and useful links with the help of which newcomers could dive into the JS world.
And the brilliant end of our Global Training Day became the Iuliia's report on the Drupal Community and Open Source features. She narrated real-life stories about people from the Drupal world who became successful.

We heard a lot of warm words from our participants and were waiting for the second day with a great impatience.

On the second day, Marina and her assistants held a captivating code competition. They showed to newcomers how to build their own website with Drupal, how to make a custom theme and custom module. To our great pleasure, all of the teams got the tasks done.
Look at the photos from the 6th Drupal GTD in Omsk in the gallery.

Mar 13 2018
Mar 13


Vue.js is a great framework for developing different kinds of web applications, however, it has a problem with SEO: the asynchronous content of an application can't be optimally crawled by search engine bots, so it could be a huge problem for your business. In this article, we will tell you about one of the easiest ways to resolve this problem and, at the same time, to improve the UX of your application. Yes, we will talk about prerendering.

Prerendering is a process to preload all elements on the page and generate the static HTML of your Single Page Application.

Advantages of prerendering

The usage of prerendering has the following benefits:

  1. SEO. Yes, finally, we can solve the problem of SEO for sites with asynchronous data: all such data will be preloaded before the crawler will index your site.
  2. Speeding up page content loading. The user can get an access to your application even before the entire JavaScript loads which significantly improves the UX of your application. No one likes to wait a long time.
  3. Cheap graceful degradation. This point follows the previous one. Now even users of old browsers or users with a disabled JS or a slow device have the access to your application. Of course, they are not able to fully interact with it but they can access important information instead of seeing an empty page.
  4. Rich Previews. All unique OpenGraph metadata are prefetched correctly now. Share your site on the Facebook and other socials, to expand target audience.

The official Vue documentation proposes to use the prerender-spa-plugin for prerendering. In common, the plugin does the following steps:

  1. It creates an instance of Phantom JS and runs the application.
  2. Takes a snapshot of the DOM.
  3. Outputs the snapshot to an HTML file in our build folder.

All right, let’s see how it works in practice.

Practice: prerendering in a Vue.js application

For demonstration, I will use the application which was created in my previous article about a single page Vue application. Get familiar with the project and start with building a simple SPA following the guide in the article, or, if you want to continue right now, just clone the repo and jump to the step 4 in that guide:

$ git clone [email protected]:DChuchin/vue-spa-tutorial.git
$ cd vue-spa-tutorial
$ git checkout step-4

Now install the plugin:

npm install --save-dev prerender-spa-plugin

After that, we need to configure the plugin for the correct work. Let’s go to webpack.conf.js and add the following settings:

var path = require('path')
var PrerenderSpaPlugin = require('prerender-spa-plugin')

module.exports = {
  // ...
  plugins: [
    new PrerenderSpaPlugin(
      // Absolute path to compiled SPA
      path.join(__dirname, '.'),
      // List of routes to prerender

Here we specify a directory from which we want to get a page for prerendering. In our case, this is the root directory. Also, we should add a list of routes which we want to prerender. For demonstration purposes, I will take just first four posts.

We should also take into account that we get data asynchronously, so if we carry on building the app following this approach, we’ll get a generated HTML with no content. To address this issue, the plugin offers three next options (check the documentation for more info):

// NOTE: Unless you are relying on asynchronously rendered content,
        // such as after an Ajax request, none of these options should be
        // necessary. All synchronous scripts are already executed before
        // capturing the page content.

        // Wait until a specific event is fired on the document.
        captureAfterDocumentEvent: 'custom-post-render-event',
        // This is how you would trigger this example event:
        // document.dispatchEvent(new Event('custom-post-render-event'))

        // Wait until a specific element is detected with
        // document.querySelector.
        captureAfterElementExists: '#content',

        // Wait until a number of milliseconds has passed after scripts
        // have been executed. It's important to note that this may
        // produce unreliable results when relying on network
        // communication or other operations with highly variable timing.
        captureAfterTime: 5000,

        // NOTE: You can even combine strategies if you like. For example,
        // if you only _sometimes_ want to wait for an event to fire, you
        // can create a timeout by combining captureAfterTime with
        // captureAfterDocumentEvent. When combining strategies, page
        // content will be captured after the first triggered strategy.

That’s all, folks! Now if we build the application, we get a prerendered HTML. If you want to manage metadata, you can use one of the available plugins for Vue, for example, vue-meta. For instance, let’s add a unique title for each page. We need to instal the plugin for this.

npm install vue-meta --save

Add it into main.js

import Meta from 'vue-meta'


const router = new Router({


And insert the following into src/components/Post.vue

metaInfo() {
  return {
    title: this.post && this.post.title,

It’s enough to make the content of the application indexed and also available for users with a disabled JavaScript. Now search engines and social networks can read meta-information of our site. Also, we succeeded to reduce the load time to the FMP (first meaningful paint), the browser doesn’t wait for the full load of JavaScript but starts rendering our page as soon as HTML is loaded. As a result, a user can start receiving information from our site earlier.

When you don’t need prerendering

Using the simple plugin prerender-spa-plugin on a build step you can easily improve search engine optimization and create the better user experience of your Vue application. Unfortunately, there are few cases when using prerendering is inappropriate.

  1. User-specific content: some page’s content, e.g. user profile page content, should be shown only for a specific user. On the build step, we don’t know who exactly will open this page, so we can’t prerender it. Anyway, if we did it, we would open user’s private information to everybody.
  2. Frequently changing content: if you work on something like a chat or some online trading application or real-time game where content must be always relevant, usage of prerendering might be ineffective as it displays an old content until a client-side JS takes over with the latest data. As a potential solution, you could set your build to re-prerender every time as data changes, or often enough to be sure that content is relevant. But it might be very resource-consuming for the server. For the data that is updated even more frequently than every minute, you should avoid prerendering.
  3. A large number of routes: it is not a good idea to prerender thousands of routes as this will take a lot of time to build your application.

In these cases, the best way is to use server-side rendering which you will be told about in the future article.

Useful links

The official Vue documentation
The Prerender SPA Plugin documentation

Feb 11 2018
Feb 11

Hello girls and boys! Today I want to talk about the trends that I was tracking the past year. But first I want to mention how I feel about articles like these. I think that the stupidest thing a designer can do — is to simply list the trends with awesome pictures from dribbble.com. How does it work?

Step 1. Go to the dribbble.com.

Step 2. Copy and Paste shots from «Popular» to your Google document.

Step 3. Write 2 or 3 sentences why these shots are popular now.

Step 4. Get the «Claps» or «Thumbs-up» from people who like pretty images.

These «Top Trends» don’t include really useful and resourceful information for young designers and your colleagues. If you want to create something interesting, show your reflections! You can write how these projects help you in work, or what you like in these streams of trends.

In 2017, we couldn't help but see how the design community promotes new styles and creative solutions in all areas of design. The big bang illustrations, substandard methods in branding, revolutions in the virtual technologies, nostalgy of 80’s, and many other interesting design solutions in the digital space.

In this article, I want to place the tendencies that are really interesting to me. And, in my opinion, these trends will be developing in 2018.

I'm a fan of a system approach. I love studios and teams of big products that create inner Design Systems and promote them to the masses.

The systems thinking creates a pattern that helps solve many issues in development and users interfaces design. The products that were created with Design Systems result in a greater efficiency than works done simply with the help of beautiful pictures.

For creating Design Systems yourself, the experience and knowledge of all teams members are essential. You can conduct a dialogue with your team and create a design system for your company. And then all the brand assets will contain certain rules. The system will help your company create new solutions for all design needs: website, mobile app, illustrations, events, advertising etc.

Below you will find the examples of products and promo-projects of my favorite studios that created Design Systems. All new interesting studios always save and share them with each other. Now we working on our design guide for our company needs, too.

Design Systems

designsystems.com by Figma

2017 has shown a real breakthrough for illustrators and their relevance. The most popular companies used the potential of young and true professionals in Illustrations and created the absolutely new brand identity for products on websites and mobile apps.

Graphics movements, crazy brushes, and unique styles of illustrators amaze with their diversity:

  • typical flat
  • isometric projections
  • noise like a power tool
  • story animation
  • soft and fluidity shapes
  • variable style combinations

True professionals and underground artists with a personal style and finely-honed skills will always be relevant. The list of the most popular brands always grows. In the future, we will see more wonderful and stylish products. Attaboy, illustrators! Well done!

Commercial Illustrations

Malika Favre

Commercial Illustrations


A modern designer is a designer who uses animation. We can create animation for everything: user interfaces, illustrations, typography, logos, etc. A vivid design is a source of emotions, and it brings the absolutely different perception of content.

Why do we empathize with characters from the Disney cartoons? When I look at Bambi, which was created in the year 42 of the last century, I still cry and sympathize with this story. Many factors influence this, of course. But Walt Disney managed to create such an approach in animated cartoons that helps us enjoy the most lively and realistic characters.

The same goes for design animation. A designer should tell stories and show the evolution of his/her design decisions, and not just make beautiful static layouts. In addition, you can learn Disney's Twelve Basic Principles of Animation. And create new realistic projects with your story.

Movement: UI, Characters, and Logo

by Adam Grabowski for Google

I believe that five years later every teenager and adult will have Virtual Reality Glasses. And we are going to a fight on laser swords in the mountains with the awesome nature, right in our rooms.

Now we see how VR is making a revolution. Many different promo-websites and games from big studios start on a worldwide level. You with your friends can visit an exhibition of modern art or go to a forest straight from a sofa. Designers can paint with a brush in the air. And all this is very cool and powerful, in its own way.

In 2017, our CEO visited the DrupalCon conference in Baltimore. He brought several Google Cardboards to our team. We are still having fun with these glasses: arranging carousels on our office chairs and enjoying new promo-websites of crazy Russian and foreign studios :-)

The rise of VR (Virtual Reality)


Thanks to the teamwork of Google, Adobe, Apple, and Microsoft, we can imagine the creation of a user interface, branding, graphics, etc. in all creative fields with a new kind of typography — Variable fonts.

Imagine that one font family can include all of the styles options: weight, height, a paragraph, letter spacing, etc. In one project, we can create styles combinations for various goals including: Regular, Bold, Italic, maybe Black, and all of these — one font.

OpenType Font Variations is a new technology that requires substantial updates and implementation in our typical working process. Also, it has a very limited backward compatibility. So, we will wait for new updates and transformation of designers and web developers work.

In 2017, I discovered for myself and my colleagues a crazy style that has been existing since the 2000s  — Brutalism. Personally, I really loved it from the bottom of my heart. And on the corporate party, we even designed a game for our big team — «Brutal design or poor design».

Brutalism is a powerful architectural style from the 1950s. The main features of this style were massive concrete usage, sharp angles, and rough shapes. This style doesn't need to look pretty as long as they serve their goals.

User Interface in this style goes back to the basics of website design and reminds us of the Internet's early days. Bold and large content, custom colors and pictograms, fun and weird photos scattered all over the space, sloppy layouts systems. All of this isn’t a real style, but in such projects, we see a lot of humor.

Brutalism with its idea, shapes, and content shows us that design it is not only aesthetics in its traditional sense. This style shows to viewers that aesthetics isn’t necessarily elegant and that websites don’t have to be only selling.

Again, no one expected that Helvetica Light used by the most popular brand can smoothly evolve into Bold and still look cool ;-) You just look at these work of crazy designers. They are beautiful!

Brutalism in the new reality


 Brutalism in the new reality

Southbank Centre

Websites that present a product or a company through a story and power content will always be on a big step ahead of those that display products using only pretty images. The product that is promoted by only “awesome” or really awesome graphics goes out of fashion very quickly and a designer has to create a new solution with the current trends.

A qualitative and seriously robust text will always be in high demand in the digital area, products, mobile applications, branding, and so on. The designer should be bound with the text: read about an experience of many different designers, learn how to use content in case studies and in live projects, and, of course, the designer can write about his/her own background in the profession and share a work experience.

When you work on design, you must always think how a text will work and be friends with it. In addition, you need friends and more communication with marketers, managers, and all who work with you on a project.

In the digital products, we are accustomed to seeing the modern and power Grotesque font families in combination with typical grid systems of designers layout. But now, we can see how big brands are choosing more traditional solutions for work with the typography and the graphic design.

Increasingly we can meet Serif Fonts in the UI Design. For example, that can be applications for reading big articles or just beautiful website with a perfect work of a designer. Also, you can see this trend in posters, branding, and everywhere it is appropriate.

Designers create more lettering and new interesting fonts. Russian font designers start to steadily use Cyrillic and create more wonderful font families which we really want to use in the world projects. And I am sure that we can show how Russian design can be unique and independent of the world designers community with its own school of design.

Bold typography and Serifs return to the web


Trends are cyclical. Now everything that surrounds us - fashion, games, music, popular films and serials, posters - all of this are trends from the 80's and 90's.

Colors, images, patterns, and favorite characters are replaced by others. And now instead of soft and cute colors more electric hues colors and palettes come. With moving away from super-duper flat characters, we can find an inspiration in new shapes, different dimensions, emotion, wonderful colors, patterns, and textures of that time.

Today, successful personalities are people of the 80’s and 90’s. And it's not surprising that fashion trends intersect with the most popular and influential people of our generation. Maybe, the noisiest and popular solutions in the design are created in order to remember the old days and enjoy the nostalgia.

Design Inspired by the 80's and 90's


Design Inspired by the 80's and 90's

by Shuka Design

Now in the world, the robotics development is gaining momentum. Hence, a lot of games, movies, comics, and promotional projects are dedicated to cyberpunk.

The technical and industrial designers, illustrators, and graphic designers amaze with their diligence and results. These wonderful works are precisely deserving attention. I really love monitoring these projects and find inspiration in everything that I consider interesting and indicative.

The robotics together with the digital design and a neon light make a perfect combination, I believe. When I go to movies to watch «Blade Runner 2049» or «Mother!» I take many design ideas from the movies for myself: characters, colors, animated credit titles, new emotion, of course. After that, I always analyze everything: assembling, music, actors, scenes, and story. All of these materials from one film I absorb inside myself. This affects my work, imagination, and perception in all spheres.

In 2017, we saw many different graphic solutions with cyberpunk style and in 2018 we will see something new and more dazzling.

Cyberpunk and Glitch effects


I want to repeat one thought and add a one new.

First, don't learn only from digest and articles that are created by many designers. I am one of those designers ;-) Look for the information and keep it for yourself. Learn how to organize «favorites» in your browser, apps, and social networks. Fall in love with the order and always write your own thoughts about the works of other designers.

The second thought that I want to emphasize for everyone:

«All the designers can use a variety of graphics solutions. It is just tools and a demonstration of skills. Anyway, all of your design should be alive and emotional. All of the rest doesn’t matter.»

Thank you so much for reading all of my thoughts about modern trends. I hope that my article was useful or at least interesting for you. If you have questions or you just want to chat with me about design, email me: [email protected] And see you in 2019!

Feb 07 2018
Feb 07


A basic web hosting stores code and a database of a site and makes it accessible for internet users. However, modern hosting platforms do more than that - they act as a tool of the development process. Acquia Cloud is one of such modern hosting platforms that can enhance your work in a number of ways. Here are some of them:

  • isolated environments for dev, stage, and prod;
  • workflow and git support;
  • basic configuration controllable from a dashboard;
  • extensive documentation;
  • Acquia Insight and Acquia Search.

Let’s look at them in detail.

Isolated environments

Acquia Cloud provides 3 isolated environments out of the box: dev, stage, and prod. Each of them is used for different purposes: a common approach is to test changes on dev, move them to stage to show to a client, and deploy to prod once the client approves them. Each environment has its own code instance, a database, and files. For an initial site import, you can upload a database backup and files to the environment using the ssh connection. Later, the database and the files can be moved between environments by using drag-and-drop in a dashboard. Code can be switched between dev, stage, and prod, too. And that’s the next point.

Acquia Cloud: Isolated environments

Workflow and git support

Acquia Cloud provides a git repository per site (aka application) with different branches or tags being deployed on different environments. As a developer, you are free to use whatever git workflow suits you and a project better, so code moves from one environment to another the way you want. Combine this with the ease of moving a database and files around - and the overall workflow between dev, stage, and prod becomes fully controlled by you, the developer! If you are familiar with the workflow of Pantheon, you already see how flexible workflow on Acquia Cloud is. Of course, you can work in the way Pantheon suggests, you just don’t have to. Acquia provides the workflow recommendations but it’s up to you whether to use them or not.

For current projects, we use this workflow.

There are 3 main branches - master, dev, and stage (the last two are created from the master). The dev branch is deployed on the dev environment, the stage branch is deployed on the stage environment, and a relevant tag created from the master branch is deployed on the production one. Tags are used on the prod to prevent recent master branch code updates from appearing on the live site until we want that explicitly. Also, it’s easy to switch tags around if any fixes should be applied. We create a feature branch from master to add new features to the site, and later merge the results to the dev and then to the stage branch. Once changes are checked and approved we merge the feature-branch back to the master, create a new tag and deploy it on the prod environment.

Dashboard Interface

There are more dashboard interface options available than just switching branches around environments. Here some actions available via the interface.

  • Control the workflow of code, files, a DB.
  • Create and download database backups.
  • Clear a varnish cache.
  • Set up cron jobs (you can set up a time frame, a command to run or an url to visit).
  • Add a ssl certificate, enable an https access.
  • Watch log records appearing in real time. Multiple kinds of logs can be watched: list of requests to a web server (access.log), normal drupal watchdog, a list of php errors.
  • Download most recent logs.

Acquia Cloud: logs

The interface also reminds you how to access a git repository and how to connect to a server via ssh. There you can download backups of older logs, upload files via rsync.

Acquia Cloud: scheduled jobs


Each category inside of a dashboard contains references to the documentation. Acquia provides extensive documentation and a number of articles about working with Cloud and Drupal, writing modules, working with drush aliases, ssh, cron, rsync, etc. - lots of useful things for the development process.

Acquia provides services that can be integrated into a site hosted on Cloud.

Acquia insight

Acquia Insight is a tool that looks through a site, evaluates its performance and security, and gives out Acquia Insight Score. A higher score means that fewer issues have been found. If you have ever struggled to explain to a client some technical problem the site has (e.g. why PHP code should be removed from blocks and panels), Insight may help you by highlighting these problems in a report and lowering the overall Acquia Insight score. Clients would like to see a nice green mark of “100%” there instead, so Acquia Insight can help you convince them to approve tasks on refactoring and optimization.

Acquia Search

Another service that works with Cloud is Acquia Search. It replaces a default site’s search through a database so it works faster. Acquia Search is a combination of Drupal module and software configuration on a server and it is based on Apache Solr and Facet API. However, you should be careful with the configuration of search indexes on different environments when using this module, otherwise, nodes from a dev site (or even a local machine) can make their way to search results on a live site. To prevent that, search indexes should be set in the read-only mode on all environments besides prod.


To sum up, Acquia Cloud is a hosting platform that integrates with a development workflow to help you spend time efficiently. By providing developers with isolated environments for different purposes, centralizing deployment in one interface and giving tools and documentation on how to use them, Acquia Cloud saves you time and effort.

Now you know some ways how cloud hosting can improve your work process, so you can test them yourself with a 30-day trial application on Acquia Cloud Free.

P.S.: In case you have missed part one of this series of articles - check out what benefits you can get from another cloud platform - Pantheon.

Migrate my site to Cloud

Jan 18 2018
Jan 18

The Bibliography and Citation - Altmetric module is an addition to the existing Bibliography and Citation module. Bibliography and Citation is a module that allows keeping, outputting, exporting and importing bibliographic data. The library we used is from the official CSL style repository with over 8000 styles. Those styles are available without charge under a Creative Commons Attribution-ShareAlike (BY-SA) license. Learn more about Bibliography and Citation here.

The Bibliography and  Citation - Altmetric module adds Altmetric badges to reference entities provided by the "Bibliography & Citation - Entity" submodule. Altmetric badges (donuts by default) visualize the influence of your published content and show a number of times your content was mentioned.

How does it work? Each donut gives your website visitors one-click access to the collated record of online attention for each piece of research, where they can browse all of the original mentions and shares associated with it.


  • The module Bibliography & Citation

The module is under an active development. If you have any questions or need more information, please, contact us.

Nov 15 2017
Nov 15

Drupal Cafe #16

Hello, our Drupal friends! We are happy to inform you that one more Drupal Cafe was held on that Saturday. It was already the 16th time when we made it.

On that Saturday morning a lot of experienced Drupal developers and newcomers gathered together in ADCI Events Hub. We felt delighted that all of them chose Drupal but not sleep.

Drupal developers and newcomers gathered together for speaking about Drupal

That time we had decided to add a little bit of an interactivity and suggested voting and commenting all reports to our participants while their impressions were still fresh. A maximum score for a report was 5 points. And some reports had a 5 points rating but we’ll talk about this a little bit later.

At Drupal Cafe #16 more than 70 people were present. They listened to 5 excellent reports about Drupal, development, and IT company’s work.

In our program were such themes as:

  1. ADCI Solutions at DrupalCon Vienna
  2. Price of implementing the Headless Drupal approach
  3. How to render Vue.js applications on a server and what does it have to do with Drupal
  4. Drupal: evil within?
  5. 14 principles of Toyota for IT companies  

First speakers were Marina and Denis. They told about DrupalCon Vienna and their impression. Denis told about the latest news of the Drupal world and noted that Drupal has grown and has changed and, of course, it has gotten better since the previous version. The report was given 4.8 points.

A report about DrupalCon Vienna

The next speaker shared an engrossing business case: how to create a Headless Drupal app and which problems can appear in this work. He told about a project which was made with the help of React.js and Drupal. Experience of these web developers was given 4.9 points.   

Headless Drupal apps: React.js and Drupal

In one of the reports a topic “Vue.js and its rendering” was raised. Dima and Erlan told about methods and tools which can help you make this process qualitative, reliable, and fast. The report was quite voluminous, the guys told about problems with SPA and how to solve them, they also touched on the topic of rendering and various tools for carrying it out. The audience rated the report at 4.75.

Vue.js and its rendering

At the end of the conference two reports took a maximum score.

Widespread errors of developers and their consequences were discussed in the report by Sergey. He spoke about bad code and showed examples to the participants. He also told why they appeared, who was blamed - Drupal or a web developer.

Widespread errors of developers and their consequences

The last speaker at the conference was Serik Beisenov, a man who tried all jobs in an IT company - a sysadmin, a test engineer, an automatization engineer, and now he is a CEO, and he has learned everything about his work. He told us what principles made Toyota one of the leaders in the car market, and how to implement these principles into IT company's work.

What principles made Toyota one of the leaders in the car market

We had been waiting for Drupal Cafe #16 for a long time, and now that it passed we can confidently say that it was not in vain. It was an interesting conference, full of quality reports, friendly atmosphere. It was nice to learn that Drupal Cafe has regular listeners who attended all of 16 events. Now we are going to prepare for the next conference, and you can look at the photos that you will find in the gallery below.

Oct 31 2017
Oct 31


Let's imagine that you (or your customer) have a great idea of a project. You are working on it locally alone. Later you build a team and you need to share code among teammates and show an intermediate result to a client. You are not a DevOps - you don’t know each teeny-tiny technical detail of server configuration. More than that - you don’t want to know. You like just to code! And, of course, you don’t want to hire a special person to do it. What to do? You are searching for a shared hosting. And what you can see - almost all shared hostings provide you with an ugly cPanel interface and force you to upload code via SFTP. SFTP? Are you kidding me? It is not the year 2000! You need at least: an SSH access, Git, and Drush. You’d like to have a simple and convenient administration panel which allows you to do some minimal server or PHP configuration. You’d like to have isolated environments and technical domains. And of course, you’d like to keep it simple.

Sounds like a story of your life? If the answer is ‘yes’ - this article is for you.

In this and the following articles, we will tell you about popular cloud hostings: Pantheon and Acquia Cloud. We’ll observe advantages and disadvantages based on our development experience.

Let's talk about Pantheon first. Pantheon is a Website Management Platform. It allows you to work with Drupal and WordPress projects.

Start of work with Pantheon

You can start a new Drupal 7, Drupal 8 or Wordpress project in a few clicks. You just have to enter a project name. That’s all: Pantheon cloud will do all the things for you.

Also, you can migrate an existing website to Pantheon following these steps:

  • create a website archive using the drush ard command. This command will generate an import-ready archive of your website code and your DB. Please note that the maximum archive size is limited to 500MB
  • upload the archive with the Terminus tool or a direct URL
  • upload static files via SSH or SFTP

A manual migration option is also available. If you are familiar with SSH and Linux CLI - this option is for you. If you choose the manual migration, Pantheon will create an empty project for you. You have to upload a codebase, the DB, and the static files manually via SSH and using Git. See the manual here.

Ok, you created a new project or migrated an existing one and now you have an access to the Pantheon dashboard.

Pantheon Dashboard

Pantheon Dashboard

The Pantheon dashboard is really nice and well-designed. In comparison to standard cPanel - it has an intuitive UI. The Pantheon dashboard allows you to perform different actions on a project very easy. You can:

  • Choose the connection mode (Git or SFTP)
  • Move a database and static files between environments, import and export the DB and the static files
  • Add and manage domains
  • Add HTTPS (available only for a pro account and higher)
  • Manage backups and configure scheduled backups
  • Protect your environments with simple HTTP-auth
  • Update Drupal Core
  • Deploy code changes or merge multidev branches
  • Enable some add-on’s

More than that you can:

  • Review the commits’ history
  • See error logs
  • See a status report and the best practice recommendations

All these features are really useful and help with some route tasks of managing your project and environments.

Isolated environments

Out of box Pantheon provides 3 environments: dev, test, and prod. Pantheon creates technical domains for each environment in the following format: <environment>-<site name>.pantheonsite.io (of course, you can attach your own domain for each environment). This is a very cool feature which isn’t  used by the most of the shared hostings. It allows you to share an intermediate result with a client and demonstrate new website features.

Let’s assume that the dev environment is your working environment. Changes are available right after you push commit. You don't need to pull changes - Pantheon will pull everything automatically.

The test environment can be very close to the prod environment. You deploy some ready features into this environment to test it before going live.

The live environment will include all tested features.

Of course, a way of using these environments is up to you.

Starting with this, let's talk about development experience and a workflow.

Git workflow and Pantheon multidev

There are two types of workflow provided by Pantheon: standard and multidev.

Standard workflow:

Standard Pantheon workflow

You are working in the master branch. Of course, you or your teammates can create a branch as you used to, but Pantheon doesn’t see any of them and you can’t switch an environment to use any of these branches.

Pantheon provides the autopull feature so that you shouldn’t pull your commits: it will be done automatically out of box. All your commits go to the ‘dev’ environment.

To deploy changes into the test environment, you have to open this test environment and click “deploy” or do it with Terminus tool.

So, if you need some changes to be deployed to live, they should be deployed to the test environment at first and then to the live.

It sounds like a good flow: it means that you are testing all your features before they go live. But it is just on the one hand.

On the other hand, let's imagine that you are not working alone on a project. You push a feature to the dev, your teammate pushes another feature too. You are working on the same branch. At the particular moment, you have to deploy changes to the test or to the live. As far as you are working on the same branch, your teammates’ changes will be deployed too. But you only need your changes. In this case, you have to revert teammate’s changes, deploy yours, and then revert teammate’s changes on the dev again. Not a very good experience, do you agree?

It can be solved with enabling the multidev feature.

Enabling the Pantheon multidev feature

The multidev workflow allows to fork the entire stack (code and content), work independently, then merge code changes back into the master. Each forked branch will have its own separate development environment, including a database, files, and a separate Git branch. Now, you can create a separate environment for every task or feature on your project and work independently.

It is more flexible, isn’t it?

Yes, but I still need more flexibility. And it is the only thing I don’t like in Pantheon.

I don’t have a full control of my repo. Of course, the idea of the ‘dev -> test -> live’ flow is the right idea. But sometimes I want to have separate Git branches for different environments. There is no way to have it in Pantheon.

Another bad thing - hotfixes.

What if I need to push a fix very fast to live? Should I still forward my commit through the ‘dev-test-live’ deployment chain? What if there are some outstanding commits in the dev? They will be deployed too and, of course, I need to avoid it. How to solve it?

Pantheon uses the tags system for deployment. So, if you deploy something to the test,  pantheon_test_<id> tag will be created. The same for the live environment.

So, to create a hotfix to live you have to:

  • get the highest live tag, use the following command: git tag | grep pantheon_live_ | sort -k1.15n | tail -1
  • let’s assume that the highest tag is pantheon_live_10. Checkout to it: git checkout pantheon_live_10
  • create a new Git branch: git checkout -b hotfix
  • implement your hot changes in code
  • generate a new tag. Our last tag number was 10. So a new tag number should be 11. git tag -a pantheon_live_11 -m "Deploying my hotfix"
  • push it git push origin pantheon_live_11

After that, the new live tag will be automatically deployed to live. It sounds like a hack - but it is the only way to create a hotfix in Pantheon.

As I said, this is the only bad thing in Pantheon from my point of view.

Let’s examine other Pantheon cool features.

Additional features

  • Upstream updates. Pantheon team keeps track of Drupal Core updates. Once a new Drupal version is released, updates will be available on Pantheon almost immediately. Please, note that you can apply core updates only using a dashboard or using Terminus. You will not be able to update the core using the drush up drupal command. This is because Pantheon does some modifications with Drupal Core. That's why they prepare updates individually for each new version.
  • Free HTTPS via Let's Encrypt service
  • Varnish caching
  • Global CDN
  • Pantheon allows adding the Solr search server and the Redis cache server
  • Pantheon allows attaching ‘new relic’ monitoring tools


Another important feature is a command line interface which provides advanced interaction with the Pantheon cloud platform. Terminus enables you to do almost everything in a terminal that you can do in the dashboard, and much more:

  • Create a new website (project)
  • Create and delete the multidev environment
  • Clone one environment to another
  • Check for and apply upstream updates
  • Deploy code from one environment to another
  • Create your own command and extensions
  • ….

If you are familiar with the Linux terminal - it is a good alternative to a UI dashboard.


Cloud hosting platforms are the next level of hosting solutions. In this article, you learned about the popular platform called Pantheon and how easy you can deploy the development-ready environment just in a few clicks. If you are still using an old hosting platform with cPanel - it is a good time to migrate your project to a cloud hosting.

Migrate my site

Oct 25 2017
Oct 25

Top free good-looking Drupal themes

What makes websites and website templates look good? A professional and beautiful design does. It should not detract from the main content; design also should facilitate the perception of information. In a good design, there are no excessive elements: every text field, a button or a picture are placed purposefully.

It is difficult enough to find both free and good quality themes. So let us introduce a list of good-looking themes which are free to use. Themes are placed here in no order.

Flat Zymphonies theme

Flat Zymphonies theme

Flat Zymphonies Theme is the one-page responsive theme. It has all needed sections for good storytelling. A big hero image creates a strong impression, a nice color scheme and a minimum of graphic elements make this theme suitable for lots of businesses. In general, the theme has good structure and shows clarity of thought.

Fresh Theme

Fresh Theme

Fresh theme has a structure typical for a blog: a big hero image and a two column layout. It is suitable for professional blogs and media. It has the stylish design with nice raster effects, such as noise, which create good vibes. The theme has fixed width and isn’t optimized for mobile devices. But we know how to fix this.

Blogger Theme

Blogger Theme

Blogger theme is good for almost every kind of blog: traveling, health, business, etc.The theme looks simple yet informative. The design of the theme is easy for understanding, it is clean and minimal. You can go over the pages and grasp the meaning without extra efforts. The theme is responsive and mobile-friendly.

Clean Theme

Clean Theme

Clean Theme is especially good for tech blogs and business stories. It has classic look with a calm color palette which still has bright blue accents. All in all, the theme makes solid and positive impression; also it has several page layouts.

Clean Corporate Theme

Clean Corporate Theme

Clean Corporate theme is a simple and clean multi-purpose theme by ADCI Solutions. It can be used for professional business and corporate sites, portfolios, and promotion of services. The theme is fully responsive and looks nice on any device.

Nexus Theme

Nexus Theme

Nexus theme can be used for different kinds of websites: a blog, a portfolio, and other. It has a responsive layout, the overall design is flat and modern. The theme consists of several pages: home, about, blogs, contact, and typography.

Parallax Zymphonies Theme

Parallax Zymphonies Theme

Parallax Zymphonies theme is a professional responsive theme which will look good on the web, tablet, and mobile versions. This theme has a parallax scrolling effect which is trending. This theme is a good solution for both a business and a personal website.

Multipurpose corporate theme

Multipurpose corporate theme

Multipurpose corporate theme is a modern-looking theme by ADCI Solutions. It can be used for professional business and corporate sites, portfolios, events promotions, and more. The theme includes a variety of blocks, a nice portfolio page, a blog page, and a typography page. The theme is fully responsive and looks nice on any device.

Corporate Clean

Corporate Clean

Corporate Clean is a free Drupal theme which is responsive and looks good on any device. The theme has such features as color module integration, 1-3-column layout support, and slideshow integration. The theme was created in 2011 and is still maintained.

Omega KickStart

Omega KickStart

This is a simple and modern professional theme which is responsive and well-customized. Commerce Kickstart is a multipurpose theme and it has well-designed shop sections. It also has a blog, about us, and contact pages.

We’ve observed 10 Drupal themes which you can use for your website. All of them are free and ready to use. Remember that the beautiful design of your website and the high-quality graphics аre able to sell your product or service better. I hope you enjoyed the collection.

Oct 10 2017
Oct 10

Table of contents

  1. For whom this article is
  2. Organization of files
  3. Organization of time
  4. One of the methods of working with file names
  5. Working files & time together
  6. Useful links

The organization of working files is based on the correct structure and navigation in the working folder of a project. I'm a web designer and I always work a lot with various files. And the hardest thing is to always keep my workspace in order.

If you:

  • work in a team with managers, developers, and other designers;
  • keep a heap of files;
  • use any time tracker for work;
  • give an estimation of tasks;
  • analyze workflows;
  • love order;

this article is for you. And I'll tell about my systems of the organization of files and tracking working hours.

If you love chaos and you are still quite good at work, then you don't need this article! You are doing everything right and I want to read the article about your working experience :-)

Organization of design files

The coolest thing about organization and planning is that you can create a working system yourself. The main thing is creating a rule and always follow it.

Why order is important

When you are working on a project, you and your files should be ready for everything. To quickly send a file to a project manager or a client; prepare all files of the project for development; another designer may need to find the file on the computer of another designer. This person should not spend much time on this. The solution is to always keep your working files in a right place for them.

How to understand that your system works properly

From memory, dictate the path to a necessary file. If after a year you repeat the path to the file, then the structure is built correctly.

There are two types of folders: private and general. The general folder contains files for managers. Private folders are a workspace for designers.

Design folders

In «Inbox» you can store files which you receive from a client in the beginning of the project, or in process.

«Out» is a place for the latest versions of layouts. The files in this folder should be all set to be sent to the client.

«Work» is a space for designers. Sketches, guides, specs, layouts etc. — all of this common files of the project with which designers work are located in this space. Here you can to do all that you want, if you are a designer, of course (っ◕‿◕)っ

If you have your own habits of naming folders that you understand, you should not give it up. For example, if you have a folder for sketches, and you are used to giving it a name such as “test” or “try” -  you feel free to name your files this way. In other words, it is can be a popular and typical folder with an atypical name for it.

Folders that require special attention can be tagged with a color. For example, it can be the folder «Edits» tagged with the red color.

«Sterile zone» is folders which you constantly fill with updated files. Old versions should be added to the Bin folder. Of course, you can keep few versions of files, just give them clear designations: v1, v2, v3…

Rule: files from the folder Work should not be delivered to the client.

When projects are completed you archive them. One year — one archive. If you have one client with several projects, create one family folder and keep all projects here.

Typical mistakes

  1. Names of files look like this: project_final_01a_v05.ai: it’s a bad example name of a file because after the part «final» that means the latest version of this file, the keys (_01a_v05) are situated. They show us that the file has a status «in work».
  2. Files contain fonts which are not free or are not in a public domain: if you use commercial fonts in your files, always provide a license for the font for a developer. If you have problems with a purchase use the free library. Find the services where you can buy fonts at the block «Useful links»
  3. Different versions of the software: if you use programs by Adobe, you should be sure that all of the project files were created in the same version. Otherwise, you can create some technical problems for your colleagues involving further work with project entities.
  4. Graphics are created in a program that is rarely used — use modern graphic editors and apps for your workflow. You will be sure that your graphics can be exported in the needed graphics’ format for front-end work. Also, if each member of the design department uses the same software, you will never get into trouble with the synchronization of files.

Rule for beginners

Only one person is responsible for order in the project folder. This person controls all of the working group and keeps up the order. It’s necessary to prepare the document which contains rules and principles of work with working files for new designers. The document must be issued in the beginning of the project. The information in the document is updated by a lead designer, if necessary.

In our design team, we always track time and control our workflow.The analysis of your working hours will help you advance your experience. You see your mistakes and it helps you work on bugs. And, of course, good statistics motivates you and your colleagues.

We use Toggl for tracking of time. The app has a simple interface and is available for all operating systems.


  • free;
  • desktop app;
  • dashboard by a period of time;
  • description of tasks;
  • creating projects;
  • creating clients with a few projects;
  • for personal and team use.

Here is how Summary report for a period of time: 1st Jan - 1st Oct looks in the Toggl interface.

The Toogl interface.

The app helps you create a simple report in two clicks. You get a PDF file with detailed descriptions of all your tasks, a total time for a particular period.

When you need to do an estimation of a task, use your previous experience! You just need to find this task in a similar completed project. It’s really helpful. Of course, you should bring to notice special aspects of tasks, because they will always be unlike each other.

One of the methods of working with file names

Oh, just look at this folder with a new season of Twin Peaks! All the episodes are numbered and have a beautiful cover.

My art director has shown me one principle of file management that I still can not refuse.

How does it work

When you give a name to your project files use episodes instead of versions.

Example: ProjectName_FileName_s01e01

«Seasons» are the stages of a project. For example, you can work on one idea and concept of the product. And when you get a feedback about your design from clients, you usually complete one of the stages and start working with updates. After that, you can start new seasons with new ideas.

«Episodes» are versions of design. Further you create more episodes: e02, e03...

The most important thing is that you should save all of your ideas, even those that you will not use in the final version.This way you don’t miss anything, and in the future you can implement good ideas.

When the project is over you can analyze your work and see how many seasons your project came through. Sometimes we work with fast projects of one or two seasons, but sometimes we have a very big project of 6 or 8 seasons.

Project's seasons

Of course, it is only a method of organizing and it doesn't show your working skills, but I like it and it helps to facilitate my workflow :-)

When you maintain order not only in your own folders but also in your time tracker you can combine all your workspaces.

Why is it necessary

Sometimes you start running a time tracker and name a task like this: design. And all day you can do different iterations: search ideas, work with illustrations, go to a meeting with a team, write a letter, etc. But then you can not analyze your work time correctly.

What do you need

You need to create templates for your work iterations and always give the right name for a task in the time tracker.

I have a special document where all my types of iterations are located.

Types of iterations:

  • Investigation
  • Design
  • Design Review
  • Communication
  • Meeting
  • Planning
  • Education

Description of iterations should be very detailed so that you really understand what you mean.


  1. Planning — Weekly / Daily Agenda
  2. Meeting — Design team — clients’ feedback and planning
  3. Design — ProjectName_Home — Wireframe
  4. Design — ProjectName_Home_s01e02 — Illustrations
  5. Communication — Letter

In Toggl, your daily report will look like this:

Toggl daily report

If you do this all the time you will have an awesome skill in your skill set. You can analyze your work: what you do faster, when you need help from your colleagues. And you can improve your workflow.

I hope my experience and specific methods will be useful for you. And that you found something interesting for organization of your workspace in this article, too.

Articles on related materials from our team

  1. Product development process
  2. How to befriend design and front-end
  3. Internal development kitchen
  4. Why remote team?


  1. Myfonts.com
  2. fonts.google.com
  3. fontsquirrel.com
Oct 06 2017
Oct 06

This year in Vienna there were a lot of speakers, specialists and just people who love Drupal and work with it. And all of this thanks to DrupalCon - the most exciting event for each Drupalist.  

We just couldn't stay away and, of course, our team members - Denis, Alex and Marina - went to Vienna for sharing their experience and getting a new one back.

ADCI Solutions at DrupalCon Vienna

DrupalCon started with the big business-summit. That event focused on specific problems and opportunities which business owners face in their daily routine. Our colleagues joined the Marketing & Collaboration workshop and learned about the best practices in the development of the Drupal business.

The second big meeting was the next day. There new milestones of Drupal were discussed.

A clue session was a speech by Dries Buytaert, the Drupal’s creator. It was very inspirational and informative. There are some moments from this one:

  • The number of fixed problems increased by 22%, the number of unique participants increased by 28%, and companies -  26%.
  • For the first time in the team there are not only developers but also a designer.
  • The latest version of Drupal 8 is gradually gaining an audience: 38% use only this.
  • Drupal companies started to use new technologies, like Vue.js, Symfony, and React.js, etc. It means that now clients get even a more flexible product.

By the way, we have applied these technologies to our work and make projects with React.js, Symfony, and Vue.js now. It is really awesome! You should try it.

ADCI Solutions at DrupalCon Vienna

The same day was full of sessions and we shared our experience, too. Marina performed at DrupalCon for the second time. She spoke in the non-technical section - "Being Human" with a report: "A leader or a manager? How to define your leadership stand".  A lot of people came to listen to Marina and ask her questions. “It went pretty well. I was really enjoying this experience in the end”, - said Marina about her speech. The video is available below.

[embedded content]

Besides, Marina and Denis conducted their own BoFs. At Marina’s BoF, cruel marketing, sales, successes, tools, and life situations in promoting Drupal services were talked over. Denis’ BoF gathered together representatives of higher education and experts in Drupal. They discussed problems and modern practices which can help to solve them. The result of Denis’ BoF was an answer to the question: “What institutes are looking for today and how these problems can be implemented with the help of Drupal?”.

Our team members hold excellent sessions at DrupalCon. We are proud and congratulate them.

DrupalCon ended with a traditional informal party where you could relax a bit from sessions and discuss new knowledge with like-minded people.

DrupalCon Vienna was attended by 1670 people! Almost a third of them were at DrupalCon for the first time, and 24% of speakers had a session for the first time, as well. 6204 sandwiches were eaten and 5778 hot cups of coffee were drunk during DrupalCon. This means that Drupal conquers more and more minds and become better.

After all our guys went to Berlin for a meeting with ladies and gentlemen from GoldLand Media. It was the interesting weekend. You can read about it in this blog.

Oct 02 2017
Oct 02


What's the difference between single-page application and multi-page application?

Nowadays, websites more and more look like applications with many interaction possibilities rather than static pages which we had around 10 years ago. On the one hand, the reasons for that lie in the users' demand for receiving and generating information based on their personal characteristics and requirements. On the other hand, website owners want to provide users with more convenient user interfaces to work with the information.

Let’s take a look at how we can build a front-end part of the websites. There are two main ways of building websites today: a multi-page application (MPA) - more traditional way, and a single-page application (SPA) - more modern way. Let’s start from the multi-page approach.

Multi-page application approach

Multi-page application approach

In the simplest form, a multi-page application consists of several pages with a static information (text, images, etc) and links to the other pages with the same content. During a jump to another page, a browser reloads content of a page completely and downloads all resources again, even the components which are repeated throughout all pages (e.g., header, footer). The main technologies for such a type of website building are HTML and CSS. It was the first way of developing websites so developers are quite experienced in it and have many solutions for you. It allows to create uncomplicated websites of this type quite fast and without many problems.

Examples of multi-page applications we built:

Issues of multi-page applications and their enhancing by using new technologies

During development, a necessity in more complicated interactive components may occur (e.g., in forms). In this case, you still can use the traditional way but you will be bounded by standard functionality. However, there are more suitable technologies for non-standard, complicated and interactive things and they are JavaScript with AJAX (asynchronous JavaScript and XML). The prosperity of Web 2.0 became possible due to the evolution of these technologies. Now you can implement multi-step forms, various charts, graphs and diagrams on your website with dynamic refresh, with keeping various states, and with no need to reload the whole page. Those technologies help to integrate SaaS on your website through APIs as well and their usage improves user experience (UX) a lot.

But at one moment you can realize that your website has become too complex with the multi-page application approach and you can find yourself creating your own framework to maintain cumbersome UI on a back-end. At first, you can divide your back-end and front-end with REST API and they will communicate in a specific language of queries. At this point of time, you will need some front-end solutions. Many companies have already faced the same problems and they realized the benefit from making a source of their project open: you provide a community with a platform and the community accelerates the evolution of the solution.It’s a win-win situation. Today you have a choice between plenty of solutions with large communities and ecosystems, e.g.:

  • React
  • Angular
  • Vue

Also, there is a huge code base in NPM (Node Package Manager) where you can find solutions for almost all problems. So currently with the help of a community and its ecosystem, it’s not that hard to create dynamic, nontrivial solutions and integrate them into multi-page application websites.

The good examples of what functionality can be integrated with modern technologies into a multi-page application website

Forms and quizzes (Vue.js)

Forms and quizzes demo made with Vue.js

Forms and quizzes demo made with Vue.js

Search (React)

Search demo made with React

With the increasing role of the interaction between a user and a website, the role of JavaScript becomes even more important and, following the evolution of Web 2.0, there appears a new way of creating a presentational part of your website - single-page application, which reveals the full power of modern technologies.

Single-page application approach

Single-page application approach

When you enter a single-page application website, you download a page only one time and then the components of the page change and load only when it is required. Because of that, such website is much faster than a multi-page application. Also, if you build a single-page application, you usually use a solid mature ecosystem (it happens the other way round when you integrate interactive elements on a multi-page application websites). In addition to that, a back-end and a front-end are separated and they don’t interfere in each other’s concerns. Such approach of developing allows you to apply the latest and the most sensible patterns of developing websites and gain many profits in a long term.

However, the way of constructing single-page applications raises new problems (e.g., SEO, Performance & Optimization, Analytics), but they all have solutions already - you just need to remember about these moments. And because of these problems, developers should have particular knowledge and experience to build a website properly.

The examples of single-page application websites

  • Gmail (Google Mail)
  • Twitch
  • GitLab

Other ways of applying modern front-end technologies

At the same time, the single-page application approach not only solves many problems but opens new opportunities: you can create user interfaces for mobile and desktop applications using one codebase, or create mobile and desktop applications without creating a web version at all; also, you can create offline applications which can be used without an Internet connection and many companies experiment with technologies like a virtual and an augmented reality using web technologies (e.g., React VR).


Let's sum up all pros and cons of both approaches.

Multi-page Application


  • Simplicity of building static pages and small websites
  • Fast creation of a minimum viable product (MVP)


  • Difficulties with adding dynamics
  • Low flexibility
  • Increasing cost of changes during adding new functionality

Possible use cases

Low and middle scale websites without much dynamics and state, e.g.:

  • landings
  • content-oriented websites without much complexity
  • prototype websites

Single-Page Application


  • Less complex dynamic components building
  • Less complex large and non-trivial websites building
  • Better user experience
  • Less load on the server
  • Better client-server interaction, dividing of front-end’s and back-end’s concerns
  • Low cost of support in a long term

Moments that you should remember about

  • Security: many problems of security become the concern of front-end developers and they should know and remember about it (you can familiarize yourself with the main problems here.
  • SEO: you need to take care about server-side rendering if you need search indexing and optimization.
  • Enabled JavaScript: today it’s hard to imagine a website without JavaScript functionality and browsers’ support of it, so you can assume that it is enabled everywhere by default. But if you face the situation when you need to consider such  a case - a server-side rendering will help you.
  • Browser history: single-page application doesn’t save your jumps to another states and you can’t go back and forth with your browser by default, but most of front-end frameworks and ecosystems have routers which use Browser History API and they solve this problem.
  • Analytics: analytics of the pages relies on page loads and you can use page load events to eliminate the problem.
  • Performance & Optimization: you should remember about mobile and low-performance devices because JavaScript usage is quite heavy in single-page applications. Also, you should remember about a weight of your bundle and consider creating chunks with dynamic load to improve user experience (e.g., you can use the new Uber website after the first 50Kb loaded and it’s fast even with 2G networks).


  • Complexity
  • You need more time to create a minimum viable product (MVP)

Possible use cases

Medium or large scale websites, or websites with much dynamics and state:

  • websites with a lot of user interfaces
  • SaaS (Software as a Service) platforms or Internet services in general
  • data-driven and form-intensive applications
  • mobile applications
  • desktop applications
  • experimental fields(VR, AR)

Useful links

  1. React, library
  2. Angular, library
  3. Vue.js, library
  4. Forms and quizes demo: Vue.js, code
  5. Search demo: React, code
  6. Gmail (Google Mail)
  7. Twitch
  8. GitLab
  9. Uber website

Need website help?

Sep 29 2017
Sep 29

Table of contents

  1. Introduction
  2. OOP in Drupal 8: what differs Drupal 8 from Drupal 7
  3. Custom module creation in Drupal 8
  4. Conclusion

OOP in Drupal 8

I had only one year of experience in the web development in general, and basic knowledge of Drupal 7 in particular when I faced Drupal 8 for the first time. When I started learning Drupal 8 I was surprised by the fact that getting to know the new version is rather easy. That’s how this little tutorial was born: I understood the way you can start working with Drupal 8 faster and now you can learn from my experience.

What do you need to know to start developing in Drupal 8? It doesn’t matter whether you have worked with Drupal’s earlier versions or not: development in Drupal 8 differs a lot. One of the main reasons - switching from procedural programming to the object-oriented approach. It means that now the biggest part of your code is placed in classes. It can be quite disturbing for programmers, but that’s how the modern programming practices work.

Drupal 7 operates the solutions that are not similar to the Symfony’s or Wordpress’ ones. There is a lot of own Drupal solutions like Form API or Drupal DBAL, the functionality for batching process, the hooks system, etc. Learning all of these things can be tedious and difficult. You should always keep in mind weak places and particular qualities of different Drupal components. For instance, if you want to start writing a new module for Drupal 7, you should know how Drupal 7 works, how different hooks process and many more things. And, of course, you must read a lot of documentation beforehand. Yes, it’s difficult and takes much time.

Drupal 8 is easier for development in comparison with the earlier Drupal versions. If you know the key OOP principles, design patterns (like Event Dispatcher, Factory or Dependency Injection) - you’ll be able to understand how the new system works.

What are the main differences that you should pay attention to while developing a Drupal module?

OOP usage

It’s much easier now for complete Drupal beginners to get to know this CMS if they know OOP and design patterns. For example, while bootstrapping Drupal the default container initializes and different services become available. What are those services? In a plain language, service is a class that implements a particular functionality. You can create your own class, define it as a service and make it available in the container.

Drupal developers plan to completely refuse hooks in the version 8. The pattern Event Dispatcher is used instead. This decision was based on hooks’ drawbacks, for example, hook_invoke_all is rather resource demanding one.

All in all, you don’t have to learn the hooks system now. If you know how a particular pattern (for example, (Event Dispatcher, Dependency Injection) works, you should only implement it in your module.

For example, you have to use hook_node_type_insert() to create a new content type in Drupal 7. Now you only should implement Dispatcher and bind your method 'createRequest' to the event that was defined in the method getSubscribedEvents. See the example below:

public static function getSubscribedEvents() {
    // Subscribe to kernel request with default priority of 0.
    $events[ EntityTypeEvents::CREATE][] = array('createRequest');
    return $events;

Besides that, you couldn’t redefine the core’s functionality with the hooks system. The transition to OOP releases many options: the possibility to build more complex architecture, data encapsulation, methods’ redefining.

Symfony components usage

Symfony components are the universal and flexible solutions, especially in comparison with Drupal’s solutions in the earlier versions: they proved themselves as stable ones and they can solve much more problems. You know that it isn’t a good practice - to reinvent the wheel, - so don’t be afraid to use ready-made solutions. Also, Symfony follows the standards such as PSR-4, PSR-7. Symfony’s components are used in the Drupal core, so it is likely to facilitate Drupal’s transition to the standards’ usage. When it happens, it will simplify the Drupal’s learning curve.

Annotations usage

Drupal 8 uses annotations (the comments in your code that contain meta information). The main advantage of the annotations is that they improve performance due to the less memory usage. The annotations are placed in the same file as a class is. Below you can see the example of the annotations’ usage at the block’s class.

 * Provides a 'Custom' Block
 * @Block(
 *   id = "custom_block",
 *   admin_label = "Custom block",
 * )

Drupal 8 routing

In Drupal 8 the component Routing replaced the hook hook_menu. Now you create a controller class with the method that returns data along a certain path. For the description of routes Drupal 8 uses the YAML format. All the information about routes of a module is kept in the file MODULE_NAME.routing.yml.

Each route is described separately from the others and it must have the following characteristics:

  • a name that identifies the route;
  • a path that begins with a slash;
  • a route’s processor;
  • conditions that manage an access to the route.

Of course, that’s not the complete list of the changes in Drupal 8. However the understanding of the mentioned changes is enough to write a custom module - and that’s what we’re going to do now.

We have already discussed the crucial aspects of Drupal 8 development, but practice is very important. Let’s create a simple module to understand how classes are used and how the changes of Drupal 8 affect a coding process. I commented the code; it will help you to understand the process.
Our module will change status messages through the admin menu. Our module will allow to set a width, a height, and a background color of a pop-up window.

Step 1

I’ll show you the module’s structure in Drupal 8 right away: it was changed a lot. Classes are kept in the src folder now, this folder is divided into subfolders, too. In our example it’s just one class of a form.
The sctructure of module in Drupal 8
The list of the necessary parameters of the info file differs from Drupal 7. Now we specify name, core and type. Type can be any of these kinds: module, theme or profile. Our module will have the configuration form where we will set parameters of the status messages, and due to that we can add the characteristic Configure - a path to this configuration form.

name: 'Status message'
description: 'Module for changing status messages'
package: custom
core: 8.x
type: module

configure: modal_window.admin_settings

Step 2

Let’s create the routing file status_message.routing.yml next. I’ll show you how I created a route for a list, a submenu for an administrative form, and a route for the form itself.

status message.admin_config (in the format MODULE_NAME.KEY) creates the submenu: we define a path to the class SystemController and its method systemAdminMenuBlockPage' with the help of the key _controller.

The admin menu will contain a list of links, and we will specify a path to that admin menu with the help of Path.

Next we create a route for the setting form with the key modal_window.admin_settings, but this time we define a path to the class of our form in the key _form. The class will be situated in the directory of the module status_message in the folder Form.

 path: '/admin/config/status-message'
   _controller: '\Drupal\system\Controller\SystemController::systemAdminMenuBlockPage'
   _title: 'Settings for status messages'
   _permission: 'access administration pages'

 path: '/admin/config/status-message/modal-window'
   _form: '\Drupal\status_message\Form\StatusMessageSettings'
   _title: 'Settings for modal window'
   _permission: 'administer site configuration'

There are few things left to do before our form will appear in the admin panel. You should create the file status_message.links.menu.yml and place the code below in this folder. The first line, likewise in the case with the route file, allocates a place in the namespace. This line is the key. In the parent we indicate the parent menu link. In the route_name we indicate the key from the routing file and that key should be relevant to the link we talked about earlier. It means that the parent of status_message.admin_config is system.admin_config: thus the submenu should be at the address admin/config. Yes, we wrote the addresses in the routing file, but without the links.menu.yml file. If you switched to the address /admin/config/status-message back then, you would see the submenu configured in the routing file - but you wouldn’t find anything in the list of links at the address admin/config.

The form of configuration of the status messages has the parent status_message.admin_config due to the fact that we built the hierarchy of links.

 title: 'Status message'
 parent: system.admin_config
 route_name: status_message.admin_config
 weight: -50

 title: 'Modal window'
 description: 'In this settings you can set width, height and background for modal window of status message.'
 parent: status_message.admin_config
 route_name: modal_window.admin_settings
 weight: 1

Now if you go to /admin/config/status-message, you’ll see this:
Settings for status messages
You can’t proceed to the configuration page Modal window because we didn’t create the class of the form. Let’s do it right now!

Step 3

Create the file StatusMessageSettings.php with the address status_message/src/Form. In the first part we talked about the PSR-4 standard and an autoloading of classes. If you have a look at “use”, you’ll see the list of the classes that we upload for the further usage. Define a way to our class in Namespace. According to the standard, we omit the src folder then.

The class StatusMessageSettings is inherited from the class ConfigFormBase and even expands its possibilities. What happens here: using the OOP principles, we describe our class that is based on the already existing class; at the same time, we don’t have to bother about implementation of the class ConfigFormBase.

In the method getFormId we only return the unique form’s ID, in the method getEditableConfigNames() we return the key settings form. Bear in mind: any class that expands ConfigFormBase must implement the method getEditableConfigNames and return the array of the configuration’s names of the fields.

In the method buildForm we describe the way our form will look like: what fields, width, height, and background it will have.

A form’s class in Drupal 8 must implement the method submitForm, that’s why the last thing we have to do is to add the submit method that will return the form’s values.

namespace Drupal\status_message\Form;

use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;
 * Defines a form that configures forms module settings.

class StatusMessageSettings extends ConfigFormBase {

  * {@inheritdoc}

 public function getFormId() {
   return 'status_message_settings';

  * {@inheritdoc}

 protected function getEditableConfigNames() {
   // Return name config file.
   return [

  * {@inheritdoc}

 public function buildForm(array $form, FormStateInterface $form_state) {
   $config = $this->config('status_message.settings');
   $form['width'] = [
     '#type' => 'number',
     '#title' => $this->t('The max-width of the pop-up window in pixels.'),
     '#min' => 100,
     '#default_value' => 800,
   $form['height'] = [
     '#type' => 'number',
     '#title' => $this->t('The height of the pop-up window in pixels.'),
     '#min' => 50,

   $form['background'] = [
     '#type' => 'color',
     '#title' => $this->t('The background of the pop-up window.'),
     '#default_value' => '#efefef',

   return parent::buildForm($form, $form_state);

  * {@inheritdoc}

 public function submitForm(array &$form, FormStateInterface $form_state) {
   $values = $form_state->getValues();
   $width = $values['width'];
   $height = $values['height'];
   if(($width >= 100 || $width == '') && ($height >= 50 || $height == '')) {
       ->set('width', $values['width'])
       ->set('height', $values['height'])
       ->set('background', $values['background'])
   } else $form_state->setErrorByName('width or height', $this->t('Height can not be less than 50. Width can not be less than 100. Enter the correct value.'));

Now when you go to admin/config/status-message/modal-window, you’ll see this form:
Settings for modal window

Step 4

We created the admin form; the thing is, the values that we can set there don’t affect the way the status messages look like. Let’s correct it.

Create the file status_message.libraries.yml (it’s the replacement of the characteristics stylesheets and scripts for the switch-on of JS and CSS files in Drupal 7) where we will specify dependencies. Drupal 8 doesn't add jQuery to each page jQuery on all pages by default: only where it’s needed. For that reason, we will define that the library of our module (file modal_window_jq.js) depends on the library that contains jQuery (core/drupal.dialog.ajax).

 version: 1.x
     css/modal_window.css: {}
   js/modal_window_jq.js: {}
     - core/drupal.dialog.ajax

The next step is creating the file status_message.module. Unfortunately, we are forced to use two hooks here: the first hands over values of form’s fields to a JS file so that the parameters of the status messages are changed; the second turns on the Twig file that is the replacement of the template.php file in Drupal 8.

We included one JS file in the file libraries.yml earlier; now we can turn another one that doesn’t depend on jQuery with the help of attachments.

An access to the values of form’s fields can be obtained by
$config = \Drupal::config('status_message.settings');
But we can also do it with the help of use tag for class download like we did it before.


* Implements hook_page_attachments().

function status_message_page_attachments(array &$attachments) {
 $config = \Drupal::config('status_message.settings');
 $attachments['#attached']['library'][] = 'status_message/modal_window';
 $attachments['#attached']['drupalSettings']['statusMessage']['modalWindow']['width'] = $config->get('width');
 $attachments['#attached']['drupalSettings']['statusMessage']['modalWindow']['height'] = $config->get('height');
 $attachments['#attached']['drupalSettings']['statusMessage']['modalWindow']['background'] = $config->get('background');

* Implements hook_theme_registry_alter().

function status_message_theme_registry_alter(&$theme_registry) {
 $theme_registry['status_messages']['theme paths'] = array(0 => drupal_get_path('module', 'status_message') . '/templates');
 $theme_registry['status_messages']['theme path'] = drupal_get_path('module', 'status_message') . '/templates';
 $theme_registry['status_messages']['path'] = drupal_get_path('module', 'status_message') . '/templates';
 // tell the theme system to use 'status_message.html.twig' as the template file. Note that you do not include 'html.twig'
 $theme_registry['status_messages']['template'] = 'status_message';
 // for check big message dpm($theme_registry)

Next create the file status_message.html.twig with the address status_message/templates. As it was said before, Drupal uses Twig template engine. Our Twig inherits from status_messages.html.twig template, and that’s really important. In our example we inherit from the status_messages.html.twig template with the help of the tag extends. This way we can manage all of the aspects of the parent file and change it, too.

{% extends "@classy/misc/status-messages.html.twig" %}
{% block messages %}
   {% if message_list is not empty %}
       {{ attach_library('bartik/messages') }}
       <div class="messages__wrapper layout-container" id="m_overlay">
           <div id="modal_window">
               <div id="modal_title" class="modal_title">
                   <p class="modal_title">Status messages</p>
               {{ parent() }}
               <button class="btn-close" id="modal_close" type="button" aria-label="close">
   {% endif %}
{% endblock messages %}

What I’ll do next is changing div’s styles with id modal_window. Earlier we defined this HTML structure in the Twig file. Try to change other attributes by doing the same actions to the width and height. Feel free to experiment! You can add drag-and-drop of the window, for example, and whatever you like, but this is another story that relates to JS and jQuery, but not to Drupal.

(function ($, Drupal, settings) {

 "use strict";

 Drupal.behaviors.status_message_modal_window = {
   attach: function (context, settings) {
    var modal = $('#modal_window');
    modal.css('background', drupalSettings.statusMessage.modalWindow.background);

})(jQuery, Drupal, drupalSettings);

I changed the background color of the module in the admin menu: now I receive the status messages in pink. I showed how to include a CSS file in the file libraries, so you can change it on the front-end side whatever way you like.
Status messages
Congratulations - we have the first results! We learned how to create forms, got to know Twig files and even JS a little bit. Of course, it’s a small step and we learned just the basic principles and saw the differences in development between Drupal’s versions. But I hope it was the useful and pleasant development adventure for you.

That’s it: we created our first module for Drupal 8. I think it wasn’t difficult for you. I really love Drupal 8 because it’s rather simple and has a great architecture. Yes, you must know OOP, design patterns, Twig and modern PHP trends. But in the Internet you can find information about everything that I’ve just mentioned. Instead of learning internal Drupal mechanisms, you should learn only the basics of web development that can be applied to other technologies. A large part of the PHP frameworks uses the same Symfony components, Twig and the same design patterns. This way learning Drupal 8 you’re learning how the most of PHP-frameworks work. Have fun!

Sep 22 2017
Sep 22

Meet ADCI Solutions at DrupalCon Vienna

Hello, Drupal friends!

Our team want to make it big at DrupalCon. We prepared the session and two BoFs for you.

A leader or a manager? How to define your leadership stand

Our Head of Organizational development wil tell you how to define a leadership stand of yours. Knowing what you stand for in this life helps to get on your own feet and achieve outstanding results both in professional area and in self-realization.


Drupal for a higher education

Our senior developer initiates the discussion on Drupal solutions for a higher education and science. The aim of this BoF is to gather Drupal experts and higher education representatives: that would allow us all to hear about the problems and the possible solutions from the first-person point of view. 


Marketing challenges in the Drupal world

Another BoF is aimed at disclosing challenges we face while promoting and selling Drupal services, building the company image and communicating with a target audience. If we know the problems - we can find the solutions. 


Drop a visit!

Sep 22 2017
Sep 22

Table of contents

  1. Introduction
  2. Server-side
  3. Client-side
  4. Conclusion
  5. Useful links

A single-page application (SPA) with Vue.js
Single-page applications have many advantages, such as speed, really good UX, and, as for developing for Drupal, the full control over the markup. There are more and more sites using SPA; there are more and more tools that simplify the process of developing complex SPA. If you read our articles (if not, then you should do it), you've probably read about a young reactive framework called Vue.js, and how you can use it in Drupal. I suggest you plunge deeper into Vue and consider writing a simple SPA.
We will create a client-side application of a simple blog. This application will show a list of all articles, and also a full text of the article. And, of course, all changes will occur without reloading a page.
With the example of this application, you will get to know how to fetch data in Vue, how to create a router and also you will learn about a very interesting concept - Vue single file components.

In this tutorial, we will only talk about writing a client with Vue. We will not talk about creating a REST server. So I will use the jsonplaceholder.typicode.com service which provides the fake online REST API. Anyway, if you want to use Drupal as a backend (jeez, it is the Drupal website, of course, you do), we’ve already written about how to organize a RESTful server with Drupal 8. Check the articles on RESTful in the block Useful links.


It is really easy to start using Vue. But it might become even easier if you use the right tools.
There is a vue-awesome project which includes a list of all kinds of tools, components libraries and plugins for any occasion.


For jump-starting a new project, I highly recommend Vue-cli. Using this you can start the project with some of the official Vue project templates, or one of the many of the open-source templates, and, of course, you can create your own one and use it anywhere.
So, first of all, we need to install vue-cli as a global package:

$ npm install -g vue-cli

Then initialize project with the chosen template; for this project I used webpack-simple which is rather enough for our purpose.

$ vue init webpack-simple vue-spa

Then go to the vue-spa folder and run npm install in terminal. After installing all the packages, we can run our application in the development mode.

$ npm run dev

This will automatically launch our project on the webpack dev server. In the browser, we can see our simplest Vue application. Of course, it does not look like how we want, it is just a base to start. To continue the work I suggest first to familiarize yourself with the structure of our template.

Webpack-simple template

Inside the webpack-simple template we have the following structure:
Webpack-simple template structure There is an index.html file with a simple HTML markup including only the element with identifier “app” in a body. It will be replaced by a vue-generated DOM. That is the reason why you should not use the tag body as a root element.
In the src directory we have the main.js file which is the entry point for webpack.The Vue components are imported here. And also here we have a root Vue instance which has two properties for now. The property ‘el’ provides the Vue instance with an existing DOM element to mount on. And another one is a render function which generates DOM from App.vue. In general, this is all we need to know about the structure of the webpack-simple template, not so much, isn’t it? The main part of our application will be coded in App.vue. The .vue extension indicates that this file is a single-file vue component. It is one of the Vue’s features, let's get to know it better.

Single File Components

Single File Components Each *.vue file consists of three types of blocks: <template>, <script> and optional <style>. As the result of it, we can divide the project into loosely-coupled components. Inside a component, its template, logics, and styles are inherently coupled, and collocating them actually makes the component more cohesive and maintainable. So now we are ready to create our Vue Blog.

Creating the application

Let's see what we are going to do. We have a header with the name of our blog at the top of the page. On the left side, we have a fixed sidebar in which we will display the headings of our articles, it will be something like a table of contents. And the rest of the page will be occupied by a dynamic block in which the article itself will be displayed.

Vue.js SPA

Step 1

First of all, remove all unnecessary lines from App.vue. And create a template in accordance with our requirements.

  <div id="app">
      <h1>Vue.js SPA</h1>
      <aside class="sidebar">
      <div class="content">

Second, we will create a Vue instance with the data property that we will place in the array with our posts. For now it’s empty, but soon we will put the data received from our server inside of the array. 
Once observed, you can no longer add reactive properties to the root data object. It is therefore recommended to declare all root-level reactive properties upfront before creating the Vue instance.

  export default {
    data () {
      return {
        posts: []

Also, I’ve added some styles to make our application look better.
The application code lives on the github.com .Just clone the repository and switch the branch by the step number to follow the application creation step by step, for example:

$ git checkout step-1

At this moment we have absolutely nothing to display in our navigation bar, so let’s get the data from our server. To do this I chose Axios a really easy-to-use HTTP client. You can also use any other convenient way for you like a Vue-resource or native fetch or even jQuery Ajax.

Step 2

Install the Axios

$ npm install --save-dev axios

Then import it into a component App and create a method getAllPosts() which we will make a request to the Drupal server and set it to the property post. Call the method in the hook created(), which will be called after the Vue instance is created and data observation has been set up.

import axios from 'axios'

export default {
  data () {
    return {
      posts: null,
      endpoint: 'https://jsonplaceholder.typicode.com/posts/',

  created() {

  methods: {
    getAllPosts() {
        .then(response => {
          this.posts = response.data;
        .catch(error => {

And now display all the headings of articles in the sidebar.

<aside class="sidebar">
  <div v-for="post in posts">
    {{ post.title }}

So far we have just displayed the names of posts but we can not see the full posts. Now I’m going to display the full post in the content section according to the chosen title in the sidebar. At the same time, I want every article to be available at its unique address.

Step 3

I will use the official Vue library vue-router to implement this. As it should be clear from the name, this library allows configuring routing for our application.
Install the package:

$ npm install --save-dev vue-router

To configure router go back to the main.js file. Here we will define the settings of our router and add it to the Vue instance.

import Vue from 'vue'
import Router from 'vue-router'
import App from './App.vue'
import Post from './components/Post.vue'
import Hello from './components/Hello.vue'


const router = new Router({
 routes: [
     path: '/',
     component: Hello,
     path: '/post/:id',
     component: Post,
     props: true,

new Vue({
 el: '#app',
 render: h => h(App),

In the route settings, we specify which component should be rendered on a specified path. Because the only component Post.vue will be responsible for rendering of each post, we don’t have to set the path for each post, all we need is to set a dynamic path.

path: '/post/:id'

This path has a dynamic segment :id which determines the specifics of our post. Herewith we have the access to this segment in component Post via this.$route.params.id. However, using $route in our component creates a tight coupling with the route which limits the flexibility of the component as it can only be used on certain URLs. Instead of this we can use the option props and set it to true. After that, the $route.params is set as the component Post props.
Now that we have a router created we can return to our application and add a few more lines to the template.

  <aside class="sidebar">
        v-for="post in posts"
        :to="{ name: 'post', params: { id: post.id } }">
      {{post.id}}. {{post.title}}
  <div class="content">

Here we have two components of vue-router: <route>r-link and <router-view>. The first one is the component for enabling user navigation in a router-enabled app. The second component is a functional component that renders a matched component for the given path.
It remains only one step. We need to display the contents of the post.

Step 4

Let’s go to the Post.vue file, which we will create a simple template in:

<template lang="html">
  <div class="post" v-if="post">
    <h1 class="post__title">{{ post.title }}</h1>
    <p class="post__body">{{ post.body }}</p>
    <p class="post__id">{{ post.id }}</p>

Then we need to set Vue instance settings for this component. Here everything will be very similar to the settings for displaying all posts. Declare the option props with variable id, which will get the number of our post. Next, define the data object the same as in App.vue:

import axios from 'axios';

export default {
  props: ['id'],
  data() {
    return {
      post: null,
      endpoint: 'https://jsonplaceholder.typicode.com/posts/',

Then create the method getPost() which will get only one post by an identifier and call it in the created() hook.

methods: {
  getPost(id) {
    axios(this.endpoint + id)
      .then(response => {
        this.post = response.data
      .catch( error => {
created() {

Almost done. If we run the application now, we’ll see that although the URL changes, we see the only post that was rendered first. The point is that for the different posts rendering we have the same component and Vue doesn’t need to recreate it because of the extra waste of resources and this also means that the lifecycle hooks of the component will not be called.
To fix this we just need to set a watcher for the $route object.

watch: {
  '$route'() {

Now it works exactly as it should. To get a production version of this application just run npm run build in your terminal. 

We built the simple single page application with Vue in four steps. We knew how easy to start your project with vue-cli. We figured out the concept of Vue single-file components which make your project more flexible and scalable. We learned how to fetch data from external API using Axios. And we saw how to configure routing with the vue-router. It is a basic knowledge, of course, but I hope it will help you to start using Vue.js with more power. If you have any questions, don’t hesitate to contact us.

Link to the GitHub project
The vue-awesome project
RESTful Web Services in Drupal 8: quick start guide
How to create a headless Drupal site

Sep 19 2017
Sep 19

Once upon a fall Saturday morning Drupal-minded developers got together. The reason was Drupal Global Training Day #5.

This event is for those who do not know anything about Drupal and for those who have just started to explore Drupal.

We unlocked a new location: it was Omsk State University. Also, we tried a new format of Drupal Global Training Day. Do you want to know how it was? Read on.

The junior developer Sasha Lopata told about the Drupal CMS, its history, competitive advantages and why it’s chosen to create a large number of websites in  “Meet Drupal in half an hour” session.

Another Sasha demonstrated the step-by-step process of creating a module in Drupal 8 and reported about the basic techniques and technologies.

The front-end developer Dima disclosed the interesting topic: "Theming in the Zen style: how to create a Drupal 8 theme". He showed how to manage the display of content on a Drupal site and what possibilities the platform under discussion provides.

The content marketer Iuliia wrapped the theory part up with the talk on the Drupal Community. She showed the participants how the Community lives, communicates and how its members collaborate and help each other.

Drupal Global Training Day #5: practice part

This time we tried a new concept of the conference. For the first time in Omsk was a workshop on creating Drupal sites in real time: this is a great way to consolidate your knowledge.

On the practice session the team lead Artyom and the developer Marina with the participants created their first own website and a module.

We asked Artyom about the practical part and how to organize it for Drupal newcomers.

And what he replied: “At the practice we created a module framework, routers, forms, and blocks. There was also an additional "home" task for the participants. In my opinion, in order to master some technology, you need to code a lot. Think up some interesting tasks for you that you and try to implement it. Start with the simplest things and gradually add new functionality. I recommend reading the Acquia docs "Building modules with Drupal 8" for beginner Drupal developers.”

Thanks to everyone who has found the time to come. This event happened, all because of you. Let’s create Drupal events together.

Drupal Global Training Day # 5 in Omsk

Sep 19 2017
Sep 19

«Working with ADCI Solutions has been a true pleasure as we have partnered on two Drupal conferences. In working with their Web Designer, Lera Tkacheva, we have been very impressed with the creative and quality designs. Not only have they delivered unique designs for the web, but have also produced print collateral and various other swag items that really brand our conferences beautifully.»

Sep 13 2017
Sep 13

DrupalCon Vienna

Hello, Drupal Community! Our team has prepared two BoFs for DrupalCon Vienna.

Our senior developer initiates the discussion on Drupal solutions for a higher education and science. The aim of this BoF is to gather Drupal experts and higher education representatives: that would allow us all to hear about the problems and the possible solutions from the first-person point of view. The BoF details

Another BoF is aimed at disclosing challenges we face while promoting and selling Drupal services, building the company image and communicating with a target audience. If we know the problems - we can find the solutions. The BoF details

Drop a visit!

Sep 05 2017
Sep 05

Table of contents

  1. Preface
  2. Security principles
  3. Key security objects
  4. Server (common settings)
  5. Web server
  6. PHP
  7. Database
  8. Drupal
  9. Conclusion
  10. Useful links

Drupal is an open-source content management system with a quite complex architecture. It also has a strong security model. Thanks to the big community of developers there is a lot of informative documentation and useful examples of the proper configuration of Drupal website security and keeping this configuration up-to-date.

It should be kept in mind that Drupal is the only one part of the software which is needed to run a website. To protect the whole system from hacking, we need to take care of an entire set of software. It includes some common server settings, the configuration of a web server, PHP and a database. Also, the proper configuration is required for any additional software on a server.

This article focuses on discussing the mentioned key points. It provides some clues which should help the server and website administrators to audit the security of the entire system. We should understand that it’s impossible to create a system which is absolutely safe but if you stick to some common principles, it will help to support an indicator of the safety of your system at the sufficient level.

Security for Drupal and related server software

Let’s start with the common security rules. Most of them are applicable not only to the Drupal development and supporting the security of the relevant for the Drupal website functioning infrastructure but also in many other cases:

  • Use widespread solutions that are developed by a large community of users. It can be well maintained open-source libraries, popular Linux distributions and so forth. Always check the integrity of the downloaded code.
  • Limit usage of any additional software. Install new software if you really need it and there is no ability to use the similar functionality from already installed packages. Uninstall all the software that you don’t need.
  • Avoid writing a custom code. Before you start doing it, think carefully whether you can avoid this. A real situation related to the Drupal development is the search for ready solutions on drupal.org before writing custom modules.
  • Deny an access by default. You should grant an access to objects in your system only when it’s necessary.
  • Add roles with required permissions. Each role must be well documented. In that way, it should be easy to support and extend a whole roles/permissions system.
  • Do not use superuser privileges. On Linux-based operating systems only use the root access when required and do this through sudo. In other words, you shouldn’t be logged in as root.
  • Document everything. First of all, it’s about any customizations of your system. It’s quite easy to forget some important details and they can be lost during the system update.
  • Do periodic security checks of your system. You should carefully analyze all suspicious cases and react on them.
  • Take care of backups. You must always have an ability to revert the system back to any of previous states. Besides, you need to be sure that the system makes the workable backups.
  • Do not open the access to your server from the Internet before the server is properly protected.

These principles can be applied to any system, regardless of a set of software and hardware that it uses. However, there are more specific key points what we will discuss further.

In addition to Drupal to run a website, it’s necessary to configure PHP, a web server, and a database server. You may also want to install some software for extending search functionality, for working with cache and so on.

As you see there is a lot of things that require the proper configuration and regular maintenance. Based on said above, we can distinguish the following objects for which we need to ensure security to some extent:

  • Server (common settings)
  • Web server
  • PHP
  • Database
  • Drupal

Security of any service available on the Internet begins with a basic configuration of a server. For the Linux-based servers it can include the following steps:

  • Change the login process to the server
  • Setup a firewall by using iptables

Change the login process to the server

By changing the process of logging in to the server, I mean a certain modification of the default server settings. The main goal is to make this process different from the standard one.

For example, any Linux-based system has a superuser that is called root. An attacker can try to pick up a password for this user. However, if a server administrator turns off root logins, such attempts will be unsuccessful. Instead of the root user, we could create a new one and then grant him the necessary permissions.

Most of the discussed changes are related to ssh settings. They are usually located in the /etc/ssh/sshd_config file. Take a look at this configuration:

Port 2345
Protocol 2
PermitRootLogin no
PasswordAuthentication no
UseDNS no
AllowUsers user

It allows a user with a name user connect via ssh to the server by using 2345-port (not standard). It also disables root logins and a password authentication.

Disabling the password authentication is an important step to improve the security of the whole system. The passwordless authentication is more secure. To log in to the server you need to generate an ssh key-pair on a local machine and then copy a public key to the server.

Setup a firewall by using iptables

The iptables utility is the default firewall for Linux systems. It can be used for managing connections to the ports that you specify. If we want to keep the website on the server, in additional to the ssh port it will be necessary to open http and/or https ports.

By default, there are no rules on a clean operating system. Typing the sudo iptables -L command (Ubuntu) returns the following entries:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

This means that the server accepts anything from anyone on any port (policy ACCEPT). Let’s try to open the necessary ports and refuse connections to other ports for an input chain.

sudo iptables -A INPUT -p tcp --dport 2345 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

These commands accept connections to 2345-, 80- and 443-ports. Despite this, we still have no other restrictions for other ports. So, you need to add a rule to an end of the input chain that will refuse all inappropriate packets.

sudo iptables -A INPUT -j DROP

That’s all. It should be borne in mind that the settings above may vary greatly depending on a chosen operating system. The main goal here is only an explanation of the basic principles. Be careful when changing network settings. Sometimes it can make a remote server not available for any connections.

A few general guidelines for setting up a web server. Applying these rules is very important for the functioning of your website. By using server vulnerabilities attackers can manipulate website files, upload malicious scripts and run these scripts somehow.

Access to the website files

There is the main rule - the website files should be editable by a non-root user and shouldn’t be writable by a web server user. The Drupal files/ directory in some cases can be available for writing by the web server’s user. The detailed information on securing file permissions and ownership can be found in the Useful links block at the end of the article.

Restrict an access to some pages on the web server level

Sometimes it may be useful to restrict an access to several pages of the website on the web server level. For example, in a situation when you have a demo website or a website without a registration functionality. So, you can protect the /user and /admin/* routes. For the Apache web server it can be done by using the mod_authz_host  and mod_rewrite modules. Keep in mind that using a http authentication isn’t a secure approach. Thus, the described method is more applicable in a given case.

Remove the unused web server extensions

All additional software on the server is a potential security risk. So, you should minimize a set of necessary tools. If you don’t need something, just remove it.

The same is applicable for the web server. Apache and Nginx web servers have a lot of additional extensions which can be used for some purposes. Carefully check a list of enabled extensions and remove all not used extensions.


Usage of the HTTPS protocol makes the website and an access to the private users’ data more secure. Nowadays it’s an absolutely impossible situation when some online stores don’t use encryption for their payment transactions. Moreover, Google sets HTTPS as a ranking indicator. It means the websites which don’t use the HTTPS protocol but at the same time process, some important information (credit cards details, payment transactions, etc.) get a negative impact on search rankings.

An ideal case is if you apply encryption for all websites that have an interaction with users. An obvious example of such an interaction can be the login and registration forms. Users type their passwords to these forms. Even if these passwords look invisible (like black circles in a field) in all browsers, they are passed through a network in an unencrypted form. So, if attackers have an access to the network, they can easily intercept the data entered. Quite often users have the same passwords for different services. This means that access to other services can also be compromised.

HTTP Authentication

It should be clear in what situations you can use an HTTP authentication. Most often you need it to protect an access to a staging website and disable indexing of this website by search bots. However, the HTTP authentication is inherently insecure. It doesn’t use any encryption algorithm. So, the traffic between your browser and the website isn’t encrypted and an attacker can get the access to the website just by copying the “Authorization” HTTP header and sending it the web server.

Also, it’s strongly recommended to keep the htpasswd file outside of a document root. Set read only permissions for this file (440).

PHP like other parts of the server infrastructure can contain vulnerabilities. Here much depends on the settings of PHP itself and on what version of PHP is currently used. Of course, you always need to check all available updates and keep PHP updated. However, in some situations, it can be quite difficult or even impossible.

In general, all the work to optimize the safety of the operation of PHP on a server can be divided into three parts:

  • Periodic update of PHP version
  • Avoiding the use of an insecure code, functions, etc.
  • Optimizing PHP settings

Periodic update of  PHP version

It’s obvious thing but, as I mentioned, in some cases updating can be quite difficult or even impossible. It can happen in a situation when you have a lot of legacy code in your application (it doesn’t work in the new PHP version) and the current business strategy doesn’t allow you to spend time on updating this code because it’s time-consuming operation. In such a case, you can try to apply some recommendations which are described below.

Avoiding the use of an insecure code

Writing a secure code is an important step to the whole application security. You should spend some time on a regular basis for reviewing all the custom code that you have. Besides, no one can give a guarantee that the third-party libraries do not contain any vulnerabilities. As I mentioned, even PHP itself can have problems with security  (using insecure functions, buffer overflows, etc.).

To solve these problems there is a good solution called Suhosin which can help you to get rid of many security issues. Suhosin was designed to protect servers and users from known and unknown flaws in PHP applications and the PHP core. It consists of two parts. The first part is a patch for the PHP core which provides a few low-level protections against buffer overflows or format string vulnerabilities. The second part is a PHP extension that implements some additional protections.

Suhosin is a really powerful tool for protecting your server against a lot of vulnerabilities. Unfortunately, it isn’t available for PHP 7. In fact, the work on Suhosin7 is being carried out, but it isn’t finished yet. The author doesn’t recommend using Suhosin7 on production servers.

Optimizing PHP settings

The two easiest steps that we can take in order to optimize the PHP security configuration are disabling unused modules and minimizing an amount of information that users can get about a current PHP installation.

To see all of the compiled PHP modules, run the following command:

$ php -m

It’s recommended to use only the most necessary modules to increase security. Carefully check the entire list and decide what modules you don’t need.

Protection of PHP from hacking is not only an accurate programming but also hiding information about a system. Take a look at this string in the php.ini file:

expose_php = Off

Make sure that this parameter is turned off. Otherwise, PHP will send the installed version in response to all requests in the X-Powered-By header.

The same thing applies to the PHP errors on a website. They can provide some additional info about your server (a type of the web server and its version, the structure of directories, etc.). So, it’s highly recommended to disable this feature on production servers.

display_errors = Off
log_errors = On
error_log = /var/log/httpd/php_scripts_error.log

The settings above allow you to turn off displaying errors occurring all around the website. Also, they activate logging of errors into the specified file.

Those were preliminary steps that will help you increase the security of using PHP on your server even without any significant modification of the system. Now let’s talk about some specific restrictions that you can add to the PHP configuration (php.ini file):

  • Disable file uploads
    file_uploads = Off

    But if such a function is necessary, it’s better to limit a file size.
    file_uploads = On
    upload_max_filesize = 1M

  • Control system resources
    max_execution_time = 30
    max_input_time = 30
    memory_limit = 50M

    You can specify the maximum execution time for each script, the maximum amount of memory and the maximum data read time.

  • Disable PHP functions which allow scripts to refer to other URLs
    allow_url_include = Off
    allow_url_fopen = Off

    If allow_url_fopen is enabled, PHP can use file functions such as file_get_contents. With it, the script can download files from remote servers.

  • Disable dangerous functions

    Before disabling, make sure that your website doesn’t require any of them.

  • Restrict an access to the file system
    open_basedir = "/var/www"

    The open_basedir directive allows you to set a directory in which PHP can access files using functions such as fopen, file_get_contents, etc. If the file is outside of this directory, PHP will refuse to open it.

  • Check the session path
    session.save_path = "/tmp"

    Make sure that the session path is outside the website root directory. Also, it mustn’t be readable or writable by other system users.

What measures you will take to ensure a database security depends primarily on the infrastructure of your application. For example, a Drupal’s database abstraction layer gives you an ability for choosing between different databases. Out of the box, it can be MySQL, SQLite or PostgreSQL. Also, Drupal supports popular MySQL forks such as MariaDB and Percona. You should understand that each system may have different specifications regarding the security.

Also much depends on the fact where you keep the database. The easiest way (in terms of security) is installing the database on the same server where you have a website. However, this approach can have an impact on the whole system’s performance and for this reason server administrators may decide to move the database on the separate server. This is especially true for high-loaded applications.

The first thing that you should do after finishing with the configuration of the server environment is checking if your infrastructure is robust enough and it can’t be easily broken by a DoS attack. In fact, even at the peak of its workload, the server should have some reserve of resources.

As I mentioned before database security settings can be very specific depending on the chosen database server. Within this article, let's look at some general measures:

  • Database access
    If the database is installed locally, you can disable the access to it from the network. If your database is on the separate server, it should be possible to set what IP address it will listen to. In case of sharing LAN between the web server and the database server set only a LAN IP address (not accessible via the Internet). It can be done by editing the my.conf file. Below is an example of the configuration when you use the same server for the database and the website.
  • Databases, users, and permissions
    Review your databases, users, and permissions in order to find any security bottlenecks. Don’t give users more rights than they actually need.
  • PHPMyAdmin and similar tools
    Make sure that you disable graphical tools for working with the database after using them. If you plan to continue using these tools, try to make an access to them as difficult as possible. For example, you can restrict an access to PHPMyAdmin by .htaccess and allow the access from certain trusted IP addresses. Besides, instead of using server applications you can try some local instruments like MySQL Workbench.

Drupal has a quite complex architecture. To ensure the safety of this complex system, it’s better to divide all the related work into small parts. During this operation you will encounter a set of tasks that need to be done only once (set file permissions, configure the settings.php file, etc.). There will be some tasks that require periodic attention (update Drupal and modules). Perhaps others will require you to work closely with the Drupal community.

Here are the two key moments that you should keep in mind:

  • Ensuring the Drupal security isn’t an easy thing but it’s very important for any website. So, you must definitely work on this.
  • The security requires a constant attention from your side.


Make sure that a web server has no writing permissions on Drupal files. Writing permissions may only be needed for cached files, uploads, sessions and temporary directories. The following command grants a write access to the public files directory (Ubuntu/Debian):

    $ chown -R www-data:www-data sites/default/files

If your website allows to upload files, pay attention to how you can secure the process of working with these files. Allow only certain file types to be uploaded. Relatively safe are text files and pictures. However, this does not change the fact that users can upload malicious code like a file with a .jpg or .txt extension. To avoid this problem you can try to install the ClamAV module which scans uploaded files for viruses and other malicious code.

The settings.php file

After the initial install, make sure that the settings.php file has no write permissions. Information about this can be found on the Status report page (admin/reports/status in Drupal 8).

In the settings.php file you can set one important option which prevents your website from thinking it is someone’s else. This type of attacks is called HTTP POST Header attacks. To protect a Drupal 7 website against them add the base URL parameter to your settings:

    $base_url = 'http://www.example.com';

The similar thing in Drupal 8 is the trusted hosts array:

    $settings['trusted_host_patterns'] = [

To generate an extra random data Drupal uses salt. Salt is also specified in the settings.php file. For enhanced security, you may put this value to some file which is located outside of the website root. In Drupal 7:

    $drupal_hash_salt = file_get_contents('/home/example/salt.txt');

And in Drupal 8:

    $settings['hash_salt'] = file_get_contents('/home/example/salt.txt');

Error logs

Drupal provides a mechanism for monitoring a status of your website. Here I mean Recent log messages and Status report pages. Try to check these pages regularly and fix issues found. The Status report page is very useful, especially after a website installation. For example, it can inform you if you forgot to add the trusted hosts settings or there is a write access to the settings.php file. Some types of suspicious activities can be traced simply by looking at the Recent log messages page. As an example imagine a situation when you notice a surge in a registration of new users.

Don’t forget to disable the display of PHP errors. They should not be visible for ordinary users. Although you may see these errors on the Recent log messages page keep in mind that it doesn’t catch all PHP errors. So, check your server log files sometimes.

Changes in Drupal core and contributed modules

This part is about the possible hacks of the Drupal core and contributed modules. Actually, it’s a well-known fact that new developers may cut corners and put their code or some changes directly into Drupal core or the installed contributed modules. This can potentially lead to unpredictable behavior of Drupal itself, as well as to the appearance of vulnerabilities.

To veer away from these problems I recommend to use the Hacked! module. This module scans the currently installed Drupal, contributed modules and themes and compares everything with appropriate versions from drupal.org. If you have the Diff module installed, Hacked! will inform what exact lines were changed. All this makes the Hacked! module a valuable analytical tool for any website.

Users and permissions

Drupal has an intuitive and customizable permissions model. A permission is the simplest element of such system. A set of permissions can be grouped by a role. Then this role may be assigned to the particular users. New permissions and roles may appear during an update of Drupal core and contributed modules. You should periodically check (for example, after updating) which roles are assigned to each user on your website and what permissions are included in these roles. Try to minimize sets of permissions that are included in each role. Don’t give users more permissions than they really need.

A good security practice is a use of a non-standard username (e.g. not admin or root) for user/1 because an attacker will check standard variants in a first place. For greater security, it’s even possible to completely disable the user/1 account.

Another good thing is checking activities of users on your website and lock inactive accounts. The User Expire module provides an ability to define a date on which a specific user account will be locked. Also, it can lock accounts that are inactive for a certain period of time.

Useful modules

Depending on your needs you may find a lot of useful security modules on drupal.org. Here is just a brief list some of them:

In this article, we reviewed a number of practices aimed at securing your website. The review also covers all parts of the necessary infrastructure - from the common server settings to the specific use cases of some Drupal modules.

Many people neglect to monitor the security of their sites and server infrastructure until there are obvious problems. Although even observance of a number of simple rules would help to avoid their appearance. So be patient and always keep an eye on the security of your system. Good luck!

  1. The detailed information on securing file permissions and ownership
  2. The mod_authz_host module
  3. The mod_rewrite module
  4. Suhosin
  5. The ClamAV module
  6. Salt
  7. The Hacked! module
  8. The Diff module
  9. The User expire module

Get a security check

Aug 30 2017
Aug 30

Drupal has changed many lives for the best and we want to show newcomers how. Share your story with us!

Record a short video with a hashtag #Drupalchanges and tell what positive changes Drupal brought to your life. Did you change your career? Cool! Met new friends, moved a bigger city? It's huge!

[embedded content]

Post the video on Twitter and/or Facebook until the 7th of September and we will compose your stories altogether so everybody can use the video!

Let's inspire together!

Aug 29 2017
Aug 29


Hello there! This little website audit checklist will get you directly to the topic itself: checking a website’s health does not need any reasoning behind it. Don’t be misled by Google: the website audit is not only about SEO, but about such aspects as design and UX, the lead generation process at your website and ease of administering/editing the website, content of the website and an interaction with social media (borrowed from HubSpot approach). We’ll go through all those aspects above and see what functional areas we can and should improve. This article is written by a content editor for content editors, website admins and website owners who need to explain to their tech colleagues what’s wrong with their website.

Be lazy - we’ve done half of the job for you!

Little tip before you start

We understand that your website probably has dozens and hundreds of web pages. It’s not possible to check them all at once, in a batch - you have other things to do after all. Web auditing is important, but choose up to ten pages that drive your business to its goal: the main page, a contact page, pages of the most popular products/groups of products. Check them first and make sure they work for you 24/7.

Web auditing

Design and UX audit

The very first subtopic we want to cover is website design and its ease of use for website visitors. Your website design welcomes your users and makes them either escape or stay and do what they came for at your website. A few years ago (a human being’s basic psychological features barely have changed since then) Google held a research and it was revealed that it takes less than a second to judge website’s attractiveness: those research participants assessed more complex websites as less attractive. What does it all have to deal with proper functioning?

The thing is, a brain prefers thinking of stuff that is easier to comprehend. Forget about complex designs not helping a website’s guest then. Or lose a newcomer.

Web design and UX audit checklist

Web design and UX checklist

  1. A page structure is easy to distinguish: headers, titles (H1-H6), footers, content help a user navigate a page.
  2. If appropriate, consider using design breadcrumbs and footer links. Use heat maps to see if your website’s visitors click the footer’s links first. Check an SEO part of this article to learn what dangers you might face.
  3. Content density does not repulse a visitor: it’s divided by headings, pictures (that must help understand content), white space.
  4. Design leads the visitor to CTA links and buttons: interactive elements, hovers, etc. Some handy design trends of 2017 can be found here.
  5. CTA is placed within the first ⅓ rd of a user’s screen.
  6. Web design aligns with the company’s brand.
  7. The website renders well on all devices: users can easily do what they came for on desktops, mobiles, tablets and so on.
  8. Check all visual elements of your design: background illustrations share the same style for the sake of a smooth transition between pages; all design elements (logo, favicons, headers, typography, colors used) don’t contradict each other, too.

If you followed the instructions above, you can see these figures changing:

  1. A level of bounce rate decreases since the navigation is clear and users understand what to do next.
  2. A session duration should grow.
  3. Users execute the main CTA.

Lead generation process audit

Lead generation process follows the design and UX topic. As we already mentioned in the checklist, the design must help to convert visitors into leads.

Lead generation process audit checklist

  1. A page has a clear call-to-action (CTA) block: a button, a link - whatever converts the best.
  2. No more than 3 calls to action.
  3. CTA must be visible and reachable for users (for instance, don’t hide a CTA in the footer if your website’s visitors don’t tend to scroll the whole page.
  4. If a website’s visitor changes his/her mind and leaves a particular CTA unfinished (for example, a contact form left unfilled completely), you should give them another opportunity to dispel a doubt. You can show them a pop-up offering a free consultation/a knowledge base to get into details/asking a reason for leaving. The pop-up is a rather tricky method of communicating with users, but wisely used - it works. Learn what annoys the website’s visitors, when it’s appropriate to show the pop-up, how much time should pass before the pop-up is shown, etc.

Likewise in the previous block, if you followed the instructions above users would execute the main CTA and if something disrupts them - there’s a tool that helps users to complete the action. Conversion must grow, if it doesn’t, you go back to the web design and UX section and check what’s wrong.

Lead generation

Content audit

Let’s assume a page structure is wisely designed and users understand what actions he/she ought to perform to get what they came for. A menu does navigation work perfectly, and all that is left - not to repulse the users with content issues. They do read it, they really do!

Content audit checklist

  1. Content adheres to the page goal: if it is a contact page - content must stick to the ways the user can contact you. It’s a very obvious, yet a very common mistake. Keep the page goal in mind when filling it with content.
  2. Content is logically structured and doesn’t confuse users. Use Jakob Nielsen’s “Inverted Pyramid”: place the most important info first, then proceed with supporting details, and only after all add a related information.
  3. No spelling and grammar mistakes.
  4. No extra content: only that drives a guest to CTA.
  5. Likewise, design in general, you should pay attention to content structure and how it’s divided: blocks, bullets, white space and illustrative pictures.

Content improvement also facilitates the main goal execution: CTAs are being clicked/filled in/completed.

SEO audit

A search engine optimization part makes your content visible to a wider audience. Without specific terms, there are many technical operations you can do so that your content is found by more and more people. Some changes, like editing headings and content itself, inserting links can be implemented without programmer’s supervision, others require the help of a specialist.

SEO audit checklist

  1. Set up a correct tracking tool to track what’s going on with your website: keywords, traffic, entrance pages, exit pages, etc.
  2. Put appropriate content tags: title tags, description tags, image tags, meta tags.
  3. Use key words and their synonyms in the headings, in the text itself.
  4. Eliminate broken links at your website.
  5. Make sure your content doesn’t have references to other sources at the very beginning: this way readers won’t leave your website too soon for Google Analytics or other tools to count it as a bounce and lower a website’s ranking in search.
  6. Think about using internal links on your website: in the footer, in content. Don’t party hard there.  Such internal links must help a user to continue his/her journey. If those links are inserted automatically, with the help of a bot, for example, Google can punish you: it treats links jamming into every matching word as a manipulation. You can find the results of such cross-linking in the end of the article. 
  7. You’ve given enough attention to link building and there are other websites that refer to yours. Thus Google treats your website as an authority one and ranks it higher. Of course, if websites that refer to your website are trustworthy :)
  8. Tune the server files that influence how search engines access your website and index it: .htaccess, robots.txt, sitemap.xml. This step can be pretty complicated for setting up without programmer’s supervision, but try not to omit it. Google must crawl into and analyze your content correctly!

What SEO gives you:

  1. First of all, you understand what drives your traffic and what your traffic sources are. Then you impact them!
  2. You understand how users find content similar to yours and now an organic traffic grows because you use tags, key words wisely.
  3. A level of bounce rate decreases.
  4. A visitor spends more time on your website than before due to internal linking.
  5. After all, your ranking must be higher than before an SEO tuning.

Social media presence audit

Now an SEO part is fixed and your website is getting higher in a search. What else can help? Right: a big link mass and references from other resources.

Social media presence audit checklist

  1. Your company/brand is present at social networks: a public page, a group.
  2. You keep referring to your website at profiles in social networks and make sure content has a wide reach.
  3. Social media icons are embedded into website’s footer or another appropriate place.

Having everything done right, you will see a traffic from social networks growing.

Little tip before you go

Ease of administering/editing the website

When you’ve done everything for a user, consider checking how easy it is to edit a website and perform everyday routine actions. There’s no particular checklist for that because it mostly depends on a CMS you use. Make sure administrators of your website can create content pages without the help of a programmer. Make sure admins can present content the right way, too: they can upload images, embed videos, align a text.


Now you’re set to conduct your first own website audit. Don’t omit steps and soon you’ll see how better the things are going. If you know the things that we might have missed in this guide or need our advice - let us know. Happy auditing!

Useful links

  1. Google research
  2. Cognitive fluency
  3. About excessive cross-linking
Aug 16 2017
Aug 16

Joining a new company is a complex and difficult process even if it is a positive move. New environment, new people, new responsibilities can shake everyone’s world and make one feel uncertainty. That is why many companies create adaptation programs in order to ease this process for new employees.

New employees adaptation: Drupal team experience

We at ADCI Solutions also care about each team member and strive to ensure that everyone feels safe and sound at work. Therefore we put efforts into a good adaptation program development. Most people in our team start from a position of an intern and make all the way up the career path from that point. Sometimes it means that being the intern in our company is the very first workplace for the person. We value such growth inside our company and try to make it comfortable for newbies to work with more seasoned team members.

The first point of adaptation in the company is a job interview. Surprising, right? But it is so. During the job interview, a potential employee receives the first impression about the company and its corporate culture and sets the first expectations, too. Researchers this stage anticipatory socialization and a decision for the job. Therefore it is very important for an interviewer to be highly transparent about the job tasks and a working atmosphere. Otherwise, after being hired the person will experience the emotional burden caused by reality mismatch.

We approach the stage of the interview after the candidate finishes the test tasks and his/her programming skills are confirmed. This means that on the interview we only check if this person matches the team spirit and fits the corporate culture.

When the person is hired and comes to his/her first working day we welcome him/her with a small booklet with our traditions, other corporate culture rules, and opportunities such as English classes, the bonus system, educational events and so on. This helps the new employee to adapt to a new environment knowing whom to ask questions and how to behave in a particular situation.

From the moment of employment starts the stage of introduction to job duties. All of our new interns and employees have a team lead and a mentor who guide them through their working integration. This person provides the necessary education and helps with getting to know other team members. After the internship is finished comes the stage of individual strategies development to manage adaptation issues. It is connected with both professional and social integration which finalize the employee incorporation and adaptation. To achieve that the three following points should be present:

  1. the new employee should be familiar not only with direct duties but also with related responsibilities, the scope of competence and other ways to prove him/herself;
  2. the new employee should perform his/her first results;
  3. the new employee should understand the values of the company and behave accordingly.

In order to provide the new interns and employees with necessary information about work and the corporate culture we not only delegate it to mentors. We also organize special team buildings that are attended by team members who work less than half a year but the rest of the team is also welcome. The agenda of such team building includes, first of all, getting to know each other better. It is crucial since the company grows bigger and we want to make sure that people know everyone’s name, hobby, etc. The other part is a team building itself. Here we accomplish some exercises to get bounded and feel the team spirit. And the final part of the agenda is a corporate culture presentation where we openly speak about unclear moments and try to be on the same page as the team.

Team-building in a web team

Besides such special activities, we have several permanent things that help newbies to adapt. These are common lunches, Xbox, and board games playing, corporate parties and, of course, group chats.

Since we have included these activities into the adaptation process new team members seem to be more confident and open. However we think that there’s no limit to perfection, therefore we also developed a short survey for team members who work more than half a year. This survey includes a question on how easy or hard was the process of adaptation in the company and what would help to speed it up.

We are still in process of improvement of our adaptation system. And hope that we’ll find the ideal way to make each day of our team members memorable.

Aug 02 2017
Aug 02

Over the past few years, e-commerce has transformed how people buy and sell online. The Internet provides a quick and easy way for people to buy things without visiting an offline store. As the demand for online purchases grows, the offer of commerce templates also gets higher. Many website developers offer attractive ready-to-use templates.

Lots of things affect the success of your online store and the way you sell it online: it’s an interface, an amount of time it takes to find a product and purchase it and many others. It is very important for small businesses and retailers to a have beautiful, yet functional and responsive website.

For this article we chose ten Drupal e-commerce themes which can be used for different kind of stores. Enjoy reading!


The Rhytm theme

The Rhytm theme is the first in our top. This is a simple and modern professional theme for different kinds of businesses. The highly customizable and easy to use, this responsive theme will help you to manage your website in several clicks. Rhytm is a multipurpose theme and it has strong well-designed shop sections.

Price: $58.


The Brilliant theme

Brilliant is a Drupal theme which looks clean and nice. It will be suitable for different kinds of shops, but the best way is to use it for the fashion store. Due to light pastel colors and the way a white space is used the overall look of the theme is clean and appealing. The Brilliant theme looks good on all devices from desktop to mobile.

Price: $58.

ADCI Commerce theme

The Commerce theme by ADCI Solutions

The Commerce theme by ADCI Solutions is the best way for you to display and sell your products, whatever you sell. It is designed to make your online selling fast, easy and inexpensive. The theme layout always fits perfectly with  every screen no matter what the size it is: a desktop, a tablet, a mobile phone, etc. It’s the best way to start your business and showcase your projects or sell your products.

Price: free.


The Marketplace theme

Marketplace is a Drupal theme which has a nice and trendy appearance. A minimum of colors, lines and slight shadows make a positive impression. The usage of negative space looks splendid. This theme will look good on any device. Especially recommended for all kinds of retailers.

Price: 63$.


The Flatize theme

Flatize is a Drupal theme mostly suitable for a shopping site. The design of the theme is very functional, there is nothing useless in it. Product page is well designed, the process of adding goods to the cart is very convenient. In addition, a variety of blocks in the layout of the pages and the correct usage of accents will not let buyer get bored and make the purchase process as tight as possible.

Price: 58$.


The Dmart theme

The Dmart theme is suitable for almost any store, whether it is a technology or furniture one. Although unusual colors and textures are used in this theme, it looks professional and minimalistic. It has a well-implemented search by price, brands, category and other parameters. Also this theme is optimized for different screen resolutions.

Price: $58.


The SimpleGreat theme

This template is perfect for businesses that sell such products as watches, jewelry and other accessories. The design of the theme is minimalistic, with dominance of gray and white colors. Also a parallax effect is used in several blocks. Responsive theme design allows to display your store well both on mobile devices and in desktop versions.

Price: $58.


The Flatastic theme

The Flatastic theme gives you an excellent opportunity to create a e-commerce website, it can be retail, fashion, interior or almost any other field. This is generally a white theme with bright accents, it looks nice and creates an impression of action and flexibility. The Flatastic theme will let you organize all content efficiently and provide you with professional features. The design is responsive and retina ready.

Price: $58.

Big C

The BigC theme

BigC is a brand new Drupal theme for almost any kind of business. It looks professional and modern, it has a flat design and you can create a good shop using this template. It has a classic structure with all needed blocks to make your shop nice and user-friendly. And a responsive layout will help customers to buy goods from mobile devices.

Price: $49.

Go shop

The GoShop theme

GoShop is a Drupal theme for commerce. It has an attractive layout and a good structure. It also has a nice typography with unusual font pairings. The whole look tells us that this theme is better to use for sport goods such as bikes. Goshop fits all possible devices smoothly.

Price: $48.


We’ve observed 10 Drupal themes which you can use to sell products online.

These are the kinds of themes suitable for different business purposes. Most of them are good for fashion stores. I hope you enjoyed the collection. These themes help to create an appealing web project, that's why if you look for the website solution, this article is to help you in your search.

Useful links

  1. The Rhytm theme
  2. The Brilliant theme
  3. The ADCI Commerce theme
  4. The Marketplace theme
  5. The Flatize theme
  6. The Dmart theme
  7. The SimpleGreat theme
  8. The Flatastic theme
  9. The Big C theme
  10. The Go shop theme
Jul 12 2017
Jul 12


A lot of time has passed since the release of Drupal 8. Instead of using only the hook-oriented paradigm and the procedural programming, Drupal chose a way of involving popular technologies and applying object-oriented methodologies. Changes affected almost all the main parts - from the core functionality to the template engine.

Adding the Symfony components to Drupal 8 had the biggest impact on its development. Drupal became even more flexible than it was before. Developers got a great opportunity to follow the modern technologies and use the object-oriented programming style.

This article focuses on discussing the changes of the common core functionality which were caused by adding the Symfony components. Here you can find the simplified code examples that would help you feel the difference between “clear” Symfony and Drupal 8 solutions. Maybe for some of you this will be the key point to a better understanding of the internal structure of Drupal 8.

Symfony components in Drupal 8

Symfony components in Drupal 8

According to the Symfony documentation, Drupal 8 contains the following components:

  • ClassLoader
  • Console
  • CssSelector
  • DependencyInjection
  • EventDispatcher
  • HttpFoundation
  • HttpKernel
  • Process
  • Routing
  • Serializer
  • Translation
  • Validator
  • Yaml

You should understand that it isn’t a full list because the Symfony community doesn’t track all the changes that have been added to the Drupal 8 core since its release. However, here we can notice the several components which are the basis of Drupal core. I talk about DependencyInjection, EventDispatcher and Routing. The biggest part of changes in the Drupal 8 architecture is connected to the integration of these components. So, the following reasoning is exactly about them.

The basis of Drupal core

Dependency injection and Services in Symfony

Talking about using the DependencyInjection component, it’s impossible not to mention the Service and Service container topics. In general terms, services are any objects managed by the service container. The service container is a special object in which each service lives. This methodology makes usage of services more standardized and flexible. As an additional bonus you get an optimized approach to working with services. If you never ask for some service, it’ll never be constructed. Besides, services are created only once - the same instance is returned every time when you ask for it.

If you have the service container in Symfony, you can easily get some service by its id:

$logger = $container->get('logger');
$entityManager = $container->get('doctrine.orm.entity_manager');

To create a custom service you just need to put a necessary code (most often it’s something that you want to reuse in an application) into a new class. Below there is an example of such a class. It contains a method of getting a random user name from an array.

// src/AppBundle/Service/Lottery.php
namespace AppBundle\Service;

class Lottery
    public function getWinner()
        $users = [

        $index = array_rand($users);

        return $users[$index];

In the services.yml file you can specify how the service container instantiates this service class. It’s possible to specify a large set of parameters here. For additional information you can check this topic.

# app/config/services.yml
        class:     AppBundle\Service\Lottery
        arguments: []

That’s it. Your service has the unique key and it’s available in the service container. How about using this service in your controller?

public function newAction()
    // ...

    // the container will instantiate a new Lottery()
    $lottery = $this->get('app.lottery');
    $winner = $lottery->getWinner();

    // ...

As you may see there is no difference between using the custom services and any of the already existing services.

So, finally, we can discuss the DependencyInjection component itself. It provides several useful classes for operating with services and their dependencies. Let’s create an additional service in order to demonstrate this functionality.

// src/AppBundle/Service/Prize.php
namespace AppBundle\Service;
class Prize
    protected $lottery;

    public function __construct(\Lottery $lottery)
        $this->lottery = $lottery;

    public function givePrizeToUser()
        // ...

The ContainerBuilder class allows you to register the just created class as a service. It can be done in the following way:

use Symfony\Component\DependencyInjection\ContainerBuilder;

$container = new ContainerBuilder();
$container->register('prize', 'Prize');

Our target is adding the dependency between the lottery and prize services. When defining the prize service, the lottery service doesn’t exist yet. You need to use the Reference class to tell the container to inject the lottery service when it initializes.

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;

$container = new ContainerBuilder();
$container->register('lottery', 'Lottery');
    ->register('prize', 'Prize')
    ->addArgument(new Reference('lottery'));

Dependency injection and Services in Drupal

Drupal slightly extends this scheme. For defining services and additional parameters it uses several yml-files. The core services are defined in the core.services.yml file. Modules can register their own services in the container by creating the modulename.services.yml file in their respective directories. Drupal uses the ServiceProvider class (the CoreServiceProvider.php file) to register the core services.

use Drupal\Core\DependencyInjection\ContainerBuilder;
// ...

class CoreServiceProvider implements ServiceProviderInterface, ServiceModifierInterface {
  public function register(ContainerBuilder $container) {
    // ...
    $container->addCompilerPass(new ModifyServiceDefinitionsPass());

    $container->addCompilerPass(new ProxyServicesPass());

    $container->addCompilerPass(new BackendCompilerPass());
    // ...
  // ...

This class contains the register() method in which you can find the ContainerBuilder class from the DependencyInjection component. Other modules apply the same principles to register their own services at the service container.

Events and Dispatching Events in Symfony

The dispatching events system is provided by the EventDispatcher component. It includes three parts:

  • Dispatcher - the main object that allows you to register new listeners or subscribers.
  • Listener or Subscriber - the object that you need to connect to the dispatcher in order to stay notified when the event is dispatched.
  • Event - the event class that describes your event.

Let’s try to extend the previous examples. Suppose you want to notify other parts of your application somehow when a random user gets a prize. First of all, you need to define a dispatcher object and connect a listener with this dispatcher.

use Symfony\Component\EventDispatcher\EventDispatcher;

$dispatcher = new EventDispatcher();
$listener = new LotteryListener();
$dispatcher->addListener('lottery.complete.action',array($listener, 'onCompleteAction'));

Then it's worth taking care of your custom event. Custom events are used very often while creating third-party libraries or if you just want to make the whole system more decoupled and flexible.

use Symfony\Component\EventDispatcher\Event;

class LotteryCompleteEvent extends Event
    const NAME = 'lottery.complete';

    protected $user;

    public function __construct(Prize $prize)
        $this->prize = $prize;

    public function getPrize()
        return $this->prize;

Now each listener has an access to the Prize object via the getPrize() method. During dispatching, you need to pass a machine name for the event. For this reason, the NAME constant is defined inside of the class.

use Symfony\Component\EventDispatcher\EventDispatcher;

$prize = new Prize();
// ...

// Create the LotteryCompleteEvent and dispatch it.
$event = new LotteryCompleteEvent($prize);
$dispatcher->dispatch(LotteryCompleteEvent::NAME, $event);

So, any listener to the lottery.complete event will get the LotteryCompleteEvent object.

In the examples above I used the event listener object, but, actually, this is not a problem to replace it with the subscriber object. The main difference between listeners and subscribers is that the subscriber is able to pass a set of events for subscription to the dispatcher. The subscriber implements the EventSubscriberInterface interface. It requires the single static method called getSubscribedEvents(). In this method you should specify a list of events.

Events and Dispatching Events in Drupal

Regarding appliance the dispatching events mechanism, you wouldn’t find any difference between using it in Symfony and in Drupal 8. Here we just need to talk about using this approach in custom modules and about the possible future plans of Drupal that are related to dispatching events functionality.

To define an Event, Dispatcher and Subscriber classes you need to do the following:

  1. You need to define the Event class under the src/ folder in the module root directory. For instance, let it be src/CustomEvent.php. This class should extend the Event class of the EventDispatcher component.
  2. You need to dispatch this event somewhere. Obviously, it depends on the logic of the module operation.
  3. Under the src/EventSubscriber directory you have to create an Event Subscriber class - src/EventSubscriber/CustomEventSubscriber.php. This class must implement the EventSubscriberInterface interface. It also must contain the single static method called getSubscribedEvents() where you need to define a list of events for subscribing.
  4. Tag the Event Subscriber as ‘event_subscriber’ in the modulename.services.yml file. You can find the necessary information about using tags in the Symfony documentation.

That’s all you need to do for dispatching some events and for reacting to them somehow.

The Events system can be a good replacement for the hook-paradigm which Drupal 8 inherited from the previous version. Despite the fact that many parts have been reworked using events, Drupal 8 still uses hooks. There are some attempts which are related to replacing some well known hooks by events. The Hook Event Dispatcher module is a good example of such an approach.

Routing in Symfony

According to the Symfony documentation you need three main parts for configuring the routing system:

  • RouteCollection - contains the route definitions
  • RequestContext - contains the necessary parameters for the request
  • UrlMatcher - performs the mapping between the request and a single route

These are all classes from the Routing component. For a better understanding let’s look at the simple example:

use Symfony\Component\Routing\Generator\UrlGenerator;
use Symfony\Component\Routing\Matcher\UrlMatcher;
use Symfony\Component\Routing\RequestContext;
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;

$route = new Route('/article/{name}', array('_controller' => 'MyController'));
$routes = new RouteCollection();
$routes->add('show_article', $route);
$context = new RequestContext('/');

// Get parameters for the specified route.
$matcher = new UrlMatcher($routes, $context);
$parameters = $matcher->match('/article/my-article');
// array('_controller' => 'MyController', '_route' => 'route_name', 'name' => 'my-article')

// Generate an url from the route.
$generator = new UrlGenerator($routes, $context);
$url = $generator->generate('show_article', array(
    'name' => 'news-article',
// /article/news-article

Another important thing that I haven’t added to the list above is the Route class. It allows you to define a single route. Then each route is added to the RouteCollection object. This action is performed by using the RouteCollection::add() method.

The UrlMatcher::match() method returns available parameters for the specified route. If there is no such a route, a ResourceNotFoundException will be thrown.

To generate a url for some route you need to use the UrlGenerator::generate() method. You can pass route variables to this method. For example, it can be useful if you have a wildcard placeholder in the route.

Besides using this approach for configuring the routing system there is a possibility to load routes from a number of the different files. Here everything depends on the FileLocator class. You can use this class to define an array of paths for checking the requested files. For each found file the loader returns a RouteCollection object.

Routing in Drupal

In general, Drupal 8 uses the same mechanisms for working with routes as Symfony does. The Routing component replaced hook_menu() from Drupal 7. Pay attention that the routing system doesn’t work with creation of  tabs, actions and contextual links. So, this functionality which was processed by hook_menu() before is taken over by other subsystems.

To create some routes you need to define them in the modulename.routing.yml file in your module.

class MyRoutesController {  
  // ...
  public function content($category) {
    // Category is a string value.
    // Here can be some logic to process this variable.

In this case the system checks permissions for the access to the specified path. If everything is okay, it calls the MyRoutesController::content() method from the controller.

If needed, you can specify a wildcard (also it’s called slug) in a path parameter for your route. It’s only possible to use such wildcards between slashes or after the last slash.

In the example above we specified the category wildcard. Let’s look how you can apply this in the controller:

class MyRoutesController {  
  // ...
  public function content($category) {
    // Category is a string value.
    // Here can be some logic to process this variable.

It’s important to use the same name for the variable as it was specified for the wildcard in the path parameter. The search for the corresponding variable is made by its name. It doesn’t even depend on the order in which the variables were specified.

Besides creating your own routes you can alter the already existing ones. This is possible thanks to the RoutingEvents::ALTER event. The event triggers after building routes. To use this functionality you need to extend the RouterSubscriberBase class and implement the alterRoutes(RouteCollection $collection) method of this class.


We considered several important points related to presence of the Symfony components in Drupal 8. Of course, it was not a complete list, but I think these components played a key role in determining the main directions of the Drupal 8 development. Drupal has become much more flexible. Now it's even possible to redefine the behavior of many parts of its core.

Usage of services and dependency injections allows to make your code more flexible and ready to reuse. By applying the DependencyInjection component you get an opportunity of a unified definition of the needed dependencies for your classes. Hooks were partially replaced by the events system from the EventDispatcher component. It allows to get more control over relations between different parts of an application. The routing system from the Routing component replaced the functionality of hook_menu(). It has become more functional, more flexible and more readable.

As you may see the biggest part of solutions in Drupal 8 are heavily based on the mentioned Symfony components. Drupal just extends some approaches and, in some cases, makes them even more flexible. All this represents Drupal 8 more attractive for the Symfony developers. Thus, relationships between Drupal and Symfony communities are strengthened. Based on these facts, we have a good reason to believe that Drupal has chosen the right way for its development. I look forward to see changes in future versions!

Drupal 8 and Symfony

Jun 30 2017
Jun 30


Sooner or later every developer faces this scary (actually, not) process called "Migration". If you’re one of them, you must have heard about one of the most outstanding and solid module for Drupal 7: Migrate. Actually this is not even the module, it’s a migration framework that provides a wonderful API and a variety of powerful tools for data migration into Drupal from various sources. From my point of view, existence of such modules is very important for the Drupal community and the Drupal ecosystem, because it provides an easy way to move projects from another CMS or from any other frameworks to Drupal. Thus we can offer our client a relatively cheap way to change their system in favor of Drupal. In this article you’ll read how to use Migrate API in Drupal 8 and we’ll build a simple module to execute migration from Drupal 7 to Drupal 8.

A bit of theory

A migration process can be presented on this diagram.

A migration process

This is kind of a common approach of migration, there is no any specific Drupal aspects. We have a source database (which is not necessary should be a database, it can be CSV, XML,  etc.) and we have a destination database which is a Drupal 8 database of course. As you can see on the diagram between these two databases (source and destination) we have a list of ordered operations.

The first one is a getting of data, it’s a query system which lets you get the data from the source database. Then goes a mapping, where you can set which field from the source database should go in what source in the destination database. The next step is processing, in this operation we can change the data taken from the source db. For example, we need to change a format of the taken data to fit new structures in Drupal 8. The last one is a setting, it’s a part of the destination object that sets the data in the structures of the destination database (Drupal 8 database structure).

The Migration API in Drupal 8

Let’s look how the things are going in Drupal 8 and with the Migration module. We don’t have a Drupal 8 release of the Migrate project on drupal.org, because the most of its features were ported into Drupal core: the main migration module “migrate” and the module for D6 and D7 migrations “migrate_drupal”. I told that not all the features of the Migrate module were ported into core, but it doesn’t mean that we’re bounded by this situation in comparison with Drupal 7 version, not at all. All these familiar features exist in the contrib project. Here is a list of the modules providing features for Drupal 8 that Drupal 7 module has:

  1. Migrate Tools: this module provides general-purpose Drush commands and a basic UI for managing migrations.
  2. Migrate Upgrade: here we can find Drush commands for Drupal-to-Drupal migrations.
  3. Migrate Plus: a very helpful module. Provides API extensions, for example, PREPARE_ROW event, an additional source and destination plugins, a well documented example module and a groups feature.
  4. Migrate Source CSV, Migrate Spreadsheet: a couple of helpful modules that provide specific source plugins.

Logically the structure of the migration API does not differ much in Drupal 7: for example, we have sources, then we process data taken from these sources and after that all data goes to a destination. In the 8th version we have 3 main parts which are implemented via a plugin system: source, process and destination.

By default Drupal 8 includes three migration modules (migrate, migrate_drupal, migrate_drupal_ui) that can help you to do a simple upgrade from the 6th or the 7th versions. Also it requires a clean & empty installation of Drupal 8. I have to admit that core’s upgrade works very decent for simple sites. But this is not our case.

Let’s imagine that we have to do migration of content from one content type in Drupal 7 “Blog” to another content type in Drupal 8 - also “Blog”, into an existing site. Our first migration will be a straightforward one, so there won’t any complex actions, so data will be migrated as it is.

How to develop a migration module for Drupal 7-to-Drupal 8 migration

Custom Drupal-to-Drupal migration

Let’s start creating our first migration module. At first we need to establish a database connection to a D7 database, here is an example of the settings.php:

// Our default connection to Drupal 8.
$databases['default']['default'] = array (
  'database' => 'drupal8',
  'username' => 'root',
  'password' => 'root',
  'prefix' => '',
  'host' => 'localhost',
  'port' => '',
  'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql',
  'driver' => 'mysql',

// Legacy database connection to Drupal 7.

$databases['old_drupal']['default'] = array (
  'database' => 'drupal7',
  'username' => 'root',
  'password' => 'root',
  'prefix' => '',
  'host' => 'localhost',
  'port' => '3306',
  'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql',
  'driver' => 'mysql',

Once the database connection to an old site is established we can enable necessary contrib modules and start:

drush dl migrate_plus, migrate_tools

drush en migrate_plus, migrate_tools

As any other Drupal 8 module we need to add yml.info file, nothing special.

name: My Migrate
description: Performs an example of a simple Drupal-to-Drupal migration.
package: Other
 - migrate
 - migrate_drupal
 - migrate_plus
type: module
core: 8.x

As the next step we need to define our mappings. Unlike D7, in D8 mappings are configuration entities defined in .yml configuration files. In comparison with D7, it is a good replacement of construction classes. We will create 2 configuration files: config for a migration group and migration itself. All config files should be placed under the following directory ‘config/install’ so that config entities are created at the same time as the module is installed.

Definition of a migration group

A name of the configuration file of a migration group will be the following: “migrate_plus.migration_group.mymig.yml”. I want to notice that migration groups in D8 are provided by the contrib module “migrate_plus”, so all our config names will be started with “migrate_plus”. The “migrate_plus” says that it’s a group config, and “mymig” it’s an id. Here are contents of the file with comments:

#id of the config
id: mymig
label: My Migration Group
description: Drupal 7 migrations group.
source_type: Drupal 7.
# In this section we set a database connection defined in settings.php
# So all migrations in this group will use this source.
    key: old_drupal
# Here we set a dependency on the module itself.
# This is necessary setting that deletes configs from a database
# on uninstallation of the module.
      - my_migrate

Once this config will be installed and imported to the database we will see a new migration group on this page ‘admin/structure/migrate’.

Definition of migration and mapping

As I said migration is also a config file. Here is a first part of the yml "migrate_plus.migration.blog_mymig.yml" file where the basic settings such as id, migration group and others are defined:

id: mymig_blog
label: Blog
  - Drupal 7
deriver: Drupal\node\Plugin\migrate\D7NodeDeriver
# Here we set an id of the migration group that we previously created to set up a correct source.
migration_group: mymig

In the following part we’ll set a source and a destination. A plugin for source migration is d7_node that is provided by Drupal core. Also we set a content type that we need to migrate from D7, in our case it's “blog”. A destination plugin will be “entity:node”:

  plugin: d7_node
  node_type: blog
  plugin: entity:node

When all basic settings like the source and the destination are set we can do a mapping (define process). This is a simple mapping for migration of base node properties. As you can notice, it’s quite simple to read and understand. (Of course, a “blog” content type should be created in D8):

    plugin: default_value
    default_value: blog
    plugin: default_value
    default_value: 1
    plugin: default_value
    source: language
    default_value: "und"
  title: title
  uid: node_uid
  status: status
  created: created
  changed: changed
  promote: promote
  sticky: sticky
    plugin: default_value
    default_value: full_html
  'body/value': body
  revision_uid: revision_uid
  revision_log: log
  revision_timestamp: timestamp

That’s it with a coding part and now we can install our module and migrate blog posts to the D8 site. A status of migration will be available for checking here: admin/structure/migrate/manage/mymig/migrations. I usually use Drush command for running migration processes:

drush migrate-import mymig_blog


drush mi mymig_blog


Sometimes you can see the following message after completing a migration process: 0 processed (0 created, etc). This message can confuse you, but there are quick explanation and solution. It happens because your migration was executed once and you missed it, so you just need to rollback migration with the following command:

drush migrate-rollback migration_id


Now we have understanding how Migration API works in Drupal 8. You’ve seen that not having a release for the Migrate module in Drupal 8 is not such a big deal. First of all, some module’s features were put into Drupal core while the others are available in the contrib project.

Also we have an example of how to build a migration module. In the further articles we’ll take a look deeper and will learn how to build complex custom migration.

Jun 29 2017
Jun 29

A year ago Dries Buytaert told that those are the content authors and site-builders who should be favoured when making product decisions. That what the survey he had taken says: 75% of focus is to be given to site-builders and authors. What does it mean? Now and onwards new Drupal releases should be oriented not only at developers, but at people who are not that much into coding. Drupal should be more intuitive and easier to adopt for such groups. That is the matter of an outstanding importance: the easier the entry barrier, the more popular the platform is.

We’re not undermining the significance of back-end and front-end developers experience. It’s them who contribute the most and push Drupal growth forward and let it flourish among the competing CMSs. An emphasis on Drupal site-building features is not just a tribute to fashion: Drupal has a lot to offer both to novice developers and seasoned gurus.

But if it’s a long game that we want to win, we - the Drupal Community - have to show Drupal’s benefits and power to the most possible number of people.

Drupal site-building

So why build on Drupal?

I don’t know who you are, but if you’re reading this article you probably were looking for “drupal site-building”, “drupal content editing” or something like that on the web.

I’m happy to give you a few notes to consider: I’m using Drupal features in my everyday routine and I don’t have to disturb my team’s developers. I create content - they create clean code.

You’re either a non-tech person or a novice developer, and that’s two groups that I want to address in this article. So why should you consider building on Drupal?

Content editors can take part in the website development

I’m a content editor in our Drupal team. It means I should be able to create particular content types, make them go live and present an article, a case study or our new Drupal contribution without bothering the rest of the team. Drupal is a great solution for me since it’s a brick-like one. I can add different nodes, promote our knowledges and tell about our expertise and I’m sure that company’s content will be rendered well. So what Drupal offers for content authors, editors?

  • An ability to create standard content types without developer’s involvement

Create more content, release time on more important development issues. Below you’ll find a “knowledge” content type in the editing mode and then you'll see how the content is displayed within this content type. Please note that the following pictures capture the modified content type from the website of ADCI Solutions.
"Knowledge” content type: editing mode
And below is how the "knowledge" content type looks in the view mode.
"Knowledge” content type: view mode
"Knowledge” content type: view mode

  • An enormous amount of ready-made themes, installation profiles and modules.
  • A content editor, a site administrator, an author - the list to be continued - can make separate pages / websites and play with their look for the sake of set goals.
  • Here’s a small experiment that we held in the 2016 at Drupal Global Training Day: our manager Marina builded her first Drupal website following the simplest instruction of another Marina who’s a back-end developer. All in all this process took about 20 minutes and showed the guests willing to learn Drupal that the learning curve is not such a nightmare. If you know Russian or just love watching someone coding - you’re welcome to check this video.
[embedded content]
  • I know what I will get before publishing the page: thank you, the preview mode. I don’t have to worry about HTML markup or CSS styles.
  • A handful of modules for content editing.
  • New hot features, such as Drag and Drop, that Dries was telling about at DrupalCon Baltimore recently, a WYSIWYG (What You See Is What You Get) editor (in-line and in-context editing).

Novice developers adopt Drupal easier and enlarge the Community

  • A module ecosystem of Drupal: it’s not necessary to be able to code to build a website. 

A module ecosystem of Drupal

  • Drupal is free. That lowers entry barriers even more. Play with it, learn it, try your start-up ideas and don’t lose money on your experiments.
  • You as a novice developer have as much documentation and trainings as one could ever wish. Just start with a drupal.org page. Drupal is not being kept in secret - it’s an Open Source system and there is more than 1-million community of Drupalers who can and want to help you. Find them at drupal.org groups and other chats, create your own issues and get help.
  • Thousands of other plug-ins such as themes, distributions (installation profiles). I mentioned this advantage above. From a developer’s point of view this one is beneficial due to an amount of time those plug-ins save. In the most cases developers are paid hourly and a client seeks for a time-savvy technology. That what Drupal is like: a deploy of a simple Drupal site would take only several hours. Take care of your client’s budget and see him or her coming back to you with new projects.
  • Drupal is mobile-friendly, so you as a beginner shouldn’t be bothered with adjusting it to different devices: it doesn’t matter if you don’t have such an experience because Drupal does this work for you. You can even edit your website from your mobile!
  • Rich functionality out of the box: install Drupal and have fun with Configuration Management, Comments, Fields, Forums, Menus, Quick Edit, Polls, Search and many more. The full list of Drupal 8 Core modules is available here.
  • Drupal is scalable: start with a simple splash page, get back to it after getting some development experience and extend your website functionality.

Keep learning: instead of a conclusion

Drupal keeps improving. Drupal keeps being adopted fastly. Drupal keeps charming content managers, website administrators and novice developers with its easy to implement solutions, feature richness and the scale of possible customization.

Drupal usage statistics

Look how many people are using Drupal, too. They learn, they dig into, they master Drupal.

These figures above make us think that Content editing focus that was set in 2016 at New Orleans has the strongest foundation: a number of people joining to the Drupal Community is growing. And you’re welcome to join, too!


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