Planet Drupal

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

Agiledrop.com Blog: AGILEDROP: Challenges ahead of Drupal in 2017

Thu, 12/29/2016 - 06:55
a href=http://www.agiledrop.com/blog/challenges-ahead-drupal-2017img src=https://www.agiledrop.com/sites/default/files/2016-12/adventure-1846437_1920.jpg //a What is done is done. What happened, happened. There are only a few days left until the year 2016 finishes. In that time Drupal 8 turned one, some fascinating new sites and product were launched, a lot of new modules were created, many problems were solved ... but still, there are some reserves. Therefore, we'll look at where Drupal can still improve in the following year. Drupal Community One of the main problems is that Drupal users are not as active in the community as they should be. So, in 2017 Drupalistas, who professionally work with Drupal, should be more active in the community.… a href=http://www.agiledrop.com/blog/challenges-ahead-drupal-2017READ MORE/a

Platform.sh: Next Wave PHP now supported

Thu, 12/29/2016 - 01:00
pWe were hoping to have this announcement out in time for Christmas gift but it was not to be. Instead it’s an early New Years gift. Nonetheless, we’re happy to announce a whole slew of new options for PHP projects to make them faster and more robust on Platform.sh: PHP 7.1 support, async support, and PThreads support./p

Lullabot: Building Views Query Plugins for Drupal 8, Part 2

Wed, 12/28/2016 - 18:00
div class=rich-textdiv class=rich-text__contentpWelcome to the second installment of our three-part series on writing Views query plugins. a href=https://www.lullabot.com/articles/building-views-query-plugins-dupal-8-part-1In part one, we talked about the kind of thought and design work that must take place before coding begins/a. In part two, we#x2019;ll start coding our plugin and end up with a basic functioning example./p pWe#x2019;ve talked explicitly about needing to build a Views query plugin to accomplish our goal of having a customized Fitbit leaderboard, but we#x2019;ll also need field plugins to expose that data to Views, filter plugins to limit results sets, and, potentially, relationship plugins to span multiple API endpoints. There#x2019;s a lot to do, so letapos;s dive in.br/ #xA0;/p h2Getting started/h2 pIn Drupal 8, plugins are the standard replacement for info hooks. If you haven#x2019;t yet had cause to learn about the plugin system in Drupal 8, I suggest the a href=https://drupalize.me/series/module-development-guideDrupalize.Me Drupal 8 Module Development Guide/a, which includes an excellent primer on Drupal 8 plugins./p h3Step 1: Create a views.inc file/h3 pAlthough most Views hooks required for Views plugins have gone the way of the a href=https://en.wikipedia.org/wiki/Dodododo/a, there is still one that survives in Drupal 8:#xA0;codehook_views_data/code.#xA0;The Views module looks for that hook in a file named code[module].views.inc,/code#xA0;which lives in your moduleapos;s root directory. codehook_views_data/code#xA0;and codehook_views_data_alter/code#xA0;are the main things you#x2019;ll find here, but since Views is loading this file automatically for you, take advantage and put any Views-related procedural code you may need in this file./p h3Step 2: Implement hook_views_data()/h3 pUsually codehook_views_data/code#xA0;is used to describe the SQL tables that a module is making available to Views. However, in the case of a query plugin it is used to describe the data provided by the external service./p div class=codepre code span class=code__comment/** * Implements hook_views_data(). *//span span class=code__functionspan class=code__keywordfunction/span span class=code__titlefitbit_views_example_views_data/spanspan class=code__params()/span /span{ span class=code__variable$data/span = []; span class=code__comment// Base data./span span class=code__variable$data/span[span class=code__stringapos;fitbit_profileapos;/span][span class=code__stringapos;tableapos;/span][span class=code__stringapos;groupapos;/span] = t(span class=code__stringapos;Fitbit profileapos;/span); span class=code__variable$data/span[span class=code__stringapos;fitbit_profileapos;/span][span class=code__stringapos;tableapos;/span][span class=code__stringapos;baseapos;/span] = [ span class=code__stringapos;titleapos;/span =gt; t(span class=code__stringapos;Fitbit profileapos;/span), span class=code__stringapos;helpapos;/span =gt; t(span class=code__stringapos;Fitbit profile data provided by the Fitbit API\apos;s User Profile endpoint.apos;/span), span class=code__stringapos;query_idapos;/span =gt; span class=code__stringapos;fitbitapos;/span, ]; span class=code__keywordreturn/span span class=code__variable$data/span; }/code/pre/div pThe format of the array is usually code$data[table_name][apos;tableapos;]/code, but since there is no table I#x2019;ve used a short name for the Fitbit API endpoint, prefixed by the module name instead. So far, I#x2019;ve found that exposing each remote endpoint as a Views #x201C;table#x201D;#x2014;one-to-one#x2014;works well. It may be different for your implementation. This array needs to declare two keys#x2014;#x2018;group#x2019; and #x2018;base.apos;#xA0;When Views UI refers to your data, it uses the #x2018;group#x2019; value as a prefix. Whereas, the #x2018;base#x2019; key alerts Views that this table is a base table#x2014;a core piece of data available to construct Views from (just like nodes, users and the like). The value of the #x2018;base#x2019; key is an associative array with a few required keys. The #x2018;title#x2019; and #x2018;help#x2019; keys are#xA0;self-explanatory and are also used in the Views UI. When you create a new view, #x2018;title#x2019; is what shows up in the #x201C;Show#x201D; drop-down under #x201C;View Settings#x201D;:/p /divdiv class=rich-text__embedundefined/divdiv class=rich-text__content pThe #x2018;query_id#x2019; key is the most important. The value is the name of our query plugin. More on that later./p h3Step 3: Expose fields/h3 pThe data you get out of a remote API isn#x2019;t going to be much use to people unless they have fields they can display. These fields are also exposed by#xA0;codehook_views_data/code./p div class=codepre codespan class=code__comment// Fields./span span class=code__variable$data/span[span class=code__stringapos;fitbit_profileapos;/span][span class=code__stringapos;display_nameapos;/span] = [ span class=code__stringapos;titleapos;/span =gt; t(span class=code__stringapos;Display nameapos;/span), span class=code__stringapos;helpapos;/span =gt; t(span class=code__stringapos;Fitbit users\apos; display name.apos;/span), span class=code__stringapos;fieldapos;/span =gt; [ span class=code__stringapos;idapos;/span =gt; span class=code__stringapos;standardapos;/span, ], ]; span class=code__variable$data/span[span class=code__stringapos;fitbit_profileapos;/span][span class=code__stringapos;average_daily_stepsapos;/span] = [ span class=code__stringapos;titleapos;/span =gt; t(span class=code__stringapos;Average daily stepsapos;/span), span class=code__stringapos;helpapos;/span =gt; t(span class=code__stringapos;The average daily steps over all the users logged Fitbit data.apos;/span), span class=code__stringapos;fieldapos;/span =gt; [ span class=code__stringapos;idapos;/span =gt; span class=code__stringapos;numericapos;/span, ], ]; span class=code__variable$data/span[span class=code__stringapos;fitbit_profileapos;/span][span class=code__stringapos;avatarapos;/span] = [ span class=code__stringapos;titleapos;/span =gt; t(span class=code__stringapos;Avatarapos;/span), span class=code__stringapos;helpapos;/span =gt; t(span class=code__stringapos;Fitbit users\apos; account picture.apos;/span), span class=code__stringapos;fieldapos;/span =gt; [ span class=code__stringapos;idapos;/span =gt; span class=code__stringapos;fitbit_avatarapos;/span, ], ]; span class=code__variable$data/span[span class=code__stringapos;fitbit_profileapos;/span][span class=code__stringapos;heightapos;/span] = [ span class=code__stringapos;titleapos;/span =gt; t(span class=code__stringapos;Heightapos;/span), span class=code__stringapos;helpapos;/span =gt; t(span class=code__stringapos;Fibit users\apos;s height.apos;/span), span class=code__stringapos;fieldapos;/span =gt; [ span class=code__stringapos;idapos;/span =gt; span class=code__stringapos;numericapos;/span, span class=code__stringapos;floatapos;/span =gt; span class=code__keywordTRUE/span, ], ];/code/pre/div pThe keys that make up a single field definition include #x2018;title#x2019; and #x2018;help#x2019;#x2014; again self-explanatory#x2014;used in the Views UI. The #x2018;field#x2019; key is used to tell Views how to handle this field. There is only one required sub-key, #x2018;id,apos; and it#x2019;s the name of a Views field plugin.#xA0;/p pThe Views module includes a handful of field plugins, and if your data fits one of them, you can use it without implementing your own. Here we use#xA0;codestandard/code, which works for any plain text data, and codenumeric/code, which works for, well, numeric data. There are a handful of others. Take a look inside code/core/modules/views/src/Plugin/views/field/code to see all of the field plugins Views provides out-of-the-box. Find the value for #x2018;id#x2019; in each field pluginapos;s annotation. As an aside, Views eats its own dog food and implements a lot of its core functionality as Views plugins, providing examples for when youapos;re implementing your Views plugins. A word of caution, many core Views plugins assume they are operating with an SQL-based query back-end. As such you#x2019;ll want to be careful mixing core Views plugins in with your custom query plugin implementation. We#x2019;ll mitigate some of this when we implement our query plugin shortly./p h3Step 4: Field plugins/h3 pSometimes data from your external resource doesn#x2019;t line up with a field plugin that ships with Views core. In these cases, you need to implement a field plugin. For our use case, codeavatar/code is such a field. The API returns a URI for the avatar image. We#x2019;ll want Views to render that as an codelt;imggt;/code tag, but Views core doesn#x2019;t offer a field plugin like that. You may have noticed that we set a field #x2018;id#x2019; of #x2018;fitbit_avatar#x2019; in codehook_views_data/code#xA0;above. That#x2019;s the name of our custom Views field plugin, which looks like this:/p div class=codepre codespan class=code__preprocessorlt;?php/span span class=code__keywordnamespace/span span class=code__titleDrupal/span\span class=code__titlefitbit_views_example/span\span class=code__titlePlugin/span\span class=code__titleviews/span\span class=code__titlefield/span; span class=code__keyworduse/span span class=code__titleDrupal/span\span class=code__titleviews/span\span class=code__titlePlugin/span\span class=code__titleviews/span\span class=code__titlefield/span\span class=code__titleFieldPluginBase/span; span class=code__keyworduse/span span class=code__titleDrupal/span\span class=code__titleviews/span\span class=code__titleResultRow/span; span class=code__comment/** * Class Avatar * * span class=code__doctag@ViewsField/span(quot;fitbit_avatarquot;) *//span span class=code__classspan class=code__keywordclass/span span class=code__titleAvatar/span span class=code__keywordextends/span span class=code__titleFieldPluginBase/span /span{ span class=code__comment/** * {span class=code__doctag@inheritdoc/span} *//span span class=code__keywordpublic/span span class=code__functionspan class=code__keywordfunction/span span class=code__titlerender/spanspan class=code__params(ResultRow span class=code__variable$values/span)/span /span{ span class=code__variable$avatar/span = span class=code__variable$this/span-gt;getValue(span class=code__variable$values/span); span class=code__keywordif/span (span class=code__variable$avatar/span) { span class=code__keywordreturn/span [ span class=code__stringapos;#themeapos;/span =gt; span class=code__stringapos;imageapos;/span, span class=code__stringapos;#uriapos;/span =gt; span class=code__variable$avatar/span, span class=code__stringapos;#altapos;/span =gt; span class=code__variable$this/span-gt;t(span class=code__stringapos;Avatarapos;/span), ]; } } }/code/pre/div pNaming and file placement is important, as with any Drupal 8 plugin. Save the file#xA0;at: codefitbit_views_example/src/Plugin/views/field/Avatar.php/code. Notice the codenamespace/code follows the file path, and also notice the annotation: code@ViewsField(quot;fitbit_avatarquot;)/code. The annotation declares this class as a Views field plugin with the #x2018;id#x2019; #x2018;fitbit_avatar,apos; hence the use of that name back in our codehook_views_data/code#xA0;function. Also important, weapos;re extending codeFieldPluginBase/code, which gives us a lot of base functionality for free. Yay OOO! As you can see,#xA0;the coderender/code method gets the value of the field from the row and returns a render array so that it appears as an codelt;imggt;/code tag./p h3Step 5: Create a class that extends QueryPluginBase/h3 pAfter all that setup, we#x2019;re almost ready to interact with a remote API. We have one more task: to create the class for our query plugin. Again, we#x2019;re creating a Drupal 8 plugin, and naming is important so the system knows that our plugin exists. We#x2019;ll create a file named:#xA0;/p pcodefitbit_views_example/src/Plugin/views/query/Fitbit.php/code#xA0;/p p...that looks like this:/p div class=codepre codespan class=code__preprocessorlt;?php/span span class=code__keywordnamespace/span span class=code__titleDrupal/span\span class=code__titlefitbit_views_example/span\span class=code__titlePlugin/span\span class=code__titleviews/span\span class=code__titlequery/span; span class=code__keyworduse/span span class=code__titleDrupal/span\span class=code__titleviews/span\span class=code__titlePlugin/span\span class=code__titleviews/span\span class=code__titlequery/span\span class=code__titleQueryPluginBase/span; span class=code__comment/** * Fitbit views query plugin which wraps calls to the Fitbit API in order to * expose the results to views. * * span class=code__doctag@ViewsQuery/span( * id = quot;fitbitquot;, * title = span class=code__doctag@Translation/span(quot;Fitbitquot;), * help = span class=code__doctag@Translation/span(quot;Query against the Fitbit API.quot;) * ) *//span span class=code__classspan class=code__keywordclass/span span class=code__titleFitbit/span span class=code__keywordextends/span span class=code__titleQueryPluginBase/span /span{ }/code/pre/div pHere we use the code@ViewsQuery/code annotation to identify our class as a Views query plugin, declaring our #x2018;id#x2019; and providing some helpful meta information. We extend codeQueryPluginBase/code to inherit a lot of free functionality. Inheritance is a recurring theme with Views plugins. I#x2019;ve yet to come across a Views plugin type that doesn#x2019;t ship with a base class to extend. At this point, we#x2019;ve got enough code implemented to see some results in the UI. We can create a new view of type Fitbit profile and add the fields we#x2019;ve defined and we#x2019;ll get this:/p /divdiv class=rich-text__embedundefined/divdiv class=rich-text__content pNot terribly exciting, we still haven#x2019;t queried the remote API, so it doesn#x2019;t actually do anything, but it#x2019;s good to stop here to make sure we haven#x2019;t made any syntax errors and that Drupal can find and use the plugins we#x2019;ve defined./p pAs I mentioned, parts of Views core assume an SQL-query backend. To mitigate that, we need to implement two methods which will, in a sense, ignore core Views as a way to work around this limitation. #xA0;Let#x2019;s get those out of the way:/p div class=codepre codespan class=code__keywordpublic/span span class=code__functionspan class=code__keywordfunction/span span class=code__titleensureTable/spanspan class=code__params(span class=code__variable$table/span, span class=code__variable$relationship/span = NULL)/span /span{ span class=code__keywordreturn/span span class=code__stringapos;apos;/span; } span class=code__keywordpublic/span span class=code__functionspan class=code__keywordfunction/span span class=code__titleaddField/spanspan class=code__params(span class=code__variable$table/span, span class=code__variable$field/span, span class=code__variable$alias/span = span class=code__stringapos;apos;/span, span class=code__variable$params/span = arrayspan class=code__params()/span)/span /span{ span class=code__keywordreturn/span span class=code__variable$field/span; }/code/pre/div pcodeensureTable/code is used by Views core to make sure that the generated SQL query contains the appropriate JOINs to ensure that a given table is included in the results. In our case, we don#x2019;t have any concept of table joins, so we return an empty string, which satisfies plugins that may call this method. codeaddField/code is used by Views core to limit the fields that are part of the result set. In our case, the Fitbit API has no way to limit the fields that come back in an API response, so we don#x2019;t need this. We#x2019;ll always provide values from the result set, which we defined#xA0;in codehook_views_data/code. Views takes care to only show the fields that are selected in the Views UI. To keep Views happy, we return code$field/code, which is simply the name of the field./p pBefore we come to the heart of our plugin query, the codeexecute/code method, we#x2019;re going to need a couple of remote services to make this work. The base Fitbit module handles authenticating users, storing their access tokens, and providing a client to query the API. In order to work our magic then, we#x2019;ll need the codefitbit.client/code and codefitbit.access_token_manager/code services provided by the base module. To get them, follow a familiar Drupal 8 pattern:/p div class=codepre codespan class=code__comment/** * Fitbit constructor. * * span class=code__doctag@param/span array $configuration * span class=code__doctag@param/span string $plugin_id * span class=code__doctag@param/span mixed $plugin_definition * span class=code__doctag@param/span FitbitClient $fitbit_client * span class=code__doctag@param/span FitbitAccessTokenManager $fitbit_access_token_manager *//span span class=code__keywordpublic/span span class=code__functionspan class=code__keywordfunction/span span class=code__title__construct/spanspan class=code__params(array span class=code__variable$configuration/span, span class=code__variable$plugin_id/span, span class=code__variable$plugin_definition/span, FitbitClient span class=code__variable$fitbit_client/span, FitbitAccessTokenManager span class=code__variable$fitbit_access_token_manager/span)/span /span{ span class=code__keywordparent/span::__construct(span class=code__variable$configuration/span, span class=code__variable$plugin_id/span, span class=code__variable$plugin_definition/span); span class=code__variable$this/span-gt;fitbitClient = span class=code__variable$fitbit_client/span; span class=code__variable$this/span-gt;fitbitAccessTokenManager = span class=code__variable$fitbit_access_token_manager/span; } span class=code__comment/** * {span class=code__doctag@inheritdoc/span} *//span span class=code__keywordpublic/span span class=code__keywordstatic/span span class=code__functionspan class=code__keywordfunction/span span class=code__titlecreate/spanspan class=code__params(ContainerInterface span class=code__variable$container/span, array span class=code__variable$configuration/span, span class=code__variable$plugin_id/span, span class=code__variable$plugin_definition/span)/span /span{ span class=code__keywordreturn/span span class=code__keywordnew/span span class=code__keywordstatic/span( span class=code__variable$configuration/span, span class=code__variable$plugin_id/span, span class=code__variable$plugin_definition/span, span class=code__variable$container/span-gt;get(span class=code__stringapos;fitbit.clientapos;/span), span class=code__variable$container/span-gt;get(span class=code__stringapos;fitbit.access_token_managerapos;/span) ); }/code/pre/div pThis is a common way of doing a href=https://www.drupal.org/docs/8/api/services-and-dependency-injection/services-and-dependency-injection-in-drupal-8dependency injection in Drupal 8/a. We#x2019;re grabbing the services we need from the service container in the codecreate/code method, and storing them on our query plugin instance in the constructor.#xA0;/p pNow we#x2019;re finally ready for the heart of it, the codeexecute/code method:/p div class=codepre codespan class=code__comment/** * {span class=code__doctag@inheritdoc/span} *//span span class=code__keywordpublic/span span class=code__functionspan class=code__keywordfunction/span span class=code__titleexecute/spanspan class=code__params(ViewExecutable span class=code__variable$view/span)/span /span{ span class=code__keywordif/span (span class=code__variable$access_tokens/span = span class=code__variable$this/span-gt;fitbitAccessTokenManager-gt;loadMultipleAccessToken()) { span class=code__variable$index/span = span class=code__number0/span; span class=code__keywordforeach/span (span class=code__variable$access_tokens/span span class=code__keywordas/span span class=code__variable$uid/span =gt; span class=code__variable$access_token/span) { span class=code__keywordif/span (span class=code__variable$data/span = span class=code__variable$this/span-gt;fitbitClient-gt;getResourceOwner(span class=code__variable$access_token/span)) { span class=code__variable$data/span = span class=code__variable$data/span-gt;toArray(); span class=code__variable$row/span[span class=code__stringapos;display_nameapos;/span] = span class=code__variable$data/span[span class=code__stringapos;displayNameapos;/span]; span class=code__variable$row/span[span class=code__stringapos;average_daily_stepsapos;/span] = span class=code__variable$data/span[span class=code__stringapos;averageDailyStepsapos;/span]; span class=code__variable$row/span[span class=code__stringapos;avatarapos;/span] = span class=code__variable$data/span[span class=code__stringapos;avatarapos;/span]; span class=code__variable$row/span[span class=code__stringapos;heightapos;/span] = span class=code__variable$data/span[span class=code__stringapos;heightapos;/span]; span class=code__comment// apos;indexapos; key is required./span span class=code__variable$row/span[span class=code__stringapos;indexapos;/span] = span class=code__variable$index/span++; span class=code__variable$view/span-gt;result[] = span class=code__keywordnew/span ResultRow(span class=code__variable$row/span); } } } }/code/pre/div pThe#xA0;codeexecute/code method is open ended. At a minimum, you#x2019;ll want to assign codeResultRow/code objects to the code$view-gt;result[]/code member variable. As was mentioned in the first part of the series, the Fitbit API is atypical because we#x2019;re hitting the API once per row. For each successful request we build up an associative array, code$row/code, where the keys are the field names we defined in codehook_views_data/code#xA0;and the values are made up of data from the API response. Here we are using the Fitbit client provided by the Fitbit base module to make a request to the a href=https://dev.fitbit.com/docs/user/User profile endpoint/a. This endpoint contains the data we want for a first iteration of our leaderboard, namely: display name, avatar, and average daily steps. Note that it#x2019;s important to track an codeindex/code for each row. Views requires it, and without it, you#x2019;ll be scratching your head as to why Views isn#x2019;t showing your data. Finally, we create a new codeResultRow/code object with the code$row/code variable we built up and add it to code$view-gt;result/code. There are other things that are important to do in execute like paging, filtering and sorting. For now, this is enough to get us off the ground./p pThat#x2019;s it! We should now have a simple but functioning query plugin that can interact with the Fitbit API. After following the installation instructions for the Fitbit base module, connecting one or more Fitbit accounts and enabling the fitbit_views_example sub-module, you should be able to create a new View of type Fitbit profile, add Display name, Avatar, and Average Daily Steps fields and get a rudimentary leaderboard:/p /divdiv class=rich-text__embedundefined/divdiv class=rich-text__content h2Debugging problems/h2 pIf the message #x2018;broken or missing handler#x2019; appears when attempting to add a field or other type of handler, it usually points to a class naming problem somewhere. Go through your keys and class definitions and make sure that you#x2019;ve got everything spelled correctly. Another common issue is Drupal throwing errors because#xA0;it can#x2019;t find your plugins. As with any plugin in Drupal 8, make sure your files are named correctly, put in the right folder, with the right namespace, and with the correct annotation./p h2Summary/h2 pMost of the work here has nothing to do with interacting with remote services at all#x2014;it is all about declaring where your data lives and what its called. Once we get past the numerous steps that are necessary for defining any Views plugins, the meat of creating a new query plugin is pretty simple./p olliCreate a class that extends QueryPluginBase/li liImplement some empty methods to mitigate assumptions about a SQL query backend/li liInject any needed services/li liOverride the codeexecute/code#xA0;method to retrieve your data into a codeResultRow/code object with properties named for your fields, and store that object on the results array of the Views object./li /ol pIn reality, most of your work will be spent investigating the API you are interacting with and figuring out how to model the data to fit into the array of fields that Views expects./p h2Next steps/h2 pIn the third part of this article, we#x2019;ll look at the following topics:/p olliExposing configuration options for your query object/li liAdding options to field plugins/li liCreating filter plugins/li /ol pUntil next time!/p /div/div

ADCI Solutions: Cache in Drupal 8

Wed, 12/28/2016 - 17:58
pstrongCache /strongis the important part of a development process. Everybody use cache, but not everybody is able to manage it.br / A cache is a hardware or a software component that stores frequently requested pages or the parts of the pages, and these pages can be shown to users with less resources and with a faster speed than usual.br / What happens to the page while it’s loading? System functions and files of all modules are turned on, settings and variables are initialized, a theme is loaded and hooks are implemented. When the cache is enabled, basic system settings load and the page loads from the cache. Obviously, in this case page loads faster.br / The cache is the important component of site optimization. It’s one of the key items in the assessment of strongGoogle PageSpeed/strong application.br / Let’s have a look at how you can use cache for your site on Drupal 8. We will also go into details and talk about strongCache API/strong, auto-placeholdering and the strongBigPipe /strongmodule. Keep on reading a href=http://www.adcisolutions.com/knowledge/cache-drupal-8?utm_source=dorgamp;utm_medium=drupal-planet-feedamp;utm_content=rss-summary target=_blankhere/a. /p

ADCI Solutions: Modern practices for creating the visual part of the web

Wed, 12/28/2016 - 17:18
pbSummary/b/p ppA modern website and its design isn’t a simple text node anymore. The modern website is the wholesome application that has its components, widgets, buttons and other managing elements. A website development approach is changing, starting from the markup creation for a content placement and ending with the ready-to-use components used for building a web page./p pThere are also changes in the way designers and developers interact now. That led to collaboration tools emergence: Avocode, Zeplin, Figma./p pSumming all the above, we’re going to observe how component based thinking changes frameworks, how the collaboration tools help designers and developers understand each other and what tools they can use to speed up the work. React.js, Angular, Atomic Design approach and many more issues will be discussed in this article. Read the full article a href=http://www.adcisolutions.com/knowledge/modern-practices-creating-visual-part-web?utm_source=dorgamp;utm_medium=drupal-planet-feedamp;utm_content=rss-summaryhere/a./p /p phr //p h4INTRODUCTION/h4 pA modern website and its design isn’t a simple text node anymore. The modern website is the wholesome application that has its components, widgets, buttons and other managing elements. Now a designer not only considers the website as the wholesome one, but he or she also takes into account all of the components, since each of them is developed separately from the others; this particular element will have its own style, it’ll be placed at any website’s place or even switched off completely so that the design inevitably changes./p pThere are also strongchanges/strong in the way designers and developers stronginteract/strong now. They understand how deeply they are interconnected and trying to keep an eye on what’s going on in scope of each other's responsibility. That led to strongcollaboration tools/strong emergence./p pSumming all the above, we’re going to observe how component based thinking changes frameworks, how the collaboration tools help designers and developers understand each other and what tools they can use to speed up the work./p h4COMPONENT BASED THINKING/h4 pimg alt=React.js src=/sites/default/files/filebrowser/users/7/Knowledge/Modern_practices/Front-end_Trands_Inner_2_ReactJs.png style=width: 720px; height: 300px; //p pstrongReact.js/strong and strongAngular/strong are two main tools at the front-end development market. It’s not obvious who’s taking this market over, though. Besides these two we have Ember.js, Vue.js, Polymer and many more./p pWhat are these frameworks are good for?/p pstrongReact.js/strong, for example, lets us write almost all code in JavaScript - templates are written in JSX (it’s a mix of JavaScript and HTML) - so as an output we have the interconnected components that have a wide variety of functions available. Components’ styles are written in a parallel with the components themselves./p pBut take into account that React only outputs HTML. So what the fuss about React.js? First of all, you know for sure how your component will render by looking at a source file. Secondly, that rather weird mix JSX makes your code cleaner. Though you cannot build an application with a React.js alone, this library helps us update View for a user./p pWith strongAngular /strongyou can create a component structure too. As it’s said in the documentation, “Angular's data binding and dependency injection eliminate much of the code you currently have to write. And it all happens within the browser, making it an ideal partner with any server technology”. Angular is perfect for Single Page applications that are getting more and more popular, so we strongly recommend using it./p pstrongEmber.js/strong is another MVC framework. It’s a very structured and beautiful one, but a drawback is that Ember has a rather small community around itself. Ember has a lighter weight than other JS libraries, but it handles a creation of websites with a heavy client-side functionality. Again, the data binding is present. What differs Ember is that route is used as model, handlebar template as view and controller manipulates the data in the model./p pFinally, we have strongVue.js/strong and strongPolymer/strong: these are the libraries for components creation./p pLet’s proceed to markup technologies we can use./p h4MARKUP TECHNOLOGIES/h4 pThere are few ways of structuring your CSS/Styles. We’d love to highlight: BEM, SMACSS, CSS Modules and Atomic Design. CSS Modules is pretty similar to BEM, but the implementation technology varies. Having this in mind, one would use CSS Modules with React.js library and Angular framework./p pWhat is strongBEM/strong?/p pstrongBEM /strongis a technology developed by a Russian IT-company Yandex. Now BEM’s fame is spreading worldwide. The BEM’s markup approach - is a component’s markup and repetitive usage of the component styles for the components with the same type. Modifications are available!/p pBEM includes blocks, elements and modifiers./p ul liBlocks can be used in the different website’s locations./li liElements are the parts of the block and don’t have any functionality out of it./li liModifiers are either the blocks or element’s features that change their outlook or behaviour./li /ul pre.block_element {...} .block_element-modifier {...}/prepWhat’s good? Modules are separated from each other and there are no unexpected cascades of selectors./p pWhat’s not that inspiring about BEM? Long namings are not that convenient to use (especially in big projects)./p pstrongSMACSS /strongstands for Scalable and Modular Architecture for CSS. This approach follows the goal of reducing an amount of code and simplifying code maintenance./p pSMACSS divides styles into 5 parts./p ol liBase rules - basic styles. These are the styles of the main website’s elements: body, input, button, ul, ol, etc. In this section we mainly use tags’ selectors and attributes’ selectors, classes are used in few cases (for instance, there are selectors stylized by JavaScript)./li liLayout rules - layout styles. Here the styles of the global elements, such as header size, footer size and sidebar size. There was a suggestion to use id in selectors since these elements appear on the web page only once. Somehow there’s a contradictory idea: not to use id selectors in styles but to use classes. It’s up to you./li liModules rules - modules styles, i.g. blocks styles that can be used on the web page several times. It’s not recommended to use id and tags selectors for modules classes./li liState rules - states styles. In this part different modules’ conditions and a site’s structure are defined. It’s the only subsection where a key word «!important» is allowed to use./li liTheme rules - design. Design styles are described in this subsection. They could be changed if needed./li /ol pstrongAtomic design/strong wraps up this block./p pimg alt=Atomic Design src=/sites/default/files/filebrowser/users/7/Knowledge/Modern_practices/Front-end_Trands_Inner_1.png style=width: 720px; height: 340px; //p pstrongAtomic Design/strong follows a component thinking: it breaks the whole website into components to use them throughout the site, in different locations. The site that adopted that philosophy is easier to introduce to a new developer, at least a codebase will be clear./p pAll website design can be divided into strong5 levels/strong: atoms, molecules, organisms, templates, pages. Atoms are basic building bricks, like buttons. Together they form the molecules that make a difference to website’s performance: for example, a set of buttons becomes a contact form./p pThe molecules, in their turn, create a particular subsection of the site: header, footer, sidebar, etc. These molecules combinations are organisms. Several organisms together form a template and that’s what you can show to a client./p pThe final stage - pages - is the templates filled with a real content./p pAtomic design process totally makes sense because system assembling is more time savvy than a typical design process: both the client and the designer see the system creation step by step and there’s no need to deconstruct the whole page if the client doesn’t like the design offered./p pWhen it comes to development, the same approach can be applied here as well. It makes code more consistent and clear. This way, you don’t have to write the same elements again and again, you just go through the atoms library and copy the code./p pLiked Atomic Design? Bear in mind that you’d better build the website applying this approach from the very beginning than adjust that website afterwards. More than that, Atomic Design suits big projects better than other approaches./p pGreat, we’ve done with slicing. The next step is moving a template from a design tool to the website./p h4DESIGNER-DEVELOPER COLLABORATION TOOLS/h4 pLadies and gentlemen, let me present two important tools for such purposes: strongZeplin/strong and strongAvocode/strong. Zeplin and Avocode are aimed at developers. Also if one has either Avocode or Zeplin, there’s no need in Photoshop and Sketch. When it comes to styles extracting, Avocode and Zeplin do it better than strongAdobe Extract/strong (that is used by Adobe Brackets for this purpose). And since the Agile approach is catching up fastly we have to think how to optimize communication within the team./p pstrongZeplin/strong is an app that collects all aspects of design elements into a sheet of specs: it simplifies a handoff between design and development. In other words, it turns a design into a code: Zeplin even takes care of generating assets of all the sizes your project needs, colours, margins and CSS suggestions for certain elements. Also Zeplin exports the assets into LESS, Sass and Stylus. Zeplin keeps all the data in a cloud storage that makes it available for contribution for all team members./p pAnd it works not only for Sketch designs, but there’s a plugin for Photoshop already. Get together and make your layout pixel-perfect!/p pBy the way, if you work in Sketch and have to convert your design asset immediately, use a Marketch plugin: it generates a HTML-page automatically so a developer can see CSS styles./p pstrongimg alt=Avocode src=/sites/default/files/filebrowser/users/7/Knowledge/Modern_practices/Front-end-trends_Inner3_Avacode.png style=width: 400px; height: 430px; float: left; /Avocode/strong is another collaboration tool. It allows to handle .psd and .sketch designs to the developer. The process is pretty simple: Avocode plugin let designer stay in Sketch or Photoshop and make the design accessible to all team members, since Avocode runs in the cloud system./p pAvocode detects all font styles, font sizes and weights and transform them into CSS. What else Avocode does is scaling up the vector shapes, converting colors to the code and measuring a distance./p pWith the help of Avocode a front-end developer may simply copy an HTML-code from the assets and generate CSS and Sass out of .psd and .sketch files./p pWeb manager and a desktop application are available./p pThe tangible drawbacks are:/p ul liAvocode doesn’t track minor design changes, only global ones, like revisions, and comments notifications./li liNo free packages./li liNot aimed at iOS and Android. Look up Sympli or Zeplin for that purpose./li /ul pWe cannot omit strongFigma/strong - a dark horse of the communication tools market. Alike previous two, Figma runs in the cloud system. It is a browser based Photoshop that lets make changes in no time. Figma has version control so developers and designers can rewind project to any stage back. Also this tool allows one to see how the design will look at mobile devices, laptops and so on. We encourage you to discover Figma features on your own with the help of the elaborated (even keyboard shortcuts are included!) guide placed at the official website./p pLast but not least - strongAdobe Extract/strong. It’s not a collaboration tool, still it does let you get the specs (colors, fonts, CSS) out of the .psd assets. This application work for the desktop and the mobile devices./p h4WHAT ELSE?/h4 pNow the design is approved, the asset is successfully turned into CSS and structured. What else could be done to optimize a workflow?/p pstrongWebpack, gulp, npm scripts/strong - these guys are to help you automate the majority of routine tasks and simplify development process. You just set them once and here you go: compile CSS, minimize, check the JavaScript and the CSS code, concatenate all files into one, keep track of files changes, update data automatically...aren’t you tired yet? There are much more functions available!/p h4CONCLUSION/h4 pWe’ve observed what component-based thinking is, what markup technologies and collaboration tools are trending. Still there is only one skill that ties all the above together./p pIt’s the willingness to work in group./p pA frontend-developer and a designer should know how their duties are interconnected and how they can collaborate efficiently./p pFront-end developers should remember that all those fancy fonts, margins and small elements like buttons do deliver a particular function. Designers ought to know each website block depicted like a static one actually will have a dynamic content and will render differently on mobile and on desktop devices. There’s no that enormous amount of information to learn: it would be enough to know about basic things at least. We recommend you to start with the article a href=http://www.adcisolutions.com/knowledge/how-befriend-design-and-frontend“How to befriend design and front-end”/a./p pFind out how your duties are interconnected with duties of your colleagues, use the trending tools and approaches we told you about - and get a development process to a new level./p

Unimity Solutions Drupal Blog: Unimity’s Journey with Drupal in 2016 - Part 2

Wed, 12/28/2016 - 15:02
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item even property=content:encodedpIn continution of our journey with Drupal at international and national level in our previous blog, we would like to highlight some initiatives and contributions at Unimity and with Chennai Drupal /p/div/div/div

Unimity Solutions Drupal Blog: Unimity’s Journey with Drupal in 2016 - Part 1

Wed, 12/28/2016 - 15:01
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item even property=content:encodedpRecollecting 2016, here’s a blog on our exciting and most amazing journey of Unimity Solutions with Drupal. Drupal Cons, Drupal Camps, Drupal Trainings, Drupal Code Sprints and much more…/p/div/div/div

Drop Guard: New security challenges arise

Wed, 12/28/2016 - 13:00
div class=view-mode-rss ds-1col clearfix div class=field field--name-display-rss-image field--type-ds field--label-hidden field__itemimg src=http://www.drop-guard.net/blog/sites/default/files/styles/medium/public/2016-12/phpmailer.png?itok=jrMa1UF2 //div div class=clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__itempTwo days ago another stronghighly critical/strong security update affected Drupal and many other CMS systems. It was the a href=https://github.com/PHPMailer/PHPMailerPHPMailer Library/a which leaves millions of websites vulnerable to the remote exploit (see a href=https://www.drupal.org/psa-2016-004https://www.drupal.org/psa-2016-004/a for details). In comparison to Drupalgeddon which had a risk of 25/25 this update has 23/25. BUT there are some things which make this update even riskier than Drupalgeddon:/p /div div class=field field--name-field-blog-post-tags field--type-entity-reference field--label-hidden field__items div class=field__itema href=http://www.drop-guard.net/blog/taxonomy/term/3 hreflang=enDrupal Planet/a/div div class=field__itema href=http://www.drop-guard.net/blog/taxonomy/term/5 hreflang=enSecurity/a/div div class=field__itema href=http://www.drop-guard.net/blog/taxonomy/term/59 hreflang=enannouncements/a/div div class=field__itema href=http://www.drop-guard.net/blog/taxonomy/term/2 hreflang=enDrupal/a/div div class=field__itema href=http://www.drop-guard.net/blog/taxonomy/term/75 hreflang=enPHP/a/div /div /div

Cheeky Monkey Media: Making Your Online Properties Fast and Efficient with AMP (and Monkey Flinging Amplification)

Tue, 12/27/2016 - 21:20
span class=field field--name-title field--type-string field--label-hiddenMaking Your Online Properties Fast and Efficient with AMP (and Monkey Flinging Amplification)/span div class=field field--name-field-image field--type-image field--label-hidden field__item img src=https://cheekymonkeymedia.ca/sites/default/files/2016-12/blog-hero-amp-cmm_0.png width=1460 height=470 alt=Making Your Online Properties Fast and Efficient with AMP (and Monkey Flinging Amplification) by Micah Joyner, Senior Interface Developer at Cheeky Monkey Media title=Making Your Online Properties Fast and Efficient with AMP (and Monkey Flinging Amplification) by Micah Joyner, Senior Interface Developer at Cheeky Monkey Media //div span class=field field--name-uid field--type-entity-reference field--label-hiddena title=View user profile. href=https://cheekymonkeymedia.ca/users/micah class=usernamemicah/a/span span class=field field--name-created field--type-created field--label-hiddenTue, 12/27/2016 - 20:20/span div class=clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__itemh2AMP (Accelerated Mobile Pages)/h2 pstrongThe official definition: /strong/p pThe a href=https://www.ampproject.org/Accelerated Mobile Pages/a (AMP) Project is an a href=https://opensource.org/open source/a initiative that embodies the vision that publishers can create mobile optimized content once and have it load instantly everywhere./p pstrongOur definition:/strong/p pA way we can make a href=https://cheekymonkeymedia.ca/our-workour websites/a sfling poo/s load and function as quickly and efficiently as possible in order to provide a much better mobile user experience./p h2Why Do We Need AMP?/h2 pMobile devices... Mobile devices just aren’t as fast desktop devices. Arguable, sure, when you’re using your mobile device to load a basic website over an ultra fast internet connection. That internet highway is not always as clear on a sunny day, though. You may not have LTE, 4G, 3G, 4 bars, 2 bars. You may have the crappiest connection known to mankind. But you still simply want that internets, cause you needs it, it’s your lifeline, your precioussss./p/div

FFW Agency: Building Platforms for Millions with NBC Sports Digital

Tue, 12/27/2016 - 21:17
span property=schema:name class=field field--name-title field--type-string field--label-hiddenBuilding Platforms for Millions with NBC Sports Digital/span span class=field field--name-uid field--type-entity-reference field--label-hiddenspan lang= about=https://ffwagency.com/user/leigh-anderson typeof=schema:Person property=schema:name datatype= xml:lang=leigh.anderson/span/span span class=field field--name-created field--type-created field--label-hiddenTue, 12/27/2016 - 20:17/span div property=schema:articleBody class=clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__itempWe had a lot of great accomplishments at FFW in 2016. It’s been a year where we’ve helped our clients shatter records and drive amazing business results. A great example of this is NBC Sports Digital, with whom we’ve collaborated with on a number of projects: we built new Drupal websites for NBCSports.com and its regional RSN networks, and we also constructed NBCOlympics.com, part of the a href=http://nbcsportsgrouppressbox.com/2016/08/22/nbcs-rio-olympics-is-the-most-successful-media-event-in-history/most successful media event in history./a/p p /p h3Building a Hub for America’s Sports Fans - NBCSports.com and Regional Sites/h3 pbr / NBC Sports Digital asked us to implement a redesign of their digital sports hubs (NBCSports.com and Sports Regional Networks websites) before the start of the NFL season. They asked us specifically to focus on videos and advertising, to increase user and sponsor satisfaction./p pOur team built each page according to NBC’s new designs, migrated the network’s data onto a scalable Drupal platform, and developed the new site to have custom layouts, themes, and functionality. We also implemented responsive design, ensuring the site looks great on any device. We were able to launch NBC Sports Digital’s new site before the NFL season kickoff with full video functionality and improved advertising, and the response has been great./p pIn addition to rebuilding NBCSports.com, we also rebuilt the websites for NBC Sports Group’s Regional Networks. NBC wanted its regional sites to have a consistent look and feel, so we set up a multisite project with all the same backend code. Our team implemented several feed customizations for each site so each different region would have unique content. The result is an ecosystem of regional sites with custom content and easy-to-maintain shared codebase—another win for NBC!/p pstrongVisit the site:br /a href=http://NBCSports.comNBCSports.com/a/strong/p p /p h3NBCOlympics.com: A Gold Medal in Site Performance/h3 pbr / In order to provide a best-in-class digital experience for NBC Olympics’ coverage of the 2016 Rio Games, NBCOlympics.com required a massive platform. When the opportunity arose for FFW to build the web platform to deliver performance, security, and stability at such a massive scale, we were excited to step up to the challenge. During the Rio Olympics, NBCOlympics.com hosted 3.3 billion total streaming minutes, 2.71 billion live streaming minutes, and was visited by 100 million unique users./p pA thorough discovery phase allowed us to plan for the implementation of the extremely complex, and massive, project. After a year and a half of work, we launched the completed site in April of 2016. We also built in a state-of-the-art advertising platform, which helped NBC Sports to manage their sponsors’ content. The new platform served up content to a record number of users, who were able to view localized listings of broadcasts and watch live streams of the events from any device. /p pWe couldn’t be more proud of our teams who worked on all three sites, and we’d like to say thanks to NBC for letting us be part of such a historic event.br /br /  /p blockquotespanNBC Olympics has set the new benchmark for how to build and operate a Drupal-based CMS in a multi-platform world./spanciteEric Black, CTO, NBC Sports Digital/cite/blockquote pbr /strongVisit the site:br /a href=http://NBCOlympics.comNBCOlympics.com/a/strong/p /div div class=field field--name-field-image field--type-image field--label-hidden field__item picture!--[if IE 9]video style=display: none;![endif]--source srcset=https://ffwagency.com/sites/default/files/styles/blog_single_desktop/public/NBC%20Blog%20Image.png?itok=80wNgyj9 1x, https://ffwagency.com/sites/default/files/styles/blog_single_desktopx/public/NBC%20Blog%20Image.png?itok=rh8pIsbg 2x media=screen and (min-width: 1601px) type=image/png/sourcesource srcset=https://ffwagency.com/sites/default/files/styles/blog_single_desktop/public/NBC%20Blog%20Image.png?itok=80wNgyj9 1x, https://ffwagency.com/sites/default/files/styles/blog_single_desktopx/public/NBC%20Blog%20Image.png?itok=rh8pIsbg 2x media=screen and (min-width: 1201px) type=image/png/sourcesource srcset=https://ffwagency.com/sites/default/files/styles/blog_single_tablet/public/NBC%20Blog%20Image.png?itok=bOe6E6j- 1x, https://ffwagency.com/sites/default/files/styles/blog_single_tabletx2/public/NBC%20Blog%20Image.png?itok=pzkGcIFF 2x media=screen and (min-width: 769px) type=image/png/sourcesource srcset=https://ffwagency.com/sites/default/files/styles/blog_single_mobile/public/NBC%20Blog%20Image.png?itok=aUvd4719 1x, https://ffwagency.com/sites/default/files/styles/blog_single_mobile2x/public/NBC%20Blog%20Image.png?itok=5DfUw0S5 2x media=(min-width: 0px) type=image/png/source!--[if IE 9]/video![endif]--img property=schema:image srcset=https://ffwagency.com/sites/default/files/styles/blog_single_desktop/public/NBC%20Blog%20Image.png?itok=80wNgyj9 alt=Colorful geometric image with figures competing in Olympics sports typeof=foaf:Image //picture/div section property=schema:commenth2Comments/h2 drupal-render-placeholder callback=comment.lazy_builders:renderForm arguments=0=node1=48312=field_comment3=ffw_comments token=977f9bcd/drupal-render-placeholder/section

Agiledrop.com Blog: AGILEDROP: On which Drupal Camp to go?

Tue, 12/27/2016 - 09:04
a href=http://www.agiledrop.com/blog/which-drupal-camp-goimg src=https://www.agiledrop.com/sites/default/files/2016-12/map-1862587_1920.jpg //a As mentioned in our interview with Janez Urevc there are too many Drupal events, which are internationally oriented. DrupalCons grow each year and so does Drupal Camps. It's hard for organizers to attract visitors, because Drupalistas can't travel every weekend. Knowledge of where to expand your Drupal skills is, therefore, a key thing. In the past few weeks, we have written many blog posts about Drupal Camps for you. Now, we give you an overview of the findings in our Drupal Camp world tour, so that your decisions which Drupal Camps to visit will be easier. After reading about and… a href=http://www.agiledrop.com/blog/which-drupal-camp-goREAD MORE/a

myDropWizard.com: Drupal 6 workaround for the highly critical vulnerability in PHPMailer

Tue, 12/27/2016 - 00:45
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item evenpYou may have noticed that a href=https://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10033-Vuln.htmlCVE-2016-10033/a came out yesterday, which discloses an Remote Code Execution (RCE) vulnerability in the PHPMailer library which is used by popular contrib modules like a href=http://drupal.org/project/smtpSMTP/a or a href=https://www.drupal.org/project/phpmailerPHPMailer/a./ppemstrongThis is a highly critical vulnerability because Remote Code Execution means an attacker can run arbitrary code on your server!/strong/em/ppThe Drupal Security team just made a PSA today: a href=https://www.drupal.org/psa-2016-004DRUPAL-PSA-2016-004/a/ppThe real, full fix is to update the PHPMailer library to version 5.2.19 or later, or if you use the SMTP module version 7.x-1.5 or lower, to update to SMTP 7.x-1.6 (because SMTP 7.x-1.x embeds the library in the module)./ppHowever, if you're using Drupal 6, you probably have an old version of PHPMailer (5.1 or lower), and newer versions may not be compatible with the code on your site (either custom or contrib). Attempting an update in the middle of the holidays when not everyone is available to test or deal with follow-up issues might not be the best idea./ppstrongSo, what we're recommending (and what we've already done for our customers) is removing the vulnerable feature from the PHPMailer library./strong/ppThe vulnerability is in PHPMailer support for sending mail via the 'sendmail' command-line application. However, odds are you using PHPMailer exclusively for sending via SMTP (like the SMTP and PHPMailer modules do). So, you can just delete the code for that feature!/ppHere's how... Open the class.phpmailer.php file, and delete:/p/div/div/div

Four Kitchens: Sharp Ideas: s2e3: BADCamp, Open Source, and Human Diversity

Fri, 12/23/2016 - 18:46
div class=field-lead-image img typeof=foaf:Image src=https://www.fourkitchens.com/blog/sites/default/files/blog/lead-images/SharpIdeasBanner_1.png width=800 height=300 alt=Sharp Ideas: the Podcast from Four Kitchens / /div div class=field-body pBroadcasting directly to you from wherever the web meets business and design, we#8217;re talking “BADCamp, Open Source, and Human Diversity” on this episode of emSharp Ideas/em, the podcast from Four Kitchens. a href=https://www.fourkitchens.com/blog/article/sharp-ideas-s2e3-badcamp-open-source-and-human-diversity[…]/a/p /div

Dries Buytaert: TAG Heuer using Drupal

Fri, 12/23/2016 - 14:51
pGrowing up my dad had a watch from a href=https://www.tagheuer.comTAG Heuer/a. As a young child, I always admired his watch and wished that one day I'd have one as well. I still don't have a TAG Heuer watch, however I just found out that a href=https://www.tagheuer.comTAG Heuer/a relaunched its website using Drupal 8 and that is pretty cool too./p pTAG Heuer's new website integrates Drupal 8 with their existing Magento commerce platform to provide a better, more content-rich shopping experience. It is a nice example of the a href=http://buytaert.net/content-and-commerce-a-big-opportunity-for-drupalContent for Commerce-opportunity/a that I wrote about a month ago. Check it out at a href=https://www.tagheuer.comhttps://www.tagheuer.com/a!/p figure class=figurediv class=img style=border: 1px solid #ccc; display: inline-block img src=http://buytaert.net/files/cache/drupal/tag-heuer-using-drupal-742x1114.jpg style=display:block alt= //div /figure

J-P Stacey: Drupal Global Sprint weekend hits Sheffield on Jan 28/29

Fri, 12/23/2016 - 13:48
pLast year I attended the a href=http://www.jpstacey.info/blog/2016-01-29/ill-be-leeds-drupal-global-sprint-weekend-saturdayDrupal Global Sprint's local event in Leeds/a, and this year Drupal Yorkshire comes to Sheffield! Everyone of any level of experience will be welcome at a href=https://groups.drupal.org/node/515739the Sheffield event, on the weekend of Jan 28/29/a, to come along and help out with the wider, open-source Drupal project./p pa href=http://www.jpstacey.info/blog/2016-12-23/drupal-global-sprint-weekend-hits-sheffield-jan-2829Read more of Drupal Global Sprint weekend hits Sheffield on Jan 28/29/a/p

Platform.sh: Production is an artifact of development

Fri, 12/23/2016 - 12:00
pIn my former life I was a Drupal consultant and architect with Palantir.net. One of my former colleagues there, Michelle Krejci, had a saying she liked to repeat: “a href=http://craychee.io/blog/2015/10/04/production-is-an-artifact/Production is an artifact of development/a.” She even presented on the topic a few times at conferences. What she was saying made sense, but I didn’t fully grok it at the time./p pNow I do./p

Agiledrop.com Blog: AGILEDROP: Drupal in Christmas Motives

Fri, 12/23/2016 - 07:58
a href=http://www.agiledrop.com/blog/drupal-christmas-motivesimg src=https://www.agiledrop.com/sites/default/files/2016-12/candles-1925292_1920.jpg //a Christmas is the most wonderful time of the year says Andy Williams in one of his songs. That's true if you ask me. The whole family gathers, eats, talks and in general enjoys spending time together, which was maybe not a common practice during the year. Families are accompanied with presents, Christmas trees, ornaments and other Christmas motives. We explored, how Drupal can conjure you the Christmas spirit. Christmas Ornaments First and the easiest way to lift up the Christmas spirit is with Drupal Icon, which is ideal for Christmas time. With it you can do a lot of things. You can, for… a href=http://www.agiledrop.com/blog/drupal-christmas-motivesREAD MORE/a

Freelock : Drupal 8 Configuration Management in the real world - workflow and gotchas

Fri, 12/23/2016 - 02:22
div class=g-plusone-wrapper style=margin: 0 1em 1em 1em;float:right g:plusone href=https://www.freelock.com/blog/john-locke/2016-12/drupal-8-configuration-management-real-world-workflow-and-gotchas size=medium annotation=bubble width=250 /g:plusone/divdiv class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item evenpPanacea, or disaster? Drupal 8 Configuration Management was supposed to solve all our woes when it came to dealing with deploying configuration. In many ways it's a vast improvement, but in some ways it has almost made matters worse./p pConfiguration Management has made it possible to store all Drupal configuration in code. This is a huge win, of course. But there are several gotchas that make it challenging to work with:/p/div/div/divdiv class=field field-name-taxonomy-vocabulary-5 field-type-taxonomy-term-reference field-label-hiddendiv class=field-itemsdiv class=field-item evena href=/tag/drupal-8Drupal 8/a/divdiv class=field-item odda href=/tag/drupal-planetDrupal Planet/a/divdiv class=field-item evena href=/tag/configuration-managementConfiguration Management/a/divdiv class=field-item odda href=/tag/gitgit/a/divdiv class=field-item evena href=/tag/watneyWatney/a/divdiv class=field-item odda href=/tag/matrixMatrix/a/divdiv class=field-item evena href=/tag/continuous-integrationContinuous Integration/a/div/div/div

Freelock : Drupal 8 Configuration Management in the real world - workflow and gotchas

Fri, 12/23/2016 - 02:22
div class=g-plusone-wrapper style=margin: 0 1em 1em 1em;float:right g:plusone href=http://www.freelock.com/blog/john-locke/2016-12/drupal-8-configuration-management-real-world-workflow-and-gotchas size=medium annotation=bubble width=250 /g:plusone/divdiv class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item evenpPanacea, or disaster? Drupal 8 Configuration Management was supposed to solve all our woes when it came to dealing with deploying configuration. In many ways it's a vast improvement, but in some ways it has almost made matters worse./p pConfiguration Management has made it possible to store all Drupal configuration in code. This is a huge win, of course. But there are several gotchas that make it challenging to work with:/p/div/div/divdiv class=field field-name-taxonomy-vocabulary-5 field-type-taxonomy-term-reference field-label-hiddendiv class=field-itemsdiv class=field-item evena href=/tag/drupal-8Drupal 8/a/divdiv class=field-item odda href=/tag/drupal-planetDrupal Planet/a/divdiv class=field-item evena href=/tag/configuration-managementConfiguration Management/a/divdiv class=field-item odda href=/tag/gitgit/a/divdiv class=field-item evena href=/tag/watneyWatney/a/divdiv class=field-item odda href=/tag/matrixMatrix/a/divdiv class=field-item evena href=/tag/continuous-integrationContinuous Integration/a/div/div/div

Lullabot: Making Drupal 8 API First with RESTful Web Services

Thu, 12/22/2016 - 21:00
Matt and Mike sit down with the developers who are leading the REST initiatives in Drupal 8, and discuss the current landscape, and what's on the horizon. We discuss JSON API, GraphQL, changes to Drupal core, and more.