Services module https://www.zengenuity.com/ en The Week in Drupal: November 2, 2012 https://www.zengenuity.com/blog/2012-11/week-drupal-november-2-2012 <span class="field field--name-title field--type-string field--label-hidden">The Week in Drupal: November 2, 2012</span> <div class="paragraph html"> <div class="container"> <p>A look back at interesting modules, articles and other Drupal news of the last week: October 26 - November 2, 2012.</p> <p><a href="https://2012.badcamp.net/"><img src="https://www.zengenuity.com/sites/default/files/migrated/bad_camp_2012.png" /></a></p> <h2>Drupal News</h2> <p><strong><a href="https://groups.drupal.org/node/264568" title="Drupal 8 announcements: Proposal for RESTful entity API">Drupal 8 announcements: Proposal for RESTful entity <span class="caps">API</span></a></strong></p> <p><strong><a href="https://groups.drupal.org/node/265088" title="Drupal 8 announcements: Don't reimplement support for arbitrary tail paths">Drupal 8 announcements: Don’t reimplement support for arbitrary tail paths</a></strong></p> <h2>Great Posts and Tutorials</h2> <p><strong><a href="https://theoleschool.com/blog/talking-drupal-nodejs" title="Talking to Drupal with Node.js">Talking to Drupal with Node.js</a></strong></p> <p><strong><a href="https://www.ostraining.com/blog/drupal/views-slideshow/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+ostrainingdrupal+%28OSTraining+Drupal%29" title="Creating a Drupal Slideshow with Views Slideshow">Creating a Drupal Slideshow with Views Slideshow</a></strong></p> <p><strong><a href="https://www.agileapproach.com/blog-entry/moving-forward-open-atrium-20" title="Moving Forward with Open Atrium 2.0">Moving Forward with Open Atrium 2.0</a></strong></p> <p><strong><a href="https://www.tsvenson.com/blog/2012/10/making-drupal-more-user-friendly" title="Making Drupal more User Friendly">Making Drupal more User Friendly</a></strong></p> <p><strong><a href="https://mrkadin.com/blog/node/69" title="Announcing PixGather">Announcing PixGather</a></strong> - A mobile app to upload pictures to a Drupal site.</p> <p><strong><a href="https://www.drupaler.co.uk/blog/corralling-permissions-grid" title="Corralling permissions into a grid">Corralling permissions into a grid</a></strong></p> <p><strong><a href="https://2bits.com/apache/memory-usage-revisited-when-open-buffet-not-blame-rather-views.html" title="Memory usage revisited: when the Open Buffet is not to blame, rather Views">Memory usage revisited: when the Open Buffet is not to blame, rather Views</a></strong></p> <p><strong><a href="https://www.gizra.com/content/message-subscribe-new-subscription-system" title="Message-subscribe — A New Subscription System">Message-subscribe — A New Subscription System</a></strong></p> <h2>Interesting New Modules</h2> <p><strong><a href="https://drupal.org/sandbox/sheldon/1827730" title="Transclude">Transclude</a></strong> - Defines an input filter that uses special tags to insert the contents of an external web page into text. For example, this can be useful is as a way of inserting the text of Wikipedia articles into nodes and having that text automatically updated whenever the Wikipedia article changes.</p> <p><strong><a href="https://drupal.org/sandbox/drupalrv/1827274" title="Word Link">Word Link</a></strong> - Allows you to replace certain words with links.</p> <p><strong><a href="https://drupal.org/sandbox/PDNagilum/1828986" title="Responsive Preview">Responsive Preview</a></strong> - View the site in different sizes easily with this module. A toolbar is displayed at the top with the configured resolutions. Click one and an iframe appears with the correct size applied. Great for developing responsive designs.</p> <p><strong><a href="https://drupal.org/sandbox/mas5d2/1829416" title="Apache Solr Document Links">Apache Solr Document Links</a></strong> - Adds indexing of external links the <a href="https://drupal.org/project/apachesolr">Apache Solr</a> Search Integration module.</p> <p><strong><a href="https://drupal.org/sandbox/curve/1828016" title="Taxonomy Tree Block">Taxonomy Tree Block</a></strong> - Generates blocks of formatted taxonomy menu blocks (in a tree format) on a vocabulary basis.</p> <p><strong><a href="https://drupal.org/project/userdelete" title="Bulk User Delete">Bulk User Delete</a></strong> - Allows you to bulk delete users through the admin interface. You provide a list of email addresses, one per line, and the users are deleted using the batch processing <span class="caps">API</span>.</p> <p><strong><a href="https://drupal.org/project/drifter" title="Drifter">Drifter</a></strong> - Allows any field to be floated left or right by providing a simple field formatter setting. A common use-case is floating images off to the side of a node.</p> <p><strong><a href="https://drupal.org/sandbox/noudroosendaal/1830070" title="Taxonomy Node Type">Taxonomy Node Type</a></strong> - Automatically adds a taxonomy term to a node based on the node type.</p> <p><strong><a href="https://drupal.org/project/commerce_mailchimp" title="Drupal Commerce MailChimp">Drupal Commerce MailChimp</a></strong> - This module integrates <a href="https://drupal.org/porject/commerce">Drupal Commerce</a> with the Mailchimp <span class="caps">API</span>’s ECommerce 360 feature for tracking store statistics for email campaigns sent via MailChimp.</p> <p><strong><a href="https://drupal.org/project/context_resolution" title="Context Resolution">Context Resolution</a></strong> - Extends the Context module with two additional conditions that enable developers to adapt to the users current screen resolution or browser width/height by using context reactions.</p> <p><strong><a href="https://drupal.org/sandbox/cpliakas/1827540" title="Date Facets">Date Facets</a></strong> - Provides date range facets similar to major search engines. (“Past hour”, “Past 24 hours”, “Past week”, etc.)</p> <p><strong><a href="https://drupal.org/project/og_invite_people" title="OG Invite People"><span class="caps">OG</span> Invite People</a></strong> - Adds a missing invite functionality for <span class="caps">OG</span> 7.x-2.x.</p> <p><strong><a href="https://drupal.org/sandbox/arosboro/1830730" title="Media OG Access">Media <span class="caps">OG</span> Access</a></strong> - Allows limiting media browser list to media in current group or group subscriptions that the current user is a member of.</p> </div> </div> <span>Wayne Eaker</span>November 2, 2012 <div class="tags"> <div class="container"> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/context-module" hreflang="en">Context module</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/drupal" hreflang="en">Drupal</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/drupal-8" hreflang="en">Drupal 8</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/drupal-commerce" hreflang="en">Drupal Commerce</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/high-performance" hreflang="en">High Performance</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/image-galleries" hreflang="en">Image Galleries</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/media-module" hreflang="en">Media module</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/message-module" hreflang="en">Message module</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/nodejs" hreflang="en">Node.js</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/open-atrium" hreflang="en">Open Atrium</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/organic-groups-module" hreflang="en">Organic Groups module</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/responsive-design" hreflang="en">Responsive Design</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/search" hreflang="en">Search</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/security" hreflang="en">Security</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/services-module" hreflang="en">Services module</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/solr" hreflang="en">Solr</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/taxonomy-module" hreflang="en">Taxonomy module</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/theming" hreflang="en">Theming</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/ux" hreflang="en">UX</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/views-module" hreflang="en">Views module</a></span> </div> </div> Fri, 02 Nov 2012 14:50:08 +0000 Wayne Eaker 194 at https://www.zengenuity.com The Week in Drupal: June 8, 2012 https://www.zengenuity.com/blog/2012-06/week-drupal-june-8-2012 <span class="field field--name-title field--type-string field--label-hidden">The Week in Drupal: June 8, 2012</span> <div class="paragraph html"> <div class="container"> <p>A look back at interesting modules, articles and other <a href="https://drupal.org">Drupal</a> news of the last week: June 1 - 8, 2012.</p> <p><a href="https://www.flickr.com/photos/57018136@N00/7155839299/" title="IMG_1995 - Version 2 by rotarised, on Flickr"><img src="https://farm8.staticflickr.com/7229/7155839299_65aa57eb42.jpg" width="500" height="333" alt="IMG_1995 - Version 2" /></a></p> <h2>Drupal News</h2> <p><strong><a href="https://www.garfieldtech.com/blog/wscci-kernel-merge" title="The Kernel has landed">The Kernel has landed</a></strong></p> <p><strong><a href="https://webchick.net/drupal-8-slides" title="Angie Byron: One Drupal 8 Slide Deck To Rule Them All - Please give this at your local event!">Angie Byron: One Drupal 8 Slide Deck To Rule Them All - Please give this at your local event!</a></strong></p> <p><strong><a href="https://groups.drupal.org/node/235308" title="DrupalCon Code of Conduct (Revised Draft)">DrupalCon Code of Conduct (Revised Draft)</a></strong></p> <p><strong><a href="https://drupal.org/node/1609112" title="Drupal Security Team update - June 2012">Drupal Security Team update - June 2012</a></strong></p> <h2>Great Posts and Tutorials</h2> <p><strong><a href="https://drupalwatchdog.com/1/2/workbench-content-management" title="Drupal Watchdog: Workbench: Content Management with a Short Learning Curve">Drupal Watchdog: Workbench: Content Management with a Short Learning Curve</a></strong></p> <p><strong><a href="https://www.palantir.net/blog/all-new-zen-same-guiding-principles" title="Palantir: An All-New Zen with the Same Guiding Principles">Palantir: An All-New Zen with the Same Guiding Principles</a></strong></p> <p><strong><a href="https://modulesunraveled.com/podcast/023-earl-miles-and-getting-views-in-drupal-8-core-modules-unraveled-podcast" title="Modules Unraveled Podcast: Earl Miles and Getting Views In Drupal 8 Core">Modules Unraveled Podcast: Earl Miles and Getting Views In Drupal 8 Core</a></strong></p> <p><strong><a href="https://www.acquia.com/blog/importing-wordpress-blogs-drupal" title="Importing WordPress blogs into Drupal">Importing WordPress blogs into Drupal</a></strong></p> <h2>Interesting New Modules</h2> <p><strong><a href="https://drupal.org/project/microsites" title="Microsites">Microsites</a></strong> - Provides a site-within-a-site capability. Microsites are individual nodes which are specially enabled to provide their own context, menu, breadcrumb and other settings.</p> <p><strong><a href="https://drupal.org/sandbox/alexweber/1619890" title="Entity Reference Or Create">Entity Reference Or Create</a></strong> - Provides an alternative input method for Entity Reference that allows users to either select an entity or create a new one.</p> <p><strong><a href="https://drupal.org/sandbox/aland/1615516" title="Field option values">Field option values</a></strong> - Provides a <span class="caps">UI</span> for setting the values function callback that overrides the list of allowed values in an Options field.</p> <p><strong><a href="https://drupal.org/project/menu_badges" title="Menu Badges">Menu Badges</a></strong> and <strong><a href="https://drupal.org/project/link_badges" title="Link Badges">Link Badges</a></strong> - Provides a method for adding iOS-style badges to menu items and links rendered by <a href="https://api.drupal.org/api/drupal/includes%21theme.inc/function/theme_link/7">theme(‘link’)</a> and <a href="https://api.drupal.org/api/drupal/includes%21common.inc/function/l/7">l()</a>.</p> <p><strong><a href="https://drupal.org/sandbox/joel_osc/1620070" title="Quiz Dependency">Quiz Dependency</a></strong> - An addon to the Quiz module which adds the concept of dependency to quizzes, so that the availability of one quiz can depend on the outcome (completed, passed, failed) of a another quiz.</p> <p><strong><a href="https://drupal.org/sandbox/njt1982/1619940" title="jQuery File Upload">jQuery File Upload</a></strong> - Enables the jQuery File Upload plugin for use with Drupal 7’s core File Field module.</p> <p><strong><a href="https://drupal.org/sandbox/mtee/1614882" title="Search API Statistics">Search <span class="caps">API</span> Statistics</a></strong> - integrates with Search and Facet APIs. It logs search queries (keywords and facets) and provides site maintainers with a visual representation of the collected data, which can be shown as a simple list in a block or as a chart. It integrates here with the <a href="https://drupal.org/project/views">Views</a> module.</p> <p><strong><a href="https://drupal.org/sandbox/svdhout/1617524" title="Views Filter Display Results">Views Filter Display Results</a></strong> - Adds a ‘default value’ for contextual filters which can be set with a view, which allows you to do things like exclude results in a view based on results from another display in that view.</p> <p><strong><a href="https://drupal.org/project/commerce_services" title="Commerce Services resources">Commerce Services resources</a></strong> - Integrates <a href="https://drupal.org/porject/commerce">Drupal Commerce</a> with the Services module’s <span class="caps">REST</span> server.</p> <p><strong><a href="https://drupal.org/project/uif_og" title="Organic Groups support for the User Import Framework">Organic Groups support for the User Import Framework</a></strong> - Add all users in the <span class="caps">CSV</span> file to a set of groups by default, or add a new “groups” column to your <span class="caps">CSV</span> file, to add specific users to specific groups</p> <p><strong><a href="https://drupal.org/sandbox/lucor/1619090" title="Ldap extras"><span class="caps">LDAP</span> extras</a></strong> - Extensions to the <a href="https://drupal.org/project/ldap"><span class="caps">LDAP</span> module</a> that allows changing the <span class="caps">LDAP</span> user password and creating <span class="caps">LDAP</span> users directly from Drupal.</p> <p><strong><a href="https://drupal.org/sandbox/theduke/1612644" title="Drush Developer">Drush Developer</a></strong> - This module extends drush with several commands that aid in developing a Drupal site.</p> </div> </div> <span>Wayne Eaker</span>June 8, 2012 <div class="tags"> <div class="container"> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/drupal" hreflang="en">Drupal</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/drupal-8" hreflang="en">Drupal 8</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/drupalcon-munich" hreflang="en">DrupalCon Munich</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/drush" hreflang="en">Drush</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/fieldapi" hreflang="en">FieldAPI</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/ldap" hreflang="en">LDAP</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/menus" hreflang="en">Menus</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/migration" hreflang="en">Migration</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/organic-groups-module" hreflang="en">Organic Groups module</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/search" hreflang="en">Search</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/security" hreflang="en">Security</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/services-module" hreflang="en">Services module</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/theming" hreflang="en">Theming</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/views-module" hreflang="en">Views module</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/wordpress" hreflang="en">Wordpress</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/workbench-module" hreflang="en">Workbench module</a></span> </div> </div> Fri, 08 Jun 2012 17:46:08 +0000 Wayne Eaker 180 at https://www.zengenuity.com The Week in Drupal: June 1, 2012 https://www.zengenuity.com/blog/2012-06/week-drupal-june-1-2012 <span class="field field--name-title field--type-string field--label-hidden">The Week in Drupal: June 1, 2012</span> <div class="paragraph html"> <div class="container"> <p>A look back at interesting modules, articles and other <a href="https://drupal.org">Drupal</a> news of the last week: May 25 - June 1, 2012.  </p> <p><a href="https://www.flickr.com/photos/yukop/7283570954/" title="Today's latte, Drupal. #geeklatte by yukop, on Flickr"><img src="https://www.zengenuity.com/sites/default/files/migrated/drupal_latte_500.jpg" alt="Today's latte, Drupal. #geeklatte" width="500" height="500" /></a></p> <h2>Drupal News</h2> <p><strong><a href="https://munich2012.drupal.org/news/conference-sessions-and-trainings-announced-drupalcon-munich" title="DrupalCon Munich: Conference Sessions and Trainings Announced">DrupalCon Munich: Conference Sessions and Trainings Announced</a></strong></p> <p><strong><a href="https://buytaert.net/spark-update-in-line-editing-in-drupal" title="Dries Buytaert: Spark update: in-line editing in Drupal">Dries Buytaert: Spark update: in-line editing in Drupal</a></strong></p> <h2>Great Posts and Tutorials</h2> <p><strong><a href="https://www.mediacurrent.com/blog/services-3x-module" title="Services 3.x Module - Webinar Video">Services 3.x Module - Webinar Video</a></strong></p> <p><strong><a href="https://ygerasimov.com/expose-your-views-to-services" title="Expose your Views to Services">Expose your Views to Services</a></strong></p> <p><strong><a href="https://www.agileapproach.com/blog-entry/using-state-machine-state-flow-build-powerful-workflows" title="Using State Machine with State Flow to build powerful workflows">Using State Machine with State Flow to build powerful workflows</a></strong></p> <p><strong><a href="https://codekarate.com/blog/theme-file-link-drupal-7" title="Theme File Link in Drupal 7">Theme File Link in Drupal 7</a></strong></p> <p><strong><a href="https://feedproxy.google.com/~r/lullabot/planet-feed/~3/8HaJkDgAqME/module-monday-exclude-node-title" title="Lullabot: Module Monday: Exclude Node Title">Lullabot: Module Monday: Exclude Node Title</a></strong></p> <p><strong><a href="https://fuseinteractive.ca/blog/wysiwyg-module-ckeditor-part-deux-extreme-beastmaster" title="WYSIWYG Module + CKEditor Part Deux: Extreme Beastmaster">WYSIWYG Module + CKEditor Part Deux</a></strong></p> <h2>Interesting New Modules</h2> <p><strong><a href="https://drupal.org/sandbox/johnnyvdlaar/1605972" title="Context path breadcrumb">Context path breadcrumb</a></strong> - Uses URL of the current page (for example /our-company/our-team/steve) to build the breadcrumbs. (Our Company > Our Team > Steve)</p> <p><strong><a href="https://drupal.org/project/search_api_combined" title="Search API Combined Fields">Search API Combined Fields</a></strong> - Allows the creation of combined fields for the Search API. This means a single field can contain the values from multiple other fields.</p> <p><strong><a href="https://drupal.org/sandbox/pl2/1600946" title="Facebook Publish">Facebook Publish</a></strong> - allows the user to post a link to a Facebook wall for the node been created or updated.</p> <p><strong><a href="https://drupal.org/sandbox/yvmarques/1603816" title="PDF Review">PDF Review</a></strong> - Allows users with the rights to comment different part of a PDF Document.</p> <p><strong><a href="https://drupal.org/project/overlay_theme" title="Overlay theme">Overlay theme</a></strong> - Set the theme that is used in the admin overlay.</p> <p><strong><a href="https://drupal.org/sandbox/bangpound/1606604" title="Drippy - the drupal assistant.">Drippy - the drupal assistant.</a> </strong>- A Clippy-like assistant for Drupal.</p> <p><strong><a href="https://drupal.org/sandbox/fluffy/1605508" title="Content reminder">Content reminder</a></strong> - Allows you to set a reminder notification to content.</p> <p><strong><a href="https://drupal.org/project/views_megarow" title="Views Megarow">Views Megarow</a></strong> - Provides modal-like functionality for opening pages and forms in megarows (rows inserted into a table below the triggering row).</p> <p><strong><a href="https://drupal.org/project/google_cloud_storage" title="Google Cloud Storage">Google Cloud Storage</a></strong> - Allows you to replace the local server file system with Google Cloud Storage.</p> <p><strong><a href="https://drupal.org/sandbox/aland/1608324" title="Fieldable vocabularies">Fieldable vocabularies</a></strong> - Makes taxonomy vocabularies fieldable.</p> </div> </div> <span>Wayne Eaker</span>June 1, 2012 <div class="tags"> <div class="container"> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/context-module" hreflang="en">Context module</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/drupal" hreflang="en">Drupal</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/drupalcon-munich" hreflang="en">DrupalCon Munich</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/facebook" hreflang="en">Facebook</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/search" hreflang="en">Search</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/services-module" hreflang="en">Services module</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/spark" hreflang="en">Spark</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/state-machine" hreflang="en">State Machine</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/ux" hreflang="en">UX</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/views-module" hreflang="en">Views module</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/wysiwyg-module" hreflang="en">WYSIWYG module</a></span> </div> </div> Fri, 01 Jun 2012 14:20:59 +0000 Wayne Eaker 179 at https://www.zengenuity.com Creating an iPhone App for a Drupal Website https://www.zengenuity.com/blog/2011-05/creating-iphone-app-drupal-website <span class="field field--name-title field--type-string field--label-hidden">Creating an iPhone App for a Drupal Website</span> <div class="paragraph html"> <div class="container"> <p><img src="https://www.zengenuity.com/sites/default/files/migrated/LA2M-iphone-app-1_0_0.png" alt="iPhone App for Drupal" title="iPhone App for Drupal" width="150" height="299" />Recently, Zengenuity released the <a href="https://zengenuity.com/portfolio/iphone-app-drupal-website">LA2M to Go iPhone app</a>, a companion to the <a href="https://zengenuity.com/portfolio/non-profit-marketing-group-website">Lunch Ann Arbor Marketing website</a>. The LA2M website is one we built on Drupal 6, and it uses custom content types, <a href="https://drupal.org/project/views">Views</a> and <a href="https://drupal.org/project/imagecache">Imagecache</a> for displaying upcoming and archived event information for the group. In creating our app, I wanted to build a system to synchronize the mobile device with the website, since event information changes on at least a weekly basis. It took a lot of research and testing various techniques (many of which of which didn’t end up working), but finally I worked out how to have the app to pull all its information automatically from the <a href="https://drupal.org">Drupal</a> site. I hope that by publishing this blog post, I can speed up this process for you, and save you some frustration. There isn’t room here to go into every detail, but I’ll discuss the major frameworks I used, and I’ll point out some important issues that wasted a lot of my time.</p> <h2>The Titanium Mobile Framework</h2> <p><img src="https://www.zengenuity.com/sites/default/files/migrated/titanium.png" alt="Titanium SDK" title="Titanium SDK" width="295" height="200" />LA2M to Go is built with the <a href="https://www.appcelerator.com/products/titanium-mobile-application-development/">Titanium Mobile Framework</a> by <a href="https://www.appcelerator.com/">Appcelerator</a>. The Titanium SDK is free, and it allows you to write native iPhone apps in web developer friendly Javascript, instead of Objective-C. It also allows you to compile the same source code as a native Android app, though this is something I haven’t tried yet. To get started with Titanium, <a href="https://www.appcelerator.com/products/download/">download the SDK here</a>. This will provide you with the Titanium Developer application you need to compile your app. You will also need to have developer tools for the target mobile platform you plan to work with. So, if you are writing an iPhone app, you need to have an <a href="https://developer.apple.com/programs/register/">Apple iOS developer account</a>, and download XCode and the iOS SDK from Apple. Android developers will need to get the <a href="https://developer.android.com/sdk/index.html">Android SDK from Google</a>.</p> <p>When coding for Titanium, you have to use your own text editor or IDE, and then load your project into the Titanium Developer application. Titanium-based apps are compiled in a two-step process. First, your code is rewritten by Titanium Developer as native iPhone or Android source code. Then, command line tools provided by the iPhone and Android SDKs are used to compile the native code and install it into the simulator or directly onto your mobile device. </p> <p><strong>One word of warning: This process absolutely sucks.</strong> It’s the worst compilation and debugging system I’ve ever experienced. When working with Titanium, be prepared to write a lot of output log statements, because that’s how you’ll be doing much of your debugging. Also, the Titanium platform is seriously lacking in documentation, and the docs that do exist are difficult to use and search. There are very few example code snippets in the <a href="https://developer.appcelerator.com/apidoc/mobile/latest">API docs</a>, which means you need to search the <a href="https://developer.appcelerator.com/questions/created">developer forums</a>. In the forums, code is often wrong or out-of-date, as there’s no way to know which version of the Titanium API it’s designed for. (The API has changed significantly from its initial release.) Appcelerator recently purchased <a href="https://aptana.com/">Aptana</a>, the makers of the excellent Aptana Studio IDE. So, I’m praying they ditch the Titanium Developer application for a more fully-featured IDE, with debugging tools and built-in documentation. This would help developers immensely. (<strong>Update (5/17/11):</strong> They have now done exactly this: <a href="https://developer.appcelerator.com/blog/2011/05/major-titanium-updates.html">https://developer.appcelerator.com/blog/2011/05/major-titanium-updates.html</a>)</p> <p>That said, I’ve written code in Objective-C with XCode before, and while XCode has both excellent debugging features and documentation, the speed at which you I create robust apps with Titanium, in a language that is more familiar to me as a web developer, means I’ll coming to back to it for my next app, despite its failings. </p> <h2>The DrupalCon Chicago App</h2> <p><img src="https://www.zengenuity.com/sites/default/files/migrated/drupalcon-chicago.jpeg" alt="DrupalCon Chicago App" title="DrupalCon Chicago App" width="175" height="175" />If you were at <a href="https://chicago2011.drupal.org/">DrupalCon Chicago</a>, you probably used the <a href="https://itunes.apple.com/us/app/drupalcon/id421074805?mt=8">conference app</a> that was available for iPhone and Android. That app was created in Titanium, by the folks at <a href="https://www.palantir.net/">Palantir</a>. Fortunately for all of us developing Drupal-connected apps, they have made <a href="https://github.com/palantirnet/drupalcon_mobile">the app’s source code available</a>, and <a href="https://www.palantir.net/blog/mobilizing-drupalcon-chicago">their blog post about it is very informative</a>.</p> <p>There isn’t a lot of technical documentation about how expand or change the app, but after spending some time with it, I was able to figure out the key details:</p> <h3>Schema Definitions</h3> <p>The app is designed to import Drupal nodes and store them in an SQLite database on the device. This way the app can be used offline. In the code, there is a schema definition designed for the DrupalCon event node type in the <span><strong>Resources/drupalcon/entity.js</strong></span> file. (You will also find a schema for Drupal.org users in there, too.) If you are building a new app from this source code, you need to modify their schema to match whatever fields your content types have. They have chosen to call their event schema “node”, but you can rename this to whatever you want, and add additional schemas for more types. If you are adding new schema types (or changing the name of them), you need to make entries for them in the <strong><span>Resources/drupal/entity.js</span></strong> file. There’s a section at the top that starts with </p> <p><strong><span>main: {<span> <br /></span>     ...</span></strong><br /><strong><span>     types {</span></strong><br /><strong><span>      <em>[a list of types and primary keys is here]</em></span></strong></p> <p>Add your new schema names to this list, following the pattern of the others in that section.</p> <p>One thing I found useful when modifying the schema were the two commented out lines in app.js that clear the DB on every app launch. </p> <p><strong><span>//Drupal.entity.db('main', 'node').initializeSchema();</span></strong><br /><strong><span>//Drupal.entity.db('main', 'user').initializeSchema();</span></strong></p> <p>These obviously need to be commented out in production, but are useful when changing the schema. (Adjust the parameters to fit your schema names.) Another helpful tool you will want to have is some sort of SQLite database browser. I ended up using the <a href="https://addons.mozilla.org/en-US/firefox/addon/sqlite-manager/">SQLite Manager Firefox extension</a>, though, I didn’t especially enjoy it. It works, but it’s kind of clunky. If you are building and iPhone app and working in the simulator, the SQLite database is difficult to find. Here’s where it’s at:</p> <p><span><strong>/Users/[your_username]/Library/Application Support/iPhone Simulator/[sdk_version]/Applications/[application_guid]/Library/Application Support/database/main.sql</strong></span></p> <p>Yeah...it’s really buried down there. One of those folders is hidden too, so you will not find that database file with Finder. You just have to know where it is.</p> <h2>Renderers</h2> <p>If you look in <strong><span>Resources/drupalcon/drupalcon.js</span></strong>, you will see a series of sections that start like this:</p> <p><strong><span>DrupalCon.renderers.session = function(session) {</span></strong></p> <p>These sections define “renderers” for different entities that you have in the SQLite database. They don’t do anything on their own. You have to call it yourself after you query the DB. But, when you look around in the app code, you’ll see that having a function that renders an SQLite database row as a TableViewRow is very handy. It’s sort of like defining a theme template for a particular node type. If you have added fields and types to the database schema, you will need to update the renderers to display your new fields.</p> <h2>Windows</h2> <p>In <strong><span>Resources/windows</span></strong> are a bunch of files that define the various screens of the app. I don’t have space in this post to go through them all, but if you look at each one, you’ll get an idea of what you need to do to make similar windows that match your project. Most of them are TableViews, which is often what you want. There’s also a MapDetailWindow that shows a static image, and other windows to render HTML content. Be sure to include any new window files you create in your <strong><span>Resources/app.js</span></strong> file. (There’s a section in it with all the includes in a list.) Also, you need to add your new windows to the app’s tab group. That can be done by following the pattern in <strong><span>Resources/main.js</span></strong>. </p> <h2>Connecting the App to Drupal</h2> <p>When I started this project, I expected to use the <a href="https://drupal.org/project/services">Services module </a>to access the Drupal data over JSON. My plan was to create a view for each content type that I needed to download and expose those views with the Views Service module. However, when trying this approach, I came across a big limitation of Views Service. This module only exposes the Views data that is directly returned by the query. It completely skips the normal rendering step of Views. This means if you want to include the URL for a specific Imagecache-processed version of an image, it can’t be done with Views Service. You also can’t rewrite the output of fields to combine two fields into one. Pretty much everything that is awesome about Views you can’t do with Views Service. </p> <p>Views Datasource to the rescue! The day after I hit this limitation, Palantir released their code for their DrupalCon app. In their post, you will see they reference the <a href="https://drupal.org/project/views_datasource">Views Datasource module</a> as an alternative to Services. Views Datasource allows you to expose Views as JSON, and it DOES send the output through the normal Views rendering engine. So, this means you can rewrite fields, get Imagecache urls, change field labels, and probably re-theme fields if you need to, though I didn’t try this last one. With this module, I was able to get exactly the JSON output I needed to download data into the app. I’m not going to go into a full detailed explanation, because actually, if you know how to use Views, it’s pretty straightforward. It works exactly like you expect it to.</p> <h2>Putting Everything Together</h2> <p><img src="https://www.zengenuity.com/sites/default/files/migrated/la2m-to-go-icon.jpeg" alt="LA2M to Go" title="LA2M to Go" width="175" height="175" />Once I had the JSON-formatted view on the Drupal site and the schemas defined in my application, everything else was just a matter of getting of the user experience and workflow that I wanted. (Ever app is different, so you’ll have to study the Titanium API and figure out what works for your project.) After only a couple weeks of development, I was able to go from conception to launching <a href="https://itunes.apple.com/us/app/la2m-to-go/id433060438?mt=8">LA2M to Go in the App Store</a>. While it was frustrating at times deciphering both the Titanium debug output and the DrupalCon app’s design, I’m really happy with the outcome. I’ll definitely use both of these technologies in future for Drupal-connected iPhone apps, and hopefully, this post will make it a little less frustrating for you to do the same.</p> <h2>Useful Resources</h2> <p><a href="https://developer.appcelerator.com/get_started">Getting Started with Titanium Mobile Platform</a></p> <p><a href="https://developer.appcelerator.com/blog/2010/05/how-to-create-a-tweetie-like-pull-to-refresh-table.html">How to Create a Pull-to-Refresh Table in Titanium</a> - Everyone loves this UI control.</p> <p><a href="https://github.com/workhabitinc/drupal-ios-sdk">Drupal-iOS SDK</a> - A separate project that connects an iPhone app to a Drupal site using only native code in XCode. Have not tried this one out. </p> </div> </div> <span>Wayne Eaker</span>May 10, 2011 <div class="tags"> <div class="container"> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/android" hreflang="en">Android</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/drupal" hreflang="en">Drupal</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/drupal-planet" hreflang="en">Drupal Planet</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/drupalcon-chicago" hreflang="en">DrupalCon Chicago</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/iphone" hreflang="en">iPhone</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/mobile" hreflang="en">Mobile</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/services-module" hreflang="en">Services module</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/titanium-mobile-framework" hreflang="en">Titanium mobile framework</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/views-module" hreflang="en">Views module</a></span> </div> </div> Tue, 10 May 2011 12:00:00 +0000 Wayne Eaker 143 at https://www.zengenuity.com The Week in Drupal: April 8, 2011 https://www.zengenuity.com/blog/2011-04/week-drupal-april-8-2011 <span class="field field--name-title field--type-string field--label-hidden">The Week in Drupal: April 8, 2011</span> <div class="paragraph html"> <div class="container"> <p>A look back at interesting modules, articles and other <a href="https://drupal.org">Drupal</a> news of April 2 - 8, 2011. Tutorials on Drupal mobile development, high-performance setups, and extension modules for Apache Solr, Services and Ubercart.</p> <p><a href="https://www.flickr.com/photos/zenquest/5586433845/" title="Festifools 2011 by zenquest, on Flickr"><img src="https://farm6.static.flickr.com/5303/5586433845_9172d9d59f.jpg" alt="Festifools 2011" width="500" height="333" /></a></p> <h2>Drupal News</h2> <p><strong><a href="https://drupal.org/node/1111276">Docs Team Spring 2011 Update</a></strong></p> <h2>Great Posts and Tutorials This Week</h2> <p><a href="https://www.lullabot.com/articles/varnish-multiple-web-servers-drupal"><strong>Configuring Varnish for High-Availability with Multiple Web Servers</strong></a></p> <p><strong><a href="https://www.palantir.net/blog/mobilizing-drupalcon-chicago">Mobilizing DrupalCon Chicago</a></strong></p> <p><strong><a href="https://www.agileapproach.com/blog-entry/four-tips-training-clients-drupal-cms">Four Tips for Training Clients on a Drupal CMS</a></strong></p> <p><strong><a href="https://nodeone.se/blogg/organizing-a-drupalcamp-%E2%80%93-a-short-how-to">Organizing a DrupalCamp - A Short How-To</a></strong></p> <p><strong><a href="https://acquia.com/blog/how-we-architected-css-views-d7">How We Architected the CSS for Views on D7</a></strong></p> <h2>Interesting New Modules and Themes</h2> <p><strong><a href="https://drupal.org/project/search_api_saved_searches">Search API Saved Searches</a></strong> - Save searches and be notified by email of changes.</p> <p><strong><a href="https://drupal.org/project/data-services">Data Services</a></strong> - Quickly expose a DB table as a JSON service.</p> <p><strong><a href="https://pingv.com/blog/announcing-apache-solr-pages">ApacheSolr Pages</a></strong> - Create pages that are actually a preset search in <a href="https://drupal.org/project/apachesolr">Apache Solr</a>. We built something just like this for Drupal 6 in January.</p> <p><strong><a href="https://drupal.org/project/apachesolr_exclude">Apache Solr Node Exclude</a></strong> - Adds a checkbox to the node form to exclude a node from Solr search.</p> <p><strong><a href="https://drupal.org/project/uc_optional_checkout_review">Ubercart Optional Checkout Review</a></strong> - Makes the review button on the <a href="https://drupal.org/project/ubercart">Ubercart</a> checkout page optional (set by store admin).</p> </div> </div> <span>Wayne Eaker</span>April 8, 2011 <div class="tags"> <div class="container"> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/drupal" hreflang="en">Drupal</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/mobile" hreflang="en">Mobile</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/search" hreflang="en">Search</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/services-module" hreflang="en">Services module</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/solr" hreflang="en">Solr</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/training" hreflang="en">Training</a></span> <span class="tag"><a href="https://www.zengenuity.com/blog/tags/ubercart" hreflang="en">Ubercart</a></span> </div> </div> Fri, 08 Apr 2011 11:00:00 +0000 Wayne Eaker 137 at https://www.zengenuity.com