Planet Drupal

Syndicate content
Drupal.org - aggregated feeds in category Planet Drupal
Updated: 30 min 46 sec ago

Zivtech: How to Choose the Right eCommerce Solution for Your Drupal Project

Tue, 01/17/2017 - 21:24
div class=field-image-photo img src=/sites/default/files/styles/large/public/c9fqyqiecds-mike-petrucci.jpg?itok=uGQmMW_x width=645 height=430 alt=Store open sign / /div div class=field-body divDrupal has a powerful suite of tools and features for just about any type of website, and eCommerce websites are no exception. Drupal has a very active and healthy eCommerce community that creates some amazing features. /div div /div p /p divThe Drupal eCommerce market mainly consists of Ubercart and Drupal Commerce, but there are also some impressive emerging technologies to keep an eye on, such as the Stripe payment API, that allow for more customized solutions. /div p /p divThe eCommerce solution that you choose will depend upon the particular Drupal site you’re developing. Is it a simple online store with just a few products, or a much more robust site with a wide variety of products? This is one of the strengths of eCommerce with Drupal: you can build the kind of solution you need without the extra, unnecessary features and functionalities./div div /div h2Ubercart vs Drupal Commerce /h2 diva href=https://www.drupal.org/project/commerce target=_blankDrupal Commerce/a is by far the most popular Drupal eCommerce solution these days. It’s the successor to the original eCommerce solution, a href=https://www.drupal.org/project/ubercart target=_blankUbercart/a. Drupal Commerce was written for Drupal 7 by the same developer that created Ubercart, a href=https://www.drupal.org/u/rszrama target=_blankRyan Szrama/a, using the latest APIs and features for Drupal 7. /div p /p divDrupal Commerce is supported by Ryan Szrama’s company, a href=https://commerceguys.com/ target=_blankCommerce Guys/a, and the Drupal community as a whole. Developers are more likely to add new features to Commerce because it is more widely used in Drupal 7 and beyond. The Drupal 8 version is still in beta, so more work needs to be done to get it to a full release. Check out the a href=https://www.drupal.org/project/issues/commerce?version=8.x target=_blankDrupal Commerce issue queue/a to see where you might be able to help./div p /p divDrupal Commerce learned from Ubercart's primary shortcoming; it was difficult to configure and not very modular. Where Ubercart was one module that was difficult to build upon, Drupal Commerce has a small set of features in the main module and a large suite of available contributed modules. This allows for easier configuration and more customizations. /div div /div h2Kickstart Your Online Store/h2 divOne of the most useful features available for Drupal Commerce is the Commerce Kickstart Drupal distribution. This is a great way for non-technical store owners to get a Drupal Commerce store up and running quickly and easily. It comes with an impressive installer that allows you to install an example store to see how everything can be configured. It then allows you to wipe the site clean and start a fresh build of your own custom store. /div p /p divThe Commerce Kickstart comes with some additional built in modules and configurations that help get a Drupal Commerce site up and running quickly. This is a more efficient solution than building from scratch with the Drupal Commerce module and any contributed modules that are necessary to achieve the desired functionality. The Commerce Kickstart distribution shows off the power of Drupal distributions; it’s a turnkey solution for Drupal eCommerce websites./div h2Stripe API/h2 divOne of Drupal’s greatest advantages over its competitors is how well it integrates with third party APIs. This allows for integration with many different payment gateways, one being a href=http://www.drupal.org/project/stripe_api target=_blankStripe API/a. Drupal developers can integrate Stripe with a Drupal site through a custom module and create highly customized payment solutions. This type of customization allows for a variety of solutions for selling and accepting payments that would be more challenging to implement with Drupal Commerce. /div div /div h2Which Solution Should I Choose?/h2 divThe solution you choose depends on the site’s needs. A small online store that only needs a simple shopping cart might be best suited for Ubercart. At its core, Ubercart is still the easiest to set up without using a Drupal distribution like Commerce Kickstart. /div p /p div /div divDrupal Commerce is a much more robust eCommerce solution for Drupal with enterprise level features that large online stores use to sell products like product displays. On top of that, you get all the features of a normal Drupal website like content types, taxonomies, and user permissions. /div p /p divIf you are looking to build a very customized payment solution that doesn’t really fit into either of these categories, perhaps a custom solution with the Stripe API module is best. /div p /p p /p pIn the end, the Drupal eCommerce solution you choose should be easy to use for your store administrators and easy for your customers to buy your products online./p div /div /div nav role=navigation class=links-inline/nav

Chromatic: Managing Complex Configuration with Drupal 8

Tue, 01/17/2017 - 18:34
pConfiguration management (CM) in Drupal 8 is great. However, when more complex configuration scenarios arise, we must find solutions to problems that core CM functionality doesn’t address (yet)./p

Chromatic: Chromatic at DrupalCon Dublin

Tue, 01/17/2017 - 18:34
pLearn all about Twig templates in Drupal 8 from our very own Larry Walangitan./p

Chromatic: Drupal Code Standards: Documentation

Tue, 01/17/2017 - 18:34
pThis is the fourth post in a series about coding standards. In this post we’ll talk about why good, standardized documentation is crucial to your project, and review a href=https://www.drupal.org/coding-standards/docsDrupal coding standards regarding documentation/a and comments./p

Drupal core announcements: Drupal 8.3.0 will be released April 5; alpha begins week of January 30

Tue, 01/17/2017 - 18:13
pDrupal 8.3.0, the next planned minor release of Drupal 8, is scheduled for Wednesday, April 5, 2017. Minor releases include new features, usability improvements, and backwards-compatible API improvements. Here's what this means now for core patches./p h3Alpha vs. Beta releases/h3 pIn previous Drupal 8 minor releases, the first pre-release version of the minor was labeled as embeta1/em, and expectations were slightly different for later betas. For Drupal 8.3.0, we've recategorized this first pre-release version as emalpha1/em, to distinguish it from the subsequent beta releases. (We will also no longer have beta target issues; some strategic issues are considered for backport to 8.3.x, but only after they are fixed in 8.4.x, and only up until the new beta phase begins.)/p pThis change should provide better clarity and fairness on which issues are accepted for commit. The overall timeline for the minor release is not changed; alpha1 simply replaces the previous beta1, and the previous, stricter beta2 now becomes beta1. (a href=https://www.drupal.org/core/d8-allowed-changes#alphaMore information on alpha and beta releases./a) The release candidate phase is the same as for past releases./p h3Drupal 8.3.0-alpha1 will be released the week of January 30/h3 ulliIn preparation for the minor release, Drupal 8.3.x will enter the alpha phase the week of January 30./li liDevelopers and site owners can begin testing the alpha./li liThe 8.4.x branch of core will be created, and future feature and API additions will be targeted against that branch instead of 8.3.x. All outstanding issues filed against 8.3.x will be automatically migrated to 8.4.x once it is opened. /liliAll issues filed against 8.2.x will then be migrated to 8.3.x, and subsequent bug reports should be targeted against the 8.3.x branch./li liDuring the alpha phase, core issues will be committed according to the following policy: olliMost issues that are a href=https://www.drupal.org/core/d8-allowed-changes#patchallowed for patch releases/a will be committed to 8.3.x and 8.4.x./li liDrupal 8.2.x will receive primarily critical bugfixes in preparation for its final patch release window. (Drupal 8.1.x and 8.0.x are not supported anymore and changes are not made to those branches.)/li liMost issues that are a href=https://www.drupal.org/core/d8-allowed-changes#minoronly allowed in minor releases/a will be committed to 8.4.x only. A few strategic issues may be backported to 8.3.x, but only at committer discretion emafter/em the issue is fixed in 8.4.x, and only up until the beta deadline./li /ol/li /ulh3Drupal 8.3.0-beta1 will be released the week of February 13/h3 pRoughly two weeks after the alpha release, the first beta release will be created. All the restrictions of the alpha release apply to beta releases as well. The release of the first beta is a firm deadline for all feature and API additions. Even if an issue is pending in the emReviewed amp; Tested by the Community/em (RTBC) queue when the commit freeze for the beta begins, it will be committed to the next minor release only./p pThe release candidate phase will begin the week of February 27, and we will post further details at that time./p pSee the a href=https://www.drupal.org/core/release-cycle-overview#datessummarized key dates in the release cycle/a, a href=https://www.drupal.org/core/d8-allowed-changesallowed changes during the Drupal 8 release cycle/a, and a href=https://www.drupal.org/core/d8-bc-policyDrupal 8 backwards compatibility and internal API policy/a for more information./p pAs a reminder, we have until the start of the alpha to add great new features to Drupal 8.3.x. Stabilizing experimental modules (such as a href=https://www.drupal.org/node/2504847Inline form errors/a and a href=https://www.drupal.org/node/2735059Migrate Drupal/a), a href=https://www.drupal.org/node/2825215landing some key Media Initiative components/a, and working on bugfixes are all priorities for 8.3.0. Help with these changes now for a great Drupal 8.3.0!/p

OSTraining: The Easiest Way to Debug Drupal Themes and Modules

Tue, 01/17/2017 - 17:58
pAre you looking for an easy way to find errors thrown by your Drupal modules and themes?/p pA lot of new developers are learning to create their a href=https://www.ostraining.com/class/d8-devfirst Drupal 8 modules/a or a href=https://www.ostraining.com/class/d8-themesDrupal 8 themes/a. Often they've made a very small typo or spacing error and are looking for an easy way to debug their mistake./p pFollow this tutorial, and you'll quickly be able to see a detailed list of recent errors on your Drupal site./p

ComputerMinds.co.uk: Show elements with form #states when values do not match

Tue, 01/17/2017 - 14:00
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-items id=md1div class=field-item even itemprop=articleBodypI've a href=https://www.computerminds.co.uk/articles/dynamic-forms-drupal-7previously written about dynamic forms in Drupal/a, using code class=prettyprint#states/code to show or hide input boxes depending on other inputs. Since then, Drupal 7 and 8 have both got the ability to combine conditions with a href=https://www.drupal.org/node/735528OR and XOR operators/a. This makes it possible to apply changes when a form element's value does emnot/em equal something, which is not obvious at all./p /div/div/div

Web Omelette: Node access grants in Drupal 8 in an OOP way

Tue, 01/17/2017 - 10:04
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item evenpThe Drupal node access grants system has always been a powerful and flexible way to control access to your nodes. It's been there from Drupal 5 (if not earlier) and it continues to exist in Drupal 8 as we move forward. In this article, I want to quickly highlight this system from a D8 perspective and how I propose to use it in a OOP architecture./p h2What is it?/h2 pThe node access grant system is a way by which you can control programatically and very granularly access to all four operations on your Drupal nodes (view, create, edit, delete). It allows to define certain realms of functionality (related to your access requirements) and a set of grants that are required for any of the four mentioned operations, within that realm. Users will then need to posses the grants in the respective realms in order to be granted access./p pThe two main components of this system are therefore:/p ul liThe implementation of codehook_node_access_records()/code which is called whenever a node is saved (or site-wide permissions rebuilt). It is responsible for storing the access requirements for that given node./li liThe implementation of codehook_node_grants()/code which is called whenever a user is trying to access a node (or a query is being performed in the name of that user). It is responsible for presenting the grants for the current user, which if match the access requirements of the node, allows them access./li /ul pThe great thing about this node access grants is that it's system-wide in the sense of who checks for the access. In contrast to implementing codehook_node_access()/code which only is called when viewing a node on its canonical URL, the access grants are checked almost everywhere such as views or even custom queries with much ease./p h2Drupal 8/h2 pIn Drupal 8 these 2 hooks remain the foundation of the node access grants system, albeit with type hinted parameters. This means that we need to place their implementation inside our code.module/code files./p pNode access grants are not used on every site because they serve relatively complex access rules. Complex access rules usually also require a fair bit of calculating what grants a particular node must have for a given realm, as well as whether a given user possesses them. For this very reason I am not so fond of having to put all this logic in my code.module/code file./p pSo I came up with a basic a href=https://www.drupal.org/project/node_access_grantsdeveloper module/a that defines an interface that has two methods: codeaccessRecords()/code and codegrants()/code. Other modules which want to implement the access grants hooks can instead now create a service which implements this interface and tag it with codenode_access_grants/code. My module will do the rest and you won't have to touch any code.module/code file. You can inject whatever dependencies from the container you need and perform whatever logic is needed for determining your grants and access records./p pLet me what you think down in the comments. Would love your feedback./p /div/div/div

Third Grove: Quicken.com Drupal Case Study

Tue, 01/17/2017 - 09:00
span property=schema:name class=field-name--titleQuicken.com Drupal Case Study/span span class=field-name--uid rel=schema:authorspan lang= about=https://www.thirdandgrove.com/user/3 typeof=schema:Person property=schema:name datatype= xml:lang=antonella/span/span span property=schema:dateCreated content=2017-01-17T08:00:00+00:00 class=field-name--createdTue, 01/17/2017 - 03:00/span

Drupal Modules: The One Percent: Drupal Modules: The One Percent — Views Flipped Table (video tutorial)

Tue, 01/17/2017 - 01:59
span class=field field--name-title field--type-string field--label-hiddenDrupal Modules: The One Percent — Views Flipped Table (video tutorial)/span div class=field field--name-field-screenshot field--type-image field--label-hidden field__item img src=http://gogrow.org/sites/default/files/styles/large/public/2017-01/views_flipped_table.png?itok=XPf6Ht6H width=480 height=241 alt=Project page screenshot typeof=foaf:Image class=image-style-large //div span class=field field--name-uid field--type-entity-reference field--label-hiddenspan lang= about=http://gogrow.org/user/24 typeof=schema:Person property=schema:name datatype= xml:lang=NonProfit/span/span span class=field field--name-created field--type-created field--label-hiddenMon, 01/16/2017 - 18:59/span div class=field field--name-field-episode field--type-integer field--label-inline div class=field__labelEpisode/div div class=field__item13/div /div div class=clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__itempHere is where we bring awareness to Drupal modules running on less than 1% of reporting sites. Today we'll consider Views Flipped Table, a module which will rotate your Views tables 90° and ask if using HTML tables is ever appropriate./p/div

Platform.sh: New year, new Solr, new features

Tue, 01/17/2017 - 01:00
pAfter ending 2016 with a a href=https://platform.sh/2016/12/php-71/new PHP version/a and starting 2017 with a href=https://platform.sh/2017/1/http2/a new HTTP version/a, we’re happy to report that there’s still plenty of new left for us to launch. This time around it’s a new Apache Solr version, 6.3./p

Jeff Geerling's Blog: Re-save all nodes of a particular type in an update hook in Drupal 8

Mon, 01/16/2017 - 23:33
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item even property=content:encodedpI recently needed to re-save all the nodes of a particular content type (after I had added some fields and default configuration) as part of a Drupal 8 site update and deployment. I could go in after deploying the new code and configuration, and manually re-save all content using the built-in bulk operation available on the code/admin/content/code page, but that would not be ideal, because there would be a period of time where the content isn't updated on the live site—plus, manual processes are fragile and prone to failure, so I avoid them at all costs./p pIn my Drupal 8 module, called codecustom/code, I added the following update hook, inside codecustom.install/code:/p/div/div/div

Joachim's blog: Changing the type of a node

Mon, 01/16/2017 - 23:22
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item even property=content:encodedpThere’s an old saying that no information architecture survives contact with the user. Or something like that. You’ll carefully design and build your content types and taxonomies, and then find that the users are actually not quite using what you’ve built in quite the way it was intended when you were building it./p pAnd so there comes a point where you need to grit your teeth, change the structure of the site’s content, and convert existing content./p pBack on Drupal 7, I wrote a plugin for Migrate which handled migrations emwithin/em a single Drupal site, so for example from nodes to a custom entity type, or from one node type to another. (The a href=https://www.drupal.org/node/1883112patch works/a, though I never found the time to polish it sufficiently to be committed.)/p pOn Drupal 8, without the time to learn the new version of Migrate, I recently had to cobble something together quickly./p pFortunately, this was just changing the type of some nodes, and where all the fields were identical on both source and destination node types. Anything more complex would definitely require Migrate./p pFirst, I created the new node type, and cloned all its fields from the old type to the new type. Here I took the time to update some of the a href=https://www.drupal.org/project/field_toolsField Tools/a module’s functionality to Drupal 8, as it pays off to have a single form to clone fields rather than have to add them to the new node type one by one./p pField Tools also copies display settings where form and view modes match (in other words, if the source bundle has a ‘teaser’ display mode configured, and the destination also has a ‘teaser’ display mode that’s enabled for custom settings, then all of the settings for the fields being cloned are copied over, with field groups too)./p pWith all the new configuration in place, it was now time to get down to the content. This was plain and simple a hack, but one that worked fine for the case in question. Here’s how it went…/p pWe basically want to change the bundle of a bunch of nodes. (Remember, the ‘bundle’ is the generic name for a node type. Node types are bundles, as taxonomy vocabularies are bundles.) The data for a single node is spread over lots of tables, and most of these have the bundle in them./p pOn Drupal 8 these tables are:/p ul lithe entity base table/li lithe entity data table/li lithe entity revision data table/li lieach field data table/li lieach field data revision table/li /ul p(It’s not entirely clear to me what the separation between base table and data table is for. It looks like it might be that base table is fields that don’t change for revisions, and data table is for fields that do. But then the language is on the base table, and that can be changed, and the created timestamp is on the data table, and while you can change that, I wouldn’t have thought that’s something that has past values kept. Answers on a postcard.)/p pSo we’re basically going to hack the bundle column in a bunch of tables. We start by getting the names of these tables from the entity type storage:/p precode$storage = \Drupal::service('entity_type.manager')-gt;getStorage('node'); // Get the names of the base tables. $base_table_names = []; $base_table_names[] = $storage-gt;getBaseTable(); $base_table_names[] = $storage-gt;getDataTable(); // (Note that revision base tables don't have the bundle.) /code/pre pFor field tables, we need to ask the table mapping handler:/p precode$table_mapping = \Drupal::service('entity_type.manager')-gt;getStorage('node') -gt;getTableMapping(); // Get the names of the field tables for fields on the service node type. $field_table_names = []; foreach ($source_bundle_fields as $field) { $field_table = $table_mapping-gt;getFieldTableName($field-gt;getName()); $field_table_names[] = $field_table; $field_storage_definition = $field-gt;getFieldStorageDefinition(); $field_revision_table = $table_mapping -gt;getDedicatedRevisionTableName($field_storage_definition); // Field revision tables DO have the bundle! $field_table_names[] = $field_revision_table; } /code/pre p(Note the inconsistency in which tables have a bundle field and which don’t! For that matter, surely it’s redundant in all field tables? Does it improve the indexing perhaps?)/p pThen, get the IDs of the nodes to update. Fortunately, in this case there were only a few, and it wasn’t necessary to write a batched hook_update_N()./p precode// Get the node IDs to update. $query = \Drupal::service('entity.query')-gt;get('node'); // Your conditions here! // In our case, page nodes with a certain field populated. $query-gt;condition('type', 'page'); $query-gt;exists(‘field_in_question’); $nids = $query-gt;execute(); /code/pre pAnd now, loop over the lists of tables names and hack away!/p precode// Base tables have 'nid' and 'type' columns. foreach ($base_table_names as $table_name) { $query = \Drupal\Core\Database\Database::getConnection('default') -gt;update($table_name) -gt;fields(['type' =gt; 'service']) -gt;condition('nid', $service_nids, 'IN') -gt;execute(); } // Field tables have 'entity_id' and 'bundle' columns. foreach ($field_table_names as $table_name) { $query = \Drupal\Core\Database\Database::getConnection('default') -gt;update($table_name) -gt;fields(['bundle' =gt; 'service']) -gt;condition('entity_id', $service_nids, 'IN') -gt;execute(); } /code/pre pNode-specific tables use ‘nid’ and ‘type’ for their names, because those are the base field names declared in the entity type class, whereas Field API tables use the generic ‘entity_id’ and ‘bundle’. The mapping between these two is declared in the entity type annotation’s entity_keys property./p pThis worked perfectly. The update system takes care of clearing caches, so entity caches will be fine. Other systems may need a nudge; for instance, Search API won’t notice the changed nodes and its indexes will a href=https://www.drupal.org/node/2749101literally need turning off and on again/a./p pThough I do hope that the next time I have to do something like this, the amount of data justifies getting stuck into using Migrate!/p /div/div/divul class=links inlineli class=comment-add first lasta href=/comment/reply/39#comment-form title=Share your thoughts and opinions related to this posting.Add new comment/a/li /ul

Dries Buytaert: Acquia retrospective 2016

Mon, 01/16/2017 - 19:30
pAs my loyal blog readers know, at the beginning of every year I publish a retrospective to look back and take stock of how far Acquia has come over the past 12 months. If you'd like to read my previous annual retrospectives, they can be found here: a href=http://buytaert.net/acquia-retrospective-20152015/a, a href=http://buytaert.net/acquia-retrospective-20142014/a, a href=http://buytaert.net/acquia-retrospective-20132013/a, a href=http://buytaert.net/acquia-retrospective-20122012/a, a href=http://buytaert.net/acquia-retrospective-20112011/a, a href=http://buytaert.net/acquia-retrospective-20102010/a, a href=http://buytaert.net/acquia-retrospective-20092009/a. When read together, they provide a comprehensive overview of Acquia's trajectory from its inception in 2008 to where it is today, nine years later. /p pThe process of pulling together this annual retrospective is very rewarding for me as it gives me a chance to reflect with some perspective; a rare opportunity among the hustle and bustle of the day-to-day. Trends and cycles only reveal themselves over time, and I continue to learn from this annual period of reflection. /p h3Crossing the chasm/h3 pIf I were to give Acquia a headline for 2016, it would be the year in which we crossed the proverbial chasm from startup to a true leader in our market. Acquia is now entering its ninth full year of operations (we began commercial operations in the fall of 2008). We've raised $186 million in venture capital, opened offices around the world, and now employ over 750 people. However, crossing the chasm is more than achieving a revenue target or other benchmarks of size. /p pThe chasm describes the difficult transition conceived by Geoffrey Moore in his 1991 classic of technology strategy, a href=https://en.wikipedia.org/wiki/Crossing_the_ChasmCrossing the Chasm/a. This is the book that talks about making the transition from selling to the early adopters of a product (the technology enthusiasts and visionaries) to the early majority (the pragmatists). If the early majority accepts the technology solutions and products, they can make a company a de facto standard for its category. /p pI think future retrospectives will endorse my opinion that Acquia crossed the chasm in 2016. I believe that Acquia has crossed the chasm because the world has embraced open source and the cloud without any reservations. The FUD-era where proprietary software giants campaigned aggressively against open source and cloud computing by sowing fear, uncertainty and doubt is over. Ironically, those same critics are now scrambling to paint themselves as committed to open source and cloud architectures. Today, I believe that Acquia sets the standard for digital experiences built with open source and delivered in the cloud. /p pWhen Tom (my business partner and Acquia CEO) and I spoke together at Acquia's annual customer conference in November, we talked about the two founding pillars that have served Acquia well over its history: open source and cloud. In 2008, we made a commitment to build a company based on open source and the cloud, with its products and services offered through a subscription model rather than a perpetual license. At the time, our industry was skeptical of this forward-thinking combination. It was a bold move, but we have always believed that this combination offers significant advantages over proprietary software because of its faster rate of innovation, higher quality, freedom from vendor lock-in, greater security, and lower total cost of ownership. /p h3Creating digital winners/h3 pAcquia has continued its evolution from a content management company to a company that offers a more complete digital experience platform. This transition inspired an internal project to update our vision and mission accordingly./p pIn 2016, we updated Acquia's vision to make it possible for dreamers and doers to craft the digital world. To achieve this vision, we want to build the universal platform for the world's greatest digital experiences. /p pWe increasingly find ourselves at the center of our customer's technology and digital strategies, and they depend on us to provide the open platform to integrate, syndicate, govern and distribute all of their digital business./p pThe focus on any and every part of their digital business is important and sets us apart from our competitors. Nearly all of our competitors offer single-point solutions for marketers, customer service, online commerce or for portals. An open source model allows customers to integrate systems together through open APIs, which enables our technology to fit into any part of their existing environment. It gives them the freedom to pursue a best-of-breed strategy outside of the confines of a proprietary marketing cloud. /p h3Business momentum/h3 pWe continued to grow rapidly in 2016, and it was another record year for revenue at Acquia. We focused on the growth of our recurring revenue, which includes new customers and the renewal and expansion of our work with existing customers. Ever since we started the company, our corporate emphasis on customer success has fueled both components. Successful customers mean renewals and references for new customers. Customer satisfaction remains extremely high at 96 percent, an achievement I'm confident we can maintain as we continue to grow. /p pIn 2016, the top industry analysts published very positive reviews based on their dealings with our customers. I'm proud that a href=http://buytaert.net/acquia-a-leader-in-2016-gartner-magic-quadrant-for-web-content-managementAcquia made the biggest positive move of all vendors/a in this year's Gartner Magic Quadrant for Web Content Management. There are now three distinct leaders: Acquia, Adobe and Sitecore. Out of the leaders, Acquia is the only player that is open-source and has a cloud-first strategy./p pOver the course of 2016 Acquia welcomed an impressive roster of new customers who included Nasdaq, Nestle, Vodafone, iHeartMedia, Advanced Auto Parts, Athenahealth, National Grid UK and more. Exiting 2016, Acquia can count 16 of the Fortune 100 among its customers./p pDigital transformation is happening everywhere. Only a few years ago, the majority of our customers were in either government, media and entertainment or higher education. In the past two years, we've seen a lot of growth in other verticals and today, our customers span nearly every industry from pharmaceuticals to finance. /p pTo support our growth, we opened a new sales office in Munich (Germany), and we expanded our global support facilities in Brisbane (Queensland, Australia), Portland (Oregon, USA) and Delhi (India). In total, we now have 14 offices around the world. Over the past year we have also seen our remote workforce expand; 33 percent of Acquia's employees are now remote. They can be found in 225 cities worldwide./p pfigure class=figurediv class=img style=border: 1px solid #ccc; display: inline-block img src=http://buytaert.net/files/cache/acquia/office-locations-2016-742x1114.jpg style=display:block alt= //div figcaption style=font-style: italic; color: #777;Acquia's offices around the world. The world got more flat for Acquia in 2016./figcaption/figure/p pWe've also seen an evolution in our partner ecosystem. In addition to working with traditional Drupal businesses, we started partnering with the world's most elite digital agencies and system integrators to deliver massive projects that span dozens of languages and countries. Our partners are taking Acquia and Drupal into some of the world's most impressive brands, new industries and into new parts of the world./p h3Growing pains and challenges/h3 pI enjoy writing these retrospectives because they allow me to chronicle Acquia's incredible journey. But I also write them for you, because you might be able to learn a thing or two from my experiences. To make these retrospectives useful for everyone, I try to document both milestones and difficulties. To grow an organization, you must learn how to overcome your challenges and growing pains. /p pRapid growth does not come without cost. In 2016 we made several leadership changes that will help us continue to grow. We added new heads of revenue, European sales, security, IT, talent acquisition and engineering. I'm really proud of the team we built. We exited 2016 in the market for new heads of finance and marketing. /p pfigure class=figurediv class=img style=border: 1px solid #ccc; display: inline-block img src=http://buytaert.net/files/cache/acquia-offsite-july-2016/the-lobster-pool-5-742x1114.jpg style=display:block alt= //div figcaption style=font-style: italic; color: #777;Part of the Acquia leadership team at The Lobster Pool restaurant in Rockport, MA./figcaption/figure/p pWe adjusted our business levers to adapt to changes in the financial markets, which in early 2016 shifted from valuing companies almost solely focused on growth to a combination of growth and free cash flow. This is easier said than done, and required a significant organizational mindshift. We changed our operating plan, took a closer look at expanding headcount, and postponed certain investments we had planned. All this was done in the name of fiscal fitness to make sure that we don't have to raise more money down the road. Our efforts to cut our burn rate are paying off, and we were able to beat our targets on margin (the difference between our revenue and operating expenses) while continuing to grow our top line./p pWe now manage 17,000+ AWS instances within Acquia Cloud. What we once were able to do efficiently for hundreds of clients is not necessarily the best way to do it for thousands. Going into 2016, we decided to improve the efficiency of our operations at this scale. While more work remains to be done, our efforts are already paying off. For example, we can now roll out new Acquia Cloud releases about 10 times faster than we could at the end of 2015. /p pLastly, 2016 was the first full year of Drupal 8 availability (it was a href=http://buytaert.net/drupal-8-0-0-releasedformally released in November 2015/a). As expected, it took time for developers and the Drupal community to become familiar with its vast array of changes and new capabilities. This wasn't a surprise; in a href=http://buytaert.net/tag/state-of-drupalmy DrupalCon keynotes/a I shared that I expected Drupal 8 to really take off in Q4 of 2016. Through the a href=http://buytaert.net/a-map-for-accelerating-drupal-8-adoptionMAP program/a we committed over $1M in funds and engineering hours to help module creators upgrade their modules to Drupal 8. All told, Acquia invested about $2.5 million in Drupal code contributions in 2016 alone (excluding our contributions in marketing, events, etc). This is the most we have ever invested in Drupal and something is I'm personally very proud of./p h3Product milestones/h3 pfigure class=figurediv class=img no-resize style=border: 1px solid #ccc; display: inline-block img src=http://buytaert.net/files/images/acquia/product-overview-2016.jpg style=display:block alt= //div figcaption style=font-style: italic; color: #777;The components and products that make up the Acquia Platform./figcaption/figure/p pAcquia remains an amazing place for engineers who want to build great products. We achieved some big milestones over the course of the year. /p pOne of the largest milestones was the significant enhancements to our multi-site platform: Acquia Cloud Site Factory. Site Factory allows a team to manage and operate thousands of sites around the world from a single console, ensuring all fixes, upgrades and improvements are delivered responsibly and efficiently. Last year we added support for multiple codebases in Site Factory – which we call Stacks – allowing an organization to manage multiple Site Factories from the same administrative console and distribute the operation around the world over multiple data centers. It's unique in its ability and is being deployed globally by many multinational, multi-brand consumer goods companies. We manage thousands of sites for our biggest customers. Site Factory has elevated Acquia into the realm of very large and ambitious digital experience delivery./p pAnother exciting product release was the a href=http://buytaert.net/personalization-takes-flight-with-the-new-acquia-liftthird version of Acquia Lift/a, our personalization and contextualization tool. With the third version of Acquia Lift, we've taken everything we've learned about personalization over the past several years to build a tool that is more flexible and easier to use. The new Lift also provides content syndication services that allow both content and user profile data to be reused across sites. When taken together with Site Factory, Lift permits true content governance and reuse./p pWe also released a href=https://www.drupal.org/project/lightningLightning/a, Acquia's Drupal 8 distribution aimed at developers who want to accelerate their projects based on the set of tested and vetted modules and configurations we use ourselves in our customer work. Acquia's commitment to improving the developer experience also led to the release of both a href=https://github.com/acquia/bltAcquia BLT/a and Acquia Pipelines (private beta). Acquia BLT is a development tool for building new Drupal projects using a standard approach, while Pipelines is a continuous delivery and continuous deployment service that can be used to develop, test and deploy websites on Acquia Cloud. /p pAcquia has also set a precedent of a href=http://buytaert.net/who-sponsors-drupal-developmentcontributing significantly to Drupal/a. We helped with the release management of Drupal 8.1 and Drupal 8.2, and with the community's adoption of a href=http://buytaert.net/the-transformation-of-drupal-8-for-continuous-innovationa new innovation model that allows for faster innovation/a. We also invested a lot in Drupal 8's API-first initiative, whose goal is to improve Drupal's web services capabilities. As part of those efforts, we introduced a href=https://github.com/acquia/waterwheel.jsWaterwheel/a, a group of SDKs which make it easier to build JavaScript and native mobile applications on top of Drupal 8's REST-backend. We have also been driving usability improvements in Drupal 8 by prototyping a new UX paradigm called outside in and by contributing to the media and layout initiatives. In 2017, I believe we should maintain our focus on release management, API-first and usability. /p pOur core product, Acquia Cloud, received a major reworking of its user interface. That new UI is a more modern, faster and responsive user interface that simplifies interaction for developers and administrators./p pfigure class=figurediv class=img style=border: 1px solid #ccc; display: inline-block img src=http://buytaert.net/files/cache/acquia/acquia-cloud-ui-2016-742x1114.jpg style=display:block alt= //div figcaption style=font-style: italic; color: #777;The new Acquia Cloud user interface released in 2016./figcaption/figure/p pOur focus on security reached new levels in 2016. In January we secured certification that we complied with ISO 27001: the international security and compliance standard for enterprise cloud frameworks. In April we were awarded our FedRAMP ATO from the U.S. Department of Treasury after we were judged compliant with the U.S. federal standards for cloud security and risk management practices. Today we have the most secure, reliable and agile cloud platform available./p pWe ended the year with an exciting partnership with commerce platform Magento that will help us advance a href=http://buytaert.net/content-and-commerce-a-big-opportunity-for-drupalour vision of content and commerce/a. Existing commerce platforms have focused primarily on the transactions (cart systems, payment processing, warehouse/supply chain integration, tax compliance, customer credentials, etc.) and neglected the customer's actual shopping experience. We've demonstrated with numerous customers that a better brand experience can be delivered with Drupal and Acquia Lift alongside these existing commerce platforms./p h3The wind in our sales (pun intended)/h3 pEntering 2017, I believe that Acquia is positioned for long-term success. Here are a few reasons why: /p ulliThe current market for content, commerce, and community-focused digital experiences is growing rapidly at just under 20 percent per year./li liWe hold a leadership position in our market, despite our relative market share being small. The analysts gave Acquia top marks for our strategic roadmap, vision and execution./li liDigitization is top-of-mind for all organizations and impacts all elements of their business and value chain. Digital first businesses are seeking platforms that not only work for marketing, but also for service, compliance, portals, commerce and more./li liOpen source combined with the cloud continue to grow at a furious pace. The continuing rise of the developer's influence on technology selection also works in our favor./li liDrupal 8 is the most significant advance in the evolution of the Drupal and a href=http://buytaert.net/the-transformation-of-drupal-8-for-continuous-innovationDrupal's new innovation model/a allows the Drupal community to innovate faster than ever before./li liRecent advances in machine learning, Internet of Things, augmented reality, speech technology, and conversational interfaces all coming to fruition will lead to a href=http://buytaert.net/cross-channel-user-experiences-with-drupalnew customer experiences/a and business models, reinforcing the need for API-first solutions and the levels of freedom that only open source and cloud computing offer./li /ulpAs I explained at the beginning of this retrospective, trends and cycles reveal themselves over time. After reflecting on 2016, I believe that Acquia is in a unique position. As the world has embraced open source and cloud without reservation, our long-term commitment to this disruptive combination has put us at the right place at the right time. Our investments in expanding the breadth of our platform with products like Acquia Lift and Site Factory are also starting to pay off./p pHowever, Acquia's success is not only determined by the technology we back. Our unique innovation model, which is impossible to cultivate with proprietary software, combined with our commitment to customer success has also contributed to our crossing of the chasm. /p pOf course, none of these 2016 results and milestones would be possible without the hard work of the Acquia team, our customers, partners, the Drupal community, and our many friends. Thank you for your support in 2016 – I can't wait to see what the next year will bring!/p

Evolving Web: Drupal 8 Migration: Migrating Basic Data (Part 1)

Mon, 01/16/2017 - 18:35
a href=https://evolvingweb.ca/%20%20___ img src=https://evolvingweb.ca/sites/default/files/styles/medium/public/2017-01/migration-1.png?itok=jACLPFN7 width=220 height=127 alt=Migration typeof=Image class=img-responsive //apA tutorial on migrating basic data to a Drupal 8 site using the migrate module and related modules./p a href=https://evolvingweb.ca/blog/drupal-8-migration-migrating-basic-data-part-1 hreflang=enread more/a

Web Wash: How to Manage Media Assets in Drupal 8

Mon, 01/16/2017 - 18:30
Everyone has their own definition of media management. In this tutorial, I'm going to focus on three parts: Storing assets, Embedding assets, Browsing assets. I want to give users the ability to create a media assets. Then have a button in the editor which they can use browse assets and then embed them. We'll utilize three modules to handle this: Media Entity, Entity Embed and Entity Browser.

Drupal core announcements: Drupal 8 Migrate API is in beta

Mon, 01/16/2017 - 16:31
pDrupal 8.0.0 replaced the earlier, in-place upgrade procedure for major version upgrades with a migration-based solution for core and contributed modules. Several modules serve this need in core: The emMigrate/em module provides a general API for migrations, the emMigrate Drupal/em module provides API support for Drupal-to-Drupal migrations, and the emMigrate Drupal UI/em module offers a simple user interface to run migrations from older Drupal versions./p pA lot of work has gone into making migrations more complete since the initial 8.0.0 release, including for multilingual sites with various configurations. Drupal-to-Drupal migrations are still not wholly complete (especially for Drupal 7 sources). However, lots of real-life use has validated the choices we made with the base Migrate API, and key architectural improvements have been completed already. An increasing number of contributed modules rely on it for their migrations./p pBased on this stability and success, the Migrate subsystem maintainers and Drupal release managers have agreed the strongMigrate API (the Migrate module) now has a href=https://www.drupal.org/core/experimental#betabeta stability/a!/strong The change took effect in Drupal 8.2.x with 8.2.5 and will apply to 8.3.0 onwards as well. /p h3What does this mean for sites and developers relying on the Migrate API?/h3 pa href=https://www.drupal.org/core/experimental#betaBeta experimental modules/a are considered API- and feature-complete and beta modules are subject to the a href=https://www.drupal.org/core/d8-allowed-changes#betabeta allowed changes policy/a. This means that module and migration developers can rely on the API remaining stable from now on! This also means that the focus with Migrate API is on a href=https://www.drupal.org/project/issues/drupal?priorities=400amp;component=migration+systemfixing critical issues/a as well as bug fixes and contributed project blockers, if they are non-disruptive, or if the impact outweighs the disruption./p pNote that emMigrate Drupal/em and emMigrate Drupal UI/em are still a href=https://www.drupal.org/core/experimentalalpha stability/a, so API changes may still happen in these modules. Completing the Drupal-to-Drupal migration path and getting emMigrate Drupal/em to beta stability is the next priority, so your help with missing and incomplete migrations is welcome!/p pIf you want to get involved, the migration team is meeting every week at alternating times. The team has a href=https://hangouts.google.com/hangouts/_/virtuoso-performance.com/weekly-drupal-8Google Hangouts/a at Wed 1pm UTC or Thu 1am UTC on an alternating weekly schedule. The #drupal-migrate a href=https://drupal.org/ircIRC channel/a is also used as a backchannel./p

Sooper Drupal Themes: Introducing Glazed Builder: A Monumental Update By SooperThemes

Mon, 01/16/2017 - 15:53
div class=field-blog-image img typeof=foaf:Image class=img-responsive src=http://www.sooperthemes.com/sites/default/files/styles/bootstrap3_col12/public/blog-images/sooper6-blog-header_2.png?itok=hRBoZpN7 width=1140 height=403 / /div div class=field-body div class=az-element az-row row az-row--sm data-az-id=b2 data-azat-device=sm data-azb=az_row data-azcnt=true style= div class=az-element az-ctnr az-column col-sm-12 data-az-id=b3 data-azb=az_column data-azcnt=true style= div class=az-element az-text data-az-id=b4 data-azb=az_text data-azcnt=true style= p2017 is going to be an incredible year for SooperThemes and for you! We kick off with the first official major version update for our drag and drop builder! Today we introduce you to Glazed Builder 1.1.0. We have rebranded Carbide Builder to Glazed Builder and developed some major new features, including entity revisions, full support for filtered contextual views and RGBA color sliders!/p pThis is a monumental update. Glazed Builder is currently not only the greatest and fastest drag and drop builder for Drupal but also a very competitive product in thenbsp;wider site building landscape.nbsp;Going forward we'll not only develop more features and designs but we'll also start developing even more complete and complex turn-key Glazed demos.nbsp;In addition this release marks the start of our Drupal 8 upgrade sprint. Yes, you heard that right, with the D8Media initiative aiming to add much needed Media improvements in Drupal 8.3 we feel like now is the right time.nbsp;/p /div div class=az-element az-row row az-row--sm data-az-id=b5 data-azat-device=sm data-azb=az_row data-azcnt=true style= div class=az-element az-ctnr az-column col-sm-3 data-az-id=b6 data-azat-width=1/4 data-azb=az_column data-azcnt=true style=/div div class=az-element az-ctnr az-column col-sm-6 data-az-id=b7 data-azat-width= 1/2 data-azb=az_column data-azcnt=true style= div class=az-element az-button data-az-id=b8 data-azat-block=btn-block data-azat-link=http://www.sooperthemes.com/ data-azat-link_target=_blank data-azat-size=btn-lg data-azat-title=Try Glazed Builder Now data-azat-type=btn-primary data-azb=az_buttona class=btn btn-primary btn-lg btn-block href=http://www.sooperthemes.com/ style= target=_blank type=buttonTry Glazed Builder Now/a/div div class=az-element az-text data-az-id=b9 data-azb=az_text data-azcnt=true style= p style=text-align: center;smallThe Admin demo is free, no card required!/small/p h2/h2 /div /div div class=az-element az-ctnr az-column col-sm-3 data-az-id=b10 data-azat-width= 1/4 data-azb=az_column data-azcnt=true style=/div /div div class=az-element az-text data-az-id=b11 data-azb=az_text data-azcnt=true style= h3 class=st-title bg-glazedRedesigned for 2017/h3 /div div class=az-element az-image text-center data-az-id=b12 data-azat-el_class=text-center data-azat-height= data-azat-image=https://www.sooperthemes.com/sites/default/files/glazed-builder/glazed-builder-interface-800.gif?fid=1486 data-azat-style=border-top-width:1px;border-bottom-width:1px;border-left-width:1px;border-right-width:1px;border-color:#999999;border-style:solid; data-azat-width= data-azb=az_imageimg alt= src=https://www.sooperthemes.com/sites/default/files/glazed-builder/glazed-builder-interface-800.gif?fid=1486 style=border-top-width:1px;border-bottom-width:1px;border-left-width:1px;border-right-width:1px;border-color:#999999;border-style:solid; title=/div div class=az-element az-text data-az-id=b13 data-azb=az_text data-azcnt=true style= pGlazed Builder has a fresh look that is designed for fast intuitive site-building. The speed of an interface isn't just about fast code, it's very much about fast design too. The new controls are all-white and while animation is used on the drop shadows the actual controls appear and respond immediately./p pThe colors and branding are matched to the Glazed brand, to emphasize the uniform experience you get when you combine our Glazed Theme with the builder. That said, Glazed Builder is still an independentnbsp;module that can work with any Drupal theme!nbsp;/p /div div class=az-element az-text data-az-id=b14 data-azb=az_text data-azcnt=true style= h3 class=st-title bg-glazedViews with Contextual Filters/h3 pPerfect if you're making a magazine website or more serious blog or commerce website! Now you can design taxonomy term or e-commerce pages with dynamic views displays. It is now fully supported to load views in drag and drop pages, override their filters and pagers in Glazed Builder, and let these views take default arguments based on url parts./p pThis feature is not just awesome for magazine websites but also for government websites, intranets, communities... Basically anyone who buildsnbsp;websites with large amounts of structured content will love this update./p /div div class=az-element az-text data-az-id=b15 data-azb=az_text data-azcnt=true style= h3 class=st-title bg-glazedBetter Equal Heights Rows And Vertical Centering, RGBA Color/h3 /div div class=az-element az-image text-center data-az-id=b16 data-azat-el_class=text-center data-azat-height= data-azat-image=https://www.sooperthemes.com/sites/default/files/glazed-builder/alpha-slider-800.gif?fid=1487 data-azat-style=border-top-width:0px;border-bottom-width:2px;border-left-width:2px;border-right-width:2px;border-color:#01b0ef;border-style:solid; data-azat-width=800 data-azb=az_imageimg alt= src=https://www.sooperthemes.com/sites/default/files/glazed-builder/alpha-slider-800.gif?fid=1487 style=border-width: 0px 2px 2px; border-color: rgb(1, 176, 239); border-style: solid; width: 800px; title=/div div class=az-element az-text data-az-id=b17 data-azb=az_text data-azcnt=true style= pHaving an alpha slider on every color setting in Glazed Builder allows more creative freedom for designers and makes it easier for site builders to implement designs that use translucent elements. We also improved equal heights rows by replacing the old jQuery trick with faster, reliable Flexbox CSS. In addition we enriched the column element with a Vertical Centering option. This let's you add vertical centering to columns independently of sibling columns.nbsp;/p /div div class=az-element az-text data-az-id=b18 data-azb=az_text data-azcnt=true style= h3 class=st-title bg-glazedSaving Revisions/h3 pSome updates are invisible:nbsp;Glazed Builder now automatically detects entity types that support revisions and will create new revisions when saving to fields on these entities. It doesn't matter if your field is on a node, bean block or custom entity. It doesn't even matter if you have have 10 Glazed Builder instances in one page, saving to multiple entities in the backend. It all just works and with revisions you'll easily undo those regrettable changes that seemed right in the spur of the moment./p ​/div div class=az-element az-text data-az-id=b30 data-azb=az_text data-azcnt=true style= h3 class=st-title bg-glazedGoole AMP/h3 pGoogle AMP is seeing more and more adoption and we integrated Glazed Builder with the Drupal AMP module. AMP is very restrictive so it won't allow fancy elements like circle charts and image comparison widgets but it should work fine with non-interactive markup generated by Glazed Builder. We welcome feedback from AMP experts on how to further extend AMP support!/p /div div class=az-element az-text data-az-id=b19 data-azb=az_text data-azcnt=true style= h3 class=st-title bg-glazedGlazed Theme 2.6.0/h3 pWhile this releases focuses on the Glazed Builder update, Glazed Theme also received new features and consequently a major version bump to 2.6.0. Less spectaculary but still very useful: A Import/Export interface was added to the Glazed Theme Settings interface. All those settings that collectively make up your sites' unique design can now easily be copy-pasted between environments, or into a new subtheme .info file./p /div div class=az-element az-text data-az-id=b20 data-azb=az_text data-azcnt=true style= h3 class=st-title bg-glazedDrupal 8 Themes and Builder/h3 ul/ul ul/ul ul/ul /div div class=az-element az-image text-center data-az-id=b21 data-azat-el_class=text-center data-azat-height= data-azat-image=https://www.sooperthemes.com/sites/default/files/Drupal%2520%257C%2520Media%2520Library%253B%2520V0.82%2520MVP.png?fid=1484 data-azat-width=800 data-azb=az_imageimg alt= src=https://www.sooperthemes.com/sites/default/files/Drupal%2520%257C%2520Media%2520Library%253B%2520V0.82%2520MVP.png?fid=1484 style=width: 800px; title=/div div class=az-element az-text data-az-id=b31 data-azb=az_text data-azcnt=true style= pAs a subscription Drupal theme shop, we really focus on building long-term relationships with our customers and that's why we carefully chose important moments that affect the products we make and maintain. Choosing the right moment to make the D8 move was hard, because Drupal 7 is just so good that it was hard for Drupal 8 to take the crown.nbsp;/p pFrom my perspective, this moment is the release of Drupal 8.3nbsp;with contrib in great shape, improved media handling, and hopefully a media browser in core! The moment that it no longer makes sense for anyone to start a Drupal 7 website is approaching and we're going to make sure all our products are running smoothly on Drupal 8 by that time./p ul/ul ul/ul ul/ul /div div class=az-element az-text data-az-id=b23 data-azb=az_text data-azcnt=true style= p style=text-align: center;a href=https://www.drupal.org/node/2796001source/a/p /div div class=az-element az-text data-az-id=b22 data-azb=az_text data-azcnt=true style=position: relative; left: 0px; top: 0px; pFor more details about this update:/p ul lia href=https://www.sooperthemes.com/documentation/changelogCHANGELOGnbsp;Glazed Theme/a/li lia href=https://www.sooperthemes.com/content/adding-new-carbide-snippets-sidebarCHANGELOG Carbide Builder/a/li /ul ul/ul ul/ul ul/ul /div /div /div div class=az-element az-row row az-row--sm data-az-id=b24 data-azat-device=sm data-azb=az_row data-azcnt=true style= div class=az-element az-ctnr az-column col-sm-3 data-az-id=b25 data-azat-width=1/4 data-azb=az_column data-azcnt=true style=/div div class=az-element az-ctnr az-column col-sm-6 data-az-id=b26 data-azat-width= 1/2 data-azb=az_column data-azcnt=true style= div class=az-element az-button data-az-id=b27 data-azat-block=btn-block data-azat-link=http://www.sooperthemes.com/ data-azat-link_target=_blank data-azat-size=btn-lg data-azat-title=Try Glazed Builder Now data-azat-type=btn-primary data-azb=az_buttona class=btn btn-primary btn-lg btn-block href=http://www.sooperthemes.com/ style= target=_blank type=buttonTry Glazed Builder Now/a/div div class=az-element az-text data-az-id=b28 data-azb=az_text data-azcnt=true style= p style=text-align: center;smallThe Admin demo is free, no card required!/small/p h2/h2 /div /div div class=az-element az-ctnr az-column col-sm-3 data-az-id=b29 data-azat-width= 1/4 data-azb=az_column data-azcnt=true style=/div/div /div div class=field-content-banner glazed-util-float-right float-right a href=http://bit.ly/1MRJwVWimg typeof=foaf:Image class=img-responsive src=http://www.sooperthemes.com/sites/default/files/default_images/sooper-theme-banner-2016-300x140.png width=300 height=140 alt= //a /div

ThinkShout: Using Google Docs and Migrate to Populate Your Drupal Site, Part 2

Mon, 01/16/2017 - 15:00
pIn a href=https://thinkshout.com/blog/2017/01/using-google-docs-and-migrate-to-populate-your-drupal-site-part-1/Part 1/a, I talked about using Google Docs + Migrate to populate your site. Now we’re going to do that with the a href=https://www.drupal.org/project/migrate_google_sheetsMigrate Google Sheets/a module. Below, I’ll provide the steps to get your own migration up and running, but if you prefer to experiment with a working example, a href=https://live-mgs-demo.pantheonsite.io/check out a demo of the Migrate Google Sheets Example module/a (provided as a submodule within Migrate Google Sheets). a href=https://docs.google.com/spreadsheets/d/1spS1BeUIzxR1KrGK2kKzAoiFZii6vBHyLx_SA0Sb89MAll content on that site was built using this example Google Sheet/a./p h2 id=setup-install-the-moduleSetup: Install the Module/h2 pIf you’ve already got a Drupal 8 site up and running, a href=https://www.drupal.org/docs/8/extending-drupal-8/installing-contributed-modules-find-import-enable-configure-drupal-8you can install the module/a in any of the normal ways. I’m assuming here that you have access to the site using a href=http://www.drush.org/en/master/Drush/a, as it’s not possible to run migrations through anything but the command line at this time. At ThinkShout, we use composer to build our site distributions, and have a href=https://github.com/thinkshout/mgs_demoa repo for building the demo site here/a./p h2 id=step-1-creating-your-custom-migration-moduleStep 1: Creating Your Custom Migration Module/h2 pThe easiest way to get started on your own set of migrations is to copy the migrate_google_sheets_example submodule and rename it something of your own. Let’s say we rename it “my_migration.” Follow these steps:/p ol liRename your .install file to “my_migration.install”, and change the function migrate_google_sheets_example_uninstall to “my_migration_uninstall”./li liDelete the helper submodule “migrate_google_sheets_example_setup” entirely – that is just necessary to build the content types required for the example module, but you shouldn’t need it for your migration module./li liRename your migrate_google_sheets_example.info.yml as “my_migration.info.yml” and open it up. At the very least, you’ll want to change the name of the migration to “name: my_migration” but you’ll also likely wish to remove the migrate_google_sheets:migrate_google_sheets_example_setup dependency. Mine ended up looking like this:/li /ol div class=language-yaml highlighter-rougepre class=highlightcodespan class=sname/spanspan class=pi:/span span class=smy_migration/span span class=stype/spanspan class=pi:/span span class=smodule/span span class=sdescription/spanspan class=pi:/span span class=sMy Migrations/span span class=score/spanspan class=pi:/span span class=s8.x/span span class=spackage/spanspan class=pi:/span span class=sMigrate/span span class=sdependencies/spanspan class=pi:/span span class=pi-/span span class=smigrate_plus/span span class=pi-/span span class=smigrate_tools/span span class=pi-/span span class=smigrate_google_sheets/span span class=pi-/span span class=sredirect/span /code/pre /div pWhen completed, your module structure should look like this:/p pimg src=/assets/images/blog/google-sheets-migrate-1.png alt=Module Structure //p pYou are now ready to enable your My Migrations module. (Make sure you disable the migrate_google_sheets_example module first, if you’d previously enabled that!)/p h2 id=step-2-create-your-spreadsheetStep 2: Create Your Spreadsheet/h2 pAssuming you have the Game and Landing page content types, you could now run the migrations in your “My Migrations” module and it will pull the data from the a href=https://docs.google.com/spreadsheets/d/1spS1BeUIzxR1KrGK2kKzAoiFZii6vBHyLx_SA0Sb89M/editGoogle Sheet/a./p pBut since you don’t have permissions to edit that sheet, you’re going to need to copy the existing sheet and create your own to do any customizations./p pimg src=/assets/images/blog/google-sheets-migrate-2.png alt=Spreadsheet //p pWhen this is done, you’ll get a url like this:/p phttps://docs.google.com/spreadsheets/d/YourLongHashIDHere where YourLongHashIDHere is your feed key./p pNow you’ll need to publish your new spreadsheet. This is an option under “File” -gt; “Publish to the web”/p pimg src=/assets/images/blog/google-sheets-migrate-3.png alt=Spreadsheet //p pTo verify that your migration module will be able to see the Google sheet, try opening an anonymous browser window and visiting the Feed version of the url, whose format is this:/p phttps://spreadsheets.google.com/feeds/list/YourLongHashIDHere/SHEET/public/values?alt=json/p pIf visiting that URL throws out a bunch of json, you’re ready to start migrating!/p pBut of course, your current set of migration files still point to the old feed. In the my_migrations/config/install folder, you’ll need to find all instances of our feed string (1spS1BeUIzxR1KrGK2kKzAoiFZii6vBHyLx_SA0Sb89M) and replace them with your feed string./p h2 id=step-3-decide-which-migrations-to-keepStep 3: Decide Which Migrations to Keep/h2 pThe Migrate Google Sheets Example module provides one Migration Group (games_example) and 6 Migrations. Depending on your site configuration, some of these might be useful, like the menu_links and the blocks migrations, and some of them will not be so useful (like the node_game migration, likely). This is a good time to trim or modify any migrations that aren’t going to be useful for your Drupal site. That being said, here are a few things that the sample migrations demonstrate:/p ul liBlock UUIDs: When you place a block using the Block Layout screen, the block’s UUID is saved in config. If you’re running a migration over and over, your block’s ID will iterate on its own, but the UUID can remain constant if you add it to the migration. a href=https://live-mgs-demo.pantheonsite.io/In the demo site/a, this allows us to create a persistent CTA block in the header./li /ul pimg src=/assets/images/blog/google-sheets-migrate-4.png alt=Module Structure //p ul liMenu Links parents: You can specify that a menu link item has a parent from within the current migration. This lets us say /bohnanza and /hanabi are children of /games/li liPage and Game redirects: These sheets demonstrate how to add the redirect from the url of content on an old site to the new home right in the content sheet. Try going to a href=https://live-mgs-demo.pantheonsite.io/that-fireworks-gamehttps://live-mgs-demo.pantheonsite.io/that-fireworks-game/a and see where you end up./li liRelated content as strings or ids: On the Page sheet, we have a reference to the “Related games” for the given page. This is an entity reference which we could fill with a couple of things. We could refer to the ID of the related games, as they are stored in the Games sheet, or we could do what we’ve done here and use the migrate_plus plugin “entity_lookup” to search for the related game node by name. As long as there is a Game node called Bohnanza, we’ll always link to the right one. This is particularly useful with Term references, where the name of the item ideally remains constant./li /ul pimg src=/assets/images/blog/google-sheets-migrate-5.png alt=Related Content //p ul liGame downloadable file: Games have associated images, which are files hosted externally to the spreadsheet. In order to relate my game content to its image, I need to download the image, get it into the file_managed database table (creating a file entity) and THEN relate that entity to the current node. This is done with the following lines in the “node_games” migration:/li /ul div class=language-yaml highlighter-rougepre class=highlightcodespan class=spublic_file_directory/spanspan class=pi:/span span class=splugin/spanspan class=pi:/span span class=sdefault_value/span span class=sdefault_value/spanspan class=pi:/span span class=s1'/spanspan class=spublic://'/span span class=err /spanspan class=spublic_file_uri/spanspan class=pi:/span span class=splugin/spanspan class=pi:/span span class=sconcat/span span class=sdelimiter/spanspan class=pi:/span span class=s1'/spanspan class=s'/span span class=ssource/spanspan class=pi:/span span class=pi-/span span class=err@/spanspan class=spublic_file_directory/span span class=pi-/span span class=simagefilename/span span class=sfield_image/target_id/spanspan class=pi:/span span class=pi-/span span class=splugin/spanspan class=pi:/span span class=sfile_copy/span span class=ssource/spanspan class=pi:/span span class=pi-/span span class=simage/span span class=pi-/span span class=err@/spanspan class=spublic_file_uri/span span class=pi-/span span class=splugin/spanspan class=pi:/span span class=sentity_generate/span span class=sfield_image/alt/spanspan class=pi:/span span class=simagealt/span span class=sfield_image/title/spanspan class=pi:/span span class=simagetitle/span /code/pre /div pYou can keep as many or as few of the migration files as you’d like. You can also create new ones./p h2 id=step-4-tell-drupal-about-your-changesStep 4: Tell Drupal About Your Changes/h2 pDrupal 8 only sees the changes you’ve made to your migration yml files when you first install the module. That means that you need to uninstall and reinstall the module to make new changes show up. a href=https://github.com/thinkshout/mgs_demo/blob/master/RoboFile.php#L18ThinkShout has a Robo script that does this/a, but the same thing can be done in Drush:/p div class=language-yaml highlighter-rougepre class=highlightcodespan class=sdrush mr --all/span span class=c1# Rolls back all migrations/span span class=sdrush pmu my_migration -y/span span class=c1# Disables my migration module/span span class=sdrush en my_migration -y/span span class=c1# Enable my migration module/span span class=sdrush ms/span span class=c1# Displays my current migration status/span /code/pre /div pYou can also string these together as one line:/p div class=language-yaml highlighter-rougepre class=highlightcodespan class=sdrush mr --all amp;amp; drush pmu my_migration -y amp;amp; drush pmu my_migration -y amp;amp; drush ms/span /code/pre /div h2 id=step-5-run-your-migrationsStep 5: Run your migrations/h2 pThis part is simple. To run all migrations, it’s a quick drush command:/p pcode class=highlighter-rougedrush mi --all/code/p pIf you’d like to find out about all the possible options for the migrate-import command, you can run/p pcode class=highlighter-rougedrush help mi/code/p pYou can also see your list of migration groups at /admin/structure/migrate, and you can review your migrations by clicking “List Migrations.” The resulting page will give you the same output, more or less, that you get from running a code class=highlighter-rougedrush ms/code./p pimg src=/assets/images/blog/google-sheets-migrate-6.png alt=Migrations //p pThese pages are helpful to know about, as they give you an easy place to find errors logged during the migration process. However, you can’t currently run a migration from the UI (a href=https://www.drupal.org/node/2470882although there is an issue for this/a)./p h2 id=gotchasGotchas/h2 pBut before we close, I do want to acknowledge some challenges we’ve seen in this approach./p pSad fact #1: HTML in a spreadsheet is ugly./p pGoogle Spreadsheets don’t let you make your rows smaller than the number of line breaks in a cell. So if you have pretty html with a bunch of line breaks, your row might be too tall to fit on your screen. a href=http://webapps.stackexchange.com/questions/6953/in-a-google-spreadsheet-how-can-i-force-a-row-to-be-a-certain-heightPeople have some clever workarounds for this/a, but so far we’ve not implemented any./p pSad fact #2: Sheet order matters (right now)/p pMaintaining the order of sheets isn’t top on everyone’s minds as they’re making changes to a spreadsheet, especially when duplicating tabs. Migrate Google Sheets asks for each sheet based on tab order. If I make a copy of the Page tab, the Game tab is now the fourth tab instead of the third tab./p pimg src=/assets/images/blog/google-sheets-migrate-7.png alt=Copy of page //p pAs it stands now, the module will happily request columns that don’t exist on the third tab and then fail in puzzling ways./p pThere is currently a href=https://www.drupal.org/node/2822948only one issue/a in the issue queue for the Migrate Google Sheets module, and it’s to fix this./p pSad fact #3: Google sheets must be publicly viewable to work (again, right now)/p pAs the module exists right now, there’s no authentication involved, so any migrated content must be publicly viewable. a href=https://developers.google.com/google-apps/spreadsheets/authorizeGoogle authorization is possible with Oauth2/a, but that is not currently implemented./p h2 id=conclusionConclusion/h2 pThanks for following along! I hope you found this series helpful. And don’t forget to visit the a href=https://www.drupal.org/project/migrate_google_sheetsMigrate Google Sheets/a a href=https://www.drupal.org/project/issues/migrate_google_sheets?categories=Allissue queue/a if you find any bugs, have an idea for a feature, or need help!/p

Cheppers blog: Development of a sponsored contrib module - Gather Content

Mon, 01/16/2017 - 10:52
a href=https://cheppers.com/blog/sponsored-module-development-gather-content img src=https://cheppers.com/sites/default/files/styles/cheppers_blog_teaser_mobile/public/blogpostteaser_Miro_1.png?itok=6Y4COlzn width=536 height=300 alt= class=image-style-cheppers-blog-teaser-mobile //a pIn 2016, our team worked on a sponsored contrib module, GatherContent. The goal of the project was to recreate the module for Drupal 7 using best practices, and to create a brand new module for Drupal 8./p