Planet Drupal

Syndicate content - aggregated feeds in category Planet Drupal
Updated: 11 min 32 sec ago

Commerce Guys: The Case for a Unified Customer Experience and Content-Driven Commerce

Mon, 06/22/2015 - 22:35
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item even property=content:encodedpimg align=left src=/sites/default/files/blog/files/unified_commerce_experience.png /Commerce Guys has been promoting the value of content-driven commerce for many years, and we are thrilled to see more and more people talking about this continued transformation in the eCommerce market. One company that has recognized this important trend is Forrester Research, who makes a strong and compelling case in their a href= And Commerce: The Odd Couple Or The Power Couple?/a. In particular, they point out that companies who differentiate themselves by providing a unified user experience to tell their story should consider a tightly integrated solution that provides both a rich Content Management System (CMS) and a flexible eCommerce transactional /gt; br / Today there is almost no barrier to selling online, making it increasingly difficult for companies to differentiate themselves online, create a strong web presence, and attract customers. The solution for many will be to focus more on creating unique user experiences, supported by interesting content, which allows their users to execute transactions anywhere along the buying journey within the context of that information. The challenge today is that this experience requires CMS and eCommerce to work together seamlessly. Unfortunately most companies manage these two functions separately with two distinct systems. This approach results in added complexity and a disjointed and inconsistent user experience that is confusing to users and damages their brand. br /br / According to Forrester, the convergence of content and commerce platforms is already well underway. [They] expect that these two solution categories to be foundational elements in digital customer experience management1. They go on to say that In an ideal world, commerce and content platforms would have fully converged into customer experience management platforms, with commerce services seamlessly exposed through best-in-class digital engagement tools and supported by social, testing, and content management services. - But this ideal isn’t likely to exist in the near future1./p h2Drupal + Drupal Commerce Provides Seamless Content amp; Commerce/h2 pThe future is NOW - and the reality is that Drupal + Drupal Commerce is the only platform with commerce natively embedded in a CMS, offering a seamless digital experience management solution with a single code base, administration, and /br /strongemWhy is this not more widely known?/em/strongbr /br / While this may be news to many, Drupal Commerce has been around for over 5 years and has over 57k active sites. It consists of core and contributed modules, support by Commerce Guys and the broader community, that can be dropped into Drupal (which itself has been around for 10+ years and has over 5 million active sites) allowing transactions to occur anywhere within the user experience created. Contextual relationships between content and products are extremely easy to create - something that is hard to do when you bolt together separate CMS and eCommerce platforms. A great example of the power of Drupal + Drupal Commerce is a href= which helps Lush in the UK tell their story, engage their customers, and sell more product./p pbr /strongemWho Benefits from a Content amp; Commerce Solution?/em/strongbr /br / Potentially everyone, but in particular are brands who benefit from a differentiated user experience that enables them to tell their story through interesting content and community engagement driving sales within the context of that experience. In addition, existing Drupal sites looking to add transactional capabilities is another obvious fit. With an existing investment in technology, skills and content, there is no better choice than to drop in commerce functionality, through Drupal Commerce modules, anywhere. Integrating with a separate eCommerce solution and bolting it onto Drupal is a common approach and certainly possible, but the result is added complexity, cost and valuable customer information that is spread out across multiple systems. Two systems makes it harder to create a level of contextualization and a unified experience that buyers are looking for. Given the increasing importance of targeting and personalizing content and offers and knowing your customer, having customer information in one place allows companies to merchandise more /br /strongemWhat Should You Do?/em/strong/p divimg alt=1 src=/sites/default/files/1.png style=width: 50px; float: left; padding: 0px 4px 0px 0px; /Read the a href= target=_blankForrester report./a They get it right, and they are one of a growing number of analysts talking about the value of content-driven commerce./div div style=clear:both; /div divimg alt=2 src=/sites/default/files/2.png style=width: 50px; float: left; padding: 0px 4px 20px 0px; /2. Don't get stuck on features. Yes, they are important, but they will also change, and you need a solution that will adapt and allow you to take advantage of new ideas quickly. Instead, consider how your business will benefit by creating an experience that keeps your customers coming back and makes it easy for them to buy./div div style=clear:both; /div divimg alt=3 src=/sites/default/files/3.png style=width: 50px; float: left; padding: 0px 4px 20px 0px; /3. If you think your business would benefit from a richer user experience, or if you just want to simplify your infrastructure with a single platform that can serve both your content and commerce needs, take a look at a href= Commerce/a - you will be pleasantly surprised by what you see./div div-----br / 1. Stephen Powers, Peter Sheldon with Zia Daniell Wigder, David Aponovich, Rebecca Katz emstrongContent And Commerce: The Odd Couple Or The Power Couple?/strong/em emstrongHow To Choose Between Using A Web Content Management Solution, An eCommerce Platform, Or Both /strong/em(Forrester, November 19, 2013) 11,14 p /p /div /div/div/div

Blink Reaction: Building Native Apps - Part 5

Mon, 06/22/2015 - 21:29
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item even property=content:encodedh2Building Native Mobile Apps with Ionic Framework and Drupal Back-end: Add User Authentication/h2 p dir=ltrToday I will show how to authorize a user in your mobile app with a Drupal website. First of all we should configure Drupal to allow REST authentication, so go to /admin/structure/services and click the “Edit” link opposite of your service name. Here, check the “Session authentication” option and save. Next go to the resources tab and edit user resource alias and check off the following options for it: login, logout, token, and register./p pAlso, we should check the user registration settings on /admin/config/people/accounts to allow new user registration by visitors, and account activation without email or admin confirmation./p p dir=ltrTo login a user with the services module, we must do following steps:/p olli dir=ltr p dir=ltrSend GET request to /services/session/token./p /li li dir=ltr p dir=ltrGet the response with CSRF token./p /li li dir=ltr p dir=ltrSend POST request with username, password with token received before in X-CSRF-Token header to /user/login endpoint./p /li li dir=ltr p dir=ltrReceive an object with user data and new CSRF token on login success or error code with a message on login fail./p /li /olp dir=ltrTo log out a user, we have to send POST request to /user/logout with X-CSRF-token header, that contains the token which we receive on login./p p dir=ltrAnd to register a new user we send a POST request to /user/register API URL with user data. As a response we should get a new user object and error status message on registration fail. The minimum data required for a user registration is username, e-mail address, and password, but we should add a status equal to 1, to immediately make a new account active, ready for use./p h2 dir=ltrIn-app integration/h2 p dir=ltrIt is good practice to save some data on a device to prevent the user from manually editing any information that is needed every time that we run application. We should use Local Storage to store user login status, tokens from the last login time and user data. AngularJS has some modules to add to Local Storage support for an application; I chose a href= It also has a cookie fallback and uses the a href= module for it./p p dir=ltrSo we should download these two modules and plug them in our index.html file./p p dir=ltra href= target=_blankgist link/a/p p dir=ltrNext we should define the UI Router state for account tab, angularLocalStorage module dependency in our app.js file and add local storage prefix constant, we will add it to our config constant./p p dir=ltra href= target=_blankgist link/a/p p dir=ltrIn the services.js file we will create a new factory called User. This will contain a list of methods to work with user operations on the REST server, and to save / delete user data from local storage. We use a href=$rootScope$rootScope/a services to have access to login status and user information from any part of the application./p p dir=ltra href= target=_blankgist link/a/p p dir=ltrIn tabs.html we add an Account tab link./p p dir=ltra href= link/a/p p dir=ltrLet’s create a tab-account template. Here we should show the following: for an unauthorized user, show login and register buttons that will open a popup form for each action; and for a logged-in (authorized) user, show information about user and a logout button. To show these parts of the template conditionally, we use the ng-show directive and loginSuccess variable that are stored globally in $rootScope./p p dir=ltra href= target=_blankgist link/a/p p dir=ltrTo show popups with login/register forms we should use a href=$ionicModal/ target=_blank$ionicModal/a service, which comes with Ionic Framework core. We must create templates for each modal window: login.html and register.html./p p dir=ltra href= target=_blankgist link/a/p p dir=ltra href= target=_blankgist link/a/p p dir=ltrFinally, we should define a controller for each (login and register) popup. We initialize a new $ionicModal instance and set a template for it, creating methods to open and close the modals, and doLogin, doLogout and doRegistration actions. It will be easy to handle any error message because our User Factory methods return promises. Also, we should save user information to Local Storage and send requests to the server only if it is necessary./p p dir=ltra href= target=_blankgist link/a/p p dir=ltrYou can clone and try all this code from my GitHub a href= target=_blankrepository/a, and to get the code of this part, checkout the part5 branch (just run “git checkout -f part5”). Now we can test the application in a browser - run “ionic serve” prompt command from the project directory and see the result of our work./p p dir=ltrTomorrow, I will add comments to articles and ability to post a comment for logged in users./p /div/div/divdiv class=field field-name-field-blog-category field-type-taxonomy-term-reference field-label-hiddendiv class=field-itemsdiv class=field-item evena href=/taxonomy/term/1 typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Drupal/a/divdiv class=field-item odda href=/taxonomy/term/2 typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Best Practices/a/divdiv class=field-item evena href=/taxonomy/term/3 typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Drupal How to/a/divdiv class=field-item odda href=/taxonomy/term/4 typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Drupal Planet/a/divdiv class=field-item evena href=/taxonomy/term/8 typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Learning Series/a/divdiv class=field-item odda href=/taxonomy/term/9 typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Technology Tools/a/div/div/divdiv class=field field-name-field-tags field-type-taxonomy-term-reference field-label-inline clearfixdiv class=field-labelPost tags:nbsp;/divdiv class=field-itemsdiv class=field-item evena href=/tags/ionic typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Ionic/a/divdiv class=field-item odda href=/tags/apps typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Apps/a/divdiv class=field-item evena href=/tags/drupal typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Drupal/a/div/div/div

Nextide Blog: Maestro How-To: Fire a Workflow After Saving Content with Rules

Mon, 06/22/2015 - 21:02
p/ppA very common use-case for Maestro is to launch a workflow in order to moderate some piece of content. You may have an expense form as a content type and you wish to have a manager review and approve it before handing it off to other departments for processing./p pThis post will show you how to fire off a moderation workflow after saving content with Rules./p pnbsp;/p pbStep 1:/b Create a simple test flow/p pI know you have a super-ultra-complex workflow, but this is best to get off the ground with a simple 1 step flow for the time being!/p pnbsp;/p

Urban Insight: Using SPARQL and Linked Open Data For Content Blocks on Your Drupal 7 Website

Mon, 06/22/2015 - 18:00
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item even property=content:encodedpThe content that you display on your Drupal site doesn’t necessarily have to be content that you own or store in your own database. In addition to your own content, there could be various use cases and methods for dynamically displaying data from outside sources and displaying it on your site./p/div/div/div

Mediacurrent: Migrating To Drupal: Improved Page Load Times

Mon, 06/22/2015 - 17:13
img typeof=foaf:Image src= width=200 height=155 alt=Migrating to Drupal improved page load times by 50% title=Migrating to Drupal improved page load times by 50% / div style=margin: 0 6px 30px 0px; padding: 10px; background-color: #ccc;/div

J-P Stacey: Architecting a Drupal 7 module into multiple files

Mon, 06/22/2015 - 16:42
pIn the Drupal modules that I inherit or review, I see a lot of different ways of factoring out into separate files, of what might have begun in the main module file. This can be useful for performance (to a limited extent) and legibility, but depending on how you do it, you might end up ironically spoiling both./p pHow should you break down your Drupal module files? Well, I'm not here to tell you the perfect file breakdown. Matching the architecture is good, although what the architecture means in Drupal 7 isn't clear. Outside of a Drupal 8/Symfony-style architectural model, there's a limit to how much the file breakdown really needs to match the architecture, and a limit to how useful doing so would be./p pa href= more of Architecting a Drupal 7 module into multiple files/a/p

BlackMesh: Summer Drupal 8 Sprints

Mon, 06/22/2015 - 16:03
span class=submitted-by/spandiv class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item even property=content:encodedpa href= are times dedicated to focused work on a project or topic. People in the same location (physical space, IRC, certain issue pages) work together to make progress, remove barriers to completion, and try to get things to done. /ppThis summer, there are many Drupal 8- focused sprint opportunities before DrupalCon Barcelona. /ppSome of these are open to everyone, some have mentors or workshops to help new contributors, some have limited space, depending on the event. /ph2Earlier this summer /h2pDrupalCon Los Angeles had very productive extended sprints, and the main sprint on Friday was huge! Since then, many sprints have continued the progress, including: a href= Camp Spain/a, a href= Wroclaw/a, a href=http://moldcamp.comMoldcamp in Chișinău, Moldova/a, and a href= United/a. /ppAnd, we had two sprints (New Hampshire and New Jersey) aided by a href= 8 Accelerate/a. If you have more money than time for sprinting or resources for planning or hosting a sprint, and you want to help get Drupal 8 out, giving to D8 Accelerate really helps. /ph4New Hampshire, USA/h4 pThe Drupal 8 a href= meta issue on SafeMarkup/a was a focus of the a href= Hampshire, USA sprint/a. /ppimg src= alt=postit board of issues and noting status at NH /br /(photo: a href= /ph4Jersey Shore Sprint, New Jersey, USA br /a href=;@DrupalCampNJ#DrupalCampNJ/a/h4 pimg src= alt=sprinters clustered together, with sunlight streaming in /br /a href=, a href=, a href=, a href= (who got a first Drupal Core commit mention), a href=, a href=, a href= Weal/a. br /(photo: a href=, cropped) /ppContinuing from the New Hampshire sprint, a main focus of the a href= Shore/a sprint was the Drupal 8 a href= meta issue on SafeMarkup/a. (I was there too.) /ph2Coming soon! Go to one! h3June 25-28, 2015 br /Twin Cities Drupal Camp, Minneapolis, Minnesota, USA br /a href= a href=;vertical=defaultamp;f=tweets#TCDrupal/a/h3 /h2pSprints are concurrent with the training day on Thursday, and concurrent with sessions Friday and Saturday. The dedicated sprint day is on Sunday. We are expecting about 10 people on Thursday and 60 people on Sunday. Sunday will have a workshop for new contributors, Core/Contrib sprints, and a a href= 8 Manual/a sprint. /ppSee the a href= page on the site/a for details. /ph3June 25-28, 2015 br /Drupal North, Toronto, Canada br /a href= pSunday is a a href= Drupal 8 sprint day/a. There will be a small unofficial sprint on Thursday. /ppThe whole a href= day camp is focused on Drupal 8/a. /ph3June 28, 2015 br /Antwerp, Belgium/h3 pThis is a dedicated one day sprint to help get Drupal 8 out. /ppSee the a href= for details. /ph3July 2-8, 2015 br /D8 Accelerate critical issue sprint, London/h3 pThis 7 day sprint will be focused on Drupal 8 critical issues and space is limited. /ppSee the a href= post/a for details. /ph3July 4, 2015 br /DrupalCamp Bristol, United Kingdom br /a href= a href=;vertical=defaultamp;f=tweets#dsbristol/a/h3 pa href= will run concurrent with sessions on Saturday. /ph3July 16-19, 2015 br /NYC Camp, New York, USA br /a href= a href=;src=typdamp;vertical=defaultamp;f=tweets#NYCCamp/a/h3 pMonday to Wednesday are sprint only days, with Drupal 8 Core and Media for Drupal 8 scheduled. Panopoly is scheduled for Tuesday and Wednesday. Sprints will also be concurrent with trainings, summits, and sessions on Thursday through Sunday. /ppSee the a href= page on the site/a and the a href= for details. /ph3July 22-26, 2015 br /DrupalCamp North, Sunderland, United Kingdom br /a href= pWednesday to Friday are dedicated a href= sprint days/a and there will also be a sprint room at the a href= concurrent with sessions on Saturday and Sunday. /ph3July 22-26, 2015 br /GovCon, Bethesda, Maryland, USA br /a href= a href=;vertical=defaultamp;f=tweets#DrupalGovCon/a/h3 pa href= conference is July 22-24 with sprints concurrent with sessions, but there will be a href= dedicated sprint days following on Saturday and Sunday, July 25 and 26/a in Washington, DC at the ForumOne offices. /ph3August 6-9, 2015 br /Drupalaton, Hungary br /a href= a href=;vertical=defaultamp;f=tweets#Drupalaton/a/h3 pa href= will be concurrent with the camp all days. /ppLast year was a href= focused and relaxing/a. /ph3August 12-15, 2015 br /MidWest Developers Summit (MWDS), Chicago, Illinois, USA br /a href=;src=typdamp;vertical=defaultamp;f=tweets#MWDS2015/a/h3 p4 days of only sprinting, hosted in the a href= offices. /ppDetails still to be announced. See the a href= event page/a for more details. /ph3September 11-18, 2015 br /Montréal to Barcelona Sprint, Montréal, Canada/h3 pFor some people in North America, Montréal could be on the way to Barcelona, where a href= extended sprints start September 19/a. /ppSee the a href= event page/a for more details. /ph2P.S./h2 pI will be at Twin Cities, GovCon, and MWDS. /ppThanks to a href= for fast changes to a href=http://www.drupical.com to show the sprints even better. /ppThanks to a href=, a href=, a href=, a href=, a href=, a href=, a href=, a href=, a href=, a href=, and a href= for helping me find more events. /p/div/div/divdiv class=field field-name-field-tags field-type-taxonomy-term-reference field-label-hiddendiv class=field-itemsdiv class=field-item evena href=/tags/drupal-planet typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Drupal Planet/a/divdiv class=field-item odda href=/tags/drupal typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Drupal/a/divdiv class=field-item evena href=/tags/sprints typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Sprints/a/div/div/divdiv class=field field-name-field-blog-images field-type-image field-label-hiddendiv class=field-itemsdiv class=field-item evenimg typeof=foaf:Image src= width=2019 height=1080 alt= title= //div/div/div

InternetDevels: DrupalTour siteseeing

Mon, 06/22/2015 - 15:38
div class=field field--name-field-preview-image field--type-image field--label-hiddendiv class=field__itemsdiv class=field__item evenimg src= width=940 height=626 alt=DrupalTour //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;If you want pizza you can either go to cafe or order delivery, right? So why should Drupal be different? :) We made Drupal delivery possible to any Ukrainian city with a href= target=_blankDrupalTour/a!/pp style=text-align: justify;img style=vertical-align: middle; src= alt=DrupalTour width=940 height=752 //p a href= more/a/div/div/div

Annertech: Tough at the top (of Google) - Content Strategy, SEO, and Low Bounce Rates

Mon, 06/22/2015 - 12:44
span class=field field-node--title field-name-title field-type-string field-label-hiddenTough at the top (of Google) - Content Strategy, SEO, and Low Bounce Rates/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-itempAnnertech is #1 on Google for a number of key search phrases and when we're not, we're usually only beaten by the Drupal Ireland page from g.d.o. (a href= How did we get to the top of Google? How do we stay there? Two words: hard work - but it really revolves around two other words: content strategy. Let's get down to the details./p/div /div /div

LevelTen Interactive: DrupalCon LA 2015 Video: Mediacurrent Interview

Mon, 06/22/2015 - 07:00
img typeof=foaf:Image src= width=600 height=300 alt= / pIn last weeks' DrupalCon interview, we featured span class=s1a href= class=s2Percona/span/a./span... a href=/blog/felipa-villegas/drupalcon-la-2015-video-mediacurrent-interview class=more-linkRead more/a/p

Midwestern Mac, LLC: DrupalCamp St. Louis 2015 finished, session videos available online!

Sun, 06/21/2015 - 20:28
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item even property=content:encodedpa href= St. Louis 2015/a was held this past weekend, June 20-21, 2015, at SLU LAW in downtown St. Louis. We had nine sessions and a great keynote on Saturday, and a full sprint day on Sunday./p p style=text-align: center;img src=/sites/ width=500 height=262 alt=DrupalCamp St. Louis 2015 Registration /br / The view coming off the elevators at SLU LAW./p pEvery session was recorded (slides + audio), and you can view all the sessions online:/p ullia href=// - Finding the entrance: Why and how to get involved with the Drupal community/a/li lia href=// basics/a/li lia href=// Content Creators Through Better UX/a/li lia href=// on a TWIG: custom theme development/a/li lia href=// Drupal/a/li lia href=// of Content: Building Meaningful Content Strategies/a/li lia href=// up your Drupal Search/a/li lia href=// Performance Drupal/a/li lia href=// of designing for a CMS/a/li lia href= of Migrate in 8/a/li lia href= Session/a/li /ulpThe Camp went very well, with almost sixty participants this year! We had a great time, learned a lot together, and enjoyed some great views of downtown St. Louis (check out the picture below!), and we can't wait until next year's DrupalCamp St. Louis (to be announced)!/p /div/div/div

Wim Leers: Eaton Urbina: structured, intelligent and adaptive content

Sun, 06/21/2015 - 20:08
pWhile walking, I started listening to Jeff Eaton#8217;s qInsert Content Here/q podcast episode 25: a href= Urbina Explains Adaptive Content/q/a. People must#8217;ve looked strangely at me because I was smiling and nodding — while walkingnbsp;:) Thanks a href=http://angrylittletree.comJeff/a span class=ampamp;/span a href=http://urbinaconsulting.comNoz/a!/p pJeff Eaton explained how the web world looks at and defines the term abbr title=What You See Is What You Getspan class=capsWYSIWYG/span/abbr. Turns out that in the semi-structured, non-web world that Noz comes from, span class=capsWYSIWYG/span has a totally different interpretation. And they ended renaming it to what it really was: abbr title=What You See Is One Optionspan class=capsWYSIWOO/span/abbr./p pJeff also asked Noz what “adaptive content” is exactly. Adaptive content is a more specialized/advanced form of structured content, and in fact “structured content”, “intelligent content” and “adaptive content” form anbsp;hierarchy:/p ul listructured content ul liintelligent content ulliadaptivenbsp;content/li/ul /li /ul /li /ul pIn other words, adaptive content is also intelligent and structured; intelligent content is also structured, but not all structured content is also intelligent or adaptive, nor is all intelligent content alsonbsp;adaptive./p pBasically, intelligent content better captures the emprecise/em semantics (e.g. not a emsection/em, but a emproduct description/em). Adaptive content is about using those semantics, plus additional metadata (“hints”) that content editors specify, to adapt the content to the context it is being viewed in. E.g. different messaging for authenticated versus anonymous users, or different nuances depending on how the visitor ended up on the current page (in other words: empersonalization/em)./p pNoz gave an excellent example of how adaptive content can be put to good use: he described how we he had arrived in Utrecht in the Netherlands after a long flight, “checked in” to Utrecht on Facebook, and then Facebook suggested to him 3 emopen/em restaurants, including cuisine type and walking distance relative to his current position. He felt like thanking Facebook for these ads — which obviously is a rare thing, to be grateful fornbsp;ads!/p pFinally, a wonderful quote from Noz Urbina that captures the essence of contentnbsp;modeling:/p blockquote pHow descriptive do we make it without making itnbsp;restrictive?/p /blockquote pIf it isn#8217;t clear by now — stronggo listen to that podcast!/strong It#8217;s well worth the 38 minutes of listening. I only captured a few of the interesting points, to get more people interested and excited.sup id=fnref:1a href=#fn:1 rel=footnote1/a/sup/p h2What about adaptive span class=ampamp;/span intelligent content in Drupalnbsp;8?/h2 pFirst, see my closely related article a href=/article/drupal-8-structured-content-authoring-experienceqDrupal 8: best authoring experience for structured content?/q/a./p pSecond, while listening, I thought of many ways that Drupal 8 is well-prepared for intelligent span class=ampamp;/span adaptive content. (Drupal already does structured content by means of Field span class=capsAPI/span and the span class=capsHTML/span tag restrictions in the body field.) Implementing intelligent span class=ampamp;/span adaptive will surely require experimentation, and different sites/use cases will prefer different solutions,nbsp;but:/p ul liAn codeintelligent_content/code module for Drupal 8: allow site builders/content strategists to define custom HTML tags (e.g. codelt;product_descriptiongt;/code) to capture site-specific semantics. A a href= class=capsCKE/spanditor Widget/a could hugely simplify the authoring experience for creating intelligent content, by showing a specific span class=capsHTML/span representation while editing (abbr title=What You See Is One Optionspan class=capsWYSIWOO/span/abbr!), thanks to span class=capsHTML/span (Twig) templates associated with those custom span class=capsHTML/spannbsp;tags./li liAn codeadaptive_content/code module for Drupal 8: a text filter that allows any tag to be wrapped in a codelt;adaptive_contentgt;/code tag, which specifies the context in which the wrapped content should benbsp;shown/hidden./li liThe latter leads to cacheability problems, because the same content may be rendered in a multitude of different ways, but thanks to a href= contexts in Drupal 8/a and the fact that a href= filters can specify cache contexts/a means adaptive content that is still cacheable is perfectly possible. (This is in fact exactly what it was intended for!) cachenbsp;contexts/li /ul pI think that those two modules would be emvery/em interesting, useful additions to the Drupal ecosystem. If you are working on this, please let me know — I would love tonbsp;help!/p div class=footnotes hr / ol li id=fn:1 pThat#8217;s right, this is basically voluntary marketing for Jeff Eaton — you#8217;re welcome, Jeff!#160;a href=#fnref:1 rev=footnote#8617;/a/p /li /ol /div ul class=tags lispan class=lineage-item lineage-item-level-0Drupal/span/li lispan class=lineage-item lineage-item-level-0WYSIWYG/span/li lispan class=lineage-item lineage-item-level-0structured content/span/li /ul

Blue Drop Shop: Camp Record Beta Test Four: DrupalCamp STL 2015

Sun, 06/21/2015 - 17:58
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item even property=content:encodedpFollowing a successful MidCamp and with some new ideas how to improve the kit, I was eager to hit the road for more testing. Problem is, I'm a freelancer with a limited budget, and getting to camps comes out of my own pocket. On a lark, I tweeted the following:/p blockquotep dir=ltrPlanning a a href= and need your sessions recorded? Sponsor me amp; I will record your sessions. Ping me! a href= /cc a href= a href= p— Kevin Thull (@kevinjthull) a href= 8, 2015/a/p/blockquote pTo my delight, both Twin Cities and St. Louis camps took me up on my offer. Of course, the stakes are even higher now, because it's no longer my own money on the line./p pBut I'm also feeling more confident about this solution and improve on the process with each camp. Connecting to non-HDMI-capable laptops remains the biggest challenge overall. I've added in a couple (full) a href= target=_blankDisplayPort to HDMI converters/a and even successfully tested a new a href= target=_blankVGA to HDMI converter/a that got my ancient Sony VAIO to display on my home flatscreen:/p blockquotep dir=ltrThe new VGA to HDMI converter shows promise. My ancient Sony Vaio WinXP laptop just connected! a href= a href= p— Kevin Thull (@kevinjthull) a href= 16, 2015/a/p/blockquote pAnd at a href= target=_blankDrupalCamp STL/a I finally got the 100% success rate that I've been shooting for! Three sessions needed fixing in post, but overall, this camp went very smoothly. A huge bonus was the fact that the two rooms were next to each other, minimizing the distance to cover when trying to coordinate laptop hookups and verify timely starts and stops of the records./p pTwin Cities is next week, with a much more challenging schedule: five concurrent sessions across two buildings and multiple floors. My Fitbit will likely hit a new high. That, and I need to finally get down to some documentation and podium signage. It's time to share the knowledge I've gained and get more hands and minds involved./p pAnd now for the learnings from DCSTL:/p ulliswapping thumb drives throughout the day means recordings can be posted during camp/li liwell-timed presenter starts/stops means no trimming, which means more recordings can be posted during camp/li lione room had screen flicker and setting the PVR resolution to 1080 helped (typically, the resolution needs to come down to 720 for this, as well as fixing color shifts)/li lihaving extra SD cards means bad audio can be fixed during down times, which means more recordings can be posted during camp/li lipower strips at the podium shouldn't be assumed, and the powered USB hub and voice recorder both have short plugs/li linever plug the powered usb into the laptop, because that can kill your record if resolution changes or the laptop goes to sleep/li litaping down individual components means less cord chaos throughout the day/li liaccess to ethernet port with a reasonably large pipe going up will get videos posted faster/li /ul/div/div/divdiv class=field field-name-field-tags field-type-taxonomy-term-reference field-label-above clearfixh3 class=field-labelTags: /h3ul class=linksli class=taxonomy-term-reference-0 rel=dc:subjecta href=/tags/drupal-planet typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=drupal planet/a/lili class=taxonomy-term-reference-1 rel=dc:subjecta href=/tags/drupal-camps typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=drupal camps/a/lili class=taxonomy-term-reference-2 rel=dc:subjecta href=/tags/session-recording typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=session recording/a/lili class=taxonomy-term-reference-3 rel=dc:subjecta href=/tags/dcstl typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=dcstl/a/li/ul/div

Drupal core announcements: Requiring hook_update_N() for Drupal 8 core patches beginning June 24

Sat, 06/20/2015 - 02:58
pIn a href=[policy, no patch] Require hook_update_N() for Drupal 8 core patches beginning June 24/a, the Drupal 8 release managers outline a policy to begin requiring hook_update_N() implementations for core patches that introduce data model changes starting after the next beta release. The goal of this policy change is to start identifying common update use-cases, to uncover any limitations we have for providing update functions in core, and to prepare core developers for considering upgrade path issues as we create the last few betas and first release candidates of Drupal 8. We need your help reviewing and communicating about this proposed policy, as well as identifying core issues that will be affected. a href= the issue for more details/a./p

Drupal Association News: Updates to our 2015 Financial Plan

Fri, 06/19/2015 - 20:41
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item evenpI want to share today that the Association is implementing a new financial plan to address lower than anticipated revenues in 2015. To align our spending more closely with our revenue, we are implementing expense cuts that I’m very sorry to say include staffing. Regrettably, we are losing three staff people today from operations, engineering and our community teams. This was not a decision we came to lightly, and we’re committed to helping those staff through their transition as best we can. In this post I want to share some information about how we got here, and our revised plan./p h3 A Brief history/h3 pThis is a really hard post to write because we a href= a plan/a to the community at the beginning of 2015, and it’s clear that we are not going to be able to fully execute to that plan. I take responsibility for that./p pI started at the Association two and half years ago, at a very different time for the organization. At that point in early 2013, the Association was a handful of staff, mostly focused on the DrupalCons. The D7 upgrade of had been halted. Not without some good reason, community trust in the Association was low, and that’s among the people who even knew the Association existed./p pWhen I joined, the message I heard from the board and from the many community members I talked to was that the Association had to learn to implement consistently and communicate more. In other words, we needed to build our credibility in the community by executing our work well and making sure the community knew what we were up to and how to get involved./p pOne thing that was clear from the outset was that was key to our success. If we could not begin to make visible improvements to with the community, we would fail. With support from the board, we decided to invest our healthy reserve in ourselves and build a team that could improve As our CTO Josh Mitchel pointed out in his a href= blog post/a, we’ve done a LOT on We’ve also made great strides in DrupalCons, introducing more first-time attendee support, providing more resources to all the sprints, and adding the third Con in global communities that are so eager to have us there. Our marketing team has helped create some a href= content for Drupal 8/a and we’ve even raised over $210,000 to help a href= fund the completion of D8 release blockers,/a The revenue we generate to do this work has also increased, and diversified. We've grown the a href= Jobs/a, and rolled out a href= Drupal/a. You can see, even with our revised expectations for 2015, that things are still growing. One of our key programs, Supporting Partners, is up 26% over this same time period last year, for example. Growth of this program was only 4% in 2014./p pimg alt= src= style=width: 460px; height: 349px; border-width: 0px; border-style: solid; margin: 5px; float: left; //p p /p pSo lots of amazing things are happening, but we have to address that we overestimated what was possible for revenue. We have to adjust our plan to meet reality./p h3 Changing the Plan/h3 pAddressing our situation is not work we took lightly. We set several goals for the process that guided our thinking throughout:/p ulli Solve for short-term revenue shortfalls while retaining resources we need to succeed long-term/li li Minimize staff impact/li li Do this once - find the scenario we can truly sustain, and then grow out of/li li Retaining credibility with staff and ensuring we communicate how valuable they are for our future/li li Maintain community confidence/li /ulpThe strategy we used was two-fold. First, we strove to preserve our core services to the community and our ability to fund our own work. Second, we decided to take action as quickly as possible because the sooner we made changes to the plan, the greater the long-term benefit to the organization. We know that this second strategy makes some of this seem like it's out of the blue, but it means that we impact as few people as possible./p pOur leadership team looked at three approaches to addressing our cash flow issues:/p ulli strongIncremental revenue:/strong Our new forecast extends actuals from the beginning of 2015 out through the end of the year. We believe that it is possible for us to improve upon this forecast slightly because, although our primary mistake was overestimating revenue, we also had some staffing change-ups (a retirement, hiring new reps) on the team at the beginning of the year that adversely affected the numbers. There is some room to modestly improve our revenue from the forecast./li li strongNon-labor expense:/strong We looked at travel, consulting fees, hardware and software, among other places in the budget where we had built in buffers or non-essential expenses. Eliminating these now, and not carrying them into 2016 was a key part of our process./li li strongLabor expense:/strong This was the last option we looked at because at the end of the day, not only do all our staff give the community everything they’ve got, we really like each other here. I care deeply for the well-being of everyone at the Association. There is also lot of discussion in the business community about the long-term negative impacts of layoffs on organizations. We looked at lots of ways to reduce labor expense, but were not able to find a solution that did not include some layoffs./li /ulpUsing this process, we were able to identify $450,000 in non-labor expense savings, and increase revenue projections $250,000 from July 1 2015 through December 31 2016. That was enough to solve our 2015 revenue shortfalls, but it did not address the issues long-term. We needed to reach deeper to ensure our long-term success. We had to consider labor reductions./p pPrior to looking at any other staff, the leadership team at the Association decided that the first staff cut had to come from us. As a team, Megan, Joe, Josh, and Matt volunteered a 10% reduction, and I volunteered a 15% reduction. But we still weren’t there. Looking at the remaining labor cuts, we wanted to use a href= values/a as our guide. We know that our team believes in our teamwork value above all else, and would want to minimize layoffs as much as possible. With that in mind, we experimented with the model and determined that we could limit layoffs to three if we asked remaining staff to take a 5% pay cut across the board./p pAll told, here’s what measures look like:/p pimg alt= src= style=width: 665px; height: 196px; border-width: 0px; border-style: solid; margin: 5px; float: left; //p p /p pWe believe this approach meets our goals and puts us in the best position possible to continue the great work we’ve been doing./p h3 What Happens Next?/h3 pOn the financial front, we’ll be managing to our cash flow for the next 18 months, as well as modernizing our budgeting and forecasting tools to reflect an Agile methodology. This will let us see further into the future more often, and give us more opportunities to update our plans based on what’s actually happening. And, if we find we are performing favorably to our plan, our first action will be to restore salaries for our staff./p pMost importantly, we’re going to be focused on our team. They all got the news earlier today, and we’re taking this time to talk things through all together, in our teams, and one on one. I am here to answer questions and hear concerns for every one of them. We’ll also implement monthly internal review of our progress to the new plan with staff so that they have transparency on a monthly basis about what’s happening. These people are the best thing we have going for us, and I won’t ever be able to make this up to any of them, but I am committed to helping them find the best path forward they can./p h3 Thank you/h3 pSharing this is not easy. The only thing that makes it better is knowing that the Association, like Drupal itself, has so much potential. I want to thank our Supporters, partners, sponsors, members, and the general community for everything you’ve given us so far. The only way we will realize our potential and move forward is together, and we are so happy that we get to do that with you./p /div/div/div

LevelTen Interactive: Drupal 8: Marketer Friendly

Fri, 06/19/2015 - 19:12
img typeof=foaf:Image src= width=600 height=300 alt=drupal 8 for marketers / pThe digital marketing world keeps changing, basically every day, or whenever Google decides it’s time to change their algorithm. As a person who practices digital marketing, I know the challenges of working with a CMS and the need to for it to allow me to publish blog posts (like this one) easily and have it be mobile responsive, because who uses actual computers these days?... a href=/blog/felipa-villegas/drupal-8-marketer-friendly class=more-linkRead more/a/p

Vasily Yaremchuk: Anchors Panels Navigation Module as an Excellent Alternative to Single Page Website Module

Fri, 06/19/2015 - 18:30
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item evenh3Background/h3 pSeveral years ago I was working on my personal Web site. Even in that time One Page solutions were very popular for some presentation, personal or CV pages./p pThe main idea of such approach to put all information on one long page with several link anchors corresponding some separate sub-sections of this page./p p align=centerimg src= //p pIn 2011 a href= target=_blankSingle Page Website module/a was created. Initially a href=http://abzats.commy home page/a was done on the base of this module./p pSingle Page Website module is good out of box solution for Drupal beginners but it has a lot of weak points connected with it's architectural solution. Some more information about this module you can see in a href= target=_blankmy report on Kiev Drupal Camp 2011/a./p h3Frustration due to Single Page Website module/h3 pIt was my fault to build single page on the base of my custom solution without some prepared and ready to use approaches (a href= target=_blankViews/a or a href= target=_blankPanels/a for example) that can put several nodes or other content entities together on one page. And according incorrect architecture Single Page Website module has a lot of restrictions. The most significant one is theme restriction. Module works with limited number of themes. Also on the module there is out of box ability to have only one page with anchor navigation from menu./p p align=centerimg src= //p pSo we should have only one language One Page Website. And the last frustrated feature of the module we should have anchors links in menu only without links to some internal or external pages./p h3New Approach based on Panels/h3 pI'm start working on the other solution about one year ago, see my post a href=/blog/anchors-panels-navigation-moduleAnchors Panels Navigation Module/a. And now I have some stable version of a href= Panels Navigation Module/a with no theme restriction and with manual anchor name management./p p align=centerimg src= //p pOf course, new approach is Panel based and it require several modules to be installed. Also to set One page website driven on Anchors Panels Navigation module takes more time than on the base Of Single Page Website one. But this solution more flexible. You can use several menus, and links in blocks and content for one page navigation. Also you can use this module to set on your site several Landing Pages and the number of such pages is not limited!/p pIf you would like to set Landing Page solution on the base of Anchors Panels Navigation module you should do a lot of manual work in Drupal admin area./p olliIn addition to setup this module you should create node with type Panel and put several pieces of content in the panes./li liSet CSS IDs to each pane that should have #anchors. The name of #anchors will be equal to the names of CSS IDs./li liTo set links in menu with #hashes. You can use absolute links to your site (like I use on my personal site) or use a href= Menu Module/a (I think it is overkill approach)./li liTo make this menu fixed in the browser window. You can use a href= per Node module/a or a href= Block module/a or, of course, put required CSS code directly in your theme./li /olpAfter this steps Anchors Panels Navigation module module will take care about scroll to you anchors when visitors will click to the links and about #hash changing in browser address string. By the fact this new approach less complex than Single Page Website module. It has less PHP and JS code and cause less problems to the site developers I hope :-)/p h3What will be the next step?/h3 pAfter one year of developing and using this module I find out that Anchors Panels Navigation is not good name for this module according marketing view. It reflects some architectural semantic core of the module but there is no any ideas about module applying in the name of the module. So I would like to ask Drupal community about better name for this module./p h3Other solutions/h3 pIt is fair to mention some other solutions belong to the other developers./p pThere is Drupal Distribution a href= target=_blankOne Page CV/a created by Ukrainian Drupal Developer Artem Shymko./p pThere is a href= target=_blankSingle Page Site module/a developed by Belgium Drupal Developer Robin Ingelbrecht. This module has no theme restriction such as Single Page Website module but there is no ability do more than one Landing Page into one Drupal site also there is no anchors in address line that does not allow to send link on separate block in the One Page site. But in this module there is beautiful Next Page submodule, and it works perfect, see a href= target=_blank pPlease let me know is there are some other Drupal based solutions that I should mention here./p /div/div/divdiv class=field field-name-taxonomy-wp-blog-tags field-type-taxonomy-term-reference field-label-abovediv class=field-labelBlog tags:nbsp;/divdiv class=field-itemsdiv class=field-item evena href=/blog-tags/planet-drupalPlanet Drupal/a/div/div/div

Acquia: Drupal: Helping NGOs Civil Society in Myanmar and beyond

Fri, 06/19/2015 - 16:11
div class=form-item form-type-item labelLanguage /label Undefined /div 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 evenpWhen Tom Feichter told me he only gets to one Drupal event a year, I wanted to know why. When he told me it's because he runs a Drupal shop–a href= creative media/a–in Yangon, Myanmar, I had to know more! We talked about Tom's history in Drupal, how Drupal's multilingual capabilities have helped him, how excited he is about Drupal 8's architecture, his history working with NGOs on the Thai/Burmese border and how that has flowed into ethical digital agency work, and more./p /div /div /div figure class=field-item even rel= resource= 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= alt= title= //div !-- render the title tag as caption -- /figure span property=dc:title content=Drupal: Helping NGOs amp; Civil Society in Myanmar and beyond class=rdf-meta element-hidden/span

Code Karate: Drush: Getting started with Drush in Drupal

Fri, 06/19/2015 - 15:35
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item evenpimg src= //p/div/div/div

Blink Reaction: Building Native Apps - Part 4

Fri, 06/19/2015 - 15:00
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item even property=content:encodedh2 dir=ltrBuilding native mobile apps with Ionic Framework and Drupal back-end: request data from Drupal/h2 h3 dir=ltrDefine app constants/h3 p dir=ltrNow we have a REST server from which we will get all required data for our application. First of all let’s define an Angular constant and store some configuration variables in it - for example, where we’ll we set the base url for services requests. In the app.js file, add a new constant method with that value./p p dir=ltra href= link/a/p p dir=ltrIonic Framework comes with a couple of useful directives that can help in app building. I decided to make one small user experience improvement: when categories list our article details page as loading, we should show a loading overlay to indicate progress. To do this, we will use the a href=$ionicLoading/$ionicLoading/a service. To change its default options you must add another constant - $ionicLoadingConfig - to the app.js file./p p dir=ltra href= link/a/p h3 dir=ltrConfigure services/h3 p dir=ltrPreviously, we had defined factories for categories and articles in the services.js file, but the endpoints were empty. Now we can set them. First of all, we have to transfer newly created config objects to the factories and prefix url property value in $http options object with config.serviceBaseUrl. We should also pass the page parameter to Categories get and Articles all methods to handle pagination. And finally we set endpoint variables. Here is the final services.js:/p p dir=ltra href= link/a/p h3 dir=ltrComplete templates/h3 p dir=ltrNow we should create templates for each tab using Ionic directives. Let’s look closer at the index.html file. Here we have a main Angular directive ng-app, which defines our app on a global scope; inside it we can see a href=, the global dynamic navigation bar. Next to it there is the a href= directive; this helps to handle application routing according to the UI Router config in app.js. All template content should render inside this directive./p p dir=ltrThe first screen of our app is a tab with an all articles list, using the tab-articles template. Here we use a href= to define the tab controller scope and set the title of this page with the view-title directive. Inside this view we set the container for content with a href= Inside it we set a href= with an a href= child. Also, we set the a href= directive in ion-item. Angular should walk though all articles data and render each article with title and image; for image, we use ng-src directive instead of src attribute. At the bottom of ion-content we add a href= - it gives us an opportunity to portionally load more articles./p p dir=ltra href= link/a/p p dir=ltrThe template for the single category is very similar to the articles tab; the changes are in the link structure to the article details pages, and the view title, which in this case will be the name of the current category./p p dir=ltra href= link/a/p p dir=ltrOn the categories tab we should show the list of categories with the number of articles in each; the list item should be linked to a single category page./p p dir=ltra href= link/a/p p dir=ltrThe last template that we need is an article-details.html. Here, we will show the article image, title and body text. We use the a href= directive to render the body with its html markup, for example: paragraphs, lists, links etc../p p dir=ltra href= link/a/p h3 dir=ltrControllers/h3 p dir=ltrPreviously we have created empty controllers for all templates, so we will add the code for them now. We should start from more simple controllers: CategoriesCtrl and ArticleDetailCtrl. CategoriesCtrl are attached to the tab-categories template; we will pass the $ionicLoading service to it, to show data loading progress to user. Inside this controller we show a loading overlay calling the show method on $ionicLoading, and load categories list with Categories factory. All of our factories return promises, so after the call it method we then add the method in which we pass 2 functions: first will run on success, second on error. In this tutorial I route all error messages to the browser console./p p dir=ltra href= link/a/p p dir=ltrArticleDetailCtrl is the same, but here we get an article data by its id, which we get from the state parameter./p p dir=ltra href= link/a/p p dir=ltrCategoryCtrl and ArticlesCtrl are similar so we define a loadMore function in them, that will try to load more articles on scrolling the page down and concatenating them with articles that have been already loaded. Then it will broadcast that the infinite scroll process was completed, and there are no additional results./p p dir=ltra href= link/a/p p dir=ltra href= link/a/p p dir=ltrYou can clone and try all this code from my github a href=; to get code for this part, checkout the part4 branch(just run “git checkout -f part4”)./p h3 dir=ltrTest, build and compile/h3 p dir=ltrBefore compiling and testing an app on an emulator or real device you may run it in the browser with command “ionic serve” from you project directory./p pIf the application worked fine in your browser you can test it in emulators, but first let’s add a platform to our project with command “ionic platform add android”, if you are using a Mac you can also add iOS platform with the command “ionic platform add ios”. Before running the app in emulator you must build it and run “ionic build android” (“ionic build ios” for iOS app). Then you can try the application in emulator by running “ionic emulate android” to emulate it in the native Android emulator that comes with Android SDK, or by running “ionic run android” to use the Genymotion emulator (it is faster and has a lot of device settings), which you can get a style=font-size: 13.0080003738403px; line-height: 1.538em; href= pTo emulate iOS you must work on Mac OS and run “ionic emulate ios”./p p dir=ltrTo build apps for production you must run/p p dir=ltr“cordova build --release android”/p p dir=ltrthen navigate to project folder platforms/android/ant-build/ and generate a key to sign app -/p p dir=ltr“keytool -genkey -v -keystore starter-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000”/p p dir=ltrand sign your application -/p p dir=ltr“jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore starter-release-key.keystore CordovaApp-release-unsigned.apk alias_name”./p p dir=ltrTo optimize your apk you should run/p p dir=ltr“zipalign -v 4 CordovaApp-release-unsigned.apk TutorialApp.apk”/p p dir=ltrand you will be ready for publishing the file TutorialApp.apk in Google Play. You can find more information about publishing available a href= p /p p dir=ltrIn the next part of this series I will show how to integrate user authentication in your app with Drupal session login./p /div/div/divdiv class=field field-name-field-blog-category field-type-taxonomy-term-reference field-label-hiddendiv class=field-itemsdiv class=field-item evena href=/taxonomy/term/1 typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Drupal/a/divdiv class=field-item odda href=/taxonomy/term/2 typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Best Practices/a/divdiv class=field-item evena href=/taxonomy/term/3 typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Drupal How to/a/divdiv class=field-item odda href=/taxonomy/term/4 typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Drupal Planet/a/divdiv class=field-item evena href=/taxonomy/term/5 typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Drupal Training/a/divdiv class=field-item odda href=/taxonomy/term/8 typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Learning Series/a/div/div/divdiv class=field field-name-field-tags field-type-taxonomy-term-reference field-label-inline clearfixdiv class=field-labelPost tags:nbsp;/divdiv class=field-itemsdiv class=field-item evena href=/tags/apps typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Apps/a/divdiv class=field-item odda href=/tags/ionic typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Ionic/a/div/div/div