Drupal Planet

Syndicate content
Drupal.org - aggregated feeds in category Planet Drupal
Updated: 9 hours 55 min ago

Yuriy Babenko: Adding custom contexts to UDFs in Acquia Lift

Sun, 03/29/2015 - 8:55pm
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item even property=content:encodedpWithin the Lift ecosystem, contexts can be thought of as pre-defined functionality that makes data available to the personalization tools, when that data exists in the current state (of the site/user/environment/whatever else)./p h3Use cases/h3 pThe simplest use of contexts is in mapping their data to UDF fields on code/admin/config/content/personalize/acquia_lift_profiles/code. When the context is available, its data is assigned to a UDF field and included with Lift requests. For example, the Personalize URL Context module (part of the a href=http://www.drupal.org/project/personalize target=_blankPersonalize/a suite) does exactly this with query string contexts./p h3First steps/h3 pThe first thing to do is to implement codehook_ctools_plugin_api()/code and codehook_personalize_visitor_contexts()/code. These will make the Personalize module aware of your code, and will allow it to load your context declaration class./p pOur module is called yuba_lift:/p div class=codespan style=color: #000000 span style=color: #FF8000/**br /nbsp;*nbsp;Implementsnbsp;hook_ctools_plugin_api();br /nbsp;*/br //spanspan style=color: #007700functionnbsp;/spanspan style=color: #0000BByuba_lift_ctools_plugin_api/spanspan style=color: #007700(/spanspan style=color: #0000BB$owner/spanspan style=color: #007700,nbsp;/spanspan style=color: #0000BB$api/spanspan style=color: #007700)nbsp;{br /nbsp;nbsp;ifnbsp;(/spanspan style=color: #0000BB$ownernbsp;/spanspan style=color: #007700==nbsp;/spanspan style=color: #DD0000'personalize'nbsp;/spanspan style=color: #007700amp;amp;nbsp;/spanspan style=color: #0000BB$apinbsp;/spanspan style=color: #007700==nbsp;/spanspan style=color: #DD0000'personalize'/spanspan style=color: #007700)nbsp;{br /nbsp;nbsp;nbsp;nbsp;returnnbsp;array(/spanspan style=color: #DD0000'version'nbsp;/spanspan style=color: #007700=gt;nbsp;/spanspan style=color: #0000BB1/spanspan style=color: #007700);br /nbsp;nbsp;}br /}br /br //spanspan style=color: #FF8000/**br /nbsp;*nbsp;Implementsnbsp;hook_personalize_visitor_contexts();br /nbsp;*/br //spanspan style=color: #007700functionnbsp;/spanspan style=color: #0000BByuba_lift_personalize_visitor_context/spanspan style=color: #007700()nbsp;{br /nbsp;nbsp;/spanspan style=color: #0000BB$infonbsp;/spanspan style=color: #007700=nbsp;array();br /nbsp;nbsp;/spanspan style=color: #0000BB$pathnbsp;/spanspan style=color: #007700=nbsp;/spanspan style=color: #0000BBdrupal_get_path/spanspan style=color: #007700(/spanspan style=color: #DD0000'module'/spanspan style=color: #007700,nbsp;/spanspan style=color: #DD0000'yuba_lift'/spanspan style=color: #007700)nbsp;.nbsp;/spanspan style=color: #DD0000'/plugins'/spanspan style=color: #007700;br /br /nbsp;nbsp;/spanspan style=color: #0000BB$info/spanspan style=color: #007700[/spanspan style=color: #DD0000'yuba_lift'/spanspan style=color: #007700]nbsp;=nbsp;array(br /nbsp;nbsp;nbsp;nbsp;/spanspan style=color: #DD0000'path'nbsp;/spanspan style=color: #007700=gt;nbsp;/spanspan style=color: #0000BB$pathnbsp;/spanspan style=color: #007700.nbsp;/spanspan style=color: #DD0000'/visitor_context'/spanspan style=color: #007700,br /nbsp;nbsp;nbsp;nbsp;/spanspan style=color: #DD0000'handler'nbsp;/spanspan style=color: #007700=gt;nbsp;array(br /nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;/spanspan style=color: #DD0000'file'nbsp;/spanspan style=color: #007700=gt;nbsp;/spanspan style=color: #DD0000'YubaLift.inc'/spanspan style=color: #007700,br /nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;/spanspan style=color: #DD0000'class'nbsp;/spanspan style=color: #007700=gt;nbsp;/spanspan style=color: #DD0000'YubaLift'/spanspan style=color: #007700,br /nbsp;nbsp;nbsp;nbsp;),br /nbsp;nbsp;);br /br /nbsp;nbsp;returnnbsp;/spanspan style=color: #0000BB$info/spanspan style=color: #007700;br /}/span /span /div pThe latter hook tells Personalize that we have a class called codeYubaLift/code located at code/plugins/visitor_context/YubaLift.inc/code (relative to our module's folder)./p h3The context class/h3 pOur context class must extend the abstract codePersonalizeContextBase/code and implement a couple required methods:/p div class=codespan style=color: #000000 span style=color: #007700lt;?/spanspan style=color: #0000BBphpbr //spanspan style=color: #FF8000/**br /nbsp;*nbsp;@filebr /nbsp;*nbsp;Providesnbsp;anbsp;visitornbsp;contextnbsp;pluginnbsp;fornbsp;Customnbsp;Yubanbsp;data.br /nbsp;*/br /br //spanspan style=color: #007700classnbsp;/spanspan style=color: #0000BBYubaLiftnbsp;/spanspan style=color: #007700extendsnbsp;/spanspan style=color: #0000BBPersonalizeContextBasenbsp;/spanspan style=color: #007700{br /nbsp;nbsp;/spanspan style=color: #FF8000/**br /nbsp;nbsp;nbsp;*nbsp;Implementsnbsp;PersonalizeContextInterface::create().br /nbsp;nbsp;nbsp;*/br /nbsp;nbsp;/spanspan style=color: #007700publicnbsp;staticnbsp;functionnbsp;/spanspan style=color: #0000BBcreate/spanspan style=color: #007700(/spanspan style=color: #0000BBPersonalizeAgentInterfacenbsp;$agentnbsp;/spanspan style=color: #007700=nbsp;/spanspan style=color: #0000BBNULL/spanspan style=color: #007700,nbsp;/spanspan style=color: #0000BB$selected_contextnbsp;/spanspan style=color: #007700=nbsp;array())nbsp;{br /nbsp;nbsp;nbsp;nbsp;returnnbsp;newnbsp;/spanspan style=color: #0000BBself/spanspan style=color: #007700(/spanspan style=color: #0000BB$agent/spanspan style=color: #007700,nbsp;/spanspan style=color: #0000BB$selected_context/spanspan style=color: #007700);br /nbsp;nbsp;}br /br /nbsp;nbsp;/spanspan style=color: #FF8000/**br /nbsp;nbsp;nbsp;*nbsp;Implementsnbsp;PersonalizeContextInterface::getOptions().br /nbsp;nbsp;nbsp;*/br /nbsp;nbsp;/spanspan style=color: #007700publicnbsp;staticnbsp;functionnbsp;/spanspan style=color: #0000BBgetOptions/spanspan style=color: #007700()nbsp;{br /nbsp;nbsp;nbsp;nbsp;/spanspan style=color: #0000BB$optionsnbsp;/spanspan style=color: #007700=nbsp;array();br /br /nbsp;nbsp;nbsp;nbsp;/spanspan style=color: #0000BB$options/spanspan style=color: #007700[/spanspan style=color: #DD0000'car_color'/spanspan style=color: #007700]nbsp;nbsp;nbsp;=nbsp;array(/spanspan style=color: #DD0000'name'nbsp;/spanspan style=color: #007700=gt;nbsp;/spanspan style=color: #0000BBt/spanspan style=color: #007700(/spanspan style=color: #DD0000'Carnbsp;color'/spanspan style=color: #007700),);br /nbsp;nbsp;nbsp;nbsp;/spanspan style=color: #0000BB$options/spanspan style=color: #007700[/spanspan style=color: #DD0000'destination'/spanspan style=color: #007700]nbsp;=nbsp;array(/spanspan style=color: #DD0000'name'nbsp;/spanspan style=color: #007700=gt;nbsp;/spanspan style=color: #0000BBt/spanspan style=color: #007700(/spanspan style=color: #DD0000'Destination'/spanspan style=color: #007700),);br /br /nbsp;nbsp;nbsp;nbsp;foreachnbsp;(/spanspan style=color: #0000BB$optionsnbsp;/spanspan style=color: #007700asnbsp;amp;/spanspan style=color: #0000BB$option/spanspan style=color: #007700)nbsp;{br /nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;/spanspan style=color: #0000BB$option/spanspan style=color: #007700[/spanspan style=color: #DD0000'group'/spanspan style=color: #007700]nbsp;=nbsp;/spanspan style=color: #0000BBt/spanspan style=color: #007700(/spanspan style=color: #DD0000'Yuba'/spanspan style=color: #007700);br /nbsp;nbsp;nbsp;nbsp;}br /br /nbsp;nbsp;nbsp;nbsp;returnnbsp;/spanspan style=color: #0000BB$options/spanspan style=color: #007700;br /nbsp;nbsp;}br /}/span /span /div pThe codegetOptions/code method is what we're interested in; it returns an array of context options (individual items that can be assigned to UDF fields, among other uses). The options are grouped into a 'Yuba' group, which will be visible in the UDF selects./p pWith this code in place (and cache cleared - for the hooks above), the 'Yuba' group and its context options become available for mapping to UDFs./p h3Values for options/h3 pThe context options now need actual values. This is achieved by providing those values to an appropriate JavaScript object. We'll do this in codehook_page_build()/code./p div class=codespan style=color: #000000 span style=color: #FF8000/**br /nbsp;*nbsp;Implementsnbsp;hook_page_build();br /nbsp;*/br //spanspan style=color: #007700functionnbsp;/spanspan style=color: #0000BByuba_lift_page_build/spanspan style=color: #007700(amp;/spanspan style=color: #0000BB$page/spanspan style=color: #007700)nbsp;{br /nbsp;nbsp;/spanspan style=color: #FF8000//nbsp;buildnbsp;valuesnbsp;correspondingnbsp;tonbsp;ournbsp;contextnbsp;optionsbr /nbsp;nbsp;/spanspan style=color: #0000BB$valuesnbsp;/spanspan style=color: #007700=nbsp;array(br /nbsp;nbsp;nbsp;nbsp;/spanspan style=color: #DD0000'car_color'nbsp;/spanspan style=color: #007700=gt;nbsp;/spanspan style=color: #0000BBt/spanspan style=color: #007700(/spanspan style=color: #DD0000'Red'/spanspan style=color: #007700),br /nbsp;nbsp;nbsp;nbsp;/spanspan style=color: #DD0000'destination'nbsp;/spanspan style=color: #007700=gt;nbsp;/spanspan style=color: #0000BBt/spanspan style=color: #007700(/spanspan style=color: #DD0000'Beach'/spanspan style=color: #007700),br /nbsp;nbsp;);br /br /nbsp;nbsp;/spanspan style=color: #FF8000//nbsp;addnbsp;thenbsp;options'nbsp;valuesnbsp;tonbsp;JSnbsp;data,nbsp;andnbsp;loadnbsp;separatenbsp;JSnbsp;filebr /nbsp;nbsp;/spanspan style=color: #0000BB$page/spanspan style=color: #007700[/spanspan style=color: #DD0000'page_top'/spanspan style=color: #007700][/spanspan style=color: #DD0000'yuba_lift'/spanspan style=color: #007700]nbsp;=nbsp;array(br /nbsp;nbsp;nbsp;nbsp;/spanspan style=color: #DD0000'#attached'nbsp;/spanspan style=color: #007700=gt;nbsp;array(br /nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;/spanspan style=color: #DD0000'js'nbsp;/spanspan style=color: #007700=gt;nbsp;array(br /nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;/spanspan style=color: #0000BBdrupal_get_path/spanspan style=color: #007700(/spanspan style=color: #DD0000'module'/spanspan style=color: #007700,nbsp;/spanspan style=color: #DD0000'yuba_lift'/spanspan style=color: #007700)nbsp;.nbsp;/spanspan style=color: #DD0000'/js/yuba_lift.js'nbsp;/spanspan style=color: #007700=gt;nbsp;array(),br /nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;array(br /nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;/spanspan style=color: #DD0000'data'nbsp;/spanspan style=color: #007700=gt;nbsp;array(br /nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;/spanspan style=color: #DD0000'yuba_lift'nbsp;/spanspan style=color: #007700=gt;nbsp;array(br /nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;/spanspan style=color: #DD0000'contexts'nbsp;/spanspan style=color: #007700=gt;nbsp;/spanspan style=color: #0000BB$values/spanspan style=color: #007700,br /nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;),br /nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;),br /nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;/spanspan style=color: #DD0000'type'nbsp;/spanspan style=color: #007700=gt;nbsp;/spanspan style=color: #DD0000'setting'br /nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;/spanspan style=color: #007700),br /nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;),br /nbsp;nbsp;nbsp;nbsp;)br /nbsp;nbsp;);br /}/span /span /div pIn the example above we hardcoded our values. In real use cases, the context options' values would vary from page to page, or be entirely omitted (when they're not appropriate) - this will, of course, be specific to your individual application./p pWith the values in place, we add them to a JS setting (codeDrupal.settings.yuba_lift.contexts/code), and also load a JS file. You could store the values in any arbitrary JS variable, but it will need to be accessible from the JS file we're about to create./p h3The JavaScript/h3 pThe last piece of the puzzle is creating a new object within codeDrupal.personalize.visitor_context/code that will implement the codegetContext/code method. This method will look at the enabled contexts (provided via a parameter), and map them to the appropriate values (which were passed via codehook_page_build()/code above):/p div class=codespan style=color: #000000 span style=color: #007700(functionnbsp;($)nbsp;{br /nbsp;nbsp;/spanspan style=color: #FF8000/**br /nbsp;nbsp;nbsp;*nbsp;Visitornbsp;Contextnbsp;object.br /nbsp;nbsp;nbsp;*nbsp;Codenbsp;isnbsp;mostlynbsp;pullednbsp;togethernbsp;fromnbsp;Personalizenbsp;modules.br /nbsp;nbsp;nbsp;*/br /nbsp;nbsp;/spanspan style=color: #0000BBDrupal/spanspan style=color: #007700./spanspan style=color: #0000BBpersonalizenbsp;/spanspan style=color: #007700=nbsp;/spanspan style=color: #0000BBDrupal/spanspan style=color: #007700./spanspan style=color: #0000BBpersonalizenbsp;/spanspan style=color: #007700||nbsp;{};br /nbsp;nbsp;/spanspan style=color: #0000BBDrupal/spanspan style=color: #007700./spanspan style=color: #0000BBpersonalize/spanspan style=color: #007700./spanspan style=color: #0000BBvisitor_contextnbsp;/spanspan style=color: #007700=nbsp;/spanspan style=color: #0000BBDrupal/spanspan style=color: #007700./spanspan style=color: #0000BBpersonalize/spanspan style=color: #007700./spanspan style=color: #0000BBvisitor_contextnbsp;/spanspan style=color: #007700||nbsp;{};br /nbsp;nbsp;/spanspan style=color: #0000BBDrupal/spanspan style=color: #007700./spanspan style=color: #0000BBpersonalize/spanspan style=color: #007700./spanspan style=color: #0000BBvisitor_context/spanspan style=color: #007700./spanspan style=color: #0000BByuba_liftnbsp;/spanspan style=color: #007700=nbsp;{br /nbsp;nbsp;nbsp;nbsp;/spanspan style=color: #DD0000'getContext'/spanspan style=color: #007700:nbsp;function(/spanspan style=color: #0000BBenabled/spanspan style=color: #007700)nbsp;{br /nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;ifnbsp;(!/spanspan style=color: #0000BBDrupal/spanspan style=color: #007700./spanspan style=color: #0000BBsettings/spanspan style=color: #007700./spanspan style=color: #0000BBhasOwnProperty/spanspan style=color: #007700(/spanspan style=color: #DD0000'yuba_lift'/spanspan style=color: #007700))nbsp;{br /nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;returnnbsp;[];br /nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;}br /br /nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;varnbsp;/spanspan style=color: #0000BBinbsp;/spanspan style=color: #007700=nbsp;/spanspan style=color: #0000BB0/spanspan style=color: #007700;br /nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;varnbsp;/spanspan style=color: #0000BBcontext_valuesnbsp;/spanspan style=color: #007700=nbsp;{};br /br /nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;fornbsp;(/spanspan style=color: #0000BBinbsp;innbsp;enabled/spanspan style=color: #007700)nbsp;{br /nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;ifnbsp;(/spanspan style=color: #0000BBenabled/spanspan style=color: #007700./spanspan style=color: #0000BBhasOwnProperty/spanspan style=color: #007700(/spanspan style=color: #0000BBi/spanspan style=color: #007700)nbsp;amp;amp;nbsp;/spanspan style=color: #0000BBDrupal/spanspan style=color: #007700./spanspan style=color: #0000BBsettings/spanspan style=color: #007700./spanspan style=color: #0000BByuba_lift/spanspan style=color: #007700./spanspan style=color: #0000BBcontexts/spanspan style=color: #007700./spanspan style=color: #0000BBhasOwnProperty/spanspan style=color: #007700(/spanspan style=color: #0000BBi/spanspan style=color: #007700))nbsp;{br /nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;/spanspan style=color: #0000BBcontext_values/spanspan style=color: #007700[/spanspan style=color: #0000BBi/spanspan style=color: #007700]nbsp;=nbsp;/spanspan style=color: #0000BBDrupal/spanspan style=color: #007700./spanspan style=color: #0000BBsettings/spanspan style=color: #007700./spanspan style=color: #0000BByuba_lift/spanspan style=color: #007700./spanspan style=color: #0000BBcontexts/spanspan style=color: #007700[/spanspan style=color: #0000BBi/spanspan style=color: #007700];br /nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;}br /nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;}br /nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;br /nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;returnnbsp;/spanspan style=color: #0000BBcontext_values/spanspan style=color: #007700;br /nbsp;nbsp;nbsp;nbsp;}br /nbsp;nbsp;};br /br /})(/spanspan style=color: #0000BBjQuery/spanspan style=color: #007700);/span /span /div pThat's it! You'll now see your UDF values showing up in Lift requests. You may also want to create new column(s) for the custom UDF mappings in your Lift admin interface./p pYou can grab the completed module from a href=https://github.com/yuriybabenko/blog/tree/master/drupal7/yuba_lift target=_blankmy GitHub/a./p/div/div/divdiv class=field field-name-field-tags field-type-taxonomy-term-reference field-label-abovediv class=field-labelTags/divdiv class=field-itemsdiv class=field-item evena href=http://yuriybabenko.com/blog/tag/drupal-planet typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=drupal planet/a/divdiv class=field-item odda href=http://yuriybabenko.com/blog/tag/drupal typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=drupal/a/divdiv class=field-item evena href=http://yuriybabenko.com/blog/tag/drupal-7 typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=drupal 7/a/divdiv class=field-item odda href=http://yuriybabenko.com/taxonomy/term/83 typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=lift/a/divdiv class=field-item evena href=http://yuriybabenko.com/taxonomy/term/82 typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=personalization/a/div/div/div
Categories: Drupal Feeds

Paul Rowell: My journey in Drupal, 4 years on

Sun, 03/29/2015 - 3:38pm
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item even property=content:encodedpI’m approaching the 4 year mark at my agency and along with it my 4 year mark working with Drupal. It’s been an interesting journey so far and I’ve learned a fair bit, but, as with anything in technology, there’s still a great deal left to discover. This is my journey so far and a few key points I learned along the way./p /div/div/div
Categories: Drupal Feeds

Victor Kane: Getting Started with a Real World Application on platform.sh

Sun, 03/29/2015 - 1:20pm
!-- google_ad_section_start --pThis is the second in a series of articles involving the writing and launching of my DurableDrupal Lean ebook series website on a href=https://platform.sh/p/aa href=https://platform.sh/latform.sh/a. Since it's a real world application, this article is for real world website and web application developers. If you are starting from scratch but enthusiastic and willing to learn, that means you too. I'm fortunate enough to have their sponsorship and full technical support, so everything in the article has been tested out on the platform. A link will be edited in here as soon as it goes live./p h3 class=westernDiving in/h3 pDiving right in I setup a Trello Kanban Board for Project Inception as follows:/p pimg src=/files/images/getting-started-platformsh-kanban-01.jpg alt=Project Inception Kanban title=Project Inception Kanban width=700 height=341 //p pBoth Vision (Process, Product) and Candidate Architecture (Process, Product) jobs have been completed, and have been moved to the MVP 1 column. We know what we want to do, and we're doing it with Drupal 7, based on some initial configuration as a starting point (expressed both as an install profile and a drush configuration script). At this point there are three jobs in the To Do column, constituting the remaining preparation for the Team Product Kickoff. And two of them (setup for continuous integration and continuous delivery) are about to be made much easier by virtue of using a href=https://platform.sh/platform.sh/a, not only as a home for the production instance, but as a central point of organization for the entire development and deployment process./p h3 class=westernBeginning Continuous Integration Workflow/h3 pWhat we'll be doing in this article:/p ul lia href=http://awebfactory.com/node/537#ci-cdOvercoming the confusion between Continuous Integration and Continuous Delivery/a/li lia href=http://awebfactory.com/node/537#ansible-playbookCreate Ansible playbook to create local development VM suitable for working with platform.sh/a/li lia href=http://awebfactory.com/node/537#clone-playbookClone the playbook from GitHub into a workspace on local dev box and vagrant up/a/li lia href=#ssh-into-dev-boxssh into the local dev box, log into platform.sh and manage ssh keys/a/li lia href=#get-project-sync-dbGet the project and sync the platform server and local databases/a/li lia href=#bring-up-websiteConfigure local dev virtual host and bring up website/a/li lia href=#exercise-ci-workflowExercise CI workflow by doing an upgrade and pushing via repo to platform/abr / /li/ul!-- google_ad_section_end --div class=og_rss_groups/divpa href=http://awebfactory.com.ar/node/537 target=_blankread more/a/p
Categories: Drupal Feeds

Code Karate: Module Investigator: Fixing an issue in the Drupal Subuser module

Sat, 03/28/2015 - 9:09pm
div class=field field-name-field-episode-number field-type-number-integer field-label-abovediv class=field-labelEpisode Number:nbsp;/divdiv class=field-itemsdiv class=field-item even199/div/div/divdiv class=field field-name-field-ddod-video field-type-file field-label-hiddendiv class=field-itemsdiv class=field-item evenimg src=http://codekarate.com/sites/default/files/styles/large/public/media-youtube/adTCiLHQlJQ.jpg?itok=rjYSUPQp alt=Module Investigator: Fixing an issue in the Drupal Subuser module //div/div/divdiv class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item evenpIn the a href=https://codekarate.com/daily-dose-of-drupal/creating-hierarchy-users-drupal-subuser-module rel=nofollowlast episode/a, we learned about the a href=https://www.drupal.org/project/subuser rel=nofollowDrupal Subuser module/a. In this episode, we continue where we left off but take a look under the hood at the module code of the Drupal Subuser module./p pBy following along with this episode you will learn some things such as:/p/div/div/divdiv class=field field-name-taxonomy-vocabulary-1 field-type-taxonomy-term-reference field-label-abovediv class=field-labelTags:nbsp;/divdiv class=field-itemsdiv class=field-item evena href=/category/tags/drupalDrupal/a/divdiv class=field-item odda href=/category/tags/drupal/drupal-7Drupal 7/a/divdiv class=field-item evena href=/category/tags/drupal/module-developmentModule Development/a/divdiv class=field-item odda href=/category/tags/drupal/module-investigatorModule Investigator/a/divdiv class=field-item evena href=/category/tags/drupal-planetDrupal Planet/a/div/div/div
Categories: Drupal Feeds

Blue Drop Shop: Camp Record Beta Test Three: MidCamp 2015

Sat, 03/28/2015 - 3:08pm
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item even property=content:encodedpAfter my #epicfail that was BADCamp, to say that I was entering MidCamp with trepidation would be the understatement of the year. Two full days of sessions and a 1-and-1 track record was weighing heavily upon my soul. Add to the mix that I was coming directly off of a 5-day con my company runs, and responsible for MidCamp venue and catering logistics. Oh right, and I ran out of time to make instructions and train anyone else on setup, which only added to my on-site burden./p h2Testing is good./h2 pAfter BADCamp, I added a powered 4-port USB hub to the kits, as well as an accessory pack for the H2N voice recorder, mainly for the powered A/C adapter and remote. All total, these two items bring the current cost of the kit to about $425./p pIn addition, at one of our venue walk-throughs, I was able to actually test the kits with the projectors UIC would be using. The units in two of the rooms had an unexplainable random few-second blackout of the screens, but the records were good and the rest of the rooms checked out./p h2Success./h2 pAfter the mad scramble setting up three breakout rooms and the main stage leading up to the opening keynote, I can't begin to describe the feeling in the pit of my stomach after I pulled the USB stick after stopping the keynote recording. I can’t begin to describe the elation I felt after seeing a full record, complete with audio./p pWe hit a few snags with presenters not starting their records (fixable) and older PCs not connecting (possibly fixable), and a couple sessions that didn’t have audio (hello redundancy from the voice recorder). Aside from that, a href=https://www.drupal.org/u/froboy target=_blankfroboy/a and I were able to trim and upload all the successful records during the Sunday sprint./p pA huge shout out also goes to a href=https://www.drupal.org/u/jason.bell target=_blankjason.bell/a for helping me on-site with setups and capture. He helped me during Fox Valley’s camp, so I deputized him as soon as I saw him Friday morning./p h2Learnings./h2 pWith the addition of the powered USB hub, we no longer need to steal any ports from the presenter laptop. For all of the first day, we were unnecessarily hooking up the hub’s USB cable to the presenter laptop. Doing this caused a restart of the record kit. We did lose a session to a presenter laptop going to sleep, and I have to wonder whether we would have still captured it if the hub hadn’t been attached./p pThe VGA to HDMI dongle is too unreliable to be part of the kit. When used, either there was no connection, or it would cycle between on and off. Most, if not all, machines that didn’t have mini display port or direct HMDI out had full display port. I will be testing a display port to HDMI dongle for a more reliable option./p pRedundant audio is essential. The default record format for the voice recorders is a WAV file. These are best quality, but enormous, which is why I failed at capturing most of BADCamp’s audio (RTFM, right?). By changing the settings to 192kbs MP3, two days of session audio barely made a dent in the 2GB cards that are included with the recorders. Thankfully, this saved three session records: two with no audio at all (still a mystery) and one with blown out audio./p pTrimming and combining in YouTube is a thing. Kudos again to a href=https://www.drupal.org/u/froboy target=_blankfroboy/a for pointing me to YouTube’s editing capabilities. A couple sessions had split records (also a mystery), which we then stitched together after upload, and several sessions needed some pre- or post-record trimming. This can all be done in YouTube instead of using a video editor and re-encoding. Granted, YouTube takes what seems like forever to process, but it works and once you do the editing, you can forget about it./p pThere is a known issue with mini display port to HDMI where a green tint is added to the output. Setting the external PVR to 720p generally fixed this. There were a couple times where it didn’t, but switching either between direct HDMI or mini display port to HDMI seemed to resolve most of the issues. Sorry for the few presenters that opted for funky colors before we learned this during the camp. The recording is always fine, but the on-site experience is borked./p pFinally, we need to tell presenters to adjust their energy saver settings. I take this for granted, because the con my company runs is for marketing people who present frequently, and this is basically just assumed to be set correctly. We are a more casual bunch and don’t fret when the laptop sleeps or the screen saver comes up during a presentation. Just move the cursor and roll with it. But that can kill a record...even with the Drupal Association kits. I do plan to test this, now that I’ve learned we don’t need any power at all from the presenter laptop, but it’s still an easy fix with documentation./p h2Next steps./h2 pstrongDocumentation/strong. I need to make simple instructions sheets to include with the kits. Overall, they are really easy to use and connect, but it’s completely unfamiliar territory. With foolproof instructions, presenters can be at ease and room monitors can be tasked with assisting without fear./p pstrongPackaging/strong. With the mad dash to set these up — combined with hourly hookups — these were a hot mess on the podium. I’ll be working to tighten these up so they look less intimidating and take up less space. No idea what this entails yet, so I’ll gladly accept ideas./p pstrongTesting/strong. As mentioned, I will test regular display port to HDMI, as well as various sleep states while recording./p pstrongShipping/strong. Because these kits are so light weight, part of the plan is to be able to share them with regional camps. There was a lot of interest from other organizers in these kits during the camp. Someone from Twin Cities even offered to purchase a kit to add to the mix, as long as they could borrow the others. A Pelican box with adjustable inserts would be just the ticket./p pstrongSponsors/strong. If you are willing to help finance this project, please contact me at a href=mailto:kthull@bluedropshop.comkthull@bluedropshop.com/a. While Fox Valley Camp owns three kits and MidCamp owns one, wouldn’t it be great to have your branding on these as they make their way around the camp circuit? The equipment costs have (mostly) been reimbursed, but I’ve devoted a lot of time to testing and documenting the process, and will be spending more time with the next steps listed above./p /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/li/ul/div
Categories: Drupal Feeds

Amazee Labs: Drupal Camp Johannesburg 2015

Sat, 03/28/2015 - 2:52pm
span class=field field-node--title field-name-title field-type-string field-label-hiddenDrupal Camp Johannesburg 2015/spandiv class=field field-node--field-lead field-name-field-lead field-type-text-long field-label-hidden div class=field-items div class=field-itempToday I had the pleasure to attend Johannesburg's Drupal Camp 2015./p/div /div /div div class=field field-node--field-image field-name-field-image field-type-image field-label-hidden div class=field-items div class=field-itemimg class=image-style-blog-full src=http://www.amazeelabs.com/sites/default/files/styles/blog_full/public/759A5492_0.jpg?itok=9x-zq2vE width=580 height=387 alt=Drupal Camp Johannesburg 2015 title=Participants in the Drupal Camp Johannesburg 2015 typeof=foaf:Image / /div /div /div div class=field field-node--body field-name-body field-type-text-with-summary field-label-hidden div class=field-items div class=field-itempThe event was organized by a href=http://dasa.org.za target=_blankDASA/a that is doing a stunning job in gathering and energizing South Africa's Drupal Community. From community subjects to Drupal 8, we got to see a lekker variety of talks including those by Michael and me on Drupal 8 and How to run a successful Drupal Shop./p pSpecial thanks to the organizers Riaan, Renate, Adam, Greg and Robin. Up next will be Drupal Camp Cape Town in September 2015./p/div /div /div
Categories: Drupal Feeds

DrupalOnWindows: Adding native JSON storage support in Drupal 7 or how to mix RDBM with NoSQL

Sat, 03/28/2015 - 12:45pm
div class=form-item form-type-item labelLanguage /label English /div div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item even property=content:encodedpI rencently read a very interesting article of an all time .Net developer comparing the MEAN stack (Mongo-Express-Angluar-Node) with traditional .Net application design. (I can't post the link because I'm unable to find the article!!)./p pAmong other things he compared the tedious process of adding a new field in the RDBM model (modifying the database, then the data layer, then views and controllers), whereas in the MEAN stack it was as simple as adding two lines of code to the UI./p/div/div/divdiv class=view view-read-more view-id-read_more view-display-id-entity_view_1 view-dom-id-6282db1cb02c2d8706b54f11b24bb9da div class=view-header hr/ h2More articles.../h2 /div div class=view-content div class=item-list ul li class=views-row views-row-1 views-row-odd views-row-first div class=views-field views-field-title span class=field-contenta href=/en/blog/bypassing-form-validations-and-required-fields-drupal-bfv-moduleBypassing Form Validations and Required Fields in Drupal: the BFV module./a/span /div/li li class=views-row views-row-2 views-row-even div class=views-field views-field-title span class=field-contenta href=/en/blog/getting-2000-requests-second-without-varnishGetting #2,000 requests per second without varnish/a/span /div/li li class=views-row views-row-3 views-row-odd div class=views-field views-field-title span class=field-contenta href=/en/blog/deploying-drupal-proDeploying Drupal Like a Pro/a/span /div/li li class=views-row views-row-4 views-row-even div class=views-field views-field-title span class=field-contenta href=/en/blog/setting-code-syntax-higlighting-drupalSetting up Code Syntax Higlighting with Drupal/a/span /div/li li class=views-row views-row-5 views-row-odd div class=views-field views-field-title span class=field-contenta href=/en/blog/build-git-windows-sourcesBuild GIT on Windows from Sources/a/span /div/li li class=views-row views-row-6 views-row-even div class=views-field views-field-title span class=field-contenta href=/en/blog/git-shell-windows-reports-shexe-has-stopped-working-appcrashGit shell on Windows reports “sh.exe has stopped working (APPCRASH)”/a/span /div/li li class=views-row views-row-7 views-row-odd div class=views-field views-field-title span class=field-contenta href=/en/blog/drupal-iis-or-apacheDrupal on IIS or Apache/a/span /div/li li class=views-row views-row-8 views-row-even div class=views-field views-field-title span class=field-contenta href=/en/blog/drupal-session-handler-everything-you-need-knowDrupal Session Handler: everything you need to know/a/span /div/li li class=views-row views-row-9 views-row-odd div class=views-field views-field-title span class=field-contenta href=/en/blog/when-php-crashes-how-collect-meaningful-information-and-what-do-itWhen PHP crashes: how to collect meaningful information and what to do with it/a/span /div/li li class=views-row views-row-10 views-row-even views-row-last div class=views-field views-field-title span class=field-contenta href=/en/blog/node-comment-and-forum-working-together-boost-user-participationNode Comment and Forum working together to boost user participation/a/span /div/li /ul/div /div /div
Categories: Drupal Feeds

Lullabot: Drupalize.Me 2015 Spring Update

Fri, 03/27/2015 - 1:32pm
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item evenpThe Drupalize.Me team typically gets together each quarter to go over how we did with our goals and to plan out what we want to accomplish and prioritize in the upcoming quarter. These goals range from site upgrades to our next content sprints. A few weeks ago we all flew into Atlanta and did just that. We feel it is important to communicate to our members and the Drupal community at-large, what we've been doing in the world of Drupal training and what our plans are for the near future. What better way to do this than our own podcast./p/div/div/div ul class=field field-name-field-show-notes field-type-link-field field-label-hidden li a href=https://www.drupal.org/aaron-winborn-awardThe Aaron Winborn Award/a /li li a href=https://drupalize.me/series/whats-new-drupal-8What's New in Drupal 8 video series/a /li li a href=https://drupalize.me/blog/201503/tutorial-vagrant-drupal-8-developmentVagrant Drupal 8 Development/a /li li a href=https://assoc.drupal.org/blog/holly.ross.drupal/2015-large-board-elections-announced2015 At-Large Board Elections Announced/a /li li a href=https://www.lullabot.com/blog/news/paying-it-forward-drupal-8-acceleratePaying It Forward: Drupal 8 Accelerate/a /li li a href=https://assoc.drupal.org/d8accelerateDrupal 8 Accelerate/a /li li a href=https://events.drupal.org/losangeles2015DrupalCon Los Angeles/a /li li a href=http://lb.cm/fldrupalFlorida Drupal Camp/a /li li a href=http://frontenddesignconference.com/Frontend Design Conference, St. Petersburg, FL/a /li /ul
Categories: Drupal Feeds

LevelTen Interactive: Part 2: More Videos That Will Help You Get Started with Drupal

Fri, 03/27/2015 - 10:41am
img typeof=foaf:Image src=http://getlevelten.com/sites/default/files/styles/600x300/public/content/blog/images/drupal_7_overview-3.png?itok=e7sJ7QY3 width=600 height=300 alt= / pspan style=font-size: 16px;If you are new to Drupal, take a look at our previous blog /spanem style=font-size: 16px;a href=http://getlevelten.com/blog/kristin-yang/new-drupal-these-videos-will-help-you-get-startedNew To Drupal? These Videos Will Help You Get Started/a. /emspan style=font-size: 16px;If you just got started in Drupal, how about we provide you these short but thorough tutorial videos on /spanstrong style=font-size: 16px;Working with Content./strong... a href=/blog/felipa-villegas/part-2-more-videos-will-help-you-get-started-drupal class=more-linkRead more/a/p
Categories: Drupal Feeds

Chromatic: Integrating Recurly and Drupal

Fri, 03/27/2015 - 10:21am
div class=field field-name-body field-type-text-with-summary field-label-hidden pIf you’re working on a site that needs subscriptions, take a look at a href=https://recurly.com/Recurly/a. Recurly’s biggest strength is its simple handling of subscriptions, billing, invoices, and all that goes along with it. But how do you get that integrated into your Drupal site? Let’s walk through it./p h3There are a handful of pieces that work to connect your Recurly account and your Drupal site. /h3 olliThe Recurly span class=capsPHP/span library./li liThe recurly.js library (optional, but recommended)./li liThe Recurly module for Drupal./li /olpThe first thing you need to do is bookmark is the a href=https://docs.recurly.com/apiRecurly span class=capsAPI/span documentation./abr /iNote: The Drupal Recurly module is still using v2 of the span class=capsAPI/span. A re-write of the module to support v3 is in the works, but we have few active maintainers right now (few meaning one, and you’re looking at her). If you find this module of use or potential interest, pop into the a href=https://www.drupal.org/project/issues/recurly?categories=Allissue queue/a and lend a hand writing or reviewing patches!/i/p h3Okay, now that I’ve gotten that pitch out of the way, let’s get started./h3 pI’ll be using a new Recurly account and a fresh install of a href=https://www.drupal.org/project/drupalDrupal 7.35/a on a local a href=https://www.mamp.info/en/span class=capsMAMP/span/a environment. I’ll also be using a href=http://www.drush.org/en/master/drush/a as I go along (Not using drush?! Stop reading this and get it set up, then come back. Your life will be easier and you’ll thank us.)/p olliThe first step is to sign up at a href=https://recurly.com/https://recurly.com//a and get your account set up with your subscription plan(s). Your account will start out in a sandbox mode, and once you have everything set up with Recurly (it’s a paid service), you can switch to production mode. For our production site, we have a separate account that’s entirely in sandbox mode just for dev and QA, which is nice for testing, knowing we can’t break anything./li liRecurly is dependent on the a href=https://www.drupal.org/project/librariesLibraries/a module, so make sure you’ve got that installed (7.x-2.x version). code class=prettyprintdrush dl libraries amp;amp; drush en libraries/code/li liYou’ll need the a href=https://github.com/recurly/recurly-client-phpRecurly Client span class=capsPHP/span library/a, which you’ll need to put into code class=prettyprintsites/all/libraries/recurly/code. This is also an open-source, community-supported library, using v2 of the Recurly span class=capsAPI/span. If you’re using a href=http://getcomposer.org/composer/a, you can set this as a dependency. You will probably have to make the libraries directory. From the root of your installation, run code class=prettyprintmkdir sites/all/libraries/code./li liYou need the a href=https://www.drupal.org/project/recurlyRecurly module/a, which comes with two sub-modules: Recurly Hosted Pages and Recurly.js. code class=prettyprintdrush dl recurly amp;amp; drush en recurly/code/li liIf you are using Recurly.js, you will need that library, v2 of which a href=https://github.com/recurly/recurly-js/tree/v2can be found here/a. This will need to be placed into code class=prettyprintsites/all/libraries/recurly-js/code.br / Your code class=prettyprint/libraries//code directory should look something like this now:br /img src=http://blog-media.chromaticsites.com.s3.amazonaws.com/recurly-tutorial/image05.png alt= //li /olh2Which integration option is best for my site?/h2 h3There are three different ways to use Recurly with Drupal. /h3 pYou can just use the library and the module, which include some built-in pages and basic functionality. If you need a great deal of customization and your own functionality, this might be the option for you./p pRecurly offers hosted pages, for which there is also a Drupal sub-module. This is the least amount of integration with Drupal; your site won’t be handling any of the account management. If you are low on dev hours or availability, this may be a good option./p pThirdly, and this is the option we are using for one of our clients and demonstrating in this tutorial, you can use the recurly.js library (there is a sub-module to integrate this). Recurly.js is a client-side credit-card authorization service which keeps credit card data from ever touching your server. Users can then make payments directly from your site, but with much less responsibility on your end. You can still do a great deal of customization around the forms – this is what we do, as well as customized versions of the built-in pages./p pbPlease note/b: Whichever of these options you choose, your site will still need a level of span class=capsPCI/span-span class=capsDSS/span Compliance (Payment Card Industry Data Security Standard). You can read more about span class=capsPCI/span Compliance a href=https://docs.recurly.com/pci-dss-compliancehere/a. This is inot/i prohibitively complex or difficult, and just requires a self-assessment questionnaire./p h3Settings/h3 pYou should now have everything in the right place. Let’s get set up./p olliGo to yoursite.dev/admin/config (just click bConfiguration/b at the top) and you’ll see bRecurly/b under bWeb Services/b. img src=http://blog-media.chromaticsites.com.s3.amazonaws.com/recurly-tutorial/image02.png alt= //li liYou’ll now see a form with a handful of settings. Here’s where to find the values in your Recurly account. Once you set up a subscription plan in Recurly, you’ll find yourself on this page. On the right hand side, go to bspan class=capsAPI/span Credentials/b. You may have to scroll down or collapse some menus in order to see it. img src=http://blog-media.chromaticsites.com.s3.amazonaws.com/recurly-tutorial/image03.png alt= //li liYour bPrivate span class=capsAPI/span Key/b is the first key found on this page (I’ve blocked mine out): img src=http://blog-media.chromaticsites.com.s3.amazonaws.com/recurly-tutorial/image12.png alt= //li liNext, you’ll need to go to bManage Transparent Post Keys/b on the right. You will not need the public key, as it’s not used in Recurly.js v2./li liClick to bEnable Transparent Post and Recurly.js v2 span class=capsAPI/span/b. img src=http://blog-media.chromaticsites.com.s3.amazonaws.com/recurly-tutorial/image00.png alt= //li liNow you’ll see your key. This is the value you’ll enter into the bTransparent Post Private Key/b field. img src=http://blog-media.chromaticsites.com.s3.amazonaws.com/recurly-tutorial/image11.png alt= //li liThe last basic setup step is to enter your bsubdomain/b. iThe help text for this field is currently incorrect as of 3/26/2015 and will be corrected in the next release. It is correct in the a href=http://cgit.drupalcode.org/recurly/plain/README.txt?id=refs/heads/7.x-1.xspan class=capsREADME/span file/a, and on the a href=https://www.drupal.org/project/recurlyproject page/a. There is no longer a -test suffix for sandbox mode./i Copy your bsubdomain/b either from the address bar or from the bSite Settings/b. You don’t need the entire url, so in my case, the subdomain is balanna-demo/b. img src=http://blog-media.chromaticsites.com.s3.amazonaws.com/recurly-tutorial/image07.png alt= //li liWith these settings, you can accept the rest of the default values and be ready to go. The rest of the configuration is specific to how you’d like to set up your account, how your subscription is configured, what fields you want to record in Recurly, how much custom configuration you want to do, and what functionality you need. The next step, if you are using Recurly’s built-in pages, is to enable your subscription plans. In Drupal, head over to the bSubscription Plans/b tab and enable the plans you want to use on your site. Here I’ve just created one test plan in Recurly. Check the boxes next to the plan(s) you want enabled, and click bUpdate Plans/b. img src=http://blog-media.chromaticsites.com.s3.amazonaws.com/recurly-tutorial/image04.png alt= //li /olh3Getting Ready for Customers/h3 pSo you have Recurly integrated, but how are people going to use it on your Drupal site? Good question. For this tutorial, we’ll use Recurly.js. Make sure you enable the submodule if you haven’t already: code class=prettyprintdrush en recurlyjs/code. Now you’ll see some new options on the Recurly admin setting page. img src=http://blog-media.chromaticsites.com.s3.amazonaws.com/recurly-tutorial/image10.png alt= //p pI’m going to keep the defaults for this example. Now when you go to a user account page, you’ll see a bSubscription/b tab with the option to sign up for a plan. img src=http://blog-media.chromaticsites.com.s3.amazonaws.com/recurly-tutorial/image01.png alt= //p pClicking bSign up/b will bring you to the signup page provided by Recurly.js. img src=http://blog-media.chromaticsites.com.s3.amazonaws.com/recurly-tutorial/image08.png alt= //p pAfter filling out the fields and clicking bPurchase/b, you’ll see a handful of brand new tabs. I set this subscription plan to have a trial period, which is reflected here. img src=http://blog-media.chromaticsites.com.s3.amazonaws.com/recurly-tutorial/image06.png alt= //p pKeep in mind, this is the default Drupal theme with no styling applied at all. If you head over to your Recurly account, you’ll see this new subscription. img src=http://blog-media.chromaticsites.com.s3.amazonaws.com/recurly-tutorial/image09.png alt= //p pThere are a lot of configuration options, but your site is now integrated with Recurly. You can sign up, change, view, and cancel accounts. If you choose to use coupons, you can do that as well, and we’ve done all of this without any custom code./p pIf you have any questions, please a href=https://docs.recurly.com/read the documentation/a, or head over to the a href=https://www.drupal.org/project/recurlyRecurly project page on Drupal.org/a and see if it’s answered in the issue queue. If not, make sure to submit your issue so that we can address it!/p /div
Categories: Drupal Feeds

Deeson: Drush Registry Rebuild

Fri, 03/27/2015 - 9:30am
img src=https://d5av3fo92eabs.cloudfront.net/sites/default/files/styles/image_400_width/public/lead_image/drush_rr.jpg?itok=nm1dkFCZ width=400 height=674 alt=Registry Rebuild title=Registry Rebuild / img src=https://d5av3fo92eabs.cloudfront.net/sites/default/files/styles/image_400_width/public/lead_image/drush_rr.jpg?itok=nm1dkFCZ width=400 height=674 alt=Registry Rebuild title=Registry Rebuild / pstrongKeep Calm and Clear Cache!/strong/p pThis is an often used phrase in Drupal land. Clearing cache fixes many issues that can occur in Drupal, usually after a change is made and then isn't being reflected on the site./p pBut sometimes, clearing cache isn't enough and a registry rebuild is in order./p pThe Drupal 7 registry contains an inventory of all classes and interfaces for all enabled modules and Drupal's core files. The registry stores the path to the file that a given class or interface is defined in, and loads the file when necessary. On occasion a class maybe moved or renamed and then Drupal doesn't know where to find it and what appears to be unrecoverable problems occur./p pOne such example might be if you move the location of a module. This can happen if you have taken over a site and all the contrib and custom modules are stored in the sites/all/modules folder and you want to separate that out into sites/all/modules/contrib and sites/all/modules/custom.  After moving the modules into your neat sub folders, things stop working and clearing caches doesn't seem to help./p pEnter, a href=https://drupal.org/project/registry_rebuildregistry rebuild/a.  This isn't a module, its a drush command. After downloading from drupal.org, the registry_rebuild folder should be placed into the directory sites/all/drush./p pYou should then clear the drush cache so drush knows about the new command/p pemdrush cc drush/em/p pThen you are ready to rebuild the registry/p pemdrush rr/em/p pRegistry rebuild is a standard tool we use on all projects now and forms part of our deployment scripts when new code is deployed to an environment./p pSo the next time you feel yourself about to tear your hair out and you've run clear cache ten times, keep calm and give registry rebuild a try./p
Categories: Drupal Feeds

Joachim's blog: A script for making patches

Fri, 03/27/2015 - 8:46am
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item even property=content:encodedpI have a standard format for patchnames: 1234-99.project.brief-description.patch, where 1234 is the issue number and 99 is the (expected) comment number. However, it involves two copy-pastes: one for the issue number, taken from my browser, and one for the project name, taken from my command line prompt./p pSome automation of this is clearly possible, especially as I usually name my git branches 1234-brief-description. More automation is less typing, and so in true XKCD condiment-passing style, I've now written that script, which you can find on github as a href=https://github.com/joachim-n/dorgpatchdorgpatch/a. (The hardest part was thinking of a good name, and as you can see, in the end I gave up.)/p pOut of the components of the patch name, the issue number and description can be deduced from the current git branch, and the project from the current folder. For the comment number, a bit more work is needed: but drupal.org now has a public API, so a simple REST request to that gives us data about the issue node including the comment count./p pSo far, so good: we can generate the filename for a new patch. But really, the script should take care of doing the diff too. That's actually the trickiest part: figuring out which branch to diff against. It requires a bit of git branch wizardry to look at the branches that the current branch forks off from, and some regular expression matching to find one that looks like a Drupal development branch (i.e., 8.x-4.x, or 8.0.x). It's probably not perfect; I don't know if I accounted for a possibility such as 8.x-4.x branching off a 7.x-3.x which then has no further commits and so is also reachable from the feature branch./p pThe other thing this script can do is create a tests-only patch. These are useful, and generally advisable on drupal.org issues, to demonstrate that the test not only checks for the correct behaviour, but also fails for the problem that's being fixed. The script assumes that you have two branches: the one you're on, 1234-brief-description, and also one called 1234-tests, which contains only commits that change tests./p pThe git workflow to get to that point would be:/p olliCreate the branch 1234-brief-description /liliMake commits to fix the bug /liliCreate a branch 1234-tests /liliMake commits to tests (I assume most people are like me, and write the tests after the fix) /liliMove the string of commits that are only tests so they fork off at the same point as the feature branch: git rebase --onto 8.x-4.x 1234-brief-description 1234-tests /liliGo back to 1234-brief-description and do: git merge 1234-tests, so the feature branch includes the tests. /liliIf you need to do further work on the tests, you can repeat with a temporary branch that you rebase onto the tip of 1234-tests. (Or you can cherry-pick the commits. Or do cherry-pick with git rev-list, which is a trick I discovered today.) /li/olpNext step will be having the script make an interdiff file, which is a task I find particularly fiddly./p /div/div/divdiv class=field field-name-field-tags field-type-taxonomy-term-reference field-label-inline clearfixdiv class=field-labelTags:nbsp;/divdiv class=field-itemsdiv class=field-item even rel=dc:subjecta href=/taxonomy/term/46 typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=git/a/divdiv class=field-item odd rel=dc:subjecta href=/taxonomy/term/49 typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=patching/a/divdiv class=field-item even rel=dc:subjecta href=/taxonomy/term/54 typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=drupal.org/a/divdiv class=field-item odd rel=dc:subjecta href=/taxonomy/term/55 typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=workflow/a/div/div/divul class=links inlineli class=comment-add first lasta href=/comment/reply/34#comment-form title=Share your thoughts and opinions related to this posting.Add new comment/a/li /ul
Categories: Drupal Feeds

agoradesign: Introducing the Outdated Browser module

Fri, 03/27/2015 - 8:25am
div class=field field-name-body field-type-text-with-summary field-label-hidden div class=field-items div class=field-item evenWe proudly present our first official drupal.org project, which we released about two months ago: the Outdated Browser module. It detects outdated browsers and advises users to upgrade to a new version - in a very pretty looking way./div /div /div
Categories: Drupal Feeds

Drupal Watchdog: Entity Storage, the Drupal 8 Way

Fri, 03/27/2015 - 7:18am
div class=field field--body field-type-text-with-summary field-label-hidden field--rss pIn Drupal 7 the Field API introduced the concept of emswappable field storage/em. This means that field data can live in any kind of storage, for instance a NoSQL database like MongoDB, provided that a corresponding backend is enabled in the system. This feature allows support of some nice use cases, like remotely-stored entity data or exploit storage backends that perform better in specific scenarios. However it also introduces some problems with entity querying, because a query involving conditions on two fields might end up needing to query two different storage backends, which may become impractical or simply unfeasible./p pThat's the main reason why in Drupal 8, we switched from field-based storage to ementity-based storage/em, which means that all fields attached to an entity type share the same storage backend. This nicely resolves the querying issue without imposing any practical limitation, because to obtain a truly working system you were basically forced to configure all fields attached to the same entity type to share the same storage engine. The main feature that was dropped in the process, was the ability to share a field between different entity types, which was another design choice that introduced quite a few troubles on its own and had no compelling reason to exist./p pWith this change each entity type has a dedicated storage handler, that for emfieldable/em entity types is responsible for loading, storing, and deleting field data. The storage handler is defined in the span class=geshifiltercode class=php geshifilter-phphandlers/code/span section of the entity type definition, through the span class=geshifiltercode class=php geshifilter-phpstorage/code/span key (surprise!) and can be swapped by modules implementing span class=geshifiltercode class=php geshifilter-phphook_entity_type_alter()/code/span./p h2Querying Entity Data/h2 pSince we now support pluggable storage backends, we need to write storage-agnostic contrib code. This means we cannot assume entities of any type will be stored in a SQL database, hence we need to rely more than ever on the a href=https://api.drupal.org/api/drupal/namespace/Drupal!Core!Entity!Query/8Entity Query API/a, which is the successor of the Entity Field Query system available in Drupal 7. This API allows you to write complex queries involving relationships between entity types (implemented via entity reference fields) and aggregation, without making any assumption on the underlying storage. Each storage backend requires a corresponding entity query backend, translating the generic query into a storage-specific one. For instance, the default SQL query backend translates entity relationships to span class=geshifiltercode class=php geshifilter-phpJOIN/code/spans between entity data tables./p pEntity identifiers can be obtained via an entity query or any other viable means, but emexisting entity (field) data should always be obtained from the storage handler via a load operation/em. Contrib module authors should be aware that retrieving partial entity data via direct DB queries is a deprecated approach and is strongly discouraged. In fact by doing this you are actually completely bypassing many layers of the Entity API, including the entity cache system, which is likely to make your code less performant than the recommended approach. Aside from that, your code will break as soon as the storage backend is changed, and may not work as intended with modules correctly exploiting the API. The only legal usage of backend-specific queries is when they cannot be expressed through the Entity Query API. However also in this case only entity identifiers should be retrieved and used to perform a regular (multiple) load operation./p h2Storage Schema/h2 pProbably one of the biggest changes introduced with the Entity Storage API, is that now the storage backend is responsible for managing its own schema, if it uses any. Entity type and field definitions are used to derive the information required to generate the storage schema. For instance the core SQL storage creates (and deletes) all the tables required to store data for the entity types it manages. An entity type can define a storage schema handler via the aptly-named span class=geshifiltercode class=php geshifilter-phpstorage_schema/code/span key in the span class=geshifiltercode class=php geshifilter-phphandlers/code/span section of the entity type definition. However it does not need to define one if it has no use for it./p pUpdates are also supported, and they are managed via the regular DB updates UI, which means that the schema will be adapted when the entity type and field definitions change or are added or removed. The definition update manager also triggers some events for a href=https://api.drupal.org/api/drupal/core!lib!Drupal!Core!Entity!EntityTypeEvents.php/class/EntityTypeEvents/8entity type/a and a href=https://api.drupal.org/api/drupal/core!lib!Drupal!Core!Field!FieldStorageDefinitionEvents.php/class/FieldStorageDefinitionEvents/8field definitions/a, that can be useful to react to the related changes. It is important to note that emnot all kind of changes are allowed/em: if a change implies a data migration, Drupal will refuse to apply it and a migration (or a manual adjustment) will be required to proceed./p pThis means that if a module requires an additional field on a particular entity type to implement its business logic, emit just needs to provide a field definition/em and apply changes (there is also an a href=https://api.drupal.org/api/drupal/core!lib!Drupal!Core!Entity!EntityDefinitionUpdateManagerInterface.php/function/EntityDefinitionUpdateManagerInterface%3A%3AapplyUpdates/8API/a available to do this) and the system will do the rest. The schema will be created, if needed, and field data will be natively loaded and stored. This is definitely a good reason to define every piece of data attached to an entity type as a field. However if for any reason the system-provided storage were not a good fit, a field definition can specify that it has a href=https://api.drupal.org/api/drupal/core!lib!Drupal!Core!Field!BaseFieldDefinition.php/function/BaseFieldDefinition%3A%3AsetCustomStorage/8custom storage/a, which means the field provider will handle storage on its own. A typical example are computed fields, which may need no storage at all./p h2Core SQL Storage/h2 pThe default storage backend provided by core is obviously SQL-based. It distinguishes between emshared/em field tables and emdedicated/em field tables: the former are used to store data for all the single-value embase fields/em, that is fields attached to every bundle like the node title, while the latter are used to store data for multiple-value base fields and embundle fields/em, which are attached only to certain bundles. As the name suggests, dedicated tables store data for just one field./p pThe default storage supports four different shared table layouts depending on whether the entity type is emtranslatable/em and/or emrevisionable/em:/p ulli emSimple/em entity types use only a single table, the embase table/em, to store all base field data. pre | entity_id | uuid | bundle_name | label | … | /pre/li li emTranslatable/em entity types use two shared tables: the base table stores entity keys and metadata only, while the emdata table/em stores base field data per language. pre | entity_id | uuid | bundle_name | langcode | | entity_id | bundle_name | langcode | default_langcode | label | … | /pre/li li emRevisionable/em entity types also use two shared tables: the base table stores all base field data, while the emrevision table/em stores revision data for revisionable base fields and revision metadata. pre | entity_id | revision_id | uuid | bundle_name | label | … | | entity_id | revision_id | label | revision_timestamp | revision_uid | revision_log | … | /pre/li li emTranslatable and revisionable/em entity types use four shared tables, combining the types described above: the base table stores entity keys and metadata only, the data table stores base field data per language, the revision table stores basic entity key revisions and revision metadata, and finally the emrevision data table/em stores base field revision data per language for revisionable fields. pre | entity_id | revision_id | uuid | bundle_name | langcode | | entity_id | revision_id | bundle_name | langcode | default_langcode | label | … | | entity_id | revision_id | langcode | revision_timestamp | revision_uid | revision_log | | entity_id | revision_id | langcode | default_langcode | label | … | /pre/li /ulpThe SQL storage schema handler supports switching between these different table layouts, if the entity type definition changes and no data is stored yet./p pCore SQL storage aims to support any table layout, hence modules explicitly targeting a SQL storage backend, like for instance Views, should rely on the a href=https://api.drupal.org/api/drupal/core!lib!Drupal!Core!Entity!Sql!TableMappingInterface.php/interface/TableMappingInterface/8Table Mapping API/a to build their queries. This API allows retrieval of information about where field data is stored and thus is helpful to build queries without hard-coding assumptions about a particular table layout. At least this is the theory, however core currently does not fully support this use case, as some required changes have not been implemented yet (more on this below). Core SQL implementations currently rely on the specialized a href=https://api.drupal.org/api/drupal/core!lib!Drupal!Core!Entity!Sql!DefaultTableMapping.php/class/DefaultTableMapping/8DefaultTableMapping/a class, which assumes one of the four table layouts described above./p h2A Real Life Example/h2 pWe will now have a look at a a href=https://github.com/plach79/d8-active-userssimple module/a exemplifying a typical use case: we want to display a list of emactive users/em having created at least one published node, along with the total number of nodes created by each user and the title of the most recent node. Basically a simple emtracker/em./p pimg src=http://cdn1.drupalwatchdog.com/sites/default/files/active-users-list-small.png class=img-responsive margin-left img-thumbnail title=User activity tracker alt=User activity tracker //p pDisplaying such data with a single query can be complex and will usually lead to very poor performance, unless the number of users on the site is quite small. A typical solution in these cases is to rely on denormalized data that is calculated and stored in a way that makes it easy to query efficiently. In our case we will add two fields to the span class=geshifiltercode class=php geshifilter-phpUser/code/span entity type to track the last node and the total number of nodes created by each user:/p pre function active_users_entity_base_field_info(EntityTypeInterface $entity_type) { $fields = []; if ($entity_type-gt;id() == 'user') { $fields['last_created_node'] = BaseFieldDefinition::create('entity_reference') -gt;setLabel('Last created node') -gt;setRevisionable(TRUE) -gt;setSetting('target_type', 'node') -gt;setSetting('handler', 'default'); $fields['node_count'] = BaseFieldDefinition::create('integer') -gt;setLabel('Number of created nodes') -gt;setRevisionable(TRUE) -gt;setDefaultValue(0); } return $fields; } /prep Note that fields above are marked as revisionable so that if the span class=geshifiltercode class=php geshifilter-phpUser/code/span entity type itself is marked as revisionable, our fields will also be revisioned. The revisionable flag is ignored on non-revisionable entity types./p pAfter enabling the module, the status report will warn us that there are DB updates to be applied. Once complete, we will have two new columns in our span class=geshifiltercode class=php geshifilter-phpuser_field_data/code/span table ready to store our data. We will now create a new span class=geshifiltercode class=php geshifilter-phpActiveUsersManager/code/span service responsible for encapsulating all our business logic. Let's add an span class=geshifiltercode class=php geshifilter-phpActiveUsersManager::onNodeCreated()/code/span method that will be called from a span class=geshifiltercode class=php geshifilter-phphook_node_insert/code/span implementation:/p pre public function onNodeCreated(NodeInterface $node) { $user = $node-gt;getOwner(); $user-gt;last_created_node = $node; $user-gt;node_count = $this-gt;getNodeCount($user); $user-gt;save(); } protected function getNodeCount(UserInterface $user) { $result = $this-gt;nodeStorage-gt;getAggregateQuery() -gt;aggregate('nid', 'COUNT') -gt;condition('uid', $user-gt;id()) -gt;execute(); return $result[0]['nid_count']; } /prep As you can see this will track exactly the data we need, using an aggregated entity query to compute the number of created nodes./p pSince we need to also act on node deletion (span class=geshifiltercode class=php geshifilter-phphook_node_delete/code/span), we need to add a few more methods:/p pre public function onNodeDeleted(NodeInterface $node) { $user = $node-gt;getOwner(); if ($user-gt;last_created_node-gt;target_id == $node-gt;id()) { $user-gt;last_created_node = $this-gt;getLastCreatedNode($user); } $user-gt;node_count = $this-gt;getNodeCount($user); $user-gt;save(); } protected function getLastCreatedNode(UserInterface $user) { $result = $this-gt;nodeStorage-gt;getQuery() -gt;condition('uid', $user-gt;id()) -gt;sort('created', 'DESC') -gt;range(0, 1) -gt;execute(); return reset($result); } /prep In the case where the user's last created node is the one being deleted, we use a regular entity query to retrieve an updated identifier for the user's last created node./p pNice, but we still need to display our list. To accomplish this we add one last method to our manager service to retrieve the list of active users:/p pre public function getActiveUsers() { $ids = $this-gt;userStorage-gt;getQuery() -gt;condition('status', 1) -gt;condition('node_count', 0, 'gt;') -gt;condition('last_created_node.entity.status', 1) -gt;sort('login', 'DESC') -gt;execute(); return User::loadMultiple($ids); } /prep As you can see, in the entity query above we effectively expressed a relationship between the span class=geshifiltercode class=php geshifilter-phpUser/code/span entity and the span class=geshifiltercode class=php geshifilter-phpNode/code/span entity, imposing a condition using the span class=geshifiltercode class=php geshifilter-phpentity/code/span a href=https://api.drupal.org/api/drupal/core!lib!Drupal!Core!Entity!Query!QueryInterface.php/function/QueryInterface%3A%3Acondition/8syntax/a, that is implemented through a span class=geshifiltercode class=php geshifilter-phpJOIN/code/span by the SQL entity query backend./p pFinally we can invoke this method in a separate controller class responsible for building the list markup:/p pre public function view() { $rows = []; foreach ($this-gt;manager-gt;getActiveUsers() as $user) { $rows[]['data'] = [ String::checkPlain($user-gt;label()), intval($user-gt;node_count-gt;value), String::checkPlain($user-gt;last_created_node-gt;entity-gt;label()), ]; } return [ '#theme' =gt; 'table', '#header' =gt; [$this-gt;t('User'), $this-gt;t('Node count'), $this-gt;t('Last created node')], '#rows' =gt; $rows, ]; } /prep This approach is way more performant when numbers get big, as we are running a very fast query involving only a single span class=geshifiltercode class=php geshifilter-phpJOIN/code/span on indexed columns. We could even skip it by adding more denormalized fields to our span class=geshifiltercode class=php geshifilter-phpUser/code/span entity, but I wanted to outline the power of the span class=geshifiltercode class=php geshifilter-phpentity/code/span syntax. A possible further optimization would be collecting all the identifiers of the nodes whose titles are going to be displayed and preload them in a single multiple load operation preceding the loop./p pAside from the performance considerations, you should note that this code is emfully portable/em: as long as the alternative backend complies with the Entity Storage and Query APIs, the result you will get will be the same. Pretty neat, huh?/p h2What's Left?/h2 pWhat I have shown above is working code, you can use it right now in Drupal 8. However there are still quite some open issues before we can consider the Entity Storage API polished enough:/p ulli Switching between table layouts is supported by the API, but storage handlers for core entity types still assume the default table layouts, so they need to be adapted to rely on table mappings before we can actually change translatability or revisionability for their entity types. See a href=https://www.drupal.org/node/2274017https://www.drupal.org/node/2274017/a and follow-ups. /li li In the example above we might have needed to add indexes to make our query more performant, for example, if we wanted to sort on the total number of nodes created. This is not supported yet, but of course «there's an issue for that!» See a href=https://www.drupal.org/node/2258347https://www.drupal.org/node/2258347/a. /li li There are cases when you need to provide an initial value for new fields, when entity data already exists. Think for instance to the emFile entity/em module, that needs to add a bundle column to the core span class=geshifiltercode class=php geshifilter-phpFile/code/span entity. Work is also in progress on this: a href=https://www.drupal.org/node/2346019https://www.drupal.org/node/2346019/a. /li liLast but not least, most of the time we don't want our users to go and run updates after emenabling/em a module, that's bad UX! Instead a friendlier approach would be automatically applying updates under the hood. Guess what? You can join us at a href=https://www.drupal.org/node/2346013https://www.drupal.org/node/2346013/a./li /ulpYour help is welcome :)/p h2So What?/h2 pWe have seen the recommended ways to store and retrieve entity field data in Drupal 8, along with (just a few of) the advantages of relying on field definitions to write simple, powerful and portable code. Now, Drupal people, go and have fun!/p /div div class=field field--images field-type-image field-label-above field--rss div class=field-labelImages:nbsp;/div img typeof=foaf:Image class=img-responsive src=http://cdn1.drupalwatchdog.com/sites/default/files/active-users-list-small.png width=500 height=399 alt= / /div
Categories: Drupal Feeds

Annertech: Some recent fun we've had Mapping with Drupal

Fri, 03/27/2015 - 6:31am
span class=field field-node--title field-name-title field-type-string field-label-hiddenSome recent fun we#039;ve had Mapping with Drupal/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-itempPeople love maps. People love being able to visually understand how locations relate to each other. And since the advent of Google Maps, people love to pan and zoom, to click and swipe. But what people hate, is a shoddy mapping experience. Mapping can be hard, but fortunately, Drupal takes a lot of the pain away./p h3Why map?/h3 pYou might want a map if you:/p/div /div /div
Categories: Drupal Feeds

Chen Hui Jing: 542 days as a Drupal developer

Thu, 03/26/2015 - 7:00pm
pI’ve just listened to the latest episode of the a href=https://modulesunraveled.com/Modules Unraveled/a podcast by a href=https://twitter.com/ModsUnraveledBryan Lewis/a, which talked about a href=https://modulesunraveled.com/podcast/131-job-market-drupal-mike-anello-modules-unraveled-podcastThe current job market in Drupal/a. And it made me think about my own journey as a Drupal developer, from zero to reasonably competent (I hope). The thing about this industry is that everything seems to move faster and faster. There’s a best new tool or framework released every other day. Developers are creating cool things all the time. And I feel like I’m constantly playing catch-up. But looking back to Day 1, I realised that I did make quite a bit of progress since then./p h3 id=learning-on-the-jobLearning on the job/h3 pI’ve been gainfully employed as a Drupal architect...
Categories: Drupal Feeds

Isovera Ideas Insights: 6 Ways to Increase ROI on Your Drupal Project

Thu, 03/26/2015 - 5:28pm
div class=field field-name-field-teaser-text field-type-text-long field-label-hiddendiv class=field-itemsdiv class=field-item evenDrupal is a great choice for your enterprise-level web application project, and maybe even your website. Like every other framework under the sun, it’s also a terrible choice if you’re cavalier about the management of its implementation. Things go awry, scope creeps, budgets get drained, and hellfire rains down from the sky… You get it. The good news is that there are steps you can take to prevent this from happening./div/div/div
Categories: Drupal Feeds

Palantir: Increasing Velocity and Drupal 8

Thu, 03/26/2015 - 5:12pm
span class=featured-blog-image img typeof=foaf:Image src=http://www.palantir.net/sites/default/files/styles/bloglandingpage-thumbnail/public/blog/images/D8Accelerate_20150326-01.png?itok=YL4Nssjy width=262 height=175 alt=Drupal 8 Accelerate title=Drupal 8 Accelerate / /span pPalantir CEO Tiffany Farriss recently keynoted a href=http://2015.midcamp.org/MidCamp/a here in Chicago where she spoke about the economics of Drupal contribution. In it, she explored some of the challenges of open-source contribution, showing how similar projects like Linux have managed growth and releases, and what the Drupal Association might do to help push things along toward a Drupal 8 release. You can give a href=https://www.youtube.com/watch?v=gDO1C0ijLcMher presentation/a a watch here. /p pWith this post, we want to highlight one of the important takeaways from the keynote: a href=https://www.crowdrise.com/d8accelerate/fundraiser/tiffanyfarrissthe Drupal 8 Accelerate Fund/a./p pSome of you are clients and use Drupal for your sites, others build those sites for clients around the world, and still others provide technology that enhances Drupal greatly. We also know that Drupal 8 is going to be a game changer for us and our clients a href=http://www.palantir.net/blog/series/d8ftwfor a lot of reasons/a./p pWhile we use a number of tools and technologies to drive success for our clients, Drupal is in our DNA. In addition to being a premium supporting partner of the Drupal Association, we also count amongst our team members prominent Drupal core and contributed module maintainers, initiative leads, and Drupal Association Board, Advisory Board, and Working Group members. /p pWe've all done our part, but despite years of support and contributions from countless companies and individuals, we need to take a new approach to incentivize contributors to get Drupal 8 done. That’s where the Drupal 8 Accelerate Fund comes in./p pPalantir is one of seven anchor donors a href=https://assoc.drupal.org/blog/holly.ross.drupal/ready-set-drupal-8-d8-accelerate-fundraiserwho are raising funds/a alongside the Drupal Association to support Drupal 8 development. These efforts relate directly to the Drupal Association's mission of uniting a global open source community to build and promote Drupal, and will (a href=https://assoc.drupal.org/d8accelerate/awardedand already have/a) support contributors directly through additional dollars for grants. /p pThe fund breaks down like this:/p ulliThe Drupal Association has contributed $62,500/li liThe Drupal Association Board has raised another $62,500 from Anchor Donors/li liNow, the Drupal Association’s goal is to raise contributions from the Drupal community. This is the chance for everyone from end users to independents to Drupal shops to show your support for Drupal 8. Every dollar donated by the community has already been matched, doubling your impact. That means the total pool could be as much as $250,000 with your help./li /ulp br / Drupal 8 Accelerate is first and foremost about getting Drupal 8 to release. However, it’s also a pilot program for Drupal Association to obtain and provide financial support for the project. This is a recognition that, as a community, Drupal must find (and fund) a a href=https://plus.google.com/u/0/+EarlMiles/posts/JiemCwPqECAsustainable model for core development/a. /p pThis is huge on a lot of levels, and those in the community have already seen the a href=http://webchick.net/d8accelerate-deep-divebenefits with awards for sprints and other specific progress in D8/a. Now it’s our turn to rally. a href=https://www.crowdrise.com/d8accelerate/fundraiser/tiffanyfarrissGive today/a and spread the word so we can all help move Drupal 8 a little closer to release./p pa href=http://www.crowdrise.com id=crowdriseStaticLink-project-256169 title=Fundraising Websites on CrowdriseFundraising Websites - Crowdrise/a/p script type=text/javascript src=https://www.crowdrise.com/widgets/donate/project/493299//scriptp /p
Categories: Drupal Feeds

Daniel Pocock: WebRTC: DruCall in Google Summer of Code 2015?

Thu, 03/26/2015 - 4:58pm
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item even property=content:encodedpI've offered to help mentor a Google Summer of Code student to work on a href=http://www.drucall.orgDruCall/a. Here is a a href=https://groups.drupal.org/node/455978#project37link to the project details/a./p pThe original DruCall was based on SIPml5 and released in 2013 as a proof-of-concept./p pIt was later adapted to use a href=http://jscommunicator.orgJSCommunicator/a as the webphone implementation. JSCommunicator itself was updated by another GSoC student, a href=http://julianalouback.comJuliana Louback/a, in 2014./p pIt would be great to take DruCall further in 2015, here are some of the possibilities that are achievable in GSoC:/p ulliUpdating it for Drupal 8/li liSupport for logged-in users (currently it just makes anonymous calls, like a phone box)/li liSupport for relaying shopping cart or other session cookie details to the call center operative who accepts the call/li /ulh3Help needed: could you be a co-mentor?/h3 pMy background is in real-time and server-side infrastructure and I'm providing all the WebRTC SIP infrastructure that the student may need. However, for the project to have the most impact, it would also be helpful to have some input from a second mentor who knows about UI design, the Drupal way of doing things and maybe some Drupal 8 experience. Please contact me ASAP if you would be keen to participate either as a mentor or as a student. The deadline for student applications is just hours away but there is still more time for potential co-mentors to join in./p h3WebRTC at mini-DebConf Lyon in April/h3 pThe next a href=https://france.debian.net/events/minidebconf2015/mini-DebConf takes place in Lyon, France on April 11 and 12/a. On the Saturday morning, there will be a brief WebRTC demo and there will be other opportunities to demo or test it and ask questions throughout the day. If you are interested in trying to get WebRTC into your web site, with or without Drupal, please see the a href=http://rtcquickstart.orgRTC Quick Start guide/a./p /div/div/div
Categories: Drupal Feeds

Acquia: 2014 greatest hits - 30 Awesome Drupal 8 API Functions you Should Already Know - Fredric Mitchell

Thu, 03/26/2015 - 4:02pm
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 evenp Looking back on 2014, it was a great year of events and conversations with people in and around Acquia, open source, government, and business. I think I could happily repost at least 75% of the podcasts I published in 2014 as greatest hits, but then we'd never get on to all the cool stuff I have been up to so far in 2015!/p p Nonetheless, here's one of my favorite recordings from 2014: a terrific session that will help you wrap your head around developing for Drupal 8 and a great conversation with Frederic Mitchell that covered the use of Drupal and open source in government, government decision-making versus corporate decision-making, designing Drupal 7 sites with Drupal 8 in mind, designing sites for the end users and where the maximum business value comes from in your organization, and more!/p /div /div /div figure class=field-item even rel= resource=https://www.acquia.com/sites/default/files/fredric_mitchel_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/fredric_mitchel_0.png?itok=VhlWt2ev alt= title= //div !-- render the title tag as caption -- /figure span property=dc:title content=2014 greatest hits - 30 Awesome Drupal 8 API Functions you Should Already Know - Fredric Mitchell class=rdf-meta element-hidden/span
Categories: Drupal Feeds