Jackrabbithanna's Drupal and CiviCRM Blog http://jackrabbithanna.com en Understanding and Using Views Contexual Filters http://jackrabbithanna.com/articles/understanding-and-using-views-contexual-filters <div class="field field-name-body field-type-text-with-summary field-label-hidden view-mode-rss"><div class="field-items"><div class="field-item even" property="content:encoded"><p>Views Contextual Filters is a feature of the Views module which allows a Views to accept filtering from url, or other inputs.  This allows you to create lists that depend on conditional or user input.  There are many reasons why you may want to filter a list based on url input.  Take for example of a list of articles.  You may have many articles and wish to categorize them.  In the case of this website I'd like to be able to filter my article lists by the different Tags I give the articles.  I have several taxonomy terms, CiviCRM, Drupal, and Integration. For this article and I am going to how how to create a simple page view that will take a term name as an url argument passed to Views Contextual Filter. </p> <p>I will create a page view with the path <a href="article-listing-by-tag">article-listing-by-tag</a>.  That link has no arguments after it, and the page view returns all articles.  <a href="/article-listing-by-tag/civicrm">article-listing-by-tag/civicrm</a> lists all the articles tagged with CiviCRM, and <a href="/article-listing-by-tag/drupal">article-listing-by-tag/drupal</a> lists all the articles tagged with Drupal.</p> <p>Goto http://[your_drupal_root]/admin/structure/views/add</p> <ol><li>Enter a name, maybe "Article Listing by tag"</li> <li>Select Content from the "Show" Select Box</li> <li>Select Article from the "of Type" Select Box</li> <li>Change the Title to "Articles"</li> <li>Items to display: 0</li> <li>Uncheck the use pager checkbox</li> <li>Click the "Contine and edit" button</li> <li>Expand the "Advanced" fieldset in the far right column</li> <li>Click "Add" under "Contextual Filters"</li> <li>Scroll down to the field shown in the image below:</li> </ol><p><img alt="" src="/sites/default/files/views-contextual-filter-0.png" style="width: 739px; height: 377px;" /></p> <p> </p> <p>11: Use these settings:</p> <p><img alt="" src="/sites/default/files/views-contextual-filters-1.png" style="width: 623px; height: 377px;" /></p> <p> </p> <p><img alt="" src="/sites/default/files/views-contextual-filters-2.png" style="width: 822px; height: 342px;" /></p> <p> </p> <p>12. Then click apply</p> <p>13. Save the view</p> <p> </p> <p>You should now have a page view that will accept a term name from the Tag vocabulary</p> </div></div></div><section class="field field-name-field-tags field-type-taxonomy-term-reference field-label-above view-mode-rss"><h2 class="field-label">Tags:&nbsp;</h2><ul class="field-items"><li class="field-item even" rel="dc:subject"><a href="/tags/drupal" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">Drupal</a></li></ul></section> Sun, 18 Aug 2013 23:20:26 +0000 Mark Hanna 13 at http://jackrabbithanna.com Easy JQuery Modificaiton of CiviCRM Forms http://jackrabbithanna.com/articles/easy-jquery-modificaiton-civicrm-forms <div class="field field-name-body field-type-text-with-summary field-label-hidden view-mode-rss"><div class="field-items"><div class="field-item even" property="content:encoded"><p>Have you ever wanted to modify a CiviCRM contribution or event registration page?  Taken a look at those Smarty templates?  Doesn't look pretty does it.</p> <p>In the article I describe how to easily add JQuery/javascript to any form you want and modify the page.</p> <p>First, and hardest of all, is create a basic CiviCRM extension.  There is a program that will generate a basic extension that integrates with CiviCRM but doesn't yet add functionality.</p> <!--break--> <p><strong>Create an Extension</strong></p> <p>Visit the CiviCRM wiki page for how to create a base Module Extension. <a href="http://wiki.civicrm.org/confluence/display/CRMDOC43/Create+a+Module+Extension">http://wiki.civicrm.org/confluence/display/CRMDOC43/Create+a+Module+Extension</a></p> <p>Once you have created your extension you need to implement one CiviCRM hook to add your javascript file to the page of your choice.</p> <p>I created an extension called com.skvare.testextend. The main php file to edit in this case is testextend.php.</p> <p>CiviCRM hooks that you implement will start with the last part of the name: testextend</p> <p>The function below implements hook_civicrmbuildForm.  Notice the call to the function <em>addScriptFile</em>. This code will add the javascript file my_alter_contribform.js to any contribution page with an id of 2. The 'com.skvare.testextend' is the name of the extension I created.</p> <pre>function tctaextend_civicrm_buildForm($formName, &amp;$form) { if($formName=='CRM_Contribute_Form_Contribution_Main'){ if($form-&gt;_id==2 ){ CRM_Core_Resources::singleton()-&gt;addScriptFile('com.skvare.testextend', 'my_alter_contribform.js'); } }</pre><p>Thats all it takes to be able to add javascript/jquery modifications to a CiviCRM form.</p> <p>Here's an example of the javascript file with some simple modifications. Put your javascript file in the base directory of the extension, the same place where you see [youmodulename].php. In my case it was the directory with testextend in it.</p> <p>This function changes the default text for the 'Other Amount' text field when you enable contributions on a contribution form. It also changes the text of the "Conbribute" button based on the membership section fieldset. The value for this fieldset label is set on the settings page for the contribution as the 'Title - New Membership' and 'Title - Renewals' fields on the Memberships tab. So if the user if getting a membership for the first time the button says "Join Now!". If the user is returning to the form to renew their membership the button says "Renew Now!" File my_alter_contribform.js:</p> <pre>/** * This is our closure - all of our code goes inside it * * This style of closure is provided by jquery and automatically * waits for document.ready. It also provides us with a local * alias of jQuery as $. * * ES5 specifies that the first line inside our closure * should be 'use strict'; */ /*jslint indent: 2 */ /*global CRM, cj, ts */ cj(function ($) { 'use strict'; // Variables declared here will be globally available within this closure //Change Other amount text box label $('.other_amount-section label').text("Other donation amount (optional)"); //Change Contribute button text to Join or Renew //for New Active Membership version of page if($('.membership-group #priceset legend').text()=="New Active Membership") { $('#_qf_Main_upload-bottom').attr('value', 'Join now!'); } // for Renew Active Membership version of page if($('.membership-group #priceset legend').text()=="Renewing Active Membership") { $('#_qf_Main_upload-bottom').attr('value', 'Renew now!'); } } });//end cj </pre><p>Use your JQuery magical powers to your hearts content without having to mess with Smarty templates!</p> </div></div></div><section class="field field-name-field-tags field-type-taxonomy-term-reference field-label-above view-mode-rss"><h2 class="field-label">Tags:&nbsp;</h2><ul class="field-items"><li class="field-item even" rel="dc:subject"><a href="/tags/civicrm" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">CiviCRM</a></li></ul></section> Sat, 20 Jul 2013 00:52:19 +0000 Mark Hanna 9 at http://jackrabbithanna.com Simple Rule Example Using CiviCRM Entity http://jackrabbithanna.com/articles/simple-rule-example-using-civicrm-entity <div class="field field-name-body field-type-text-with-summary field-label-hidden view-mode-rss"><div class="field-items"><div class="field-item even" property="content:encoded"><p>The new Drupal module CiviCRM Entity exposes 11 CiviCRM objects as Drupal Entities and provides rules support for these entities.  In this article I will demonstrate how to create a simple rule which creates a synced drupal user for the contact when the contact gets a membership.</p> <p>This how-to assumes you have the <a href="https://drupal.org/project/rules">Rules</a> modules and the <a href="https://drupal.org/sandbox/eileen/1923028">CiviCRM Entity</a> module installed.</p> <p><strong>Create the rule:</strong></p> <ul><li>admin/config/workflow/rules/reaction/add</li> <li>for name enter Create Synced User When Contact Gets Membership</li> <li>For <strong>React on Event: </strong>Select 'CiviCRM Membership has been created'</li> <li>Click Save</li> <li>Under <strong>Actions </strong>select 'Create Linked Drupal User Account'</li> <li>Click Continue</li> <li>The default value for the CiviCRM contact Contact <strong>Data selector </strong>field should already be correct but ensure it is: civicrm-membership:contact-id-contact</li> <li>Check <strong>Activate account</strong> and <strong>Send ccount notification email</strong> if you wish</li> <li>Click save</li> </ul><p><strong>You can extend the rule</strong></p> <p>If you would like to only create the user for a specific membership type.</p> <ul><li>Under <strong>Conditions</strong> click the Add Condition link</li> <li>For the <strong>Select the <em class="placeholder">condition</em> to add</strong> field select Data Comparison</li> <li>Under <strong>Data to Compare</strong> use the data selector find the membership type id field of the membership object. It should be this: civicrm-membership:membership-type-id</li> <li>Click Continue</li> <li>Under <strong>Operator</strong> select equals</li> <li>Under <strong>Data Value</strong> enter the membership type id of the membership type you'd like to create linked drupal users for</li> <li>click save</li> </ul><p> </p> </div></div></div><section class="field field-name-field-tags field-type-taxonomy-term-reference field-label-above view-mode-rss"><h2 class="field-label">Tags:&nbsp;</h2><ul class="field-items"><li class="field-item even" rel="dc:subject"><a href="/tags/drupal" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">Drupal</a></li><li class="field-item odd" rel="dc:subject"><a href="/tags/civicrm" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">CiviCRM</a></li><li class="field-item even" rel="dc:subject"><a href="/tags/integration" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">Integration</a></li></ul></section> Fri, 28 Jun 2013 02:19:32 +0000 Mark Hanna 8 at http://jackrabbithanna.com Creating an Entity Reference View http://jackrabbithanna.com/articles/creating-entity-reference-view <div class="field field-name-body field-type-text-with-summary field-label-hidden view-mode-rss"><div class="field-items"><div class="field-item even" property="content:encoded"><p>The Entity Reference module is a useful Drupal 7 module and can be used to reference any entity from a field added to any other entity.  For example, you can add a entity reference field to the Basic Page content type, which references taxonomy terms of vocabulary (bundle) tags.  When you are creating a page and want to reference a particular term, it may help the user to see a custom format for the terms.  By default the term name will be displayed for the terms that can be referenced.  It may be convenient for the user to have a more detailed descprition of the term to make a decision.  Perhaps for good reasons you have terms named "1" and "2" in a Staff vocabulary.   You may write descriptions for those terms where "1"s description is "Director" and "2"s description is "Teacher".  You want to reference one of these terms when you create a Basic Page.  The entity reference module comes with built in funcitonality for the use of views in creating a filtered list of entities available for selection for an entity reference field.</p> <p>I want the options in my Staff Reference field to be "1 - Director" and "2- Teacher".</p> <p>First create the Taxonomy vocabulary and terms</p> <ul><li>Goto: admin/structure/taxonomy/add</li> <li>Enter Staff in the name field</li> <li>Click Save</li> <li>Click on <strong>add terms</strong> for the Staff vocabulary</li> <li>(Creating first term) <ul><li>Enter 1 for the <strong>Name</strong> field</li> <li>Enter Director for the <strong>Description </strong>field</li> <li>Save</li> </ul></li> <li>Create second term <ul><li>Enter 2 for the <strong>Name field</strong></li> <li>Enter Teacher for the <strong>Description </strong>field</li> <li>Save</li> </ul></li> </ul><p>Now create an entity reference view</p> <ul><li>Goto structure/views/add</li> <li>Name the view Staff Reference View</li> <li>Select Taxonomy terms from the <strong>Show</strong> select list</li> <li>Select Staff from the <strong>Type</strong> select list</li> <li>Uncheck the <strong>Create a page</strong> checkbox</li> <li>Click <strong>Continue and Edit</strong></li> </ul><p>Configuring the view</p> <ul><li>Click the <strong>+Add</strong> button</li> <li>Select Entity Reference</li> <li>In the <strong>Fields</strong> section click the add link</li> <li>Check the box next to Taxonomy term: Term description</li> <li>Click <strong>Apply</strong></li> <li>Uncheck <strong>Create a Label</strong></li> <li>Click Apply</li> <li>Click the<a class="views-ajax-link views-ajax-processed-processed" href="http://www.youniversally.com/reviews-system/admin/structure/views/nojs/config-item/staff_reference_view/entityreference_1/field/name"> </a><strong><span class="views-ajax-link views-ajax-processed-processed">Taxonomy term: Name</span></strong> link in the <strong>Fields</strong> section</li> <li>Uncheck <strong>Link this field to its taxonomy term page</strong></li> </ul><ul><li>Under the <strong>Format</strong> section you will see a <em>Format: Entity Reference List | Settings</em></li> <li>Click Settings</li> <li>For <strong><label for="edit-style-options-search-fields">Search fields</label></strong> check Taxonomy term:Name</li> <li>Click Apply</li> <li>Under the <strong>Format</strong> section you will also see<span class="label"> <em>Show:</em></span><em> <span class="views-ajax-link views-ajax-processed-processed">Inline fields</span><span class="label"> | </span><span class="views-ajax-link views-button-configure views-ajax-processed-processed"><span>S</span></span><span class="views-ajax-link views-button-configure views-ajax-processed-processed"><span>ettings</span></span></em></li> <li>Click Settings</li> <li>Under <strong>Inline Fields</strong> <ul><li>Check Taxonomy term: Name</li> <li>Check Taxonomy term: Term description</li> </ul></li> <li>Click Apply</li> <li>Save the view</li> </ul><p>Lets add and configure an entity reference field.</p> <ul><li>Go to admin/structure/types/manage/page/fields</li> <li>Enter Staff Reference in the <strong>Add new field</strong> text field.</li> <li>Select Entity Reference from the <strong>Field Type</strong> select list</li> <li>Select Select List from the Widget select list</li> <li>Click Save</li> </ul><p>You are now presented with the <strong>Field Settings</strong> page</p> <p><strong>Target Type</strong> sets the entity which this field will reference. In our example we will be using Taxonomy Term. Inside the <strong>Entity Selection</strong> fieldset is the <strong>Mode</strong> field with two options: Simple (with bundle filter) , and views (Filter by an Entity Reference View).</p> <ul><li>For <strong>Mode </strong>Select Views (Filter by an Entity Reference View)</li> <li>For <strong>View used to select the entities </strong>choose the view we created earlier staff_reference_view  Entity reference</li> <li>Click the <strong>Save Field Settings</strong> button</li> <li>Click <strong>Save Settings</strong> when the next page loads</li> </ul><p>Create a page</p> <ul><li>Goto: node/add/page</li> <li>You will see the Article Reference field select list under the body field</li> <li>The Options say "1-Director" and "2-Teacher"</li> </ul><p> </p> </div></div></div><section class="field field-name-field-tags field-type-taxonomy-term-reference field-label-above view-mode-rss"><h2 class="field-label">Tags:&nbsp;</h2><ul class="field-items"><li class="field-item even" rel="dc:subject"><a href="/tags/drupal" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">Drupal</a></li></ul></section> Wed, 26 Jun 2013 23:56:09 +0000 Mark Hanna 7 at http://jackrabbithanna.com Using Rules and Views Bulk Operations http://jackrabbithanna.com/articles/using-rules-and-views-bulk-operations <div class="field field-name-body field-type-text-with-summary field-label-hidden view-mode-rss"><div class="field-items"><div class="field-item even" property="content:encoded"><p>In a <a href="/articles/eva-and-entity-reference-use-case-how">previous article</a> I described how to use the EVA and Entity Reference modules to create a simple reviews system for the Article content type.  To improve this system, it would be good if when an Article is deleted, that all the reviews that reference that Article are also deleted.</p> <p>To do this we will use Rules, Conditional Rules, and Views Bulk Operations</p> <h3>Rules</h3> <p>The rules module allows site administrators to define conditionally executed actions based on occurring events (known as reactive or ECA rules). It's a replacement with more features for the trigger module in Drupal core.</p> <p><strong>Example use cases</strong></p> <ul><li>Build flexible content publishing workflows changes</li> <li>Send customized mails to notify your users about important events</li> <li>Create custom redirections, system messages, breadcrumbs, ...</li> <li>Altering variable or entity data depending on user role</li> <li>Executing custom php code after comment added</li> <li>Deleting entities that reference an entity that is being deleted</li> </ul><p>The Rules module reacts to Events and performs various actions when those events occur. Conditions can be applied to rules. Once an event triggers Rules, and the set conditions are met, Rules can perform various actions or loops of actions.</p> <h3>Rules Components</h3> <p>Rules components can be used to organize combinations of actions or conditions. For example, you may have many actions you wish to take after one type of event. You an event may invoke a rules action component which will contain several action rules which will fire when your event happens. This is handy because it allows you to organize and separate each action for simpler editing especially in the case of complicated conditions for executing an action.</p> <p><a href="http://drupal.org/project/rules">http://drupal.org/project/rules</a></p> <h3>Conditional Rules</h3> <p>Conditional Rules allows much more flexibility in the conditioning of rules actions. Adds If/Else, switch, and while structures to be placed in the actions area of a Rule</p> <p><a href="http://drupal.org/project/rules_conditional">http://drupal.org/project/rules_conditional</a></p> <h3>Views Bulk Operations</h3> <p>Views Bulk Operations creates an interface to perform actions on views query result entities. In Rules it adds an action to load a list of entity ids or objects which can be acted on by other rules actions.</p> <p><a href="http://drupal.org/project/views_bulk_operations">http://drupal.org/project/views_bulk_operations</a></p> <h2>How-To Guide</h2> <p><strong>Create VBO View to use in rule</strong></p> <ol><li>Create a new view showing content of type review, no page or other views displays.</li> <li>Add a field Bulk Operations: Content and at least one other field</li> <li>Settings for the Bulk Operation field, Under 'Selected Bulk Operations', Check the Delete item checkbox,</li> <li>Add contextual filter which is the entity reference field</li> <li>Pager settings: display all items</li> </ol><p><strong>Create Rule</strong></p> <ol><li>Create new Rule React to event: After deleting content</li> <li>Add condition: ‘Content is of type’ and select Article</li> <li>Add action: Load a list of entity objects from VBO view</li> <li>Select New view that was created in steps 1‐4 and pass the node:nid (of deleted node) as the argument to the view</li> <li>Name the List Reviews List</li> <li>Add Loop, list to act on is Reviews List, can change name of current item is list (optional)</li> <li>Nested in loop add action Delete Entity, use [list‐item] or whatever you named the current list item</li> </ol></div></div></div><section class="field field-name-field-tags field-type-taxonomy-term-reference field-label-above view-mode-rss"><h2 class="field-label">Tags:&nbsp;</h2><ul class="field-items"><li class="field-item even" rel="dc:subject"><a href="/tags/drupal" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">Drupal</a></li></ul></section> Tue, 25 Jun 2013 19:34:55 +0000 Mark Hanna 5 at http://jackrabbithanna.com Understanding Views Relationships http://jackrabbithanna.com/articles/understanding-views-relationships <div class="field field-name-body field-type-text-with-summary field-label-hidden view-mode-rss"><div class="field-items"><div class="field-item even" property="content:encoded"><p>Source: <a href="http://drupal.org/node/1578586">http://drupal.org/node/1578586</a></p> <p>Relationships are used to allow Views to bring in data that is associated with the data already available in the view. A comment view could, for example, use the relationship comment: content to tap into data about the node for each comment. A term view could use the relationship taxonomy: parent term to tap into data from the parent term of each listed term.</p> <p>People comfortable with writing SQL queries will recognize the relationships as joins. You add, edit and delete relationships in the same way as filter, view fields and sort criteria by using the add button and its related menu.</p> <p><!--break--></p> <p>To look at the actual SQL generated by a view follow the steps below</p> <ol><li>Goto: admin/structure/views/settings</li> <li>Under '<span class="fieldset-legend">Live preview settings'</span></li> <li><span class="fieldset-legend">Make sure '</span>Show information and statistics about the view during live preview' option is checked</li> <li>Check the 'Show the SQL query' option</li> <li>Save</li> </ol><p><strong>Relationship settings:</strong></p> <p>You add, edit and delete relationships in the same way as filter, view fields and sort criteria by using the add button and its related menu. The settings for relationships are:</p> <ul><li>Identifier: This is the name that will be used for the relationship within the Views administration interface.</li> <li>Require this relationship: Checking this option will make the view exclude items where this relationships cannot be fulfilled.<br />For the relationship taxonomy: parent term, for example, it would mean that terms without parent terms would be excluded.</li> </ul><p>A view with relationships will, for each result in the view, not only have data for the base object of the view, but also for the objects described by the relationships. When editing the configuration of data fields there is (where applicable) an option relationships in the fieldset more. This setting can be used to select which object should be used for this data field. This means that in a comment view utilizing the comment: content relationship, you can choose to filter on node type. If you are including the relationship comment: user you could sort the results by the name of the user writing the comment.</p> <p>Data fields can be tied to the base object of the view, or to any of the objects provided by relationships. When creating a view you select the base table for the view, comments, users, nodes, etc, to decide what will be the view's base objects. Some functionality in Views always acts on the base object, ignoring all relationships. An example of this is the distinct option, hidden under query settings in the advanced section.</p> <p>If you use the Entity reference, References and Relation modules to connect entities on your site, these connections will show up as relationships in Views.</p> </div></div></div><section class="field field-name-field-tags field-type-taxonomy-term-reference field-label-above view-mode-rss"><h2 class="field-label">Tags:&nbsp;</h2><ul class="field-items"><li class="field-item even" rel="dc:subject"><a href="/tags/drupal" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">Drupal</a></li></ul></section> Tue, 25 Jun 2013 19:03:36 +0000 Mark Hanna 4 at http://jackrabbithanna.com Useful Field Modules http://jackrabbithanna.com/articles/useful-field-modules <div class="field field-name-body field-type-text-with-summary field-label-hidden view-mode-rss"><div class="field-items"><div class="field-item even" property="content:encoded"><h3>Field Formatter API</h3> <p><a href="https://drupal.org/project/field_formatter_settings">https://drupal.org/project/field_formatter_settings</a></p> <p>The Field API in Drupal core lacks the ability for other modules to easily alter field formatter settings forms and the formatter summaries. This module is a small API provider for other modules since it's too late to get the hooks into core. This and the modules below give you much more flexibility with fields especially when used in combination with Display Suite.</p> <h3>Modules making use of the Field Formatter API module:</h3> <ul style="list-style-type:none"><li><strong>Field injector</strong> <a href="https://drupal.org/project/field_injector">https://drupal.org/project/field_injector</a> <p>Provides display settings for fields to inject themselves into text fields at specific locations. For example, you can have an image field inject itself below the first paragraph of the body field.</p> </li> <li><strong>Field formatter class</strong> <a href="https://drupal.org/project/field_formatter_class">https://drupal.org/project/field_formatter_class</a> <p>This module allows site administrators to add classes to the outer HTML wrapper for any field display.</p> </li> <li><strong>Field delimiter</strong> <a href="http://drupal.org/project/field_delimiter">http://drupal.org/project/field_delimiter</a> <p>Field Delimiter provides an additional setting for field formatters, allowing multi‐value fields to be displayed with a delimiter between the values.</p> </li> <li><strong>Field multiple limi</strong>t <a href="http://drupal.org/project/field_multiple_limit">http://drupal.org/project/field_multiple_limit</a> <p>This is a simple module that provides settings to limit the number of values to display on fields with multiple values.</p> </li> <li><strong>Field word boundry</strong> <a href="http://drupal.org/project/field_word_boundary">http://drupal.org/project/field_word_boundary</a> <p>Field Word Boundary is a module that extends the settings for the Trimmed and Summary or trimmed formatters for long text fields. This module will allow us to trim by the nearest word boundary instead, and will add an optional ellipsis.</p> </li> <li><strong>Field formatter conditions</strong> <a href="http://drupal.org/project/ffc">http://drupal.org/project/ffc</a></li> </ul><h3>Field Collection</h3> <p>Provides a field‐collection field, to which any number of fields can be attached. A field collection is internally represented as an entity, which is embedded in the host entity. Thus, if desired field collections may be viewed and edited separately too. There are many modules that add additional capability for the field collection module.</p> <p><a href="http://drupal.org/project/field_collection">http://drupal.org/project/field_collection</a></p> <h3>Modules making use of the Field Collection module:</h3> <ul style="list-style-type:none"><li><strong>Field Collection Table: </strong><a href="https://drupal.org/project/field_collection_table" rel="nofollow">Field Collection Table</a> <p>Provides a table formatter for the Field Collection module.</p> </li> <li><strong>Field Collection Views: </strong><a href="https://drupal.org/project/field_collection_views" rel="nofollow">Field Collection Views</a> <p>This module provides a formatter leveraging views for the Field Collection module.</p> </li> <li><strong><strong>Field Collection Deploy: </strong></strong><a href="https://drupal.org/project/field_collection_deploy" rel="nofollow">Field Collection Deploy</a> <p>Deploy the content of Field Collection fields from one site to another.</p> </li> </ul><h3><strong><strong>Field Slideshow</strong></strong></h3> <p>Provides a Slideshow formatter for Image fields, using JQuery <a href="http://jquery.malsup.com/cycle/" rel="nofollow">Cycle</a> plugin.</p> <p>Compared to Views slideshows, building the slideshow from multiple nodes, this module builds it from a single node, with a multi-valued Image/Media/Field Collection field.</p> <p><a href="https://drupal.org/project/field_slideshow">https://drupal.org/project/field_slideshow</a></p> <h3>Views Field</h3> <p>A whole class could be devoted to this interesting but largely unknown module. Allows field tables to be used as base tables with Views. Drupal creates a table for each Drupal field. This module allows you to expose all the columns for a field table and add them as fields or to be used with and <a href="/articles/understanding-views-relationships">views relationships</a>. On a field settings form, you may select to expose the field table as a base table, or the columns of the field table to expose (e.g., entity_type, entity_id, and delta) Multiple "exposed" field tables may be related by a multi‐column join using the primary key columns. This module provides a programmatic interface to trigger this relation.</p> <p><a href="http://drupal.org/project/views_field">http://drupal.org/project/views_field</a></p> </div></div></div><section class="field field-name-field-tags field-type-taxonomy-term-reference field-label-above view-mode-rss"><h2 class="field-label">Tags:&nbsp;</h2><ul class="field-items"><li class="field-item even" rel="dc:subject"><a href="/tags/drupal" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">Drupal</a></li></ul></section> Tue, 25 Jun 2013 17:56:03 +0000 Mark Hanna 3 at http://jackrabbithanna.com EVA and Entity Reference Use Case How-to http://jackrabbithanna.com/articles/eva-and-entity-reference-use-case-how <div class="field field-name-body field-type-text-with-summary field-label-hidden view-mode-rss"><div class="field-items"><div class="field-item even" property="content:encoded"><p>This article describes the building of a practical example use case using modern Drupal 7 modules and site building techniques. I will show how to use Views, EVA, Fieldgroup, Entity Reference, Entity Reference Prepopulate, Display Suite modules to display content from multiple content types and other Drupal Entities on an article content type page. The goal is build a review system for the article content type.</p> <p><!--break--></p> <h2>Modules</h2> <p>Modules used in this how-to.</p> <h3>Display Suite</h3> <p>Display Suite allows you to take full control over how your content is displayed using a drag and drop interface. Arrange and configure the fields for your nodes, views, comments, user data etc. the way you want without having to work your way through dozens of template files.</p> <p><a href="https://drupal.org/project/ds" target="_blank">https://drupal.org/project/ds</a></p> <h3>EVA</h3> <p>"Eva" is short for "Entity Views Attachment;" it provides a Views display plugin that allows the output of a View to be attached to the content of any Drupal entity. The body of a node or comment, the profile of a user account, or the listing page for a Taxonomy term are all examples of entity content. The EVA views display provides an interface in the Views UI attach a view as a field to any Drupal Entity. It also provides interface to select any value of the Entity that the EVA view field is attached to, as a contextual filter in the view. Allows the options and flexibility of views to be used in your content displays.</p> <p>You can use EVA to display only fields values for a particular piece of content, giving incredible control over the display and formatting flexibility of the fields. For example you may desire to have two fields concatenated in some special way. You can add your fields to your EVA display, set the contextual filter to NID, add a Global: Text Field, and using tokens format your fields with HTML. Don’t forget to exclude your fields from display if you are going to use them together in a Global: Text Field. Example: You may have a city, state, and zip fields. You can combine them in a Global: Text Field in Views to display as “City, State ZIP”. When you manage the display for your content type add the EVA just created to the display and whenever a node the type is displayed it will pass its nid to the EVA and the EVA will return the fields you select, formatted as you desire.</p> <p><a href="https://drupal.org/project/eva" target="_blank">https://drupal.org/project/eva</a></p> <h3>Entity Reference and Entity Reference Prepopulate</h3> <p>Entity Reference provides a field type that can reference arbitrary Drupal Entities. Entity Reference Prepopulate allows prepopulating any entity reference field via URL argument.</p> <p><a href="http://drupal.org/project/entityreference" target="_blank">http://drupal.org/project/entityreference</a></p> <p><a href="https://drupal.org/project/entityreference_prepopulate" target="_blank"> https://drupal.org/project/entityreference_prepopulate</a></p> <h3>Fieldgroup</h3> <p>Fieldgroup will, as the name implies, group fields together. All fieldable entities will have the possibility to add groups to wrap their fields together. Fieldgroup comes with default HTML wrappers like vertical tabs, horizontal tabs, accordions, fieldsets or div wrappers</p> <p><a href="http://drupal.org/project/field_group">http://drupal.org/project/field_group</a></p> <h2>How-to Guide</h2> <p><strong>Create a “Review” content type.</strong></p> <ul><li>Add an entity reference field (Label: Article Reference fieldname:field_article_reference) to the view which will be prepopulated by a url argument via a link created by a custom Display Suite code field.</li> <li>In the settings for the entity reference field in the “Additional behaviors” group check the “Entity reference prepopulate” checkbox. For the action property set Disable field. This shows the article that is referenced but doesn’t allow the user to change it when creating or editing review.</li> <li>Create Display suite code field</li> <li>Check the Node value for the Entities field. This will attach the custom field to Nodes (Content).</li> <li>Enable tokens for the custom code field by checking the Token check box below theField Code</li> <li>Set ‘Text Format’ to ‘Display Suite Code’ and create token html code for a link where field_article_reference is the name of the entity reference field created in step one and added to the article content type<drupal root="">:  </drupal></li> </ul><p><img alt="" src="/sites/default/files/add-review-code.jpg" style="width: 688px; height: 295px;" /></p> <p><strong>Create a Review for Article EVA</strong></p> <ul><li>Create a new view listing Content of Type Review</li> <li>Add an EVA view display.</li> <li>Enter a value for the view Title, "Reviews"</li> <li>In the Entity content settings category <ol><li>Set Entity to Content (Nodes)</li> <li>Set Bundle to Article</li> <li>Leave Arguments set to id<span id="cke_bm_114E" style="display: none;"> </span></li> </ol></li> <li>Add a contextual filter that is the entity reference field of the Review content type. <ol><li>Add Contextual Filter: Content: Article Reference (field_article_reference)</li> <li>Under <em>When the filter value is NOT available</em> set hide view</li> </ol></li> <li>Sort by postdate.</li> <li>Display an unformatted list of Reviews teasers.</li> </ul><p><strong>Add view to Article Display</strong></p> <ul><li>Manage the display for the Article content type. For the Default or the Full Content display modes select custom display suite layout, for example (One Column)</li> <li>Add a horizontal tab group Field group and two horizontal tab items Fieldgroups. Nest the two tab items in the tab group. Nest the article body and other fields (comments, links, title) in the first tab labeled “Article”.</li> <li>Nest custom Display Suite Field second tab item labeled “Reviews”.</li> <li>Nest the review list eva field in Reviews tab after the custom field.</li> </ul></div></div></div><section class="field field-name-field-tags field-type-taxonomy-term-reference field-label-above view-mode-rss"><h2 class="field-label">Tags:&nbsp;</h2><ul class="field-items"><li class="field-item even" rel="dc:subject"><a href="/tags/drupal" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">Drupal</a></li></ul></section> Tue, 25 Jun 2013 05:33:14 +0000 Mark Hanna 2 at http://jackrabbithanna.com Drupal/CiviCRM Integration http://jackrabbithanna.com/articles/drupalcivicrm-integration <div class="field field-name-body field-type-text-with-summary field-label-hidden view-mode-rss"><div class="field-items"><div class="field-item even" property="content:encoded"><h2>Example Use Case</h2> <p>This example is a one event page which has tabs of many types of content and views attached which allows a anonymous user to view the info, see registered participants, register for the event via one webform which also automatically creates a contact, membership, active drupal user, and participant event registration to the event, logs in the user, and sets his user entered password via text field on the webform.</p> <p>Using this method you can create easily customizable membership join, and event registration pages which leverage the full gauntlet of advanced Drupal 7 modules, and the easy of customizing the layout and style with css in the Drupal theme.</p> <p><!--break--></p> <h2>Views</h2> <p><a href="http://wiki.civicrm.org/confluence/display/CRMDOC42/Views3+Integration">Wiki instructions,http://wiki.civicrm.org/confluence/display/CRMDOC42/Views3+Integration,</a> to give Drupal Views access to CiviCRM tables.</p> <h2>Entities</h2> <p>Drupal entities are data structures returned as <em>objects</em> and accessed and manipulated with object methods. Full blown Object-oriented approach</p> <p>Excerpts from <a href="http://drupal.org/node/1261744">Intro to Drupal Entities Book Page - http://drupal.org/node/1261744</a></p> <p>The Drupal community often compares site building through configuration to a favorite childhood toy: LEGO bricks. We can build Entity types, which can make Bundles, to which we can add Fields and then create Entities. This article explains the relationships between Entity types &gt; Bundles &gt; Fields &gt; Entities. This was one of the most important changes of Drupal 7, and brought components from some well-loved contributed modules -- such as CCK -- into the core system.</p> <h3>Entity types</h3> <p>In earlier versions of Drupal, the field system was only used on content types. Now, thanks to the Entity API, we can add fields to other things, like comments. Fieldable entities make Drupal eminently flexible. An entity type is a useful abstraction to group together fields. Let’s consider some examples of entity types:</p> <ul><li>Nodes (content)</li> <li>Comments</li> <li>Taxonomy terms</li> <li>User profiles</li> </ul><p>You can also build new kinds of entity types where the options above don't suit your needs.</p> <h3>Eileen's CiviCRM Entity Module</h3> <p>Core CiviCRM drupal module exposes a few entities, mainly contacts, groups, and mailings. Exposes 11 CiviCRM data entities such as memberships, groups, participants, mailings, activities, pledges, events to views, rules, and entity reference modules as Drupal entities. Actually allows druaplized interaction with many more civicrm data structures including the tags,relationships, and custom data field sets via Relationships in views. <a href="http://drupal.org/sandbox/eileen/1923028">http://drupal.org/sandbox/eileen/1923028</a></p> <p>I hacked civicrm core views handling to add group relationships to views (For Civi 4.2, unnecessary in 4.3). See <a href="http://drupal.org/node/1945508">issue page</a> for instructions.</p> <h3>Webform CiviCRM Module</h3> <p>From <a href="http://drupal.org/project/webform_civicrm">Project Page - http://drupal.org/project/webform_civicrm</a><br />This project brings the power and flexibility of Drupal Webforms to the CiviCRM community, allowing for tighter integration of your Website and CRM database. This module can link any webform with CiviCRM, creating and updating contacts, group subscriptions, tags, relationships, cases, activities and event participants. Includes support for custom data set fields attached to contacts</p> <h1>How its done</h1> <p>This document describes how to setup a Drupal content type of "Event' which will be used as a container to provide an extended interface for an CiviCRM event. Using fieldgroups, EVA, and Entity Reference among those modules listed below one can setup using site-building techniques only a set of tabs each with different associated information that a user may find interesting to have at their fingertips.</p> <p><img src="http://www.jackrabbitwebdesign.com/images/tabbed-event-reg-page.png" /></p> <p>I create tabs for:</p> <ol><li>The event information</li> <li>Travel Information (additional Drupal CT)</li> <li>Participant list</li> <li>Embedded Webform that allows for contact creation and event registration</li> <li>Map (via Openlayers) Registration via the webform will trigger php code with rules to create a synced drupal user, set the user to active, log the user in, set the password based on a webform field, create a free membership and sync the user's roles.</li> </ol><p>Modules Used</p> <ol><li>core PHP Filter</li> <li><a href="http://drupal.org/project/views" target="_blank">Views</a></li> <li><a href="http://drupal.org/project/entity_reference" target="_blank">Entity Reference</a></li> <li><a href="http://drupal.org/project/eva" target="_blank">Enity Views Attachment(EVA)</a></li> <li><a href="http://drupal.org/project/field_group" target="_blank">Field Group</a></li> <li><a href="http://drupal.org/project/rules" target="_blank">Rules</a></li> <li><a href="http://drupal.org/project/openlayers" target="_blank&quot;">Openlayers</a> (for mapping)</li> <li><a href="http://drupal.org/project/webform" target="_blank">Webform</a></li> <li><a href="http://drupal.org/project/webform_civicrm" target="_blank">Webform CiviCRM</a></li> <li><a href="http://drupal.org/sandbox/eileen/1923028" target="_blank">CiviCRM Entity</a> Use Git to get latest version</li> </ol><p>Create the CiviCRM Event</p> <ol><li>Create Event via CiviCRM admin interface</li> <li>Set Title, Description, Event Type: Exhibition, Free, Online Registration, Start and End Dates, Event Capacity, enter address, enter longitude and latitude coordinates in appropriate fields</li> </ol><ul style="list-style-type:none"><li> <h2>Setting up content data structures and content</h2> </li> </ul><ol><li>Create view with References views display that lists all CiviCRM events (<a href="/articles/creating-entity-reference-view">How to create Entity Reference view</a>)</li> <li>Create Drupal Content Type Event</li> <li>Add entity reference field called Event Reference, choose to use view created first to give options to select list</li> <li>Create Drupal Content Type Travel Information</li> <li>Add exisiting entity reference field called Event Reference, choose to use view created first to give options to select list, as well as other fields as desired</li> <li>Add exisiting entity reference field called Event Reference to Webform content type</li> <li>Create Drupal content Event node and set entity reference field to newly created CiviCRM event</li> <li>Create Drupal content Travel information node and set entity reference field to newly created CiviCRM event</li> <li>Create Membership Type in CiviCRM titled "Free Member"</li> </ol><ul style="list-style-type:none"><li> <h2>Creating CiviCRM Webform</h2> </li> </ul><ol><li>Create Webform node, title appropriately, enter body text, SET Event Reference field to the newly created CiviCRM event, save</li> <li>Click webform tab and add a regular webform text field for a password</li> <li>Click CiviCRM tab on Webform node view page</li> <li>Check checkbox labeled "Enable CiviCRM Processing "</li> </ol><ul style="list-style-type:none"><li> <h3>Contact 1 Vertical Tab Settings</h3> <ol><li>Select Contact Type for Webform fields</li> <li>Leave "Exisiting Contact" checkbox checked if you want the webform to autopopulate with logged in user's CiviCRM contact data</li> <li>Check checkboxes for CiviCRM contact data fields to include in Webform</li> <li>Include any Email, Phone, Tags, Relationships, Groups, Websites, or ANY CUSTOM DATA FIELD SETS THAT HAVE BEEN CREATED,,,, COOOL!!</li> <li>In this case try checking the first and last name boxes under Contact Fields</li> </ol></li> <li> <h3>Event Registration Verical Tab Settings</h3> <ol><li>Select Register all contacts for same event</li> <li>Select show events of type the same as the event that was created earlier</li> <li>Select "Always" for Show Remaining Space in Events</li> <li>Under Registration, Select 1 for Number of Event Sets (yes you can register for multiple events in one webform)</li> <li>Select the Event, Participant Role, and Registration status fields appropriately</li> </ol></li> </ul><h2>Create Views (The basics ignoring styling)</h2> <h3>Create CiviCRM Event info EVA View</h3> <ol><li>Create new view, list of CiviCRM events entities</li> <li>Add EVA views display</li> <li>In the Entity content settings category <ol><li>Set Entity to Node</li> <li>Set Bundle to Event</li> <li>Set Arguments to token with the value of [node:field-event-reference:id]</li> </ol></li> <li>Add Relationship: Entity Reference: Referencing entity</li> <li>Add fields as you see fit</li> <li>Add Contextual Filter: Content: Event Reference (field_event_reference) <ol><li>Relationship to use should be set automatically but make sure that the Content: Event Reference is used</li> <li>Under <em>When the filter value is NOT available</em> set hide view</li> <li>Add filter criteria Content: Type = Event</li> <li>Save</li> </ol></li> </ol><h3>Create Participant Info EVA View (Create view of CiviCRM Participant Entities)</h3> <ol><li>Add EVA views display</li> <li>In the Entity content settings category <ol><li>Set Entity to Node</li> <li>Set Bundle to Event</li> <li>Set Arguments to token with the value of [node:field-event-reference:id]</li> </ol></li> <li>Add Relationships <ol><li>CiviCRM Participants: Event ID</li> <li>CiviCRM Participants: Participant's Contact ID</li> </ol></li> <li>Add Contextual Filter: CiviCRM Events: Event ID <ol><li>Relationship to use should be set automatically but make sure that the CiviCRM Participants: Event ID Relationship is used</li> <li>Under <em>When the filter value is NOT available</em> set hide view</li> <li>Add fields as you see appropriate</li> <li>Save</li> </ol></li> </ol><h3>Create Registration Webform EVA</h3> <ol><li>Create view, list of Content of Type Webform</li> <li>Add EVA views display</li> <li>In the Entity content settings category <ol><li>Set Entity to Node</li> <li>Set Bundle to Event</li> <li>Set Arguments to token with the value of [node:field-event-reference:id]</li> </ol></li> <li>Add Relationship Entity Reference: Event Reference</li> <li>Add Contextual Filter: CiviCRM Events: Event ID <ol><li>Relationship to use should be set automatically but make sure that the Entity Reference: Event Reference Relationship is used</li> <li>Under <em>When the filter value is NOT available</em> set hide view</li> <li>Under Format: set to Rendered Entity, Full Content</li> <li>Make sure you have a Filter Criteria: Type=Webform</li> <li>Save</li> <li>View for Travel Information is the same except the Filter Criteria should be Type=Travel Information</li> </ol></li> </ol><h2>Create Openlayers Map Custom Map</h2> <ol><li>goto admin/structure/openlayers/maps/add</li> <li>Set title to 'Event Map'</li> <li>Save.....to be continued</li> </ol><h2>Create Event Map EVA</h2> <ol><li>Create new view, list of CiviCRM events entities</li> <li>Add EVA views display</li> <li>In the Entity content settings category <ol><li>Set Entity to Node</li> <li>Set Bundle to Event</li> <li>Leave Arguments set to id</li> </ol></li> <li>Set Format to Openlayers Map, set Map setting to Event Map</li> <li>Add Contextual Filter: CiviCRM Events: Event ID <ol><li>Under <em>When the filter value is NOT available</em> set hide view</li> <li>Add Openlayers Data Overlay views display to view</li> <li>Set Display name: Event Location Point</li> <li>Set Format:Show to Fields MAKE SURE AND SET THE FOR SELECT OPTION ABOVE TO "This openlayers (override)"</li> <li>Add fields <ol><li>CiviCRM Address: Latitude</li> <li>CiviCRM Address: Longitude</li> <li>CiviCRM Events: Title</li> </ol></li> <li>Set Format to Openlayers Data Overlay MAKE SURE AND SET THE FOR SELECT OPTION ABOVE TO "This openlayers (override)"</li> <li>Set settings to Format: OpenLayers Data Overlay | Settings <ol><li>Set Map Data Sources to Lat/Lon Pair</li> <li>Set latitude setting to CiviCRM Address: Latitude</li> <li>Set longitude setting to CiviCRM Address: Longitude</li> <li>Set Title setting to CiviCRM Events: Title</li> <li>Apply settings and save view</li> </ol></li> </ol></li> </ol><h2>Create Openlayers Map Custom Map Continued</h2> <ol><li>Edit Event Map settings</li> <li> <h3>Layers and Styles tab</h3> <ol><li>Choose base layer maps and choose a default</li> <li>At the bottom of the list is a section called Openlayers layers. Find the one with Event Location Point in it. Check the Enabled and Activated checkboxes</li> <li>Set pointers in Style and Select Style options</li> <li>Click save and then edit again</li> </ol></li> <li> <h3>Behaviors Tab</h3> <ol><li>Under Tooltip for Features check the Tooltip for Features checkbox. Also check the checkbox for the overlay view that we had just created</li> <li>Under Zoom to Layer check the Zoom to Layer checkbox. Also check the checkbox for the overlay view that we had just created.</li> <li>Save</li> </ol></li> </ol><h2>Manage Drupal Event content type Display</h2> <ol><li>Manage Display for event content type default display</li> <li>Create horizontal tab group</li> <li>Create 5 groups, Event Info, Travel Info, Participants, Register, Map</li> <li>Nest the groups in the horizontal tab group</li> <li>You will see EVA fields have appeared since we created several EVA Views</li> <li>Nest the Event EVA into Event Info, Participants EVA under Participant group, etc....</li> </ol><h2>Rules, now we get jiggy</h2> <p>The Webform civicrm module always creates a contact from the webform submission</p> <h3>Create rule Create Membership after contact creation</h3> <ol><li><strong>Create free membership for webform, and CiviCRM event registration pages</strong></li> <li> <ol><li>Add rule</li> <li>React to "CiviCRM Contact has been created"</li> <li>Add action Execute PHP code</li> <li>Automagic member create code</li> <li>Membership type id of 1 is for the Free Member type created in the beginning, check the id for your membership type and change in code</li> <li>Also change the join, start, and end dates. Generally you want the join and start dates to be whatever today is...or write some date code yourself. </li> <li> <h5>Code: I know its CIvi API2 and not the best but it works for this example</h5> <p>require_once 'api/v2/Membership.php'; //require_once 'api/api.php'; $params = array( 'contact_id' =&gt; $civicrm_contact-&gt;id, 'membership_type_id' =&gt; '1', 'join_date' =&gt; '2013-06-13', 'start_date' =&gt; '2013-06-13', 'end_date' =&gt; '2014-12-21', 'is_override' =&gt; 1, 'status_id' =&gt; 1, ); $result = civicrm_contact_membership_create( $params );</p> </li> </ol></li> <li> <h3>Create rule Create Drupal user after webform submission</h3> </li> <li> <ol><li>React to "Webform was submitted"</li> <li>Switch to "data selection" and leave form_id as the value in the "Data selector" field</li> <li>Condition "Webform has name" select appropriate name</li> <li>Add action execute php code</li> <li> <h5>Add Code:</h5> <p>$email = $data['components']['civicrm_1_contact_1_email_email']['value'][0]; $password = $data['components']['desired_password']['value'][0]; $params2 = array( 'name' =&gt; $email, 'mail' =&gt; $email, 'email' =&gt; $email, ); $errors = array(); $config = CRM_Core_Config::singleton(); $config-&gt;userSystem-&gt;checkUserNameEmailExists($params, $errors); if (! empty($errors)) { drupal_set_message(" could not create user record " . $errors['email']); return FALSE; } $params2['cms_name'] = $params2['name'] = $newuser['name'] = $params2['mail']; $params2['cms_pass'] = $newuser['pass'] = $password ; //substr(str_shuffle("abcefghijklmnopqrstuvwxyz"), 0, 8); $params2['status'] = 1; $params2['notify'] = TRUE; $newuser['uid'] = $config-&gt;userSystem-&gt;createUser($params2, 'email'); $newuser['mail'] = $params2['mail']; $user_object = (object) $newuser; CRM_Core_BAO_UFMatch::synchronizeUFMatch($user_object, $user_object-&gt;uid, $email, 'drupal', NULL, NULL, TRUE); $user_updated = db_update('users') -&gt;fields(array( 'status' =&gt; 1, )) -&gt;condition('uid', $user_object-&gt;uid, '=') -&gt;execute(); global $user; $user = user_load( array('uid'=&gt;$user_object-&gt;uid ) ); $pass = user_hash_password($password); db_query("UPDATE {users} SET pass = :pwd WHERE uid = :uid", array('pwd'=&gt;$pass,':uid' =&gt;$user-&gt;uid)); _civicrm_member_roles_sync($user-&gt;uid);</p> </li> <li>creates user with username as email address, password set by webform textfield, sets user to active, logs them in and syncs roles</li> </ol></li> </ol></div></div></div><section class="field field-name-field-tags field-type-taxonomy-term-reference field-label-above view-mode-rss"><h2 class="field-label">Tags:&nbsp;</h2><ul class="field-items"><li class="field-item even" rel="dc:subject"><a href="/tags/drupal" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">Drupal</a></li><li class="field-item odd" rel="dc:subject"><a href="/tags/civicrm" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">CiviCRM</a></li><li class="field-item even" rel="dc:subject"><a href="/tags/integration" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">Integration</a></li></ul></section> Tue, 25 Jun 2013 04:14:31 +0000 Mark Hanna 1 at http://jackrabbithanna.com