Planet Drupal

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

CiviCRM Blog: Easier creation of email newsletters - Content Tokens!

Tue, 11/25/2014 - 01:15
div class=field field-name-body field-type-text-with-summary field-label-hidden div class=field-item even property=content:encodedpWhen preparing an email newsletter, one part of it that is time consuming is gathering together all the content that is needed. In my experience, virtually all the content already exists elsewhere, such as in the local CMS, in CiviCRM, or on a blog, or some other online source.    So I was thinking how can I make this process easier.  What I did: I created mail merge tokens for CiviCRM that autofill a list of recent blog posts, stories, or any other type of CMS content.  So the end-user sees a list of tokens, one for each content type and for each date range. Such as Content of type 'blog' changed in the last 7 days .  What is particulary powerful about this approach, is that if you are also using a CMS aggregator (such as the aggregator module in Drupal core) then virually any external RSS feed is turned into CMS content, which is now available as a CiviCRM token. /p pSome examples of how this new extension may help your organization:/p p   - Your staff posts new content of type story each week.Your monthly newsletter editor can use the new token for Content of type 'story' changed in the last 1 month to save time preparing the newsletter./p p  - A national organization you are affiliated with has a number of blogs that they host. Your local organization would like to include recent blog posts from the national organization in the local member newsletter.  Your local webmaster previously configured the aggregator module to pull in those external blogs into your CMS. Your monthly newsletter editor can use the new token for Content of type 'feed item' changed in the last 1 month to save time preparing the newsletter./p p- Any other situation where there is existing content that you want to include in your email or PDF. /p pThis new extension Content Tokens is published in thea href=https://civicrm.org/extensions/content-tokens CiviCRM extensions area/a stronga href=https://civicrm.org/extensions/content-tokenshttps://civicrm.org/extensions/content-tokens /a/strong/p pThis new extension is designed in the same style as the a href=https://civicrm.org/extensions/fancy-tokensFancy Token/a extension that provides tokens for upcoming events, contribution pages, profiles, and WebForms. /p p /p p /p p /p /div /div div class=field field-name-taxonomy-vocabulary-1 field-type-taxonomy-term-reference field-label-hidden clearfix ul class=field-items li class=field-item even a href=/category/civicrm-blog-categories/civicrm typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=CiviCRM/a /li li class=field-item odd a href=/category/civicrm-blog-categories/drupal typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Drupal/a /li li class=field-item even a href=/category/civicrm-blog-categories/extensions typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Extensions/a /li li class=field-item odd a href=/category/civicrm-blog-categories/wordpress typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=WordPress/a /li /ul /div

Shomeya: Failure to Launch: The Myth of the Missing Map

Tue, 11/25/2014 - 01:00
img alt=Article_img_4701 height=199 src=http://cdn.shomeya.com/uploads/article/image/30/article_IMG_4701.jpg width=590 /pIt#39;s all about perspective when it comes to launching. We always think we need something more, that missing set of instructions or special ingredient that will propel us to finish. That special person, few moments of sanity, or foolproof plan./p pBut at the end of the day, while those things may encourage us to make the choice to take action or bring balance and clarity, they never change the fact that we won#39;t make it anywhere until we start the journey. We could be waiting at the bus stop thinking it#39;s the only way we#39;ll get there, when the whole time we could have been on the train./p a href=http://shomeya.com/articles/failure-to-launch-the-myth-of-the-missing-map?utm_campaign=failure-to-launch-the-myth-of-the-missing-mapamp;utm_medium=rssamp;utm_source=tag-drupal-planetRead more/a

Visitors Voice: Turn the negative trend regarding site search

Mon, 11/24/2014 - 22:10
Almost every second user (45%) are dissatisfied or very dissatisfied, having a hard time finding information they are looking for according to a survey (2014). The survey also shows that it is getting worse due to rapid information growth and users’ tendency to increase expectations. The better web search engines like Google gets, the higher [#8230;]

Wizzlern: Drupal 8 Configuration Management with Drush

Mon, 11/24/2014 - 20:45
div class=field field-name-field-ankeiler field-type-text-long field-label-hiddendiv class=field-itemsdiv class=field-item oddpToday I got my feed wet with Drupal 8 Configuration Management. For those who are new to this excellent feature in Drupal 8, you should read the documentation at drupal.org (a href=https://www.drupal.org/documentation/administer/configManaging configuration in Drupal 8/a) or watch this a href=http://www.youtube.com/watch?v=eg2dtPFyGxsDrupalCon Amsterdam video/a. This article assumes you are familiar with Drush and Drush aliases./ppI worked with a very basic workflow using a development site and an acceptance site. Both sites are under revision control, where the complete webroot (core + modules, but not settings.php) is placed in git. For gitignore I used a copy of the example.gitignore which you'll find in Drupal's root directory./ppI used a href=https://github.com/drush-ops/drushDrush 7/a to import and export the configuration. 'Export' is to transfer a site's configuration from Drupal to file and 'Import' is to transfer in reversed direction. Using span class=geshifiltercode class=text geshifilter-textdrush @dev config-export/code/span you export the configuration from the development site to the sites/default/config_*/staging directory. The staging directory now holds many *.yml files that each contain the configuration of an individual section. I've chosen to use git to transfer these files to the acceptance site. At the acceptance site span class=geshifiltercode class=text geshifilter-textdrush @acc config-import/code/span is used to transfer the configuration from the file system to the acceptance site./ppMake sure that the acceptance site is a copy of the development site. For example using span class=geshifiltercode class=text geshifilter-textdrush @dev archive-dump/code/span you can make a copy of both the files and database. With this you can create a copy of the site using span class=geshifiltercode class=text geshifilter-textdrush archive-restore/code/span./ppI made these changes to the .gitignore file to allow the staging directory to be added to git:/p/div/div/divdiv class=field field-name-taxonomy-vocabulary-2 field-type-taxonomy-term-reference field-label-inline clearfixdiv class=field-labelTags:nbsp;/divdiv class=field-itemsdiv class=field-item odda href=/category/tags/drupal-8drupal 8/a/divdiv class=field-item evena href=/category/tags/drushdrush/a/divdiv class=field-item odda href=/category/tags/deploymentdeployment/a/divdiv class=field-item evena href=/category/tags/configuration-managementconfiguration management/a/div/div/div

Drupal Association News: Forum One to work on Content Strategy for Drupal.org

Mon, 11/24/2014 - 19:38
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item evenpimg class=left src=https://www.drupal.org/files/styles/supporters-large/public/ForumOne_RGB_Wordmark.png?itok=jfpKXd11 /Several weeks ago, we a href=https://assoc.drupal.org/blog/tvn/drupal.org-content-strategy-announcing-request-proposalsissued an RFP/a for Drupal.org Content Strategy project. We got a number of great submissions, and the next couple of weeks the Drupal Association staff and the Drupal.org Content Working Group members spent reviewing proposals and interviewing potential vendors./p pToday we are happy to announce that we’ve selected a vendor for the content strategy project: a href=http://forumone.com/Forum One/a, an open-source digital agency./p pTheir proposal met all our project requirements and outlined a solid plan for how we can make this project happen. During the interviews Forum One impressed us with their professionalism, passion for content strategy, their extensive experience working on large content strategy projects, and their deep knowledge of the Drupal community and Drupal.org, the website./p pWe believe that together our staff and Forum One team will make this project a success. Can’t wait to start working and improve Drupal.org content for all our varied audiences./p /div/div/div

Phase2: Drushful Thinking

Mon, 11/24/2014 - 19:00
h2What is Drush?/h2 pIf you#8217;re asking that question right now then congratulations! You are one of the lucky people who will have your life changed today! Cancel everything and read up on a href=https://github.com/drush-ops/drushDrush/a, the command line bridge to Drupal./p h2Everybody knows about Drush, ya Dingus!/h2 pThat#8217;s more like it. Who doesn#8217;t love Drush, right? Right!/p pBut more and more, I find myself seeing people reinventing things that Drush already handles because they just don#8217;t know all that Drush can do. It#8217;s getting frustrating, and I want to fix that./p h1First, The Basics/h1 h2Stuff everybody knows/h2 pHere are a few Drush commands that most people know and love, just to get them out of the way:/p ul lidrush updb: run pending database updates/li lidrush cc all: clear all caches/li lidrush dl lt;somethinggt;: download the lt;somethinggt; module/li lidrush en lt;somethinggt;: enable the lt;somethinggt; module/li /ul h2Stuff everybody knows (Features Editionb™/b)/h2 pAnd if you#8217;re using Features, you#8217;re probably familiar with:/p ul lidrush fra: revert all Features/li lidrush fe: export a new or updated Feature with a new component/li lidrush fu lt;featurenamegt;: update the lt;featurenamegt; Feature with updated site config/li lidrush fr lt;featurenamegt;: revert the site#8217;s config to the current state of the lt;featurenamegt; Feature/li /ul h2Aliases/h2 pFor a lot of the fun stuff, you#8217;ll have to understand Drush aliases. If you don#8217;t, here#8217;s the gist: Drush aliases give you an easy way to run Drush commands on remote Drupal sites, as opposed to only being able to use it on your local sites. If you#8217;re constantly SSH#8217;ing into different environments just to run a couple quick commands, you need to stop doing that./p pThere#8217;s a href=http://www.astonishdesign.com/blog/drush-aliases-what-why-and-howlots/a a href=https://www.deeson.co.uk/labs/drupal-drush-aliases-and-how-use-themof/a a href=http://www.bariswanschers.com/blog/working-drush-alias-files-teamsdocumentation/a about Drush aliases and how to create your own, but most of the docs lack notes on some of the lesser known awesome things you can do with aliases. Keep reading, sailor./p pWell, one more thing. This is probably a good time to mention a couple quick commands./p pFirstly, let#8217;s run an arbitrary shell command on our dev environment./ppre class=crayon-plain-tagdrush @foo-dev exec echo $SOMETHING/prepOr maybe we should just go ahead and SSH in to do something a little more complex./ppre class=crayon-plain-tagdrush @foo-dev ssh/prepOr maybe we need to do a bunch of aliased commands, but we want to do it without SSH#8217;ing in (because the commands require local files or something). We can make a Drush alias persist until we tell it to stop using:/ppre class=crayon-plain-tagdrush site-set @foo-dev/prepAnd then when we#8217;re done doing what we do, we can just run it again without the #8220;@foo-dev#8221; argument to unset it./p pNow, keep reading, sailor./p h1Syncing Ship/h1 p(Warning: these headlines are going to get worse and worse)/p pOne of the most common things to do with Drush aliases is to sync stuff from one alias to another./p pFor example, want to sync the dev site database down into your local?/ppre class=crayon-plain-tagdrush sql-sync @foo-dev @foo-local/prepHow about files? Sync #8216;em!/ppre class=crayon-plain-tagdrush rsync @nexderm-dev:%files @nexderm:%files/prepOr maybe some unwashed sent you a DB dump and you have to import it the old fashioned way?/ppre class=crayon-plain-tagcat ~/path/to/file.sql | drush sql-cli/prepSometimes you want to drop your entire database before importing, to make sure you don#8217;t get any tables left behind from your old install that aren#8217;t supposed to be there. That#8217;s as easy as:/ppre class=crayon-plain-tagdrush sql-drop/prepSometimes, it#8217;s useful to be able to automate running arbitrary SQL commands on multiple environments, and that#8217;s pretty easy too. Say for example that you quickly want to get the username for uid 1 on the prod environment (the #8220;drush user-information#8221; command would be much better for this, but shut up)./ppre class=crayon-plain-tagdrush @foo-prod sqlq 'select name from users where uid = 1'/prepThat one is also good for automation, like if you want to write a quick script that changes the username for uid 1 on all environments./p h1Drupal Without Drupal/h1 pIt#8217;s often useful to run one-off arbitrary code within the context of Drupal, without having to actually put it in the codebase somewhere. This is typically done one of two ways:/p pIf it#8217;s just a short one-liner, then there#8217;s the ever-useful #8220;php-eval#8221; (aka #8220;ev#8221;) command. For example, let#8217;s inspect a node object./ppre class=crayon-plain-tagdrush @foo-dev php-eval 'print_r(node_load(123));'/prepOr if it#8217;s a longer one, then we can just throw our code into a PHP file, and run it using:/ppre class=crayon-plain-tagdrush php-script filename.php/prep/p h1Reports Cohorts/h1 pDrush is really good at getting us information from Drupal without waiting for a full page load./p pHow many times have you navigated to the Watchdog page and sat through page load after page load while you went through the pagination and added filtering and blah blah blah to find an error message? Stop doing that! Do this instead:/ppre class=crayon-plain-tagdrush watchdog-show/prepThere are a lot of useful options for watchdog-show, such as:/p ul li#8211;tail (continuously show new messages)/li li#8211;full (show the full output, with all of the fields, instead of the summarized version)/li li#8211;severity (such as #8220;#8211;severity=error#8221;)/li li#8211;count (show more than the default 10, such as #8220;#8211;count=100#8243;)/li /ul pAnd I#8217;d bet you#8217;re familiar with #8220;drush vget#8221; to get variables, but did you know you can pass #8220;#8211;format=whatever#8221; to get the results formatted as JSON or CSV or YAML or a bunch of other things, for easy scripting?/p pAnother one of my favorites is this charm, which basically prints out the stuff you see on the Status Report page in Drupal. It#8217;s nice for sanity checking before pushing releases live./ppre class=crayon-plain-tagdrush status-report/prepAnd then there#8217;s this guy, which prints out a bunch of useful info about the current installation, such as DB info, path to PHP executable and .ini file, Drupal version, Drupal root, etc. It#8217;s a nice first step when debugging a broken install./ppre class=crayon-plain-tagdrush status/prepAnd for those times when you need to edit a config file (php.ini, or settings.php, or an alias file, or .htaccess, etc.), you can run this to let you choose which of those files to edit and it#8217;ll open it up in an editor for you:/ppre class=crayon-plain-tagdrush config/prep/p h1Using Users/h1 pDrush is nothing short of a miracle when it comes to user management./p pFirst of all, there#8217;s the ever-annoying task of logging in as this user or that user. You usually don#8217;t know the password, or maybe you#8217;re just too lazy to type it. Run this to open up your browser with a one-time login link so you can skip all of that malarky:/ppre class=crayon-plain-tagdrush user-login name-or-uid/prepOr, if you#8217;re slightly less lazy, and just want to change the password to something so that you can log in the old fashioned way:/ppre class=crayon-plain-tagdrush user-password name-or-uid --password=test1234/prepThen there#8217;s the #8220;fun#8221; process of adding a user and filling out the form. Skip that:/ppre class=crayon-plain-tagdrush user-create person123 --mail=quot;what@isthis.comquot; --password=quot;letmeinquot;/prepOnce that#8217;s done, you probably want to give that new user some roles. For role stuff, you have this:/ppre class=crayon-plain-tagdrush user-add-role quot;user editorquot; person123 drush user-remove-role quot;user editorquot; person123/prepBut watch out! The role you need to add doesn#8217;t exist yet! Let#8217;s add it, and give it some permissions./ppre class=crayon-plain-tagdrush role-create 'user editor' drush role-add-perm 'user editor' 'administer users'/prepIf you just need to show information about a user, such as email address, roles, UID, etc., try this. I#8217;m embarrassed to say that I#8217;ve been using raw SQL for this for years./ppre class=crayon-plain-tagdrush user-information name-or-uid/prep/p h1Fields of Dreams/h1 pOne of the most under-used things that Drush gives you is field management tools. I#8217;m going to be lame here and just copy and paste the docs, since they#8217;re pretty self explanatory./ppre class=crayon-plain-tagField commands: (field) field-clone Clone a field and all its instances. field-create Create fields and instances. Returns urls for field editing. field-delete Delete a field and its instances. field-info View information about fields, field_types, and widgets. field-update Return URL for field editing web page./prep/p h1Other Schtuff/h1 pHere are some great commands that don#8217;t really fit into any clear-cut categories./p pIt has some neat archiving tools:/ppre class=crayon-plain-tagdrush archive-dump #backup code, files, an DB to a single package drush archive-restore #expand one of those archives into a full Drupal site/prepSomewhat similar to those is this one, which will download and install Drupal, serve it using a little built-in server, and log you in, all in one command. Note that this one includes about a bazillion options and is super duper powerful./ppre class=crayon-plain-tagdrush core-quick-drupal/prepDrush also lets you play with the cache, which can save a lot of time when debugging a caching issue:/ppre class=crayon-plain-tagdrush cache-get your-cid your-bin drush cache-set your-cid your-data your-bin your-expire/prepThere are a couple unknown commands for working with contrib:/ppre class=crayon-plain-tagdrush pm-info modulename #display included files, permissions, configure link, version, dependencies, etc. drush pm-releasenotes modulename #show the release notes for the version of module that you're using/prepRun cron! Not exciting, but super useful./ppre class=crayon-plain-tagdrush cron/prepHave you ever been in the middle of debugging and you know that something is happening in a form_alter (or some other hook) but you#8217;re not sure in which module? Try this command, which will tell you all of the implementations of a given hook, and let you choose one to view the source code of it./ppre class=crayon-plain-tagdrush fn-hook form_alter/prepAnd finally, this bad boy is basically #8220;Drush docs in a box#8221; and has a TON of useful info. Seriously, try it now./ppre class=crayon-plain-tagdrush topic/prep/p h1Drushful Thinking/h1 pThere#8217;s a giant heap of useful Drush commands, some of which you hopefully hadn#8217;t seen before. So what, right?/p pThe #8220;so what#8221; is that it#8217;s useful to start thinking in terms of #8220;how can Drush do this for me?#8221; and you#8217;ll often find that the answer is #8220;pretty easily.#8221;/p pPlay a game with yourself. Next time you#8217;re working on site building or anything that involves a lot of clicky clicky in the Drupal UI, give yourself a jellybean or a chip or something every time you do something in Drush instead of in the UI./p pBut why? Well for one, before you know it, you#8217;ll be spending  much less time waiting on page loads. But secondly, Drush lends itself to automation, and thinking in terms of Drush naturally leads you to think in terms of automating and scripting things, which is a great place to be./p pPractice some Drushful Thinking! And let me know any of your favorite Drush tips and tricks in the comments. Check out a href=http://www.drushcommands.com/drushcommands.com/a for some more inspiration./p img src=http://track.hubspot.com/__ptq.gif?a=457100k=14bu=http%3A%2F%2Fwww.phase2technology.comr=http%3A%2F%2Fwww.phase2technology.com%2Fblog%2Fdrushful-thinking%2Fbvt=rssp=wordpress style=float:left; xml:base=http://www.phase2technology.com/feed/ width=1 height=1 border=0 align=right/

Appnovation Technologies: Easing Time Inc.'s Transition to Drupal

Mon, 11/24/2014 - 16:25
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item even property=content:encoded pstrongIntroduction/strongbr //p/div/div/divdiv class=sharethis-buttonsdiv class=sharethis-wrapperspan st_url=http://www.appnovation.com/blog/easing-time-incs-transition-drupal st_title=Easing Time Inc.#039;s Transition to Drupal class=st_facebook/span span st_url=http://www.appnovation.com/blog/easing-time-incs-transition-drupal st_title=Easing Time Inc.#039;s Transition to Drupal class=st_twitter/span span st_url=http://www.appnovation.com/blog/easing-time-incs-transition-drupal st_title=Easing Time Inc.#039;s Transition to Drupal class=st_sharethis/span script type='text/javascript'var switchTo5x = false;/scriptscript type='text/javascript' src='http://w.sharethis.com/button/buttons.js'/scriptscript type='text/javascript'stLight.options({publisher:dr-75626d0b-d9b4-2fdb-6d29-1a20f61d683});/script/div/div

3C Web Services: Essential Drupal 7 Modules

Mon, 11/24/2014 - 16:01
p/p pstrongINTRODUCTION/strong/p pDrupal is a great CMS but really isn't very powerful out of the box. To harness its power you'll need to use contrib (contributed) modules. Contributed modules are created by the community and are not part of the core Drupal download. But they can be downloaded and installed from the drupal.org website./p

Midwestern Mac, LLC: NFS, rsync, and shared folder performance in Vagrant VMs

Mon, 11/24/2014 - 15:28
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item even property=content:encodedpIt's been a well-known fact that using native VirtualBox or VMWare shared folders is a terrible idea if you're developing a Drupal site (or some other site that uses thousands of files in hundreds of folders). The most common recommendation is to switch to NFS for shared folders./p pNFS shared folders are a decent solution, and using NFS does indeed speed up performance quite a bit (usually on the order of 20-50x for a file-heavy framework like Drupal!). However, it has it's downsides: it requires extra effort to get running on Windows, requires NFS support inside the VM (not all Vagrant base boxes provide support by default), and is not actually all that fast—in comparison to native filesystem performance./p/div/div/div

Open Source Training: A Beginners Guide to the Drupal Services Module

Mon, 11/24/2014 - 15:21
!-- Start ScreenSteps Content -- div class=LessonContent div class=LessonSummary pThe Services module allows to provide web services from your Drupal site./p pServices is really popular and works with formats such as REST, XMLRPC, JSON and SOAP./p pHowever, when asked about Services during a training in class last week, I was realized that the students were asking me because there was little-to-no clear documentation available./p pSo, I sat down with and decided to write a Beginners guide to the Services module./p pHere's a 5-step guide to using Services creating a REST API for your Drupal site./pimg src=http://feeds.feedburner.com/~r/ostrainingdrupal/~4/-eG5LBTkRpc height=1 width=1/

Web Omelette: Drupal update hooks with multiple passes

Mon, 11/24/2014 - 14:05
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item evenpIf you do a lot of Drupal development and need to deploy configuration I am sure that you are using update hooks to some extent at least. If you don't use Features and want to create a taxonomy vocabulary or something in code, the a href=https://api.drupal.org/api/drupal/modules%21system%21system.api.php/function/hook_update_N/7hook_update_N()/a hook is the way to go./p pBut have you ever needed to perform an update the size of which would exceed PHP's maximum execution time? If you need to create 1000 entities (let's just say as an example), it's not a good idea to trust that the production server will not max out and leave you hanging in the middle of a deploy. So what's the solution?/p pYou can use the batch capability of the update hook. If you were wondering what the codeamp;$sandbox/code argument is for, it's just for that. You use it for two things mainly:/p ul listore data required for your operations across multiple passes (since it is passed by reference the values remain)/li litell Drupal when it should stop the process by setting the code$sandbox['#finished']/code value to 1. /li /ul pLet me show you how this works. Let's say we want to create a vocabulary and a bunch of taxonomy terms with names from a big array. We want to break this array into chunks and create the terms one chunk at the time so as to avoid the load on the server./p pSo here is how you do it:/p precode/** * Create all the terms */ function my_module_update_7001(amp;$sandbox) { $names = array( 'Fiona', 'Jesse', 'Michael', ... 'Sam', 'Nate', ); if (!isset($sandbox['progress'])) { $sandbox['progress'] = 0; $sandbox['limit'] = 5; $sandbox['max'] = count($names); // Create the vocabulary $vocab = (object) array( 'name' =gt; 'Names', 'description' =gt; 'My name vocabulary.', 'machine_name' =gt; 'names_vocabulary', ); taxonomy_vocabulary_save($vocab); $sandbox['vocab'] = taxonomy_vocabulary_machine_name_load('names_vocabulary'); } // Create the terms $chunk = array_slice($names, $sandbox['progress'], $sandbox['limit']); if (!empty($chunk)) { foreach ($chunk as $key =gt; $name) { $term = (object) array( 'name' =gt; $name, 'description' =gt; 'The name is: ' . $name, 'vid' =gt; $sandbox['vocab']-gt;vid, ); taxonomy_term_save($term); $sandbox['progress']++; } } $sandbox['#finished'] = ($sandbox['progress'] / $sandbox['max']); } /code/pre pdiv id=block-inject-2 class=block-inject block-inject-2/divdiv class=clearfix/divpSo what happens here? First, we are dealing with an array of names (can anybody recognise them by the way?) Then we basically see if we are at the first pass by checking if we had set already the codeprogress/code key in code$sandbox/code. If we are at the first pass, we set some defaults: a limit of 5 terms per pass out of a total of codecount($names)/code. Additionally, we create the vocabulary and store it as a loaded object in the sandbox as well (because we need its id for creating the terms)./p pThen, regardless of the pass we are on, we take a chunk out of the names always offset by the progress of the operation. And with each term created, we increment this progress by one (so with each chunk, the progress increases by 5) and of course create the terms. At the very end, we keep setting the value of code$sandbox['#finished']/code to the ratio of progress per total. Meaning that with each pass, this value increases from an original of 0 to a maximum of 1 (at which point Drupal knows it needs to stop calling the hook)./p pAnd like this, we save a bunch of terms without worrying that PHP will time out or the server will be overloaded. Drupal will keep calling the hook as many times as needed. And depending on the operation, you can set your own sensible chunk sizes./p pHope this helps./p /div/div/divdiv class=sharethis-buttonsdiv class=sharethis-wrapperspan st_url=http://www.webomelette.com/drupal-update-hooks-multiple-passes st_title=Drupal update hooks with multiple passes class=st_facebook/span span st_url=http://www.webomelette.com/drupal-update-hooks-multiple-passes st_title=Drupal update hooks with multiple passes class=st_twitter st_via=drupalexp/span span st_url=http://www.webomelette.com/drupal-update-hooks-multiple-passes st_title=Drupal update hooks with multiple passes class=st_googleplus/span script type='text/javascript'var switchTo5x = true;/scriptscript type='text/javascript' src='http://w.sharethis.com/button/buttons.js'/scriptscript type='text/javascript'stLight.options({publisher:dr-8de6c3c4-3462-9715-caaf-ce2c161a50c});/script/div/div

Another Drop in the Drupal Sea: R.O.O.S.T.S. Women in Tech

Mon, 11/24/2014 - 12:57
pThere was a a href=https://2014.badcamp.net/session/panel-how-can-men-be-better-allies-women-tech-heforshesession at BADCamp/a this year asking how Men can be better allies for Women in tech. The panelists had experiences with males that ranged from helpful, to innocently bungled, to outright demeaning. There was a small amount of suggestions about what men can do to be better allies./p pa href=http://blog.isaacsonwebdevelopment.com/blog/2014/11/24/roosts-women-tech target=_blankread more/a/p

BlackMesh: Strategies for businesses investing (in Drupal 8) through giving their employees Drupal contribution time

Mon, 11/24/2014 - 06:00
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item even property=content:encoded pBy a href=https://www.drupal.org/u/yesctCathy Theys/a, with help from a href=https://www.drupal.org/u/xjmxjm/a, a href=https://www.drupal.org/u/schnitzelMichael Schmid/a, and a href=https://www.drupal.org/u/kattekrabDonna Benjamin/a./p ullia href=#prefacePreface/a/li lia href=#contributingContributing/a/li ullia href=#payingCompanies paying their employees to contribute/a/li lia href=#typesTypes of Contribution/a/li ullia href=#releaseContributing to Drupal 8 release/a/li /ullia href=#benefitsBenefits of Contribution/a/li /ullia href=#strategiesStrategies, concentrate resources/a/li ullia href=#reduceReduce ramp-up time./a/li lia href=#accrueReduce pressure to work on client or internal deadlines./a/li lia href=#timeConsolidate time./a/li ullia href=#savingConsolidate by saving up contribution time./a/li lia href=#subsetConsolidate by giving fewer people more contribution time./a/li /ullia href=#long-termFocus long-term./a/li lia href=#rotateRotate./a/li /ullia href=#examplesExamples/a/li lia href=#helpHelp for Businesses/a/li lia href=#summarySummary/a/li ullia href=#correctionsCorrections/a/li lia href=#cathyContact me/a/li /ullia href=#mentorsps. Finding mentors/a/li /ulh2 id=prefacePreface/h2 pThe target audience of this post is decision makers in businesses that are deciding if and how their employees might work on Drupal 8 in a way that helps Drupal 8 be released faster. There are benefits to the individuals and the company from every kind of contribution, even if it does not match the recommendations in this post./p pDo not let anything hold you back. Just doing it is better than not doing it at all. Contribution does not have to be perfect. Drupal is great at helping people get involved at whatever level they want to be involved./p pSee these great resources to help you get started: /pul class=rteindent4ligeneral information on a href=https://www.drupal.org/getting-involvedgetting involved with Drupal/a,/li lia href=https://www.drupal.org/contributor-taskscontributor task documents/a for instructions on doing common contributor tasks,/li lia href=https://www.drupal.org/core-mentoringcore office hours/a where mentors help new contributors,/li lia href=https://groups.drupal.org/node/446803Drupal 8 critical office hours/a to help people who are already contributors work on Drupal 8 critical issues, or/li lia href=http://www.blackmesh.com/blog/looking-drupalcon-amsterdam-sprints-upcoming-sprints-you-attendin-person sprints/a./li/ulpPeople will be helpful and supportive./p h2 id=contributingContributing/h2 pThere are lots of ways that businesses invest in Drupal. Some sponsor events like a href=https://groups.drupal.org/events?type%5B%5D=regionalDrupal camps/a or a href=https://latinamerica2015.drupal.org/sponsorsDrupalCons/a. Some help fund travel for key contributors to attend sprints (hearing about the need via word of mouth or an employee who knows of someone in need and brings it to their employer's attention). Some a href=https://www.drupal.org/core-mentoring/sprint-resourceshost sprints in their offices/a. Some have a href=https://assoc.drupal.org/membershipDrupal Association memberships/a, are a href=https://assoc.drupal.org/supporting-partnersDrupal Association Supporting Partners/a, or join contribution alliances like a href=http://www.largescaledrupal.com/Large Scale Drupal/a. Some produce training or documentation. Some contribute funding directly to community members working on a specific project. Some give money to teams or individuals via a href=https://gratipay.com/for/drupal/?limit=100Drupal Gratipay/a./p h3 id=paying class=rteindent1Companies paying their employees to contribute/h3 pSome businesses are giving their employees contribution time or are hiring people specifically to contribute./p pThis post covers some ideas to make employee paid contribution time an even more effective investment, especially when companies want to help with getting Drupal 8 released./p h3 id=types class=rteindent1Types of Contribution/h3 pStrategies in this post can apply in general to contributing: /pul class=rteindent4lito any open source project,/li lito a Drupal project, module, theme, distribution,/li lito Drupal core,/li lito Drupal.org infrastructure or testbot (Continuous Integration aka a href=https://www.drupal.org/project/drupalciDrupal.org CI 2.0/a),/li lion the a href=https://www.drupal.org/security-teamsecurity team/a/li liby planning an a href=https://groups.drupal.org/drupal-event-organizationevent/a like DrupalCon, a Drupal camp, or a sprint,/li liby preparing talks or trainings for Drupal events,/li liat a meta level by working in a governance group like the a href=https://assoc.drupal.org/about/boardDA board/a or a a href=https://www.drupal.org/governanceDrupal Working Group/a,/li lito a href=https://www.drupal.org/roadmapDrupal.org improvements/a like issue queue workflow, profiles, landing page content, or/li liby building, maintaining, or sponsoring outside tools (like a href=http://simplytest.me/project/drupal/8.0.xsimplytest.me/a or a href=http://drupical.com/Drupical/a)./li /ulpDrupal is constantly improving its recognition and definition of contribution to include: organizing, communicating, fundraising, testing, documenting, mentoring, designing, architecting, reviewing, and coding./p pA particular interest to me is contributing to Drupal 8 and helping it get released sooner. (It is of interest to some businesses too :) which is what inspired this post.)/p h4 id=release class=rteindent1Contributing to Drupal 8 release/h4 pThe Drupal 8 branch of the codebase was opened for development in early 2011. The first Drupal 8 beta was released October 1 2014. There are a href=https://www.drupal.org/project/issues/search/drupal?project_issue_followers=amp;status%5B%5D=1amp;status%5B%5D=13amp;status%5B%5D=8amp;status%5B%5D=14amp;status%5B%5D=4amp;priorities%5B%5D=400amp;version%5B%5D=8.0.x-devamp;issue_tags_op=%3D125 Drupal 8 critical issues/a (some complex, some straightforward). A Drupal 8 release candidate will be tagged when there are zero critical issues, and once subsequent critical issues are resolved, one such release candidate will become the 8.0.0 release. There will be much rejoicing. (Check the a href=https://www.drupal.org/core/release-cycleRelease cycle page on Drupal.org/a for up-to-date release cycle information.) /ppWhat is really needed to help Drupal 8 get released?/p ul class=rteindent4lia href=https://www.drupal.org/patch/reviewReviewing/a br / Lack of quality reviews is the biggest problem we have. People get good at giving quality reviews first by just reviewing. Their review skills will get better over time./li liKeeping critical a href=https://www.drupal.org/contributor-tasks/write-issue-summaryissue summaries/a clear and up-to-date br / This is not easy busy work; this is much appreciated and important. Some issues will not be committed without an accurate summary. Summaries help people get involved with, stay involved in, and review issues./li liAdopting issues br / An issue can have a working patch, but that is not sufficient to get it committed. Sometimes an issue needs someone to adopt it and not give up until it is marked fixed and committed. This person becomes familiar with the issue, and checks in on it to see what it needs: maybe a re-roll, maybe an issue summary update, maybe track down a particular person whose feedback is needed, … they pay attention to the issue and help it get whatever it needs so that issue gets committed./li liFocusing on development milestones and release blockersbr / Unblocking the a href=https://www.drupal.org/node/2341575beta-to-beta upgrade path/a will enable more early adopters to begin investing resources in Drupal 8. Work on a href=https://www.drupal.org/project/issues/search?projects=amp;project_issue_followers=amp;status%5B%5D=1amp;status%5B%5D=13amp;status%5B%5D=8amp;status%5B%5D=14amp;status%5B%5D=4amp;issue_tags_op=%3Damp;issue_tags=D8+upgrade+pathupgrade path issues/a, other a href=https://www.drupal.org/project/issues/search/drupal?project_issue_followers=amp;status%5B%5D=1amp;status%5B%5D=13amp;status%5B%5D=8amp;status%5B%5D=14amp;status%5B%5D=4amp;priorities%5B%5D=400amp;categories%5B%5D=1amp;categories%5B%5D=2amp;version%5B%5D=8.0.x-devamp;issue_tags_op=%3Dcritical Drupal 8 issues which block release/a, and a href=https://www.drupal.org/node/2267715release-blocking changes to Drupal.org/a is the most direct way to accelerate the release itself./li liPaying attention to Drupal 8 news and priorities br / Reading a href=http://groups.drupal.org/core/updatesDrupal 8 updates/a is a good way to stay up-to-date./li /ulh3 id=benefits class=rteindent1Benefits of Contribution/h3 pWhat benefits would a company be looking for?/p ul class=rteindent4liA quicker release of Drupal 8 means your organization can use a href=https://www.drupal.org/drupal-8.0all of Drupal 8's improvements/a for real projects, as well as drive growth in Drupal-related businesses (like Drupal hosting and training)./li liEmployees with expertise in Drupal 8./li liEmployees with better skills. (Employees will interact with a huge community of experts, and learn from them.)/li liEmployees with more skills. All Drupal 8 issues have to pass a href=https://www.drupal.org/core-gatescore gates/a in: documentation, accessibility, usability, performance, and testing. People who work on core issues learn about those areas./li liEmployees with even more skills. Working with the community builds other valuable skills, that are not strictly about technology, applicable to internal processes as well as to client work./li liSaving money on training. Businesses just have to pay for one side of the training, for their employee time. They do not have to pay for the trainer time like they would for on-site training, or pay for training classes for their employees to attend./li liMaking connections with possible future additional employees./li liRaising the company's profile, brand recognition, and appeal. (See a href=https://amsterdam2014.drupal.org/keynote-dries-buytaertDries's DrupalCon Amsterdam Keynote on contribution recognition/a.)/li liSteering the future of Drupal in ways that align with the company and the community./li /ulh2 id=strategiesStrategies for businesses investing in getting Drupal 8 released sooner through giving their employees Drupal contribution time/h2 h3 id=reduce class=rteindent1Reduce ramp-up time./h3 pSometimes people who are experts at their job, in a certain area, can feel ineffective or inefficient while contributing. Before telling everyone Go contribute, businesses can: /pul class=rteindent4liconsult with an a href=#mentorsexperienced contributor or mentor/a for advice on structuring your contribution policies or program ,/li lishare resources with employees about how to contribute,/li liget employees tools that might help for contributing (they maybe not the same tools necessary for their job), and/or/li lihave employees attend a sprint that has mentoring for new contributors, or work with experienced contributors and mentors online in #drupal-contribute in a href=https://www.drupal.org/ircIRC/a, in #drupal during a href=https://www.drupal.org/core-mentoringcore mentoring hours/a, or arrange for an a href=#mentorsexperienced contributor or mentor/a to hold an event onsite (or virtually) for employees./li /ulh3 id=accrue class=rteindent1Reduce pressure to work on client or internal deadlines./h3 pNot every employee will be interested in spending work time on contribution. Instructing all employees to contribute may not have the best results./p pFor example, if a company schedules certain time for contribution, say the last Friday of the month, for all employees to emoptionally/em spend the day contributing, some people will want to spend that time on client work, or internal projects, maybe because of a deadline, or maybe just because they do not want to contribute that day. People who want to contribute during the scheduled time will see their co-workers working on work projects and feel pressure to also not contribute./p pSomething that can overcome this, is letting people who want to contribute, contribute during off time, so they are still working while the rest of their team is. They can keep track of their contribution time, and later exchange it for scheduled vacation or professional develop time going to conferences or training./p h3 id=time class=rteindent1Consolidate time.h3 /h3/h3pThe following strategies center around an idea: strongConcentrate your resources/strong./p pLet's take an example: a business who has 10 employees that is thinking about giving each person 4 hours of contribution time every week (10% time), or having one day a month where everyone contributes (5% time)./p p4 hours a week, or one day a month is not enough to work on a complicated issue. The time would start with reading any new comments on an issue, maybe changing local environment (requirements are different for Drupal 8 compared to Drupal 7), seeing if any changes in the code base effect the issue, maybe verifying the problem still exists, … thinking, trying ideas, maybe there would be enough time to implement them, and post back to the issue, update the issue summary as needed and explain what was changed and why in a comment, but more likely, there would not be enough time. It depends on the complexity of the problem./p pThere are things that a person can do with 4 hours a week that are helpful contributions. There are even things on issues blocking Drupal 8 release that people could do… but there are things where after 4 hours, a person is just understanding enough to get started ... and then they are out of time, and have to wait till next week. Where they might need to spend the 4 hours getting back up to speed again./p h4 id=saving class=rteindent1Consolidate by saving up contribution time./h4 pIf employees have 4 hours a week contribution time, let them save it up for a couple months, and then use it in a chunk. For example, if someone does not contribute for 2 months, they could then have 36 hours of contribution time they could save up and take a (almost) full week to tackle a complicated problem, or tackle a bunch of not quite so complicated issues, without having the overhead of ramping up and context switching./p h4 id=subset class=rteindent1Consolidate by giving fewer people more contribution time./h4 pInstead of 10 people contributing 4 hours a week, pick 2 people from those that that want to contribute, give them each 20 hours a week./p pWith 20 hours a week, there is time to work on a complex problem, and also respond to feedback quickly. This reduces the overhead of needing to come back up to speed, context switching, or rebasing on a code base that has changed a lot./p pWith more consecutive time, people can concentrate on more complex problems, and stay up to date better, with less overhead. We can take that even further.../p h3 id=long-term class=rteindent1Focus long-term./h3 pIf instead of 10 people contributing 4 hours a week, you have 2 people contributing 20 hours a week, let them plan to do that for a few months./p pSome issues need someone to look after them, week after week, to see the issue through to completion./p pWhen someone shows they can make a reliable and ongoing contribution to the project, other experienced contributors, or project leaders will invest more into bringing that person up to speed and helping them get things done./p pGive people 3-4 months where they can plan on contributing./p h3 id=rotate class=rteindent1Rotate./h3 pAfter a few months, bring an employee back to full time client billable hours. And give another employee a turn to concentrate on contributing for 3-4 months./p pEmployees learn so much while contributing. Returning to focus on client projects or in-house work with their team is an opportunity to share that learning with everyone in the company. The company benefits from the improved skills and new community connections that employee gained while contributing directly to the project. /ppThis can also help to protect people from burning out on contributing./p h2 id=examplesExamples/h2 pHere are some examples of businesses having their employees contribute. Some are recent, some have been doing this for years. [These are examples of direct Drupal core contribution by employers. There are many ways to contribute to Drupal, and many businesses contribute in different, valuable ways.]/p ul class=rteindent4lia href=http://www.blinkreaction.com/blog/drupal-as-a-public-good-and-renewing-our-commitmentBlink Reaction had a sprint/a for their employees and brought in local experienced contributors and mentors to help their employee contribution time be effective, and get help targeting issues that are currently relevant. Blink Reaction had their event on non-working hours, a Saturday, so people did not have to stop working during regular hours when they feel like they should be working on projects with deadlines. People who work a full day at the contribution event on Saturday, get a compensation day they can schedule to take later./li lia href=https://www.getpantheon.com/jobs?gh_jid=33200Pantheon is hiring a contributor/a, and going to bring in an experienced contributor to mentor that person for a week or two./li lia href=https://www.acquia.com/blog/announcing-office-cto-acquiaAcquia/a has multiple full-time employees working on Drupal 8 issues./li lia href=http://chapterthree.com/blog/joining-chapter-threeChapter Three employs one of Drupal 8's four branch maintainers to work on Drupal 8/a./li lia href=http://nodeone.se/NodeOne (now part of Wunderkraut)/a), a href=https://www.zivtech.com/Zivtech/a, a href=https://www.erdfisch.de/erdfisch/a, a href=http://comm-press.de/comm-press/a, a href=http://cheppers.com/Cheppers/a, a href=http://breaktech.com/Breakthrough Technologies/a, and a href=New Digital Partnership/a (among others) dedicated 25-50% of one employee's time for several months to a particular Drupal core initiative./li liFreelancers and independents like a href=http://poplarware.com/news/freelancer-contribJennifer Hodgdon/a (and many others) incorporate contribution work with their billable time./li lia href=https://previousnext.com.au/drupalgivePreviousNext/a hired Donna (kattekrab) Benjamin to help focus the company's community engagement activities. She spends half her time on client work to ensure her role is sustainable, and half her time on community activity, such as the community working group, Drupal Association board and organising events. She also works with the PreviousNext team to help them find their own niche for making a useful contribution. Lee (larowlan) Rowlands and John Albin also spend some of their paid time mentoring other PreviousNext staff to contribute, who all have 20% time to work on the Drupal project code or community./li lia href=http://www.amazeelabs.com/Amazee Labs/a built their own company website on Drupal 8 Alpha and continues to implement customer websites on Drupal 8. Employees are paid to: find issues in Drupal 8, open issues in the issue queues, fix them, post the fixes on the issues, and further work on the issues. /liliBlackMesh hired me. :) To work on Drupal 8 issues and to help others contribute to Drupal./li /ulh2 id=helpHelp for businesses/h2 pSometimes it helps to have someone you can just talk to. You can talk to me. Reach out and ask any questions you have. I can answer them, or connect you with people who can./p h2 id=summarySummary/h2 pContribute. Doing it in any way is better than doing it perfectly. These are some strategies for paying employees to contribute that will help Drupal 8 release sooner. Concentrate your resources. Talk to others about what works at their companies. Get help from experienced contributors and mentors./p h3 id=corrections class=rteindent1Corrections/h3 pIf there are corrections or missing examples, please let me know./p p id=cathy-Cathybr /a href=http://twitter.com/YesCT@YesCT/a or a href=http://drupal.org/u/yesctDrupal.org contact form/a/p h2 id=psps./h2 h3 id=mentors class=rteindent1How to find and contact mentors and experienced contributors/h3 pSee the list of core mentoring leads in a href=http://cgit.drupalcode.org/drupal/tree/core/MAINTAINERS.txtMAINTAINERS.txt/a, and contact them in #drupal-contribute in a href=https://www.drupal.org/ircIRC/a or via their Drupal.org contact pages. There are also more mentors beyond the mentoring maintainers, and there is not exactly a list of experienced contributors. So, please feel free to just contact me and I can put you into contact with others./p/div/div/divspan class=submitted-by/spandiv class=field field-name-field-tags field-type-taxonomy-term-reference field-label-hiddendiv class=field-itemsdiv class=field-item evena href=/tags/drupal typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Drupal/a/divdiv class=field-item odda href=/tags/contributor typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Contributor/a/divdiv class=field-item evena href=/tags/sprints typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Sprints/a/divdiv class=field-item odda href=/tags/drupal-8 typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Drupal 8/a/div/div/div

orkjerns blogg: Headless Drupal with head fallback

Sun, 11/23/2014 - 22:22
span class=field field-node--title field-name-title field-type-string field-label-hiddenHeadless Drupal with head fallback/span span class=field field-node--uid field-name-uid field-type-entity-reference field-label-hiddenspan lang= about=/user/1 typeof=schema:Person property=schema:name datatype=admin/span/span span class=field field-node--created field-name-created field-type-created field-label-hiddenSun, 11/23/2014 - 21:22/span div class=field field-node--body field-name-body field-type-text-with-summary field-label-hidden div class=field-items div property=schema:text class=field-itempI just wanted to take a moment to talk about how I approached the hot word headless Drupal on my blog. It uses some sort of headless communication with the Drupal site, but it also leverages Drupal in a standard way. For different reasons. (by the way, a href=https://groups.drupal.org/headless-drupalif you are interested in headless Drupal, there is a groups.drupal.org page about the subject.)/a/p pFirst of all, let's examine in what way this simple blog is headless. It is not headless in the way that it offers all the functionality of Drupal without using Drupals front-end. For example, these words I am typing is not typed into a decoupled web-app or command-line tool. Its only headless feature is that it loads content pages with ajax through Drupal 8's new REST module. Let's look at a typical set-up for this, and how I approached it differently./p h2A typical setup/h2 pA common way to build a front-end JavaScript application leveraging a REST API, is using a framework of your choice (backbone / angular / or something else *.js) and build a single-page application (or SPA for short). Basically this could mean that you have an index.html file with some JavaScript and stylesheets, and all content is loaded with AJAX. This also means that if you request the site without JavaScript enabled, then you would just see an empty page (except of course if you have some way of scraping the dynamic content and outputting plain HTML as fallback)./p h2Head fallback/h2 pI guess the headless metaphor sounds strange when I change it around to talk about head fallback. But what I mean with this is that I want a user to be able to read all pages with no JavaScript enabled, and I want Drupal (the head) to handle this. All URLs should also contain (more or less) the same content if you are browsing with JavaScript or without it. Luckily, making HTML is something Drupal always has done, so let's start there./p pNow, this first part should be obvious. If a user comes to the site, we show only the output of each URL as intended with the activated theme. This is a out-of-the box feature with Drupal (and any other CMS). OK, so the fallback is covered. The next step is to leverage the REST module, and load content async with AJAX./p h2Head first, headless later/h2 pA typical scenario would be that for the front page I would want to request the /node resource with the header Accept:application/hal+json to get a list of nodes. Then I would want to display these in the same way the theme displays it statically on a page load. The usual way of doing this is that when the document is ready, we request the resource and build and render the page, client side. This is impractical in one way: You are waiting to load the entire document to actually render anything at all. Or maybe even worse: You could be waiting for the entire /node list to load, only to destroy the DOM elements with the newly fetched and rendered JSON. This is bad for several reasons, but one concrete example is a smart phone on a slow network. This client could start rendering your page on the first chunk of html transferred, and that would maybe be enough to show what is called the above the fold content. This is also something a href=https://developers.google.com/speed/docs/insights/PrioritizeVisibleContent that is a criteria in the often used Google PageSpeed./a Meaning in theory that our page would get slower (on first page load) by building a SPA on top of the fallback head./p pIt is very hip with some headless Drupal goodness, but not at the cost of performance and speed. So what I do for the first page load, is trust Drupal to do the rendering, and then initializing the JavaScript framework (a href=http://lhorie.github.io/mithril/Mithril.js/a in my case) when I need it. Let's take for example you, dear visitor, reading this right now. You probably came to this site via a direct link. Now, why would I need to set up all client side routes and re-render this node when all you probably wanted to do, was to read this article?/p h2Results and side-effects/h2 pOK, so now I have a fallback for JavaScript that gives me this result (first picture is without JavaScript, second is with JavaScript):/p img src=/sites/default/files/no-js.png style=border: 4px solid black;width:95%;display:block;margin:auto /img src=/sites/default/files/js.png style=border: 4px solid black;width:95%;display:block;margin:auto /pAs you can see, the only difference is that the disqus comment count can not be shown on the non-js version. So the result is that I have a consistent style for both js and non-js visitors, and I only initialize the headless part of the site when it is needed./p pA fun (and useful) side-effect is the page speed. Measured in Google PageSpeed this now gives me a score of 99 (with the only suggestion to increase the cache lifetime of the google analytics js)/p img src=/sites/default/files/pagespeed.png style=border: 4px solid black;width:95%;display:block;margin:auto /h2Is it really headless, then?/h2 pYes and no. Given that you request my site with JavaScript enabled, the first page request is a regular Drupal page render. But after that, if you choose to go to the front page or any other articles, all content is fetched with AJAX and rendered client side./p h2Takeaways and lessons learned/h2 pI guess some of these are more obvious than others./p ulliDo not punish your visitor for having JavaScript emdisabled/em. Make all pages available for all users. Mobile first is one thing, but you could also consider no-js first. Or both?/li liDo not punish your visitor for having JavaScript emenabled/em. If you render the page based on a AJAX request, the time between initial page load and actual render time will be longer, and this is especially bad for mobile./li liSubsequent pages are way faster to load with AJAX, both for mobile and desktop. You really don't need to download more than the content (that is, the text) of the page you are requesting, when the client already have the assets and wrapper content loaded in the browser./li /ulh2Disclaimers/h2 pFirst: these techniques might not always be appropriate for everyone. You should obviously consider the use case before using a similar approach/p pIf you, after reading this article, find yourself turning off JavaScript to see what the page looks like, then you might notice that there are no stylesheets any more. Let me just point out that this would not be the case if your _first_ page request were without JavaScript. By requesting and rendering the first page with JavaScript, your subsequent requests will say to my server that you have JavaScript enabled, and thus I also assume you have stored the css in localStorage (as the js does). a href=http://orkjern.com/running-on-drupal-8Please see this article for more information/a/p pLet's just sum this up with this bad taste gif in the category speed:/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-item img property=schema:image src=http://orkjern.com/sites/default/files/field/image/pegasus_e0.gif width=135 height=135 alt= typeof=foaf:Image / /div /div /div div class=field field-node--field-tags field-name-field-tags field-type-taxonomy-term-reference field-label-above clearfix h3Tags: /h3 ul class=links field-items lia href=/taxonomy/term/1 property=schema:aboutplanet drupal/a/li lia href=/taxonomy/term/2 property=schema:aboutdrupal 8/a/li lia href=/taxonomy/term/5 property=schema:aboutjavascript/a/li /ul /div ul class=links inlineli class=comment-forbidden/li/ul

Gizra.com: Todo app with RESTful backend

Sat, 11/22/2014 - 23:00
pThe Drupal community can now proudly claim its own implementation of a a href=(http://gizra.github.io/todo_restful/#/Todo app/a with a RESTful backend!/p pimg src=http://www.gizra.com/assets/images/posts/todo-restful/image1.jpg //p pa href=http://todomvc.com/TodoMVC/a is a site that helps you select the right JS MVC library. But more then that, it allows you to learn by comparing those libraries, as they all implement the same thing - a simple Todo app./p pI#39;ve decided to fork the a href=http://todomvc.com/examples/angularjs/#/Angular example/a, and build it on top of a href=https://github.com/Gizra/restfulRESTful/a. Looking at the Angular code, I was pleasantly surprised./p pa href=http://www.gizra.com/content/todo-restful-backend/Continue reading…/a/p

Paul Booker: How to determine the A and MX records for a given Domain for a given DNS server

Sat, 11/22/2014 - 11:36
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item even property=content:encodedpre class=brush: bash $ dig A paulbooker.co.uk @208.67.220.220 ; DiG 9.8.3-P1 A paulbooker.co.uk @208.67.220.220 ;; global options: +cmd ;; Got answer: ;; -HEADER- opcode: QUERY, status: NOERROR, id: 55528 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;paulbooker.co.uk. IN A ;; ANSWER SECTION: paulbooker.co.uk. 10800 IN A 92.243.12.252 ;; Query time: 131 msec ;; SERVER: 208.67.220.220#53(208.67.220.220) ;; WHEN: Fri May 31 17:44:54 2013 ;; MSG SIZE rcvd: 50 /prepre class=brush: bash $ dig MX paulbooker.co.uk @208.67.220.220 ; DiG 9.8.3-P1 MX paulbooker.co.uk @208.67.220.220 ;; global options: +cmd ;; Got answer: ;; -HEADER- opcode: QUERY, status: NOERROR, id: 42037 ;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;paulbooker.co.uk. IN MX ;; ANSWER SECTION: paulbooker.co.uk. 10800 IN MX 5 ALT2.ASPMX.L.GOOGLE.COM. paulbooker.co.uk. 10800 IN MX 1 ASPMX.L.GOOGLE.COM. paulbooker.co.uk. 10800 IN MX 10 ASPMX2.GOOGLEMAIL.COM. paulbooker.co.uk. 10800 IN MX 10 ASPMX3.GOOGLEMAIL.COM. paulbooker.co.uk. 10800 IN MX 5 ALT1.ASPMX.L.GOOGLE.COM. ;; Query time: 122 msec ;; SERVER: 208.67.220.220#53(208.67.220.220) ;; WHEN: Fri May 31 17:46:13 2013 ;; MSG SIZE rcvd: 167 /prep If no DNS server argument is provided, dig consults /etc/resolv.conf and queries the name servers listed there. /p pre class=brush: bash $ cat /etc/resolv.conf # # Mac OS X Notice # # This file is not used by the host name and address resolution # or the DNS query routing mechanisms used by most processes on # this Mac OS X system. # # This file is automatically generated. # nameserver 194.168.4.100 nameserver 194.168.8.100 /prep These nameservers are provided by my broadband provider ../p pre class=brush: bash $ dig -x 194.168.4.100 ; DiG 9.8.3-P1 -x 194.168.4.100 ;; global options: +cmd ;; Got answer: ;; -HEADER- opcode: QUERY, status: NOERROR, id: 48388 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;100.4.168.194.in-addr.arpa. IN PTR ;; ANSWER SECTION: 100.4.168.194.in-addr.arpa. 22026 IN PTR cache1.service.virginmedia.net. ;; Query time: 12 msec ;; SERVER: 194.168.4.100#53(194.168.4.100) ;; WHEN: Fri May 31 17:50:01 2013 ;; MSG SIZE rcvd: 88 /prep .. virgin media via DHCP./p pIf you want to find out more about dig then you need to man dig not sure what man is, then you need to man man. Dig? :D/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-0a href=/drupal-developer/tags/dns typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=dns/a/lili class=taxonomy-term-reference-1a href=/drupal-developer/tags/dig typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=dig/a/lili class=taxonomy-term-reference-2a href=/drupal-developer/tags/drupalplanet typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=drupalplanet/a/li/ul/divdiv class=easy_social_box clearfix horizontal easy_social_lang_und div class=easy_social-widget easy_social-widget-twitter firsta href=http://twitter.com/share class=twitter-share-button data-url=http://www.paulbooker.co.uk/drupal-developer/command-lines/how-determine-and-mx-records-given-domain-given-dns-server-0 data-count=horizontal data-lang = en data-via= data-related=:Check it out! data-text=How to determine the A and MX records for a given Domain for a given DNS serverTweet/a/div div class=easy_social-widget easy_social-widget-facebookiframe src=//www.facebook.com/plugins/like.php?locale=en_USamp;href=http%3A//www.paulbooker.co.uk/drupal-developer/command-lines/how-determine-and-mx-records-given-domain-given-dns-server-0amp;send=falseamp;layout=button_countamp;width=88amp;show_faces=trueamp;action=likeamp;colorscheme=lightamp;font=amp;height=21amp;appId= scrolling=no frameborder=0 style=border:none; overflow:hidden; width:88px; height:21px; allowTransparency=true/iframe/div div class=easy_social-widget easy_social-widget-googleplusdiv class=g-plusone data-size=medium data-annotation=bubble data-href=http://www.paulbooker.co.uk/drupal-developer/command-lines/how-determine-and-mx-records-given-domain-given-dns-server-0/div/div div class=easy_social-widget easy_social-widget-linkedin lastscript type=in/share data-url=http://www.paulbooker.co.uk/drupal-developer/command-lines/how-determine-and-mx-records-given-domain-given-dns-server-0 data-counter=right/script/div /div !-- /.easy_social_box --

Paul Booker: Allowing a user to login only if they have an active infusionsoft CRM contact.

Sat, 11/22/2014 - 11:17
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item even property=content:encodedpre class=brush: php /** * Implements hook_user_login(). */ function mymodule_infusionsoft_user_login($edit, $account) { global $tag; if (user_access('administer site configuration')) { return TRUE; } $contact_active = _mymodule_infusionsoft_contact_active($account-mail); if ($contact_active == FALSE) { session_destroy(); session_start(); // Load the anonymous user $user = drupal_anonymous_user(); drupal_set_message(variable_get('mymodule_infusionsoft_message', 'Infusionsoft account not created or has expired.'), 'warning'); if (empty($tag)) drupal_goto('user/register'); if ($tag == expired) drupal_goto('account-expired'); if ($tag == blocked) drupal_goto('account-blocked'); } else { // Update membership roles to match CRM groups/tags _mymodule_infusionsoft_update_membership_roles($account); } } /prepre class=brush: php function _mymodule_infusionsoft_contact_active($mail) { global $tag; $contact_active = FALSE; $contact_id = infusionsoft_contact_load_by_email($mail); if (!empty($contact_id) is_numeric($contact_id)) { $groups = infusionsoft_group_contact_options($contact_id); $num_groups = count($groups); if ($num_groups == 0) return FALSE; if (in_array(STATUS__EXPIRED, $groups)) { $tag = expired; return FALSE; } if (in_array(STATUS__LIVE, $groups)) { $tag = active; return TRUE; } } /pre/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-0a href=/drupal-developer/tags/infusionsoft typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=infusionsoft/a/lili class=taxonomy-term-reference-1a href=/drupal-developer/tags/crm typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=CRM/a/lili class=taxonomy-term-reference-2a href=/drupal-developer/tags/hookuserlogin typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=hook_user_login/a/lili class=taxonomy-term-reference-3a href=/drupal-developer/tags/drupalplanet typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=drupalplanet/a/li/ul/divdiv class=easy_social_box clearfix horizontal easy_social_lang_und div class=easy_social-widget easy_social-widget-twitter firsta href=http://twitter.com/share class=twitter-share-button data-url=http://www.paulbooker.co.uk/drupal-developer/code-snippet/allowing-user-login-only-if-they-have-active-infusionsoft-crm-contact data-count=horizontal data-lang = en data-via= data-related=:Check it out! data-text=Allowing a user to login only if they have an active infusionsoft CRM contact.Tweet/a/div div class=easy_social-widget easy_social-widget-facebookiframe src=//www.facebook.com/plugins/like.php?locale=en_USamp;href=http%3A//www.paulbooker.co.uk/drupal-developer/code-snippet/allowing-user-login-only-if-they-have-active-infusionsoft-crm-contactamp;send=falseamp;layout=button_countamp;width=88amp;show_faces=trueamp;action=likeamp;colorscheme=lightamp;font=amp;height=21amp;appId= scrolling=no frameborder=0 style=border:none; overflow:hidden; width:88px; height:21px; allowTransparency=true/iframe/div div class=easy_social-widget easy_social-widget-googleplusdiv class=g-plusone data-size=medium data-annotation=bubble data-href=http://www.paulbooker.co.uk/drupal-developer/code-snippet/allowing-user-login-only-if-they-have-active-infusionsoft-crm-contact/div/div div class=easy_social-widget easy_social-widget-linkedin lastscript type=in/share data-url=http://www.paulbooker.co.uk/drupal-developer/code-snippet/allowing-user-login-only-if-they-have-active-infusionsoft-crm-contact data-counter=right/script/div /div !-- /.easy_social_box --

3C Web Services: How to redirect all traffic to HTTPS on your Drupal site

Sat, 11/22/2014 - 00:57
pSince Google announced that it gives an additional SEO boost for sites that are fully encrypted with HTTPS it is now advisable to encrypt your entire site and not just pages with sensitive information such as user login and checkout pages./p pThere are multiple method to achieve this. We like using the below modification to .HTACCESS file. Simply add this code to the .HTACCESS file that is located in the Drupal root directory after the the line and all traffic to your site will now automatically be redirected from HTTP to HTTPS./p

ImageX Media: Delivery Documentation

Fri, 11/21/2014 - 22:11
div class=field field-name-body field-type-text-with-summary divWhen buying a car, there’s a reason you are given such a comprehensive user's manual to cover everything that the salesperson or technician was unable to show you how to do in the first demonstration. Things like what to do when the Check Engine light comes on, or which grade of oil to use when it comes time for an oil change. Although you may not reference it often, when needed the supporting user manual is worth its weight in gold./div /div

Blink Reaction: Matt Korostoff Talks REST and SOAP

Fri, 11/21/2014 - 21:53
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item even property=content:encodedpThis talk was given at Drupal Camp Baltimore 2014. In it, I discuss REST and (briefly) SOAP APIs built with Drupal. I give a number of hands on examples using Views Datasource, RESTful Web Services (restws), and the Services module./p piframe src=http://www.youtube.com/embed/a2nHIWlCXSw frameborder=0 width=640 height=360/iframe/p/div/div/div