Droptica: Droptica: Building a big website? Here are ten reasons why you should be using Drupal

Planet Drupal - 19 December 2017 - 3:24am
When you’re building an advanced website, you can choose from among many technologies. Usually, the first choice is the programming language (PHP, Python, Java, ASP.NET, etc.) and then we decide whether we should code everything from scratch or use a framework to do all the heavy lifting. There is also a third choice, a more comprehensive solution –so-called CMF systems, which stands for content management framework. Drupal 8 is one of these systems. In this article, I will tell you why it’s worth it to choose Drupal as the basis for any large and advanced website.  By large and advanced, I mean one that is changed frequently. Content changes are carried out by at least one editor, supported by at least one developer (along with a QA tester and a sysadmin), who’s responsible for continuous development of the website, adding new functionalities, fixing the emerging bugs and so on.  Some examples of large and advanced websites:
Categories: Drupal

Amazee Labs: Client Interactions - Amazee Agile Agency Survey Results - Part 8

Planet Drupal - 19 December 2017 - 3:24am
Client Interactions - Amazee Agile Agency Survey Results - Part 8

This is part eight of our series processing the results of the Amazee Agile Agency Survey. Previously I wrote about estimations, this time let’s focus on client interactions. How regularly does the team meet the client and how is communication between the team and the client handled?

Josef Dabernig Tue, 12/19/2017 - 12:24 Client Meetings

When asked about “how regularly does the team meet the client”, 33% mentioned “more or once per week”, 30% selected they would meet “less frequently” compared to the 16.7% which chose “every two weeks”. This is followed by 6.7% that chose to meet clients “each day for the daily standup”, and the same amount chose to meet clients “never”. It looks like there is no apparent tendency but half of the teams choose to work together with clients more regularly, and another half of the team doesn’t have much client interactions.

For us, at Amazee this depends heavily on the project and the teams. In some cases we form teams together with clients where all developers will be assigned to the project full time in that consequence have regular client interactions. For the stable Scrum teams in Zurich that I work most with, we run multiple projects at the same time and therefore didn’t consider inviting clients to our daily meetings as we discuss several projects at the same time. As we have been successfully moving towards having fewer projects per team and a global maintenance team, we are considering this option though as to have closer client interactions between the team members. On top of that, we have found regular demos for clients and grooming meetings between the teams and clients beneficial. We balance the decision to do them based on how much money the client is willing to spend on having multiple people at a meeting.

Client Communication

In a second question, we asked “How is communication between the team and the client handled” and contestants could choose from a scale of 1-5. The lowest indicates communication is handled “exclusively by a person dedicated to talking to the client (PM, PO proxy, ...)”, and the highest, indicates that communication is handled “Always together with the entire team”. An equal share of 33% turned out to be with a 2 or a 3, 13.3% with a 1 or a 4 and 6.7% with a 5. We can see that there is a tendency to channel communication between clients and the team through a person within the company (PM, PO proxy).

For us at Amazee its a 2. Every project has a PO from our side assigned that will represent the client to the team if the client is not available and will represent the team to the client to have a single point of contact. Still, we encourage clients to meet the team regularly for a better understanding on both sides of the project and collaboration. The higher the ratio is that a team can dedicate their time to one project & customer, the easier it is to justify that the entire team will collaborate with the client. Being in an agency environment with multiple projects at the same time, those customers are not often to be encountered though. This is why we try to find a good compromise between customer collaboration with the team and efficiency gains of channelled communication.

How do you and your team interact with your clients? Please leave us a comment below. If you are interested in Agile Scrum training, don’t hesitate to contact us.

Stay tuned for the next post where we’ll look at agile practices.

Categories: Drupal

XY Grid Layouts

New Drupal Modules - 19 December 2017 - 1:16am

This module integrates the new full reworked XY Grid system of the ZURB Foundation Framework with Drupal 8 Layout plugin in order to provide a responsive and easy to manage way for site builders to display content and page elements.

This module was based on the Foundation Layouts module for Drupal 8.

It is tested and work well with ZURB Template Project


Categories: Drupal

Digital Echidna: Thoughts on all things digital: Putting Our Best Foot Forward Against Bullying on For Me Day

Planet Drupal - 19 December 2017 - 1:12am
Bullying is a major problem in our schools, workplaces, homes, and over the Internet. Over the next 14 months, Digital Echidna is supporting a series of mental health awareness campaigns, in particular those with an emphasis on inclusion and…
Categories: Drupal

Last Call Media: LCM Drupal Scaffold 2.0

Planet Drupal - 18 December 2017 - 6:00pm
LCM Drupal Scaffold 2.0 Rob Mon, 12/18/2017 - 21:00

Last year, we released an ambitious project to open source our own internal workflow. We called it the Last Call Drupal Scaffold (definitely not the most original name), and we presented it to the world at several different camps and conferences, including Drupalcon Baltimore.

Categories: Drupal

Agiledrop.com Blog: AGILEDROP: What do developers joining Drupal need to know before they start?

Planet Drupal - 18 December 2017 - 4:02pm
Did you decide that you want to become a Drupal Developer? Congratulation! That is a great decision. As a Junior Drupal developer, you are going to face some of the challengers. Do not worry; every Drupal developer needed to go true this. But what skills do you need to join Drupal community? Are there any particular tools that you need to me familiar with? Jup, there is some knowledge you need to conquer before you enter Drupal coding and let's see the list of important skills, concepts, and tools that we think you should already know as a beginner in Drupal.    1. PHP language Every… READ MORE
Categories: Drupal

Xeno Media: Web Accessibility Part I: Do we still need to ask?

Planet Drupal - 18 December 2017 - 12:06pm

“The power of the Web is in its universality. Access by everyone regardless of disability is an essential aspect.”

Tim Berners-Lee, 1997

What exactly is web accessibility?

Web accessibility is the removal of technical impediments that could limit access to or interaction with a website by any person with disabilities. The goal of a web accessible site is to allow all users equal access to all content and functionality. 

Some disabilities that web accessibility can address
  • Visual: Visual impairments up to and including complete blindness, various common types of poor vision, color blindness

  • Motor Skills: Difficulty using hands, tremors, Bradykinesia, loss of detailed muscle control, etc., due to conditions such as Parkinson’s, MS, stroke, and other movement disorders

  • Auditory: Hearing impairments up to and including total deafness and including the hard of hearing

  • Cognitive: Cognitive impairment and learning disabilities (Dyslexia, Dyscalculia, etc.) that may affect memory, attention, problem-solving and logic skills.

Temporary Disabilities

When developing with accessibility in mind there will almost certainly be some unexpected good fortune.  For example: if a person breaks her primary hand, and is forced to wear a cast, she may temporarily lose the ability to operate a mouse. The developer didn’t plan to cater to the temporarily disabled, but well designed keyboard navigation could surely save the day for such an accident victim.

Why does web accessibility matter?
  • It’s the right thing to do.

    Here’s a chance to make a positive difference in many people’s lives. Improving a site’s accessibility will make that site better for all users and will likely improve its position in the SERPs (Search Engine Result Pages). So be a good citizen and contribute to web accessibility! Make the web a better place for everyone!

  • It may be required.

    There are various state and federal laws regarding web accessibility.

    Some organizations and businesses have faced legal action for non-compliance with accessibility guidelines. Even if you were to win such a challenge, the cost in legal fees and in lost time would be substantial. Why risk exposing your business to the possibility of a legal challenge.

  • It’s good for business.

    According to the U.S. Census Bureau’s 2002 Survey of Income and Program Participation (SIPP), there are 51.2 million people with disabilities in the United States. That’s 18.1% of the U.S. population! Those folks need goods and services too, some of which are very specialized.

    Millions of people with disabilities shop, travel, buy cars, buy homes, eat out, go out and participate in most of the same activities as their fully-abled friends, neighbors and family. Web developers are in a unique position to work towards the good of all to advocate for and to help facilitate these behaviors. We all benefit.

  • Web accessibility is becoming easier to achieve and more unified with web standards as time passes.
  • More to come

    This series on Web accessibility will continue with the following:

    Part II: What guides accessibility efforts?

    This post will highlight the laws and governance related to web accessibility efforts.

    Part III: Tools and techniques for web accessibility

    Here we will provide a primer on assistive technologies and tools you and your developers can use to make your site more accessible.

    Part IV: Case studies

    This post will highlight two real-world applications where we have worked closely with clients to achieve highly-accessible websites. 


    Categories: Drupal

    Evolving Web: Writing a Custom Migration Source Plugin in Drupal 8

    Planet Drupal - 18 December 2017 - 10:01am

    Usually, Drupal migrations get run at the beginning of a project to get all your content into Drupal. But sometimes, you need to create a migration that runs on a regular basis. For example, you have an external database of courses and programs maintained by a university that needs to be displayed on a Drupal site. Another example: you have a database of book data that needs to be pulled into Drupal nightly.

    When working with migrations where the source files are updated every day, it can get really tedious to download the updated source files manually each time the migration runs.

    In this tutorial, we'll write a source plugin based on the CSV source plugin which will allow us to automatically download CSV files from a remote server via SFTP before running migrations. This article was co-authored by my colleague David Valdez - gracias David for your contribution.

    The Problem

    In a project we worked on recently, we had the following situation:

    • CSV files are updated by a PowerShell script every night on the client's server.
    • These CSV files are accessible via SFTP.

    Our task is to download the CSV source files over SFTP and to use them as our migration source.

    Before We Start The Plan

    The goal is to avoid downloading the file manually every time we run our migrations. So we need a way to doing this automatically everytime we execute a migration. To achieve this, we create a custom source plugin extending the CSV plugin provided by the Migrate Source CSV module, which will download CSV files from a remote server and pass it to the CSV plugin to process them.

    The Source Migrate Plugin

    To start, let's create a custom module and call it migrate_example_source and implement a custom migrate source plugin by creating a PHP class inside it at /src/Plugin/migrate/source/MigrateExampleSourceRemoteCSV.php

    We start implementing the class by simply extending the CSV plugin provided by the migrate_source_csv module: namespace Drupal\migrate_source_csv\Plugin\migrate\source; use Drupal\migrate_source_csv\Plugin\migrate\source\CSV as SourceCSV; use phpseclib\Net\SFTP /** * @MigrateSource( * id = "migrate_example_source_remote_csv" * ) */ class MigrateExampleSourceRemoteCSV extends SourceCSV {}

    Adding the annotation @MigrateSource is very important because that is what will make the migrate module detect our source plugin. In our plugin, we use the phpseclib/phpseclib libraries to make SFTP connections. Hence, we need to include the libraries in our project by running the following command in the Drupal root:

    composer require phpseclib/phpseclib

    Our plugin will download the source CSV file and will simply pass it to the CSV plugin to do the rest. We do the download when the plugin is being instantiated like this:

    /** * {@inheritdoc} */ public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration) { // If SFTP connection parameters are present. if (!empty($configuration['sftp'])) { // A settings key must be specified. // We use the settings key to get SFTP configuration from $settings. if (!isset($configuration['sftp']['settings'])) { throw new MigrateException('Parameter "sftp/settings" not defined for Remote CSV source plugin.'); } // Merge plugin settings with global settings. $configuration['sftp'] += Settings::get('sftp', []); // We simply download the remote CSV file to a temporary path and set // the temporary path to the parent CSV plugin. $configuration['path'] = $this->downloadFile($configuration['sftp']); } // Having downloaded the remote CSV, we simply pass the call to the parent plugin. parent::__construct($configuration, $plugin_id, $plugin_definition, $migration); }

    In the constructor we are using global SFTP credentials with Settings::get(). We need to define the credentials in settings.php like this:

    $settings['sftp'] = array( 'default' => [ 'server' => 'ftp.example.com', 'username' => 'username', 'password' => 'password', 'port' => '22', ], );

    Once we have the credentials of the FTP server we use a downloadFile() method to download the remote CSV file. Here's an extract of the relevant code:

    protected function downloadFile(array $conn_config) { ... // Prepare to download file to a temporary directory. $path_remote = $conn_config['path']; $basename = basename($path_remote); $path_local = file_directory_temp() . '/' . $basename; ... // Download file by SFTP and place it in temporary directory. $sftp = static::getSFTPConnection($conn_config); if (!$sftp->get($path_remote, $path_local)) { throw new MigrateException('Cannot download remote file ' . $basename . ' by SFTP.'); } ... // Return path to the local of the file. // This will in turn be passed to the parent CSV plugin. return $path_local; }

    Note: The code block above has been simplified a bit. If you see the actual source plugin, there are some lines of code which make things more compatible with the migration_lookup plugin.

    This method creates an SFTP connection, downloads the file to a temporary location and returns the path to the downloaded file. The temporary file path is then passed to the Migrate Source CSV and that's it! Finally, to use the plugin in our migration we just set our plugin as the source/plugin:

    id: migrate_example_content label: 'Example content' ... source: plugin: migrate_example_source_remote_csv # Settings for our custom Remote CSV plugin. sftp: settings: sftp path: "/path/to/file/example_content.csv" # Settings for the contrib CSV plugin. header_row_count: 1 keys: - id ...

    The code for this plugin and the example module is available at migrate_example_source. Great!

    + more awesome articles by Evolving Web
    Categories: Drupal

    Electric Citizen: Essential SEO Tune-Up for your Drupal 8 Website

    Planet Drupal - 18 December 2017 - 7:49am

    Drupal is well known for being a Search Engine Optimization (SEO) friendly Content Management System (CMS) and Drupal 8, the latest version, is the best by far. Many of the essential requirements for SEO best practices are already baked into the core software architecture, and with a little knowledge and some basic configuration anyone can tune up their website to become faster, drive more traffic, and perform better in the search engine rankings.

    Categories: Drupal

    Promet Source: Promet Source Announces Partnership with Drupal Open Y

    Planet Drupal - 18 December 2017 - 7:39am
    Promet Source is proud to announce that we have teamed up with OpenYMCA.org, an open-source digital platform for marketing and e-commerce, as a Drupal development partner. Through this partnership, we are committed to the Open Y philosophy, community, and platform.
    Categories: Drupal

    OSTraining: Embed a Youtube Player as Media Asset Into CKEditor in Drupal 8

    Planet Drupal - 18 December 2017 - 6:19am

    The new Media capabilities in Drupal allow you create a media library with all kinds of media assets and use these assets everywhere. One way to use them is to embed these assets directly into CKEditor.

    You can pull these assets from Youtube or Vimeo with the Video Embed Field module, so you only need to store the URL on your Drupal site.This will come in handy for a lot of site editors. Let’s start!

    Categories: Drupal

    Ckeditor Speak2type

    New Drupal Modules - 18 December 2017 - 4:58am

    This is simple plugin for CKEditor 4, adding the ability to type into the editor using speech.


    Click the microphone button and speak to your microphone. Your words should appear as the content in the editor.

    Categories: Drupal

    Commerce ML Migrations

    New Drupal Modules - 18 December 2017 - 3:27am
    Categories: Drupal

    Commerce ML Exchange

    New Drupal Modules - 18 December 2017 - 3:26am
    Categories: Drupal

    Commerce ML API

    New Drupal Modules - 18 December 2017 - 3:25am
    Categories: Drupal

    Commerce PayPal PLUS

    New Drupal Modules - 18 December 2017 - 2:19am

    This project integrates PayPal PLUS into the Drupal Commerce payment and checkout systems.

    The development of this module has just started; there should be a release candidate available until the end of February 2018.

    Categories: Drupal

    Myadmin Toolbar

    New Drupal Modules - 18 December 2017 - 12:12am

    This module will hide top bar in Admin Toolbar.

    Categories: Drupal

    Star Rating Form Display

    New Drupal Modules - 17 December 2017 - 6:30pm

    This module tranform select tag of starrating module to clickable icon (more friendly)


    Install as other Drupal modules. More detail here

    Categories: Drupal

    Dcycle: Migrating Webforms from Drupal 7 to Drupal 8

    Planet Drupal - 17 December 2017 - 4:00pm

    I recently needed to port hundreds of Drupal 7 webforms with thousands of submissions from Drupal 7 to Drupal 8.

    My requirements were:

    • Node ids need to remain the same
    • Webforms need to be treated as data: they should be ignored by config export and import, just like nodes and taxonomy terms are. The reasonining is that in my setup, forms are managed by site editors, not developers. (This is not related to migration per se, but was a success criteria for my migration so I’ll document my solution here)
    Migration from Drupal 7

    I could not find a reliable upgrade or migration path from Drupal 7 to Drupal 8. I found webform_migrate lacks documentation (I don’t know where to start) and migrate_webform is meant for Drupal 6, not Drupal 7 as a source.

    I settled on a my own combination of tools and workflows to perform the migration, all of them available on my Github account.

    Using version 8.x-5.x of webform, I started by enabling webform, webform_node and webform_ui on my Drupal 8 site, this gives me an empty webform node type.

    I then followed the instructions for a basic migration, which is outside the scope of this article. I have a project on Githubwhich I use as starting point from my Drpual 6 and 7 to 8 migrations. The blog post Custom Drupal-to-Drupal Migrations with Migrate Tools, Drupalize.me, April 26, 2016 by William Hetherington provides more information on performing a basic migration of data.

    Once you have set up your migration configurations as per those instructions, you should be able to run:

    drush migrate-import upgrade_d7_node_webform --execute-dependencies

    And you should see something like:

    Processed 25 items (25 created, 0 updated, 0 failed, 0 ignored) - done with 'upgrade_d7_node_type' Processed 11 items (11 created, 0 updated, 0 failed, 0 ignored) - done with 'upgrade_d7_user_role' Processed 0 items (0 created, 0 updated, 0 failed, 0 ignored) - done with 'upgrade_d7_user_role' Processed 95 items (95 created, 0 updated, 0 failed, 0 ignored) - done with 'upgrade_d7_user' Processed 109 items (109 created, 0 updated, 0 failed, 0 ignored) - done with 'upgrade_d7_node_webform'

    At this point I had all my webforms as nodes with the same node ids on Drupal 7 and Drupal 8, however this does nothing to import the actual forms or submissions.

    Importing the data itself

    I found that the most efficient way of importing the data was to create my own Drupal 8 module, which I have published on Dcycle’s Github account, called webform_d7_to_d8. (I have decided against publishing this on Drupal.org because I don’t plan on maintaining it long-term, and I don’t have the resources to combine efforts with existing webform migration modules.)

    I did my best to make that module self-explanatory, so you should be able to follow the steps the README file, which I will summarize here:

    Start by giving your Drupal 8 site access to your Drupal 7 database:

    $databases['upgrade']['default'] = array ( 'database' => 'drupal7database', 'username' => 'drupal7user', 'password' => 'drupal7password', 'prefix' => '', 'host' => 'drupal7host', 'port' => '3306', 'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql', 'driver' => 'mysql', );

    Run the migration with our without options:

    drush ev 'webform_d7_to_d8()'


    drush ev 'webform_d7_to_d8(["nid" => 123])'


    drush ev 'webform_d7_to_d8(["simulate" => TRUE])'

    More detailed information can be found in the modlue’s README file.

    Treating webforms as data

    Once you have imported your webforms to Drupal 8, they are treated as configuration, that is, the Webform module assumes that developers, not site builders, will be creating the forms. This may be fine in many cases, however my usecase is that site editors want to create and edit forms directly on the production, and we don’t want them to be tracked by the configuration management system.

    Jacob Rockowitz pointed me in the right direction for making sure webforms are not treated as configuration. For that purpose I am using Drush CMI tools by Previous Next and documented on their blog post, Introducing Drush CMI tools, 24 Aug. 2016.

    Once you install in your ~/.drush folder and run drush cc drush, you can use druch cexy and druch cimy and instead of drush cim and drush cex in your conguration management process. Here is how and why:

    Normally, if you develop your site locally and, say, add a content type or field, or remove a content type of field, you can run drush cex to export your newly created configuration. Then, your colleagues can pull your code and run drush cim to pull your configuration. drush cim can also be used in continuous integration, preproduction, dev, and production environments.

    The problem is that drush cex exports all configuration, and drush cim deletes everything in the database which is not in configuration. In our case, we don’t want to consider webforms as configuration but as data, just as nodes as taxonomy terms: we don’t want them to be exported along with other configuration; and if they exist on a target environment we want to leave them as they are.

    Using Drush CMI tools, you can add a file such as the following to ~/.drush/config-ignore.yml:

    # See http://blog.dcycle.com/blog/2017-12-18 ignore: - webform.webform.*

    This has to be done on all developers’ machines or, if you use Docker, on a shared Docker container (which is outside the scope of this article).

    Now, for exporting configuration, run:

    drush cexy --destination='/path/to/config/folder'

    Now, webforms will not be exported along with other configuration.

    We also need to avoid erasing webforms on target environments: if you create a webform on a target environment, then run drush cim, you will see something like:

    webform.webform.webform_9521 delete webform.webform.webform_8996 delete webform.webform.webform_8991 delete webform.webform.webform_8986 delete

    So, we need to avoid deleting webforms on the target environment when we import configuration. We could just do drush cim --partial but this avoids deleting everything, not just webforms.

    Drush CMI tools provides an alternative:

    drush cimy --source=/path/to/config/folder

    This works much like drush cim --partial, but it allows you to specify another parameter, –delete-list=/path/to/config-delete.yml

    Then, in config-delete.yml, you can specify items that you actually want to delete on the target environment, for example content types, fields, and views which do not exist in code. This is dependent on your workflow and they way to set it up isdocumented on the Drush CMI tools project homepage.

    With this in place, we’ll have our Drupal 7 webforms on our Drupal 8 site.

    I recently needed to port hundreds of Drupal 7 webforms with thousands of submissions from Drupal 7 to Drupal 8.

    Categories: Drupal

    Forms Steps

    New Drupal Modules - 17 December 2017 - 12:45pm

    Forms Steps provides an UI to create forms workflows using forms modes. It creates quick and configurable multisteps forms.
    This module is currently still in alpha but is highly maintained and gives a nice overview of what can be done with that new forms modes feature integrated in Drupal8.

    This project is born in top of a real business case. The core of that module is in use and all new features will be integrated.

    Categories: Drupal


    Subscribe to As If Productions aggregator - Drupal