Planet Drupal

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

Drupal Easy: DrupalEasy Podcast 153: DrupalCon Los Angeles - Day 2 Recap

Fri, 05/15/2015 - 14:45
div class=field field-type-link field-field-embed a href=http://podcasts.drupaleasy.com/DrupalEasy_ep153_20150514.mp3 rel=enclosureDownload Podcast 153/a /div pRyan Mike and Ted are joined by a href=http://twitter.com/skwashdDave Hall/a, a href=https://twitter.com/amitaibuAmitai Burstein/a, a href=https://twitter.com/damienmckennaDamien McKenna/a, a href=https://twitter.com/socketwenchTess Flynn/a, a href=https://twitter.com/brightboldKelley Curry/a, a href=https://twitter.com/modsunraveledBrian Lewis/a in this a href=https://www.youtube.com/watch?v=0o4EgSXd0DEmusical/a and magical Day 2 of DrupalCon in Los Angeles./p pa href=http://drupaleasy.com/podcast/2015/05/drupaleasy-podcast-153-drupalcon-los-angeles-day-2-recap target=_blankread more/a/pdiv class=feedflare a href=http://feeds.feedburner.com/~ff/DrupalEasy?a=VndT845p63g:upz74Xb0rxg:yIl2AUoC8zAimg src=http://feeds.feedburner.com/~ff/DrupalEasy?d=yIl2AUoC8zA border=0/img/a a href=http://feeds.feedburner.com/~ff/DrupalEasy?a=VndT845p63g:upz74Xb0rxg:qj6IDK7rITsimg src=http://feeds.feedburner.com/~ff/DrupalEasy?d=qj6IDK7rITs border=0/img/a /divimg src=http://feeds.feedburner.com/~r/DrupalEasy/~4/VndT845p63g height=1 width=1 alt=/

InternetDevels: Tips for Design when using Drupal

Fri, 05/15/2015 - 11:33
div class=field field--name-field-preview-image field--type-image field--label-hiddendiv class=field__itemsdiv class=field__item evenimg src=http://st1.internetdevels.net/sites/default/files/public/blog_preview/design_blog_main.jpg width=937 height=624 alt=Tips for Design when using Drupal //div/div/divdiv class=field field--name-body field--type-text-with-summary field--label-hiddendiv class=field__itemsdiv class=field__item evenpemMeet the new blog post with /emememtips about a target=_blank href=http://internetdevels.com/services/ux-designDrupal web design/a/em from our guest blogger Lalit Sharma, SEO consultant who runs a SEO agency. /em/pp/ppDrupal is a popular open-source platform loved by many designers. However, there are a few golden rules to follow when designing anything for Drupal sites in order to ensure developers have an easier time coding, maintain production speeds and the client’s pocket remains relatively bulky. A few are as provided below:/p a href=http://internetdevels.com/blog/tips-for-design-when-using-drupalRead more/a/div/div/div

Metal Toad: Amazon CloudFront with Drupal 8

Fri, 05/15/2015 - 02:04
span class=field field-node--title field-name-title field-type-string field-label-hidden data-quickedit-field-id=node/1000/title/en/rssAmazon CloudFront with Drupal 8/span span class=field field-node--created field-name-created field-type-created field-label-hidden data-quickedit-field-id=node/1000/created/en/rssMay 14th, 2015/span span class=field field-node--uid field-name-uid field-type-entity-reference field-label-hidden data-quickedit-field-id=node/1000/uid/en/rss a title=View user profile. href=/people/dylan-tack lang= about=/people/dylan-tack typeof=schema:Person property=schema:name datatype=Dylan Tack/a/span div class=field field-node--body field-name-body field-type-text-with-summary field-label-hidden data-quickedit-field-id=node/1000/body/en/rss div class=field-items div class=field-itempSince I wrote my a href=/blog/amazon-cloudfront-drupalfirst review of CloudFront/a in 2012, Amazon has added support for three essential features:/p ullia href=http://aws.amazon.com/about-aws/whats-new/2013/10/15/amazon-cloudfront-now-supports-put-post-and-other-http-methods/Dynamic content with POST, PUT and other HTTP methods/a /lilia href=http://aws.amazon.com/about-aws/whats-new/2014/03/05/amazon-cloudront-announces-sni-custom-ssl/Custom SSL certifications with Server Name Indication (SNI)/a br / This is important because with SNI, there's no need for a dedicated IPs (and the associated $600 per month fee) /lilia href=http://aws.amazon.com/about-aws/whats-new/2014/10/07/amazon-cloudront-announces-wildcard-cookies-options-caching/Wildcard cookies/a /li/ulpWhat this means is that CloudFront is no longer just for static content; it's fully capable of delivering content from a dynamic CMS like Drupal. Here are the configs, step-by-step:/p h3Configure your distribution and origin/h3 pThis is fairly straightforward. I reccomend using a CNAME for your origin (which could be a single instance, or an elastic load balancer). Ideally, your origin URL should not be accessible from the open internet for serveral reasons:/p ulliPrevent the origin URL from getting crawled by search engines /liliPevent DDoS attacks from being able to bypass the CDN /liliPrevent spoofing of the span class=geshifiltercode class=text geshifilter-textX-Forwarded-For/code/span header /li/ulpimg src=/sites/default/files/cf_general_settings.png //p pimg src=/sites/default/files/cf_origin.png //p h3Configure a default behavior/h3 pNoteworthy settings are:/p ulliuse origin cache headers - This means CloudFront will honor the page lifetime set on span class=geshifiltercode class=text geshifilter-text/admin/config/development/performance/code/span within Drupal. /liliWhitelist Host and CloudFront-Forwarded-Proto. This allows virtual hosts, and any SSL redirect logic on the origin to function correctly. /liliWhitelist your site's session cookie. /li/ulpimg src=/sites/default/files/cf_default.png //p h3Drupal 8 workarounds/h3 pOne of the remaining Drupal 8 critical issues interferes with CloudFront:br /a href=https://www.drupal.org/node/2364011[meta] External caches mix up response formats on URLs where content negotiation is in use/abr / As a result, some additional behaviors are needed to work around this. These settings instruct CloudFront to forward emall/em client headers for specific paths:/p pimg src=/sites/default/files/cf_behaviors.png //p pimg src=/sites/default/files/cf_ajax_behavior.png //p h3Domain-sharding/h3 pIf you plan to use a single domain for your entire site, you're done! On this site, we decided to keep the a href=https://www.stevesouders.com/blog/2013/09/05/domain-sharding-revisited/domain-sharding/a approach described in my previous post, so we need a little D8 code./p h4span class=geshifiltercode class=text geshifilter-textmt_custom.info.yml/code/span/h4 div class=geshifilter div class=text geshifilter-text style=font-family:monospace; pre style=font-family: monospace; font-weight: normal; font-style: normalname: Metal Toad Custom description: Stuff that doesn't fit anywhere else. package: Custom type: module core: 8.x dependencies:/pre/div /div h4span class=geshifiltercode class=text geshifilter-textmt_custom.services.yml/code/span/h4 div class=geshifilter div class=text geshifilter-text style=font-family:monospace; pre style=font-family: monospace; font-weight: normal; font-style: normalservices: mt_custom_event_subscriber: class: Drupal\mt_custom\EventSubscriber\MTCustomSubscriber arguments: ['@current_user'] tags: - {name: event_subscriber}/pre/div /div h4span class=geshifiltercode class=text geshifilter-textmt_custom.module/code/span/h4 div class=geshifilter div class=php geshifilter-php style=font-family:monospace; pre style=font-family: monospace; font-weight: normal; font-style: normalspan style=color: #000000; font-weight: bold;use/span Drupal\Component\Utility\UrlHelperspan style=color: #339933;;/span   span style=color: #009933; font-style: italic;/** * Implements hook_file_url_alter(). *//span span style=color: #000000; font-weight: bold;function/span mt_custom_file_url_alterspan style=color: #009900;(/spanspan style=color: #339933;amp;/spanspan style=color: #000088;$uri/spanspan style=color: #009900;)/span span style=color: #009900;{/span   span style=color: #666666; font-style: italic;// Route static files to Amazon CloudFront, for anonymous users only./span span style=color: #b1b100;if/span span style=color: #009900;(/span\Drupalspan style=color: #339933;::/spanspan style=color: #004000;request/spanspan style=color: #009900;(/spanspan style=color: #009900;)/spanspan style=color: #339933;-gt;/spanspan style=color: #004000;server/spanspan style=color: #339933;-gt;/spanspan style=color: #004000;get/spanspan style=color: #009900;(/spanspan style=color: #0000ff;'HTTP_HOST'/spanspan style=color: #009900;)/span span style=color: #339933;==/span span style=color: #0000ff;'www.metaltoad.com'/span span style=color: #339933;amp;amp;/span \Drupalspan style=color: #339933;::/spanspan style=color: #004000;currentUser/spanspan style=color: #009900;(/spanspan style=color: #009900;)/spanspan style=color: #339933;-gt;/spanspan style=color: #004000;isAnonymous/spanspan style=color: #009900;(/spanspan style=color: #009900;)/span span style=color: #339933;amp;amp;/span span style=color: #339933;!/span\Drupalspan style=color: #339933;::/spanspan style=color: #004000;request/spanspan style=color: #009900;(/spanspan style=color: #009900;)/spanspan style=color: #339933;-gt;/spanspan style=color: #004000;isSecure/spanspan style=color: #009900;(/spanspan style=color: #009900;)/spanspan style=color: #009900;)/span span style=color: #009900;{/span   span style=color: #666666; font-style: italic;// Multiple hostnames to parallelize downloads./span span style=color: #000088;$shard/span span style=color: #339933;=/span a href=http://www.php.net/crc32span style=color: #990000;crc32/span/aspan style=color: #009900;(/spanspan style=color: #000088;$uri/spanspan style=color: #009900;)/span span style=color: #339933;%/span span style=color: #cc66cc;4/span span style=color: #339933;+/span span style=color: #cc66cc;1/spanspan style=color: #339933;;/span span style=color: #000088;$cdn/span span style=color: #339933;=/span span style=color: #0000ff;http://staticspan style=color: #006699; font-weight: bold;$shard/span.metaltoad.com/spanspan style=color: #339933;;/span   span style=color: #000088;$scheme/span span style=color: #339933;=/span file_uri_schemespan style=color: #009900;(/spanspan style=color: #000088;$uri/spanspan style=color: #009900;)/spanspan style=color: #339933;;/span span style=color: #b1b100;if/span span style=color: #009900;(/spanspan style=color: #000088;$scheme/span span style=color: #339933;==/span span style=color: #0000ff;'public'/spanspan style=color: #009900;)/span span style=color: #009900;{/span span style=color: #000088;$wrapper/span span style=color: #339933;=/span file_stream_wrapper_get_instance_by_schemespan style=color: #009900;(/spanspan style=color: #0000ff;'public'/spanspan style=color: #009900;)/spanspan style=color: #339933;;/span span style=color: #000088;$path/span span style=color: #339933;=/span span style=color: #000088;$wrapper/spanspan style=color: #339933;-gt;/spanspan style=color: #004000;getDirectoryPath/spanspan style=color: #009900;(/spanspan style=color: #009900;)/span span style=color: #339933;./span span style=color: #0000ff;'/'/span span style=color: #339933;./span file_uri_targetspan style=color: #009900;(/spanspan style=color: #000088;$uri/spanspan style=color: #009900;)/spanspan style=color: #339933;;/span span style=color: #000088;$uri/span span style=color: #339933;=/span span style=color: #0000ff;span style=color: #006699; font-weight: bold;$cdn/span//span span style=color: #339933;./span UrlHelperspan style=color: #339933;::/spanspan style=color: #004000;encodePath/spanspan style=color: #009900;(/spanspan style=color: #000088;$path/spanspan style=color: #009900;)/spanspan style=color: #339933;;/span span style=color: #009900;}/span span style=color: #b1b100;else/span span style=color: #b1b100;if/span span style=color: #009900;(/spanspan style=color: #339933;!/spanspan style=color: #000088;$scheme/span span style=color: #339933;amp;amp;/span a href=http://www.php.net/strposspan style=color: #990000;strpos/span/aspan style=color: #009900;(/spanspan style=color: #000088;$uri/spanspan style=color: #339933;,/span span style=color: #0000ff;'//'/spanspan style=color: #009900;)/span span style=color: #339933;!==/span span style=color: #cc66cc;0/spanspan style=color: #009900;)/span span style=color: #009900;{/span span style=color: #000088;$uri/span span style=color: #339933;=/span span style=color: #0000ff;span style=color: #006699; font-weight: bold;$cdn/span//span span style=color: #339933;./span UrlHelperspan style=color: #339933;::/spanspan style=color: #004000;encodePath/spanspan style=color: #009900;(/spanspan style=color: #000088;$uri/spanspan style=color: #009900;)/spanspan style=color: #339933;;/span span style=color: #009900;}/span span style=color: #009900;}/span span style=color: #009900;}/span   span style=color: #009933; font-style: italic;/** * Implements hook_css_alter(). *//span span style=color: #000000; font-weight: bold;function/span mt_custom_css_alterspan style=color: #009900;(/spanspan style=color: #339933;amp;/spanspan style=color: #000088;$css/spanspan style=color: #009900;)/span span style=color: #009900;{/span span style=color: #666666; font-style: italic;// Mangle the paths slightly so that Drupal\Core\Asset\AssetDumper will generate/span span style=color: #666666; font-style: italic;// different keys on HTTPS. Necessary because CDN URL varies by protocol./span span style=color: #b1b100;if/span span style=color: #009900;(/span\Drupalspan style=color: #339933;::/spanspan style=color: #004000;request/spanspan style=color: #009900;(/spanspan style=color: #009900;)/spanspan style=color: #339933;-gt;/spanspan style=color: #004000;isSecure/spanspan style=color: #009900;(/spanspan style=color: #009900;)/spanspan style=color: #009900;)/span span style=color: #009900;{/span span style=color: #b1b100;foreach/span span style=color: #009900;(/spanspan style=color: #000088;$css/span span style=color: #b1b100;as/span span style=color: #000088;$key/span span style=color: #339933;=gt;/span span style=color: #000088;$file/spanspan style=color: #009900;)/span span style=color: #009900;{/span span style=color: #b1b100;if/span span style=color: #009900;(/spanspan style=color: #000088;$file/spanspan style=color: #009900;[/spanspan style=color: #0000ff;'type'/spanspan style=color: #009900;]/span span style=color: #339933;===/span span style=color: #0000ff;'file'/spanspan style=color: #009900;)/span span style=color: #009900;{/span span style=color: #000088;$css/spanspan style=color: #009900;[/spanspan style=color: #000088;$key/spanspan style=color: #009900;]/spanspan style=color: #009900;[/spanspan style=color: #0000ff;'data'/spanspan style=color: #009900;]/span span style=color: #339933;=/span span style=color: #0000ff;'./'/span span style=color: #339933;./span span style=color: #000088;$css/spanspan style=color: #009900;[/spanspan style=color: #000088;$key/spanspan style=color: #009900;]/spanspan style=color: #009900;[/spanspan style=color: #0000ff;'data'/spanspan style=color: #009900;]/spanspan style=color: #339933;;/span span style=color: #009900;}/span span style=color: #009900;}/span span style=color: #009900;}/span span style=color: #009900;}/span/pre/div /div h4span class=geshifiltercode class=text geshifilter-textsrc/EventSubscriber/MTCustomSubscriber.php/code/span/h4 div class=geshifilter div class=php geshifilter-php style=font-family:monospace; pre style=font-family: monospace; font-weight: normal; font-style: normalspan style=color: #000000; font-weight: bold;namespace/span Drupal\mt_custom\EventSubscriberspan style=color: #339933;;/span   span style=color: #000000; font-weight: bold;use/span Symfony\Component\HttpFoundation\RedirectResponsespan style=color: #339933;;/span span style=color: #000000; font-weight: bold;use/span Symfony\Component\HttpKernel\Event\FilterResponseEventspan style=color: #339933;;/span span style=color: #000000; font-weight: bold;use/span Symfony\Component\HttpKernel\KernelEventsspan style=color: #339933;;/span span style=color: #000000; font-weight: bold;use/span Symfony\Component\HttpKernel\Event\GetResponseEventspan style=color: #339933;;/span span style=color: #000000; font-weight: bold;use/span Symfony\Component\EventDispatcher\EventSubscriberInterfacespan style=color: #339933;;/span span style=color: #000000; font-weight: bold;use/span Drupal\Core\Session\AccountInterfacespan style=color: #339933;;/span   span style=color: #000000; font-weight: bold;class/span MTCustomSubscriber span style=color: #000000; font-weight: bold;implements/span EventSubscriberInterface span style=color: #009900;{/span   span style=color: #000000; font-weight: bold;protected/span span style=color: #000088;$account/spanspan style=color: #339933;;/span   span style=color: #000000; font-weight: bold;public/span span style=color: #000000; font-weight: bold;function/span checkForCloudFrontspan style=color: #009900;(/spanGetResponseEvent span style=color: #000088;$event/spanspan style=color: #009900;)/span span style=color: #009900;{/span span style=color: #000088;$req/span span style=color: #339933;=/span span style=color: #000088;$event/spanspan style=color: #339933;-gt;/spanspan style=color: #004000;getRequest/spanspan style=color: #009900;(/spanspan style=color: #009900;)/spanspan style=color: #339933;;/span   span style=color: #666666; font-style: italic;/* * Make sure Amazon CloudFront doesn't serve dynamic content * from static*.metaltoad.com *//span span style=color: #b1b100;if/span span style=color: #009900;(/spana href=http://www.php.net/strstrspan style=color: #990000;strstr/span/aspan style=color: #009900;(/spanspan style=color: #000088;$req/spanspan style=color: #339933;-gt;/spanspan style=color: #004000;server/spanspan style=color: #339933;-gt;/spanspan style=color: #004000;get/spanspan style=color: #009900;(/spanspan style=color: #0000ff;'HTTP_HOST'/spanspan style=color: #009900;)/spanspan style=color: #339933;,/span span style=color: #0000ff;'static'/spanspan style=color: #009900;)/spanspan style=color: #009900;)/span span style=color: #009900;{/span span style=color: #b1b100;if/span span style=color: #009900;(/spanspan style=color: #339933;!/spana href=http://www.php.net/strstrspan style=color: #990000;strstr/span/aspan style=color: #009900;(/spanspan style=color: #000088;$req/spanspan style=color: #339933;-gt;/spanspan style=color: #004000;getPathInfo/spanspan style=color: #009900;(/spanspan style=color: #009900;)/spanspan style=color: #339933;,/span span style=color: #0000ff;'files/styles'/spanspan style=color: #009900;)/spanspan style=color: #009900;)/span span style=color: #009900;{/span a href=http://www.php.net/headerspan style=color: #990000;header/span/aspan style=color: #009900;(/spanspan style=color: #0000ff;HTTP/1.0 404 Not Found/spanspan style=color: #009900;)/spanspan style=color: #339933;;/span span style=color: #b1b100;print/span span style=color: #0000ff;'404 Not Found'/spanspan style=color: #339933;;/span a href=http://www.php.net/exitspan style=color: #990000;exit/span/aspan style=color: #009900;(/spanspan style=color: #009900;)/spanspan style=color: #339933;;/span span style=color: #009900;}/span span style=color: #009900;}/span span style=color: #009900;}/span   span style=color: #009933; font-style: italic;/** * {@inheritdoc} *//span static span style=color: #000000; font-weight: bold;function/span getSubscribedEventsspan style=color: #009900;(/spanspan style=color: #009900;)/span span style=color: #009900;{/span span style=color: #000088;$events/spanspan style=color: #009900;[/spanKernelEventsspan style=color: #339933;::/spanspan style=color: #004000;REQUEST/spanspan style=color: #009900;]/spanspan style=color: #009900;[/spanspan style=color: #009900;]/span span style=color: #339933;=/span a href=http://www.php.net/arrayspan style=color: #990000;array/span/aspan style=color: #009900;(/spanspan style=color: #0000ff;'checkForCloudFront'/spanspan style=color: #009900;)/spanspan style=color: #339933;;/span span style=color: #b1b100;return/span span style=color: #000088;$events/spanspan style=color: #339933;;/span span style=color: #009900;}/span   span style=color: #000000; font-weight: bold;public/span span style=color: #000000; font-weight: bold;function/span __constructspan style=color: #009900;(/spanAccountInterface span style=color: #000088;$account/spanspan style=color: #009900;)/span span style=color: #009900;{/span span style=color: #000088;$this/spanspan style=color: #339933;-gt;/spanspan style=color: #004000;account/span span style=color: #339933;=/span span style=color: #000088;$account/spanspan style=color: #339933;;/span span style=color: #009900;}/span   span style=color: #009900;}/span/pre/div /div /div /div /div

Capgemini Engineering: Drupal integration patterns

Fri, 05/15/2015 - 01:00
pAs Drupal has evolved, it has become more than a href=http://www.palantir.net/blog/drupal-not-cmsjust a CMS/a. It is now a fully fledged Web Development Platform, enabling not just sophisticated content management and digital marketing capabilities but also any number of use cases involving data modelling and integration with an endless variety of applications and services. In fact, if you need to build something which responds to an HTTP request, then you can pretty much find a way to do it in Drupal./p blockquote p“Just because you can, doesn’t mean you should.”/p /blockquote pHowever, the old adage is true. Just because you can use use a sledgehammer to crack a nut, that doesn’t mean you’re going to get the optimal nut-consumption-experience at the end of it./p pDrupal’s flexibility can lead to a number of different integration approaches, all of which will “work”, but some will give better experiences than others./p pOn the well trodden development path of Drupal 8, giant steps have been taken in making the best of what is outside of the Drupal community and “getting off the island”, and exciting things are happening in making Drupal less of a sledgehammer, and more of a finely tuned nutcracker capable of cracking a variety of different nuts with ease./p pIn this post, I want to explore ways in which Drupal can create complex systems, and some general patterns for doing so. You’ll see a general progression in line with that of the Drupal community in general. We’ll go from doing everything in Drupal, to making the most of external services. No option is more “right” than others, but considering all the options can help make sure you pick the approach that is right for you and your use case./p h2 id=build-it-in-drupalBuild it in Drupal/h2 pOne option, and probably the first that occurs to many developers, is to implement business logic, data structures and administration of a new applications or services using Drupal and its APIs. After all, a href=https://www.drupal.org/project/entityEntity API/a and the schema system give us the ability to model custom objects and store them in the Drupal database; a href=https://www.drupal.org/project/viewsViews/a gives us the means to retrieve that data and display it in a myriad of ways. Modules like a href=https://www.drupal.org/project/rulesRules/a; a href=https://www.drupal.org/project/featuresFeatures/a and a href=https://www.drupal.org/project/ctoolsCTools/a provide extensive options for implementing specific business rules to model your domain specific data and application needs./p pThis is all well and good, and uses the strengths of Drupal core and the wide range of community a href=https://www.drupal.org/project/project_modulecontributed modules/a to enable the construction of complex sites with limited amounts of coding required, and little need to look outside Drupal. The downside can come when you need to scale the solution. Depending on how the functionality has been implemented you could run into performance problems caused by large numbers of modules, sub-optimal queries, or simply the amount of traffic heading to your database - which despite caching strategies, tuning and clustering is always likely to end up being the performance bottleneck of your Drupal site./p pIt also means your implementation is tightly coupled to Drupal - and worse, most probably the specific version of Drupal you’ve implemented. With Drupal 8 imminent this means you’re most likely increasing the amount of re-work required when you come to upgrade or migrate between versions./p h2 id=its-all-phpIt’s all PHP/h2 pDrupal sites can benefit hugely from being part of the larger PHP ecosystem. With a href=http://www.drush.org/en/master/make/Drush make/a, the a href=https://www.drupal.org/project/librariesLibraries API/a, a href=https://www.drupal.org/project/composer_managerComposer Manager/a, and others providing the means of pulling external, non-Drupal PHP libraries into a Drupal site, there are huge opportunities for building complexity in your Drupal solution without tying yourself to specific Drupal versions, or even to Drupal at all. This could become particularly valuable as we enter the transition period between Drupal 7 and 8./p pIn this scenario, custom business logic can be provided in a framework agnostic PHP library and a a href=http://capgemini.github.io/open%20source/symfony-liveNaked Module/a approach can be used to provide the glue between that library and Drupal - utilising a href=https://getcomposer.orgComposer/a to download and install dependencies./p pThis approach is becoming more and more widespread in the Drupal community with Commerce Guys (among others) taking a a href=https://drupalcommerce.org/blog/16864/commerce-2x-stories-addressinglibraries first approach/a to many components of Commerce 2.x which will have generic application outside of Drupal Commerce./p pThe major advantage of building framework agnostic libraries is that if you ever come to re-implement something in another framework, or a new version of Drupal, the effort of migrating should be much lower./p h2 id=integrateIntegrate/h2 pBuilding on the previous two patterns, one of Drupal’s great strengths is how easy it is to integrate with other platforms and technologies. This gives us great opportunity to implement functionality in the most appropriate technology and then simply connect to it via web services or other means./p pThis can be particularly useful when integrating with “internal” services - services that you don’t intend to expose to the general public (but may still be external in the sense of being SaaS platforms or other partners in a multi-supplier ecosystem). It is also a useful way to start using Drupal as a new part of your ecosystem, consuming existing services and presenting them through Drupal to minimise the amount of architectural change taking place at one time./p pBuilding a solution in this componentised and integrated manner gives several advantages:/p ul liSeparation of concerns - the development, deployment and management of the service can be run by a completely separate team working in a different a href=http://martinfowler.com/bliki/BoundedContext.htmlbounded context/a. It also ensures logic is nicely encapsulated and can be changed without requiring multiple front-end changes./li liHorizontal scalability - implementing services in alternate technologies lets us pick the most appropriate for scalability and resilience./li liReduce complex computation taking place in the web tier and let Drupal focus on delivering top quality web experience to users. For example, rather than having Drupal publish and transform data to an external platform, push the raw data into a queue which can be consumed by “non-Drupal” processes to do the transform and send./li liEnable re-use of business logic outside of the web tier, on other platforms or with alternative front ends./li /ul h2 id=nearly-headless-drupalNearly-Headless Drupal/h2 pa href=https://github.com/davidhwang/horsemanHeadless Drupal/a is a phrase that has gained a lot of momentum in the Drupal community - the basic concept being that Drupal purely responds with RESTful endpoints, and completely independant front-end code using frameworks such as Angular.js is used to render the data and completely separate content from presentation./p pPersonally, I prefer to think of a “nearly headless” approach - where Drupal is still responsible for the initial instantiation of the page, and a framework like Angular is used to control the dynamic portion of the page. This lets Drupal manage the things it’s good at, like menus, page layout and content management, whilst the “app” part is dropped into the page as another re-usable component and only takes over a part of the page./p pFor an example use case, you may have business requirements to provide data from a service which is also provided as an API for consumption by external parties or mobile apps. Rather than building this service in Drupal, which while possible may not provide optimal performance and management opportunities, this could be implemented as a standalone service which is called by Drupal as just another consumer of the API./p pFrom an Angular.js (or eminsert frontend framework of choice/em) app, you would then talk directly to the API, rendering the responses dynamically on the front end, but still use Drupal to build everything and render the remaining elements of the page./p h2 id=summing-upSumming up/h2 pAs we’ve seen, Drupal is an incredibly powerful solution, providing the capability for highly-consolidated architectures encapsulated in a single tool, a perfect enabler for projects with low resources and rapid development timescales. It’s also able to take its place as a mature part of an enterprise architecture, with integration capabilities and rich programming APIs able to make it the hub of a Microservices or Service Oriented Architecture./p pEach pattern has pros and cons, and what is “right” will vary from project to project. What is certain though, is that Drupal’s true strength is in its ability to play well with others and do so to deliver first class digital experiences./p pNew features in Drupal 8 will only continue to make this the case, with a href=https://www.drupal.org/node/1283408more tools in core/a to provide the ability to build rich applications, a href=https://www.drupal.org/documentation/modules/restRESTful APIs for entities out of the box/a allowing consumption of that data on other platforms (or in a headless front-end), improved HTTP request handling with a href=http://docs.guzzlephp.org/en/latest/Guzzle/a improving options for consuming services outside of Drupal, and much more./p pa href=http://capgemini.github.io/drupal/drupal-integration-patternsDrupal integration patterns/a was originally published by Capgemini at a href=http://capgemini.github.ioCapgemini/a on May 15, 2015./p

X-Team: DrupalCon Latin America through the eyes of an X-Teamer (Part 2)

Thu, 05/14/2015 - 23:25
pDrupal left the island. Larry Garfield brought us an awesome speech about Drupal 8, which you can see here. Dries explained to us why Drupal 8 had to change. Larry showed us those changes, and everybody loved his demo, but the important thing came after that. The inline editor, content management improvements, rendering HTML5 are.../p pThe post a rel=nofollow href=http://x-team.com/2015/05/drupalcon-latin-america-eyes-x-teamer-part-2/DrupalCon Latin America through the eyes of an X-Teamer (Part 2)/a appeared first on a rel=nofollow href=http://x-team.comX-Team/a./p

Acquia: Web Accessibility for Developers -- Part 2

Thu, 05/14/2015 - 22:15
figure class=field-item even rel= resource=https://www.acquia.com/sites/default/files/accessibility_620.jpg class=field-item even div id=styles-2 class=styles styles-field-image styles-style-scale_width_280 styles-container-image styles-preset-scale_width_280 img typeof=foaf:Image src=https://www.acquia.com/sites/default/files/styles/scale_width_280/public/accessibility_620.jpg?itok=5hcVt1HS alt= title= //div !-- render the title tag as caption -- /figure figure class=field-item odd rel= resource=https://www.acquia.com/sites/default/files/whitehouse-screenshot.png class=field-item odd div id=styles-3 class=styles styles-field-image styles-style-scale_width_280 styles-container-image styles-preset-scale_width_280 img typeof=foaf:Image src=https://www.acquia.com/sites/default/files/styles/scale_width_280/public/whitehouse-screenshot.png?itok=tM5E8Bh4 alt= title= //div !-- render the title tag as caption -- /figure div class=field field-name-body field-type-text-with-summary field-label-hidden div class=field-items div property=content:encoded class=field-item evenpimg src=/sites/default/files/istock_000057254170_large.jpg alt=access //p pWe’re at the halfway point of what hopefully has been a helpful guide for developers to make a website accessible for all visitors. (If you missed the first part of this two-part series, please click a href=/blog/web-accessibility-tips-developers target=_blankhere/a.)/p pIn this blog, we’ll review how instructional text, navigation, and other parts of development can allow those with blindness and low vision, deafness, and other disabilities to make full use of a website./p h2There’s a Proper Place for Instructional Text/h2 pWhen providing an example that will help the user fill out a field, place it after the label of the field and before the field itself. This will let the screen reader pinpoint the instructional text and leave no doubt to the user that they’re hearing an example of what’s required. For instance, an example of how to enter the country code and remaining digits of a telephone number should come just before the field./p h2A Search that Searches When Instructed/h2 pMany people love filters that are dynamic — offering results after each selection is made — but it’s not the best thing for a text reader. Dynamic searches cause the page to constantly refresh, leaving a visitor who’s using a text reader to wonder what’s going on. A page shouldn’t reload until the user hits a button. That means all filters and search functionality should have “submit,” “go,” and “apply” buttons./p h2Jump Directly to Main Content/h2 pReaders without disabilities probably take it for granted that they can jump directly to the main content on a webpage. But for those using a screen reader, they first have to listen to a long list of navigation links, icons and other elements before reaching the main content. That’s where a “skip to main content” link comes in handy. It allows a user to skip everything at the top of the page./p pThe good news for developers using Drupal is that the “skip to main content” link is beginning to come right out of the box and is already included in some themes. If it’s not included, don’t worry. The code in your template should look similar to:/p pcodelt;a id=skip-link href=#main-content class=element-invisible element-focusablegt;Skip to main contentlt;/agt;/code. /p pThe CSS code should make the link invisible to a sighted user but will allow a screen reader to focus on the link./p h2An Easier Way to Zoom and Shrink/h2 pVisually impaired people who don’t need a screen reader still may need to manipulate the size of text. They don’t always know how to use keyboard shortcuts and need a user-friendly aid. In a matter of minutes, a site administrator can plop a text-resizing module onto a Drupal webpage. Here’s a a href=https://www.drupal.org/project/text_resize target=_blankhandy helper/a on how to do it. Just keep in mind that it doesn’t always work for menu items, but it usually does resize static text./p h2Know What to Show; What to Hide/h2 pCSS allows developers to change the style of a webpage and make content sparkle. But some text-based screen readers or older screen readers need to read the page with all of the styles disabled. It’s important to make sure that if the stylesheets are turned off, the screen reader will still be able to read the order of the content correctly and be able to access all functionality. /p pMost of the responsive Drupal themes are already providing this functionality out of the box, but this standard is important to think about, and test when choosing how you will lay out your pages. /p pIn order to test, disable your stylesheets — as seen in this screenshot of a White House page, for instance — and scroll down the page to ensure that the content order is the same as you originally intended./p pimg src=/sites/default/files/whitehouse-screenshot.png alt=white house screenshot //p pThese are only a few steps that can help developers make a website accessible to all visitors. If you’d like to see more ideas — or perhaps even gain a greater understanding of Web accessibility itself — here are two resources worth checking out:/p pThe first is a a href=http://webaim.org/standards/508/checklist target=_blankchecklist of standards from Section 508/a of the federal Rehabilitation Act that government agencies must follow to provide full and fair Internet access to people with disabilities. Even though only federal agencies are required to follow them, the standards serve as a thorough and detailed source of steps for businesses and organizations to use./p pAnother useful resource are the a href=http://www.w3.org/TR/WCAG20/ target=_blankWeb Content Accessibility Guidelines/a offered by the World Wide Web Consortium (WC3). The guidelines are comprehensive and should also help you on the way to creating an accessible website./p pThanks for reading. Please leave a comment below if you have other suggestions you’d like to share./p pDown the road, we’ll post a companion, two-part series on accessibility for clients – stay tuned./p /div /div /div div class=field field-name-field-tags field-type-taxonomy-term-reference field-label-inline clearfix div class=field-labelTags:nbsp;/div div class=field-items div rel= class=field-item evena href=/resources/acquia-drupal-planet typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=acquia drupal planet/a/div /div /div span property=dc:title content=Web Accessibility for Developers -- Part 2 class=rdf-meta element-hidden/span

Dave Hall Consulting: Leaking Information in Drupal URLs

Thu, 05/14/2015 - 21:26
pWhen a user doesn't have access to content in Drupal a 403 forbidden response is returned. This is the case out of the box for unpublished content. The problem with this is that sensitive information may be contained in the URL. A great example of this the DrupalCon site./p img src=http://davehall.com.au/sites/default/files/DrupalCon-Philadephia_0.png / pThe way to avoid this is to use the a href=https://www.drupal.org/project/m4032404m4032404 module/a which changes a 403 response to a 404. This simple module prevents your site leaking information via URLs./ptable id=attachments class=sticky-enabled theadtrthAttachment/ththSize/th /tr/thead tbody tr class=oddtda href=http://davehall.com.au/sites/default/files/DrupalCon-Philadephia_0.pngDrupalCon-Philadephia.png/a/tdtd139.21 KB/td /tr /tbody /table

Chapter Three: Drupal 8 Automated Testing with Travis CI

Thu, 05/14/2015 - 19:05
p id=drupal-8-automated-testing-with-travisciTravis CI burst onto the hosted continous integration scene by offering free testing for public projects. If your code is on Github and available to the public then Travis will run your tests for you./pbr / br / pI will show you how to get Drupal 8 running all of it's PHPunit tests in Travis. If you want to use Travis for your own private repo, you will have to a href=https://travis-ci.com/planspay a little bit/a. In my opinion that is a small price to pay for never setting up Jenkins again./pbr / br / pFirst we specify our programming language and the version./pbr / br / precodebr / language: phpbr / br / php:br / - 5.4br / /code/prebr / br / pNext up we specify our database information. Note that we do not have to specify install steps for either PHP or MySQL./p

Forum One: Zero to MVP in 40 Minutes: What We learned Building Headless Drupal 8 for DrupalCon LA

Thu, 05/14/2015 - 18:51
pMy colleague a href=https://forumone.com/staff/adam-juran/Adam Juran/a and I just finished with our session, a href=https://events.drupal.org/losangeles2015/sessions/coder-and-themer%E2%80%99s-guide-getting-rich-quick-silicon-valley-0-mvp-40-minutesZero to MVP in 40 minutes: Coder and Themer Get Rich Quick in Silicon Valley/a, at DrupalCon LA. This one was a real journey to prepare, and through it we learned a lot of dirty truths about Drupal 8, Javascript frameworks, and the use cases where the two make sense together./p pThe live coding challenge in our session proposal seemed simple: icreate a web application that ingests content from an external API, performs content management tasks (data modelling, relationships, etc.) through the Drupal 8 interface, and deliver it all to an AngularJS front-end./i This is exactly the “headless Drupal” stuff that everyone has been so excited about for the last year, so doing it in a 40 minute head-to-head code battle seemed like an entertaining session./p h2bIngesting content from an external API/b/h2 pThe first hard truth we discovered was the limitations of the still-nascent Drupal 8. Every monthly release of a new Drupal 8 beta includes a series of “change records,” defining all the system-wide changes that will have to be accounted for everywhere else. For example, a href=https://www.drupal.org/node/2310411one change record/a notes that a variable we often use in Drupal forms is now a different kind of object. This change breaks every single form, everywhere in Drupal./p pThe frequency of this kind of change record is a problem for anyone who tries to maintain a contributed module. No one can keep up with their code breaking every month, so most don’t. The module works when they publish it as “stable”, but two or three months later, it’s fundamentally broken. changes like this currently happen 10-15 times every month. Any module we were hoping to use as a part of this requirement #8211; Twitter, Oauth, Facebook #8211; were broken when we started testing./p pWe finally settled on using Drupal’s robust Migrate module to bring in external content. After all, Drupal 7 Migrate can import content from almost any format! Turns out that this isn’t the case with Drupal 8 core’s Migrate module. It’s limited to the basic framework you need for all migrations. Importers for various file types and sources simply haven’t been written yet./p pNo matter which direction we turned, we were faced with the fact that Drupal 8 needed work to perform the first requirement in our challenge. We chose to a href=https://www.drupal.org/node/2458003create a CSV Source plugin ourselves/a (with much help from a href=http://drupal.org/u/mikeryanmikeryan/a and a href=https://www.drupal.org/u/chxchx/a) just to be able to meet this requirement. This was not something we could show in the presentation; it was only a prerequisite. Phew!/p h2bDisplaying it All in Angular/b/h2 pBuilding an AngularJS based front end for this presentation involved making decisions about architecture, which ended up as the critical focus of our talk. AngularJS is a complete framework, which normally handles the entire application: data ingestion, manipulation, iand/i display. Why would you stick Drupal in there? And what would an Angular application look like architecturally, with Drupal 8 inside?/p pYou always have a choice of what to do and where to do it. Either system can ingest data, and either system can do data manipulation. Your decision should be based on which tool does each job the best, in your particular use case: a catch-all phrase that includes factors like scalability and depth of functionality, but also subtler elements like the expertise of your team. If you have a shop full of AngularJS people and a simple use case, you should probably build the entire app in Angular!/p pGiven that perspective, Drupal really stands out as a data ingestion and processing engine. Even when you have to a href=https://ohthehugemanatee.org/blog/2015/05/02/how-to-build-a-new-source-for-drupal-migrate-8/write a new Migration source plugin/a, the Entity model, Drupal’s #8220;plug-ability#8221;, and Views make data crunching extremely easy. This is a strong contrast to data work in Angular, where you have to write everything from scratch./p pWe feel that the best combination of Drupal and Angular is with Drupal ingesting content, manipulating it, and spitting it out in a ready-to-go format for AngularJS to consume. This limits the Angular application to its strengths: layout, with data from a REST back-end, and only simple logic./p h2bThe Session/b/h2 piframe width=500 height=375 src=https://www.youtube.com/embed/pm1ZtOB5qpw?feature=oembed frameborder=0 allowfullscreen/iframe/p pIn the session, we talked a bit about the larger concepts involved, and moved fairly quickly into the technical demonstration. First, Adam demonstrated the flexibility of the decoupled front-end, using a href=http://bower.io/bower libraries/a to build an attractive layout without writing a single line of custom CSS.  Then I demonstrated importing data from CSV sources into Drupal 8, along with the simplicity of configuring Drupal Views to output JSON. Taken together, the videos are 37 minutes long #8211; not bad for a totally custom RESTful endpoint and a nice looking front-end!/p pHere is Adam#8217;s screencast, showing off the power of the bootstrap-material-design library to build a good looking site without any custom CSS at all:/p div style=width: 1280px; class=wp-video!--[if lt IE 9]scriptdocument.createElement('video');/script![endif]--br / video class=wp-video-shortcode id=video-11234-1 width=1280 height=720 preload=metadata controls=controlssource type=video/mp4 src=http://forumone.com/wp-content/uploads/2015/05/cvst-theming.m4v?_=1 /a href=http://forumone.com/wp-content/uploads/2015/05/cvst-theming.m4vhttp://forumone.com/wp-content/uploads/2015/05/cvst-theming.m4v/a/video/div pa href=https://www.dropbox.com/s/danq3sm78jnhepo/drupal8%20goes%20in%20the%20back.mp4?dl=0Here is my screencast/a, demonstrating how easy it is to create Migrate module importers and REST exports in Drupal 8./p pAnd here is the a href=https://www.dropbox.com/s/3cl7gnrf2u8jd72/update%20angular%20smaller.mp4?dl=0final screencast/a, quickly showing the changes we made in AngularJS to have it call the two Drupal Services./p pWant to learn of Forum One#8217;s Drupal development secrets? Check out our a href=http://forumone.com/insights/tag/drupalcon/other Drupalcon blog posts/a, or visit our booth (#107) and talk with our tech wizards in person!/p

Another Drop in the Drupal Sea: DrupalCon LA Wednesday Recap

Thu, 05/14/2015 - 18:30
pAfter the keynote I took advantage of the opportunity to meet face to face with a new contact. Then, after lunch I headed into a couple of BOFs that were way out of my league and made my brain hurt. I finished up the day with a session that was more in my comfort zone./p pI think it's good to stretch my mind and get out of my comfort zone even though it, quite honestly, left me feeling really stupid. I also felt really tired by the end of the day. So, I decided to take a pass on any social events for the evening and just relax in my hotel room./p pa href=http://blog.isaacsonwebdevelopment.com/blog/2015/05/14/drupalcon-la-wednesday-recap target=_blankread more/a/p

InternetDevels: DrupalTour Zhytomyr

Thu, 05/14/2015 - 15:52
div class=field field--name-field-preview-image field--type-image field--label-hiddendiv class=field__itemsdiv class=field__item evenimg src=http://st3.internetdevels.net/sites/default/files/public/blog_preview/zhytomyr.jpg width=937 height=624 alt=DrupalTour Zhytomyr //div/div/divdiv class=field field--name-body field--type-text-with-summary field--label-hiddendiv class=field__itemsdiv class=field__item evenp style=text-align: justify;Spring time is just perfect for Drupal rides! The weather is great, drupallers are in the good mood and Drupal-van shines in the bright sun… So we decided to make a ride to Zhytomyr. And it turned out to be awesome!/pp style=text-align: justify;We had to leave Lutsk at 7:30 AM to arrive to Zhytomyr in time. Getting up at 6 on Saturday morning is not so easy, by the way! But we actually had no other options and the trip to Zhytomyr was worth it :)/p a href=http://internetdevels.com/blog/drupaltour-zhytomyrRead more/a/div/div/div

Friendly Machine: Notes from DrupalCon Los Angeles

Thu, 05/14/2015 - 15:41
pOn Tuesday, Dries gave the a href=https://www.youtube.com/watch?v=uNRtZDAS0xIamp;list=PLpeDXSh4nHjRwS2wCW-rOTsYNy1op3e0Camp;index=4best keynote/a Irsquo;ve heard him deliver. It included some very interesting Drupal history and it brought home to me how extraordinary Drupal really is. There were so many points in the projectrsquo;s history when things could have happened differently -nbsp;or not happened at all. To see a photo of the first DrupalCon attendees 10 years ago (27 people) while sitting among ~3000 Drupalists from around the worldnbsp;was pretty amazing./p pThere are so many people doing big, interesting things with Drupal. Despite concerns about corporate influence within the Drupal community, the project empowers a huge number of non-profits and institutions of higher education and it was great to see them so well represented here. It might be weird to talk about software as a force for good, but thatrsquo;s really how I see Drupal. It makes a huge difference to a lot of organizations and the valuablenbsp;work they contribute to society./p pAs you may have heard, there will be a DrupalCon in India next year. The city hasnrsquo;t been announced yet, but my money is on Mumbai. Irsquo;ve known two people who have traveled to India. Both said it was amazing and intense. Irsquo;m not sure if Irsquo;ll go, but Irsquo;m very tempted. I love travel, but that is one hell of a long flight (20 hours)./p pThe sessions this year were all recorded and put on YouTube, so if you want to catch up on anything you might have missed, herersquo;s the a href=https://www.youtube.com/playlist?list=PLpeDXSh4nHjRwS2wCW-rOTsYNy1op3e0Clink/a. There are a few sessions I recommend you check out:/p ul lia href=https://www.youtube.com/watch?v=hAIM1eEw-yUamp;index=7amp;list=PLpeDXSh4nHjRwS2wCW-rOTsYNy1op3e0CBattle for the Body Field/a/li lia href=https://www.youtube.com/watch?v=v1zsGYLtankamp;index=82amp;list=PLpeDXSh4nHjRwS2wCW-rOTsYNy1op3e0CDesigning for Brains/a/li lia href=https://www.youtube.com/watch?v=Yt1oR6TqGXgamp;index=52amp;list=PLpeDXSh4nHjRwS2wCW-rOTsYNy1op3e0CAvoiding the Git of Despair/a/li /ul pHowever,nbsp;the biggest benefit of DrupalCon for me isnrsquo;t the sessions. Itrsquo;s getting to meet people and talking with them about their projects and how they are solving the problems they encounter. To everyone that came by the Lullabot booth to chat, thank you! It was great to see you in person and I hope to chat again next year - if not sooner!/p a href=/tags/drupalDrupal/a

Acquia: Build Your Drupal 8 Team: Technical Roles and Required Skills

Thu, 05/14/2015 - 15:38
figure class=field-item even rel= resource=https://www.acquia.com/sites/default/files/drupal8teamillo_0.png class=field-item even div id=styles-2 class=styles styles-field-image styles-style-scale_width_280 styles-container-image styles-preset-scale_width_280 img typeof=foaf:Image src=https://www.acquia.com/sites/default/files/styles/scale_width_280/public/drupal8teamillo_0.png?itok=nvhyPs4y alt= title= //div !-- render the title tag as caption -- /figure div class=field field-name-body field-type-text-with-summary field-label-hidden div class=field-items div property=content:encoded class=field-item evenpimg src=/sites/default/files/blog/drupal8teamillo.png width=620 height=620 //p pLast time, we discussed some a href=/blog/build-your-drupal-8-team-skills-tech-non-tech-and-bridge-members target=_blankbig themes/a your Drupal 8 team should be synched up with, like object-oriented programming. Now we're going to drill down into more specifics on the technical side./p pIs your tech team full of generalists, or do all your developers have special skill sets and focus on specific kinds of functionality, like databases or communications? Either way, someone on your team will have to fill each of these technical roles for a successful Drupal 8 project./p h2Drupal 8 Architect/h2 pMore than anyone else on the project, the Drupal 8 architect needs to understand Drupal 8 in depth. The architect needs to make the decisions about the project's overall architecture, which requires envisioning how the system works as a whole. This is bigger than just the Drupal 8 application, because the project needs to fit into your company's entire software environment. It may need to be integrated with other corporate back-end systems, so this role needs to understand the full technical environment, not just the tech stack that comes with Drupal 8. As much as possible, this individual needs to have a strong understanding of front-end and back-end development tools in addition to a thorough understanding of how Drupal 8 works./p h2UI Designer/h2 pThe UI designer needs to understand what the technology is capable of and how to use it to create the best experience for end users. To work with Drupal 8, the UI designer should keep building HTML, CSS and Javascript knowledge, but also develop a Drupal 8-specific understanding of how to create themes and build sites. Learning the capabilities of Twig is needed because Twig replaces PHPTemplate in the new version of Drupal. Instead of .tpl.php files, .html.twig files are needed./p h2Front-End Developer/h2 pAll that stuff the UI designer promised the business? It's the front-end developer's job to turn that hypothetical design into a functioning interface. Like the UI designer, front end developers should enhance their knowledge of HTML, CSS and Javascript, and pick up knowledge of Twig. PHP knowledge will help also; so will knowing MySQL. The front-end developer will also want a Drupal 8-specific understanding of how to create themes and build sites, as well as how to develop custom modules and address Drupal 8 performance and Drupal 8 security concerns./p h2Back-End Developer/h2 pClicking on website front-end elements does nothing until you implement the functionality in the back-end. You need to be able to write new functionality from scratch, building on existing components when possible. When the application needs to integrate with other systems, the back-end developer writes the code that hooks it all together into a system that functions seamlessly. This role needs some knowledge of front-end tools like HTML, CSS and JavaScript, but it also requires understanding back-end tools like PHP and MySQL in depth. For Drupal 8 knowledge, the back-end developer should focus on architecture and planning topics as well as how to develop custom modules and address Drupal 8 performance and Drupal 8 security concerns./p h2Marketing Technical Lead/h2 pThe marketing technical lead owns the content publishing process. She defines the procedure for publishing content and makes sure it adheres to site standards. Because content doesn't accomplish anything unless someone sees it, the marketing technical lead needs to make sure it follows good SEO and SEM practices. It's important that the marketing tech lead keeps current with ever-changing SEO practices, and focuses on learning Drupal 8 as a content management system. Learning about the administration functions, and the kinds of changes you can make that won't require a developer to write code, will be especially useful for this role./p pemNext time: Non-Technical Team Roles and Required Skills for a Drupal 8 Project./em/p /div /div /div div class=field field-name-field-tags field-type-taxonomy-term-reference field-label-inline clearfix div class=field-labelTags:nbsp;/div div class=field-items div rel= class=field-item evena href=/resources/acquia-drupal-planet typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=acquia drupal planet/a/div /div /div span property=dc:title content=Build Your Drupal 8 Team: Technical Roles and Required Skills class=rdf-meta element-hidden/span

Drupalize.Me: Learning To Debug: Stop Thinking and Look

Thu, 05/14/2015 - 15:02
div class=field field-name-body field-type-text-with-summary field-label-hidden text-content text-secondarydiv class=field-itemsdiv class=field-item evenpDebugging is a discipline that requires patience, and a fervent attention to detail. In the often times fast paced world of software development, when we're faced with deadlines, and an ever growing list of new features to add, and bugs to resolve, it can be a difficult to slow down and proceed in a meticulous, measured fashion. When it comes to solving difficult problems though, this fastidious approach is exactly what's required to locate, and resolve, a problem's root cause./p /div/div/divdiv id=comment-wrapper-nid-2189/div

Annertech: Thoughts on DrupalCon LA's Front End Forum

Thu, 05/14/2015 - 13:34
span class=field field-node--title field-name-title field-type-string field-label-hiddenThoughts on DrupalCon LA#039;s Front End Forum/span div class=field field-node--body field-name-body field-type-text-with-summary field-label-hidden div class=field-items div class=field-itempAt DrupalconLA, I had the opportunity to go to an Open Front End Forum, wherein people chatted about the state of the front end. It was good fun, and the moderator did a good job of keeping the conversation flowing./p pstrongFirst question: Where is the line that separates front end from back end?/strong/p pThere was some disagreement on that. There is a line, there is no line, it's a permeable line... Going on to explore what defined front end or backend, people cited tasks and tools like PHP, HTML/CSS/JS, the browser, Photoshop, in favour of one argument or another./p/div /div /div

Trellon.com: Agile Design Techniques - Video Is Live

Thu, 05/14/2015 - 02:47
div class=field-body pTrellon presented a session about Agile design techniques at Drupalcon Los Angeles which was very well received. Over 100 people were in attendance to hear Blake Maples, Mike Haggerty and Jake Tooman talk about the way we introduced Agile design within Trellon and made it work for the groups we serve./p pSlides from the presentation are available at the following URL:/p pa href=https://docs.google.com/presentation/d/1XwXELD7pIQ8CQUuNCv00hxaavUWeaKBj0Konssf-XOk/edit?usp=sharinghttps://docs.google.com/presentation/d/1XwXELD7pIQ8CQUuNCv00hxaavUWeaKBj.../a/p /div ul class=field-taxonomy-vocabulary-2 li a href=/category/blog-tags/drupal typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Drupal/a /li li a href=/category/blog-tags/drupalcon typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Drupalcon/a /li li a href=/category/blog-tagslos-angeles typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Los Angeles/a /li /ul

Pixelite: Drupal Migrate D2D :: Taxonomy terms on nodes

Thu, 05/14/2015 - 02:00
pA migration project I am currently working on hit a small hurdle with taxonomy terms on a content type. This took too long to resolve. Hopefully posting this here will save others the time and hassle I went though./p h2 id=migrate-d2dMigrate D2D/h2 pI am going to assume that if you are reading this you are already using the a href=https://www.drupal.org/project/migrate_d2dmigrate_d2d/a module so I won’t go into the big explanation about what it is, why you should use it and just how greatful we all should be to a href=https://www.drupal.org/u/mikeryanMike Ryan/a./p h2 id=node-migration-and-taxonomiesNode migration and taxonomies/h2 pAfter following the docs I found that my taxonomy field was not being populated. A little digging led me to the conclusion that this was not something d2d handled out of the box and it was something I would have to deal with myself. There are a number of moving parts involved with this and due to all of these I can understand emwhy/em it is not something migrate d2d could do./p h3 id=public-function-prepareentity-rowpublic function prepare($entity, $row)/h3 pThe magic happens here. The codeprepare()/code function is the final thing to be called before the node object is saved. This is where we get to do any final tweaks or tidyups. You can find full detail on this in the a href=https://www.drupal.org/node/1132582Commonly implemented Migration methods/a page in the a href=https://www.drupal.org/migrateMigrate handbook/a./p pIn the codeprepare()/code function the code$entity/code is the new object that we are about to save and the code$row/code is our source object. At this point the taxonomy has been added to the code$row/code./p pWithin the code$row/code object the taxonomy has been added with its vid as the root level attribute. If you don’t know to watch for that it can catch you. Added to that it is the vid of the destination vocabulary that is used which caught me off guard. The situation I had did not have me migrating the vobacularies, just the terms within them and the vid for the Categories vocab was not the same on my development environment as it was on my staging environment. This caught me out initially as I don’t have direct access to the staging database to examine the content of tables./p figure img src=http://www.pixelite.co.nz/img/migrate-d2d/row_object_krumo.png alt=Krumo output of $row. class=img-responsive img-thumbnail / figcaptionsmallsource $row-gt;{destination vid} = array({source tid}, {source tid}, {source tid})/small/figcaption /figure pOnce it was realised that the vid was from the destination vocabulary things got easier. This is how the code looked in the end for me;/p div class=highlightprecode class=language-php data-lang=phpspan class=cplt;?php/span span class=kpublic/span span class=kfunction/span span class=nfprepare/spanspan class=p(/spanspan class=nv$node/spanspan class=p,/span span class=nv$row/spanspan class=p)/span span class=p{/span span class=c1// The node#39;s terms are in an array under their destination vocab ID and/span span class=c1// this is different from environment to environment. However, we#39;ve only/span span class=c1// got one taxonomy.../span span class=nv$keys/span span class=o=/span span class=nbarray_keys/spanspan class=p((/spanspan class=karray/spanspan class=p)/span span class=nv$row/spanspan class=p);/span span class=kforeach/span span class=p(/spanspan class=nv$keys/span span class=kas/span span class=nv$key/spanspan class=p)/span span class=p{/span span class=kif/span span class=p(/spanspan class=nbis_numeric/spanspan class=p(/spanspan class=nv$key/spanspan class=p))/span span class=p{/span span class=nv$cat_vid/span span class=o=/span span class=nv$key/spanspan class=p;/span span class=kbreak/spanspan class=p;/span span class=p}/span span class=p}/span span class=kif/span span class=p(/spanspan class=o!/spanspan class=kempty/spanspan class=p(/spanspan class=nv$row/spanspan class=o-gt;/spanspan class=p{/spanspan class=nv$cat_vid/spanspan class=p}))/span span class=p{/span span class=kforeach/span span class=p(/spanspan class=nv$row/spanspan class=o-gt;/spanspan class=p{/spanspan class=nv$cat_vid/spanspan class=p}/span span class=kas/span span class=nv$tid/spanspan class=p)/span span class=p{/span span class=c1// We want the tid of the term we have migrated. This lets us look it up/span span class=c1// our migrate_map table./span span class=nv$new_tid/span span class=o=/span span class=nxdb_select/spanspan class=p(/spanspan class=s1#39;migrate_map_tncategoryterms#39;/spanspan class=p,/span span class=s1#39;m#39;/spanspan class=p)/span span class=o-gt;/spanspan class=nafields/spanspan class=p(/spanspan class=s1#39;m#39;/spanspan class=p,/span span class=karray/spanspan class=p(/spanspan class=s1#39;destid1#39;/spanspan class=p))/span span class=o-gt;/spanspan class=nacondition/spanspan class=p(/spanspan class=s1#39;sourceid1#39;/spanspan class=p,/span span class=nv$tid/spanspan class=p)/span span class=o-gt;/spanspan class=naexecute/spanspan class=p()/span span class=o-gt;/spanspan class=nafetchField/spanspan class=p();/span span class=nv$node/spanspan class=o-gt;/spanspan class=nafield_category/spanspan class=p[/spanspan class=nxLANGUAGE_NONE/spanspan class=p][][/spanspan class=s1#39;tid#39;/spanspan class=p]/span span class=o=/span span class=nv$new_tid/spanspan class=p;/span span class=p}/span span class=p}/span span class=p}/span span class=cp?gt;/spanspan class=x/span/code/pre/div h3 id=caveatsCaveats/h3 pThis worked for me because I only had strongone/strong taxonomy field to worry about. The moment you get more than one you will want to revisit the assignment of $new_tid to the appropriate field. This shouldn’t be a problem to hand code and if you have migrated the vocabularies too you may be able to use the migrate_map table to make something more dynamic./p h2 id=commentsComments/h2 pIf you have (or are currently) using migrate I would be interested to hear how you found it. Especially if you are migrating terms, but not the vocabulary./p

Midwestern Mac, LLC: Ansible for Drupal infrastructure and deployments - DrupalCon LA 2015 BoF

Wed, 05/13/2015 - 23:57
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item even property=content:encodedpWe had a great discussion about how different companies and individuals are using Ansible for Drupal infrastructure management and deployments at DrupalCon LA, and I wanted to post some slides from my (short) intro to Ansible presentation here, as well as a few notes from the presentation./p pThe slides are below:/p div style=text-align: center; iframe src=https://www.slideshare.net/slideshow/embed_code/key/Fy7AHxhL1AUeNw width=476 height=400 frameborder=0 marginwidth=0 marginheight=0 scrolling=no/iframe/div h2Notes from the BoF/h2 pIf first gave an overview of the basics of Ansible, demonstrating some Ad-Hoc commands on my a href=https://github.com/geerlingguy/raspberry-pi-drambleRaspberry Pi Dramble/a (a cluster of six Raspberry Pi 2 computers running Drupal 8), then we dove headfirst into a great conversation about Ansible and Drupal./p/div/div/div

Drupal Easy: DrupalEasy Podcast 152: DrupalCon Los Angeles - Day 1 Recap

Wed, 05/13/2015 - 22:20
div class=field field-type-link field-field-embed a href=http://podcasts.drupaleasy.com/DrupalEasy_ep152_20150513.mp3 rel=enclosureDownload Podcast 152/a /div pLive (almost) from Los Angeles, Ryan, Ted, and Mike are joined by a few familiar voices for a quick recap of day 1 of DrupalCon. We talk highlights, a href=https://www.youtube.com/watch?v=0o4EgSXd0DEsongs from the prenote/a, special Drupal moments, and Ryan interviews Rob Loach from a href=http://www.kalamuna.comKalamuna/a about Kalabox 2.0./p pa href=http://drupaleasy.com/podcast/2015/05/drupaleasy-podcast-152-drupalcon-los-angeles-day-1-recap target=_blankread more/a/pdiv class=feedflare a href=http://feeds.feedburner.com/~ff/DrupalEasy?a=DoEn6oSAKK0:xAEJlwL3YN0:yIl2AUoC8zAimg src=http://feeds.feedburner.com/~ff/DrupalEasy?d=yIl2AUoC8zA border=0/img/a a href=http://feeds.feedburner.com/~ff/DrupalEasy?a=DoEn6oSAKK0:xAEJlwL3YN0:qj6IDK7rITsimg src=http://feeds.feedburner.com/~ff/DrupalEasy?d=qj6IDK7rITs border=0/img/a /divimg src=http://feeds.feedburner.com/~r/DrupalEasy/~4/DoEn6oSAKK0 height=1 width=1 alt=/

Another Drop in the Drupal Sea: DrupalCon LA Tuesday Recap

Wed, 05/13/2015 - 18:26
pI followed my own advice from my a href=/blog/2015/05/08/drupalcon-n00bsDrupalCon for n00bs post/a, and took part in some great sessions, checked out a BOF, ran a BOF of my own and hung out a bit in the Exhibition Hall. I loved finding out about Symfony and Drupal 8 and am super excited about what the combination has to offer. I was pleasantly surprised by the attendance in my BOF. And, I picked up some great swag in the Exhibition Hall and had some nice conversations./p pLet's just hope that they get the lunch situation sorted out better today!/p pa href=http://blog.isaacsonwebdevelopment.com/blog/2015/05/13/drupalcon-la-tuesday-recap target=_blankread more/a/p