<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>pingVision</title>
  <subtitle>Interactive Design + Development for Drupal websites</subtitle>
  <link rel="alternate" type="text/html" href="http://pingv.net"/>
  <link rel="self" type="application/atom+xml" href="http://pingv.net/atom/feed"/>
  <id>http://pingv.net/atom/feed</id>
  <updated>2008-11-05T18:32:21-06:00</updated>
  <entry>
    <title>Drupal upgrade tip: Converting from Event module to CCK Date</title>
    <link rel="alternate" type="text/html" href="http://pingv.net/blog/alasda/2008/drupal-upgrade-tip-converting-event-module-cck-date" />
    <id>http://pingv.net/blog/alasda/2008/drupal-upgrade-tip-converting-event-module-cck-date</id>
    <published>2008-12-23T14:09:15-06:00</published>
    <updated>2008-12-23T14:09:22-06:00</updated>
    <author>
      <name>alasda</name>
    </author>
    <category term="Calendar Module" />
    <category term="CCK" />
    <category term="code" />
    <category term="convert" />
    <category term="Date" />
    <category term="Date Module" />
    <category term="Drupal" />
    <category term="Event Module" />
    <category term="upgrade" />
    <category term="Views" />
    <content type="html"><![CDATA[<p> If you're upgrading your site from Drupal 5 to Drupal 6 and were previously using the event module, you have probably realized that a lot of the supporting modules that made the event module functional (such as Event Views) have fallen by the wayside.  Well, as luck would have it, much (if not all) of the functionality that the event module provides can be re-created using CCK date fields, views and the calendar module.  So the only task that remains is to get your existing event content migrated over into usable CCK fields, and then configure your views to display them into a calendar display.</p>
<p>While there are undoubtedly other approaches to achieve this end, this is a relatively quick and painless path to get the features you want up and running.</p>
<p>You'll require the following D6 supporting modules:<br />
CCK - <a href="http://drupal.org/project/cck" title="http://drupal.org/project/cck">http://drupal.org/project/cck</a><br />
Date - <a href="http://drupal.org/project/date" title="http://drupal.org/project/date">http://drupal.org/project/date</a><br />
Views - <a href="http://drupal.org/project/views" title="http://drupal.org/project/views">http://drupal.org/project/views</a><br />
Calendar - <a href="http://drupal.org/project/calendar" title="http://drupal.org/project/calendar">http://drupal.org/project/calendar</a></p>
<p>Install and enable the latest revisions of these modules.</p>
<p>Identify the content type or types currently on your site which are used by events.  The process differs slightly depending on whether the resulting CCK date fields will be located in only one content type, or shared between multiple types.</p>
<p>Through the CCK interface, create new date fields in your existing event content type.  These are the fields into which the old event information will be migrated .  For the purposes of this document, I'll call them "eventstart" and "eventend".</p>
<p>If you have only one content type for events, your new fields will be created in the mysql table corresponding to that type.  For example, if your content type was called wine_tastings, a table called content_type_wine_tastings will exist in your database, and the fields field_eventstart_value and field_eventend_value will exist in this table.</p>
<p>If you're sharing the eventstart and eventend fields between multiple content types, new tables will be created to house this data.  In this example, the tables would be called content_field_eventstart and content_field_eventend.</p>
<p>Now with a little php and mysql magic, we can populate the new field data from the event_start and event_end fields from the original event table.  Because the date information is stored in slightly different formats, a little bit of transformation is required.  Create a php script like the example below, and execute from the command line.  This example was constructed using shared date fields across multiple content types.</p>
<p><b>Remember to ALWAYS back up your database before performing any operations like this!</b></p>
<div class="codeblock"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// You backed up your database, right?</p>
<p>// Set up the mysql connection<br />// Drupal's bootstrap function may be substituted here<br />// require_once '/path/to/drupal/includes/bootstrap.inc';<br />// drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);<br /></span><span style="color: #0000BB">$con </span><span style="color: #007700">= </span><span style="color: #0000BB">mysql_connect</span><span style="color: #007700">(</span><span style="color: #DD0000">'localhost'</span><span style="color: #007700">, </span><span style="color: #DD0000">'yourdbusername'</span><span style="color: #007700">, </span><span style="color: #DD0000">'yourdbpassword'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">mysql_select_db</span><span style="color: #007700">(</span><span style="color: #DD0000">'yourdbname'</span><span style="color: #007700">, </span><span style="color: #0000BB">$con</span><span style="color: #007700">);</p>
<p></span><span style="color: #FF8000">// Cycle through all the records in the event table <br /></span><span style="color: #0000BB">$q </span><span style="color: #007700">= </span><span style="color: #DD0000">'select * from event'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$r </span><span style="color: #007700">= </span><span style="color: #0000BB">mysql_query</span><span style="color: #007700">(</span><span style="color: #0000BB">$q</span><span style="color: #007700">);<br />while (</span><span style="color: #0000BB">$row </span><span style="color: #007700">= </span><span style="color: #0000BB">mysql_fetch_assoc</span><span style="color: #007700">(</span><span style="color: #0000BB">$r</span><span style="color: #007700">)){</p>
<p></span><span style="color: #FF8000">// Transform the date information<br />// CCK date format: 2008-12-10T00:00:00<br />// event date format: 2006-11-13 15:00:00<br />&nbsp; </span><span style="color: #0000BB">$startdate </span><span style="color: #007700">= </span><span style="color: #0000BB">preg_replace </span><span style="color: #007700">(</span><span style="color: #DD0000">"/ /"</span><span style="color: #007700">, </span><span style="color: #DD0000">'T'</span><span style="color: #007700">, </span><span style="color: #0000BB">$row</span><span style="color: #007700">[</span><span style="color: #DD0000">'event_start'</span><span style="color: #007700">]);</p>
<p></span><span style="color: #FF8000">// Populate the new field for eventstart<br />&nbsp; </span><span style="color: #0000BB">$q2 </span><span style="color: #007700">= </span><span style="color: #DD0000">'update content_field_eventstart set field_eventstart_value="'</span><span style="color: #007700">. </span><span style="color: #0000BB">$startdate </span><span style="color: #007700">. </span><span style="color: #DD0000">'" WHERE nid="'</span><span style="color: #007700">. </span><span style="color: #0000BB">$row</span><span style="color: #007700">[</span><span style="color: #DD0000">'nid'</span><span style="color: #007700">] . </span><span style="color: #DD0000">'"'</span><span style="color: #007700">;<br />&nbsp; if (!</span><span style="color: #0000BB">$r2 </span><span style="color: #007700">= </span><span style="color: #0000BB">mysql_query</span><span style="color: #007700">(</span><span style="color: #0000BB">$q2</span><span style="color: #007700">)){</p>
<p></span><span style="color: #FF8000">// Don't continue if anything goes south<br />&nbsp;&nbsp;&nbsp; </span><span style="color: #007700">exit (</span><span style="color: #0000BB">$q2 </span><span style="color: #007700">.</span><span style="color: #DD0000">" failed!\n"</span><span style="color: #007700">);<br />&nbsp; }</p>
<p></span><span style="color: #FF8000">// Perform the same transformation and data population for the end date<br />&nbsp; </span><span style="color: #0000BB">$enddate </span><span style="color: #007700">= </span><span style="color: #0000BB">preg_replace</span><span style="color: #007700">(</span><span style="color: #DD0000">"/ /"</span><span style="color: #007700">, </span><span style="color: #DD0000">'T'</span><span style="color: #007700">, </span><span style="color: #0000BB">$row</span><span style="color: #007700">[</span><span style="color: #DD0000">'event_end'</span><span style="color: #007700">]);<br />&nbsp; </span><span style="color: #0000BB">$q3 </span><span style="color: #007700">= </span><span style="color: #DD0000">'update content_field_eventend set field_eventend_value="'</span><span style="color: #007700">. </span><span style="color: #0000BB">$enddate </span><span style="color: #007700">.</span><span style="color: #DD0000">'" WHERE nid="'</span><span style="color: #007700">. </span><span style="color: #0000BB">$row</span><span style="color: #007700">[</span><span style="color: #DD0000">'nid'</span><span style="color: #007700">] .</span><span style="color: #DD0000">'"'</span><span style="color: #007700">;</p>
<p></span><span style="color: #FF8000">// Once again, terminate the operation if the query fails<br />&nbsp; </span><span style="color: #007700">if (!</span><span style="color: #0000BB">$r3 </span><span style="color: #007700">= </span><span style="color: #0000BB">mysql_query</span><span style="color: #007700">(</span><span style="color: #0000BB">$q3</span><span style="color: #007700">)){<br />&nbsp;&nbsp;&nbsp; exit(</span><span style="color: #0000BB">$q3 </span><span style="color: #007700">.</span><span style="color: #DD0000">" failed!\n"</span><span style="color: #007700">);<br />&nbsp; }<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
<p>Once you've got these fields populated, you should check an existing node to verify that the information has been correctly populated.  Navigate to one of your event nodes, and select edit.  You should see both the legacy event date information and the new CCK fields populated with the start and end dates.</p>
<p>If this all checks out, browse to the modules page and disable the events module.  You are now free to uninstall the event module and purge any vestigial tables.</p>
<p>Congratulations!  You have converted your event nodes to a more flexible CCK/Date setup.  These fields are now available for use in views using the calendar module! </p>
    ]]></content>
  </entry>
  <entry>
    <title>Fields in core</title>
    <link rel="alternate" type="text/html" href="http://pingv.net/blog/ben-jeavons/2008/fields-core" />
    <id>http://pingv.net/blog/ben-jeavons/2008/fields-core</id>
    <published>2008-12-19T11:30:46-06:00</published>
    <updated>2008-12-19T12:10:44-06:00</updated>
    <author>
      <name>Ben Jeavons</name>
    </author>
    <category term="code" />
    <category term="Drupal" />
    <category term="Drupal 7" />
    <content type="html"><![CDATA[<p> The fields in core sprint is happening, and you can follow it in the <a href="http://groups.drupal.org/fields-core">Fields in Core group</a>. Check out the emerging Field API specification at <a href="http://docs.google.com/View?docid=dcz939d6_2gnh78thd" title="http://docs.google.com/View?docid=dcz939d6_2gnh78thd">http://docs.google.com/View?docid=dcz939...</a> and the latest public discussion on storage at <a href="http://groups.drupal.org/node/17576" title="http://groups.drupal.org/node/17576">http://groups.drupal.org/node/17576</a>, table per field or table per type. The functionality of fields is huge for Drupal and future versions of core. Follow along in the fields in core group and participate because it's not something to be taken lightly. </p>
    ]]></content>
  </entry>
  <entry>
    <title>DrupalCon DC 09 Sessions</title>
    <link rel="alternate" type="text/html" href="http://pingv.net/blog/ben-jeavons/2008/drupalcon-dc-09-sessions" />
    <id>http://pingv.net/blog/ben-jeavons/2008/drupalcon-dc-09-sessions</id>
    <published>2008-12-16T16:20:23-06:00</published>
    <updated>2008-12-16T16:22:46-06:00</updated>
    <author>
      <name>Ben Jeavons</name>
    </author>
    <category term="Drupal" />
    <category term="DrupalCon" />
    <category term="DrupalCon DC 2009" />
    <category term="pregnancy.org" />
    <category term="SportingNews.com" />
    <content type="html"><![CDATA[<p> <a href="http://dc2009.drupalcon.org/">DrupalCon DC</a> is a few months away, but as you know time flies with Drupal, so now is the time to vote for what you want the next DrupalCon to be. With almost 200 sessions proposed you have a lot to choose from!</p>
<p>pingVision has proposed or is part of five sessions:</p>
<ul>
<li><a href="http://dc2009.drupalcon.org/session/data-importation-how-import-enterprise-level-data">Data Importation: How to import enterprise level data</a>
<p><a href="http://dc2009.drupalcon.org/user/cyberswat">Kevin Bridges</a> and <a href="http://dc2009.drupalcon.org/user/jcfiala">John Fiala</a> will talk on bringing legacy content and users into Drupal.</p>
</li>
<li><a href="http://dc2009.drupalcon.org/session/theming-out-box-designing-drupal">Theming Out of the Box: Designing in Drupal</a>
<p>Monarch Digital's <a href="http://dc2009.drupalcon.org/user/prestonso">Preston So</a> and pingVision's <a href="http://dc2009.drupalcon.org/user/ultimateboy">Matt Tucker</a> will cover foundations of design and advanced CSS techniques and how to make Drupal not look like, well, Drupal.</p>
</li>
<li><a href="http://dc2009.drupalcon.org/session/contributing-code-drupal-cvs-and-projects">Contributing Code: Drupal CVS and Projects</a>
<p><a href="http://dc2009.drupalcon.org/user/dww">Derek Wright</a> and I will talk about Drupal.org's CVS and Projects and how to contribute code.</p>
</li>
</ul>
<p>And there are two proposed case studies, <a href="http://dc2009.drupalcon.org/session/pregnancyorg-casestudy">Pregnancy.org</a> and <a href="http://dc2009.drupalcon.org/session/sportingnewscom-casestudy">SportingNews.com</a>, by <a href="http://dc2009.drupalcon.org/user/matthews">Matthew Saunders</a> and members of the pingVision team.</p>
<p>If any of these sessions interests you, please vote for them on <a href="http://dc2009.drupalcon.org/sessions">DC2009.DrupalCon.org</a>!</p>
<p>I'm really looking forward to DC next year. Not only will I get to see some of my family in the area, I'll get to see some Drupal family as well! Among the sessions I'm excited about is <a href="http://dc2009.drupalcon.org/session/path-richer-text-input-format-improvements-drupal-7">Input Format Improvements in Drupal 7</a>, <a href="http://dc2009.drupalcon.org/session/drupal-databases-next-generation">Drupal Databases: The Next Generation</a>, and <a href="http://dc2009.drupalcon.org/session/new-node-and-taxonomy-apis-drupal-7">New node and taxonomy APIs in Drupal 7</a> to name just a few.</p>
<p>DrupalCon DC is looking to be the best DrupalCon yet! What are you looking forward to? </p>
    ]]></content>
  </entry>
  <entry>
    <title>pingVision&#039;s Drupal services go Platinum as Acquia Partner</title>
    <link rel="alternate" type="text/html" href="http://pingv.net/blog/laura/2008/pingvisions-drupal-services-go-platinum-acquia-partner" />
    <id>http://pingv.net/blog/laura/2008/pingvisions-drupal-services-go-platinum-acquia-partner</id>
    <published>2008-12-12T07:37:59-06:00</published>
    <updated>2008-12-12T07:53:28-06:00</updated>
    <author>
      <name>Laura</name>
    </author>
    <category term="About" />
    <category term="Press" />
    <category term="Partners" />
    <category term="Acquia" />
    <category term="Dries Buytaert" />
    <category term="Drupal" />
    <category term="Jay Batson" />
    <category term="Views" />
    <content type="html"><![CDATA[<p> <a href="http://pingv.com/services"><img src="http://pingv.com/files/BadgePlatinum.png" alt="Acquia Platinum Partner badge" title="pingVision is an Acquia Platinum Partner" /></a><br />
It happened several weeks ago, and the <a href="http://www.prweb.com/releases/2008/12/prweb1613654.htm">official announcement</a> went out <s>yesterday</s> Wednesday, so I figured it's time to blog it: pingVision is an <a href="http://acquia.com/partners">Acquia Platinum Partner</a>, offering IA/TA, web design, development, deployment, performance tuning and consulting services for sites built using Acquia Drupal<sup class="glossary-indicator" title="Acquia Drupal is a commercially supported distribution of Drupal, comprised of Drupal core, plus some contributed modules – all vetted by Acquia, a company co-founded by Drupal creator Dries Buytaert. The Acquia Drupal code is available for free under the same General Public License that governs the Drupal code. Acquia Drupal provides a solid foundation for subscription to the Acquia Network, which provides streamlined code updates functionality and other support. See http://pingv.com/services/acquia-drupal"><a href="http://pingv.com/glossary/10#term314" title="Acquia Drupal is a commercially supported distribution of Drupal, comprised of Drupal core, plus some contributed modules – all vetted by Acquia, a company co-founded by Drupal creator Dries Buytaert. The Acquia Drupal code is available for free under the same General Public License that governs the Drupal code. Acquia Drupal provides a solid foundation for subscription to the Acquia Network, which provides streamlined code updates functionality and other support. See http://pingv.com/services/acquia-drupal" class="glossary-indicator">*</a></sup>.</p>
<p>Acquia truly escalated the Drupal world when it came out with its commercially supported distribution of Drupal. Nothing is lost. It's all gain. Because Acquia Drupal is still Drupal, still free, still licensed under the GPL. And it's co-founded by Drupal creator Dries Buytaert, meaning it's not at all likely to go off on its own fork. (Dries not only wouldn't want to, it wouldn't make business sense in the open source ecosystem.)</p>
<p>Check out the <a href="http://acquia.com/products-services/acquia-drupal-modules">community modules</a> included in Acquia Drupal:</p>
<ul>
<li>Admin Menu</li>
<li>Advanced Help</li>
<li>CCK</li>
<li>Fivestar</li>
<li>Google Analytics</li>
<li>Image and ImageCache</li>
<li>Pathauto</li>
<li>Printer, e-mail and PDF versions of pages</li>
<li>Tagadelic</li>
<li>and, of course, Views, the powerful query builder developed by Earl Miles that enables non-coders to create custom filtered dynamic blocks and pages of content.</li>
</ul>
<h3>A new support resource</h3>
<p>The <a href="http://acquia.com/products-services/acquia-network">Acquia Network</a> of support offers some new reassurance to website owners and operators who might be a bit leery of venturing into the deep end of the open source pool.</p>
<p>You can get:</p>
<ul>
<li>Software update management</li>
<li>System profile management</li>
<li>Automated spam blocking with Mollom</li>
<li>Heartbeat uptime monitoring</li>
<li>Code modification detection</li>
<li>Remote cron activation</li>
<li>Online documentation</li>
<li>Site usage statistics</li>
</ul>
<p>Acquia also has a tech support team available via web, email and telephone, depending upon subscription level.</p>
<p>We're delighted to offer <a href="http://pingv.com/services">Acquia Drupal services</a>. It's been a real pleasure working with the Acquia team these past few weeks. We look forward to many years working together to help spread Drupal around the world.</p>
<h3>From the press release</h3>
<blockquote><p>Acquia, provider of the commercially supported distribution of the popular Drupal social publishing system, today announced that pingVision, the Drupal web developer behind websites such as PopSci.com and Pregnancy.org, has been selected to join the Acquia Partner Program as a Platinum service provider. pingVision has received substantial and sustained recognition for its Drupal technology solutions, and is fully committed and fully equipped to deliver sustainable business growth with Acquia-powered solutions.</p>
<p>"pingVision has a strong reputation for its leading technology solutions and has shown a deep commitment to furthering Acquia's vision. We're excited to have pingVision join the Acquia Partner Program as a platinum member," said Jay Batson, Acquia co-founder and CEO.</p>
<p>pingVision has won awards for design and development of Drupal-powered websites for clients including Bonnier, E.W. Scripps &amp; Co., Stanford University and BlogHer, and is one of the few companies providing turnkey services for enterprise Drupal websites.</p>
<p>"Acquia Drupal and the Acquia Network are ideal for our clients of all sizes, who want that added level of support," said Laura Scott, co-founder and President of pingVision. "And by providing a fully supported distribution of Drupal for a website's foundation, Acquia affords us the opportunity to focus on the custom development, integrations and theming at the core of our business."</p>
<p>The Acquia Partner Program helps organizations of all sizes identify Drupal service providers with the expertise, experience and services to meet their unique website requirements. As an Acquia Platinum partner, pingVision can deliver custom solutions built on Acquia Drupal that connect to the Acquia Network for additional site management and network services, as well as technical support. Working together, Acquia and pingVision are focused on extending the reach of Drupal into new markets and application areas.</p>
<p>For more information, please visit: <a href="http://acquia.com/partners" title="http://acquia.com/partners">http://acquia.com/partners</a>, and http://pingv.com.</p></blockquote>
<p>And be sure to say hello! </p>
    ]]></content>
  </entry>
  <entry>
    <title>Drupal Meet-Up &amp; Ad-Hoc DBUG Holiday Happy Mash-up (of sorts)</title>
    <link rel="alternate" type="text/html" href="http://pingv.net/blog/laura/2008/drupal-meet-up-ad-hoc-dbug-holiday-happy-mash-up-sorts" />
    <id>http://pingv.net/blog/laura/2008/drupal-meet-up-ad-hoc-dbug-holiday-happy-mash-up-sorts</id>
    <published>2008-12-09T18:01:21-06:00</published>
    <updated>2008-12-09T18:05:02-06:00</updated>
    <author>
      <name>Laura</name>
    </author>
    <category term="DBUG" />
    <category term="Drupal" />
    <category term="holidays" />
    <category term="Meet-Up" />
    <content type="html"><![CDATA[<p> 'Tis the season, and we've almost arrived at the second Wednesday of the month, meaning that this month's Drupal Meetup will be a sort of casual, impromptu holiday affair.<br />
<img src="http://pingv.com/files/Druplicon-santa.png" alt="Druplicon Santa" title="Ho ho ho!" /><br />
What that means is that we'll have some eggnog and perhaps other celebratory fare to complement the usual pizza and Drupal enthusiasm.</p>
<p>We don't know if you've been naughty or nice, but Drupliclaus does! (Heh.) So come share in some Drupal karma. We promise we won't sing any carols.</p>
<p>It all starts at 6:30pm tomorrow (Wednesday, December 10th), here at pingVision. RSVP <a href="http://drupal.meetup.com/15/calendar/9152248/">here</a>. And if you haven't already, be sure to join <a href="http://groups.drupal.org/denverboulder-colorado-user-group-dbug">the official DBUG home at Groups.Drupal.org</a>! </p>
    ]]></content>
  </entry>
  <entry>
    <title>What a difference a couple of years make</title>
    <link rel="alternate" type="text/html" href="http://pingv.net/blog/laura/2008/what-difference-couple-years-make" />
    <id>http://pingv.net/blog/laura/2008/what-difference-couple-years-make</id>
    <published>2008-12-05T15:43:20-06:00</published>
    <updated>2008-12-05T15:44:30-06:00</updated>
    <author>
      <name>Laura</name>
    </author>
    <category term="About" />
    <category term="Boulder" />
    <category term="business" />
    <category term="DBUG" />
    <category term="Drupal" />
    <category term="Meet-Up" />
    <content type="html"><![CDATA[<p> Last month marked our 2-year anniversary in our current office — or, rather, one of our current office suites.<br />
<a href="http://www.flickr.com/photos/28263608@N00/3078482226" title="View &#039;The (future) pingVision building&#039; on Flickr.com"><img src="http://farm4.static.flickr.com/3200/3078482226_c5a841ff4e_m.jpg" alt="The (future) pingVision building" border="0" width="240" height="180" /></a>Now we're looking at some possible new office spaces where we will make our home next, and that has me looking back at the life lived inside these walls. In a way, it's hard to believe we've been here two years already. Yet it also feels like where we were two years ago was more like a million years ago. Times change.</p>
<p><a href="http://www.flickr.com/photos/28263608@N00/3077651369" title="View &#039;Home office start-up days&#039; on Flickr.com"><img src="http://static.flickr.com/3196/3077651369_4881d308bd_m.jpg" alt="Home office start-up days" border="0" width="" height="" /></a><br />
Before getting into this building, we were doing the bulk of our work out of a home office, and used a virtual office for meetings, etc. We knew then that getting into a "real" office would constitute a huge improvement in our productivity. </p>
<p><a href="http://www.flickr.com/photos/28263608@N00/3077650933" title="View &#039;Officially listed&#039; on Flickr.com"><img src="http://farm4.static.flickr.com/3218/3077650933_0c831cecdd_m.jpg" alt="Officially listed, though mispelled" border="0" width="160" height="240" /></a><br />
In hindsight, I think we underestimated just how much of an improvement that would in fact make.</p>
<p>When we first moved into the building starting on the Monday after Thanksgiving 2006, we had just Suite 1, a 4-room (plus full bathroom) space on a split-level. It was not all that big, especially during our meet-ups....But we did our best to spruce it up and make it a comfy place to work.</p>
<p><a href="http://www.flickr.com/photos/28263608@N00/3078482338" title="View &#039;The first office&#039; on Flickr.com"><img src="http://static.flickr.com/3027/3078482338_366cb1ef41_s.jpg" alt="The first office" border="0" width="" height="" /></a><a href="http://www.flickr.com/photos/28263608@N00/3077651289" title="View &#039;Crowded Drupal Meet-up&#039; on Flickr.com"><img src="http://static.flickr.com/3226/3077651289_6cc2e45fd8_s.jpg" alt="Crowded Drupal Meet-up" border="0" width="" height="" /></a><a href="http://www.flickr.com/photos/28263608@N00/3077651041" title="View &#039;An early Drupal Meet-up at pingVision&#039; on Flickr.com"><img src="http://static.flickr.com/3240/3077651041_b4f4c84f9b_s.jpg" alt="An early Drupal Meet-up at pingVision" border="0" width="" height="" /></a></p>
<p><a href="http://www.flickr.com/photos/28263608@N00/3078482424" title="View &#039;Original office, with lights to brighten it up&#039; on Flickr.com"><img src="http://static.flickr.com/3036/3078482424_0eb6920bcc_s.jpg" alt="Original office, with lights to brighten it up" border="0" width="" height="" /></a></p>
<p><br class="break" /><br />
As we grew and suites opened up in our building, we started taking them over, spreading out ... until we reached the point where we are now, with 5 out of the 6 suites and over 5,000 square feet of space....</p>
<p><a href="http://www.flickr.com/photos/28263608@N00/2536726601" title="View &#039;Drupal MeetUp sign at pingVision&#039; on Flickr.com"><img src="http://farm3.static.flickr.com/2375/2536726601_7a479da632_s.jpg" alt="Drupal MeetUp sign at pingVision" border="0" width="75" height="75" /></a><a href="http://www.flickr.com/photos/28263608@N00/2848502085" title="View &#039;DBUG Drupal Meet-Up at pingVision in Boulder&#039; on Flickr.com"><img src="http://farm4.static.flickr.com/3061/2848502085_7a015911fb_s.jpg" alt="DBUG Drupal Meet-Up at pingVision in Boulder" border="0" width="75" height="75" /></a><a href="http://www.flickr.com/photos/28263608@N00/3078482652" title="View &#039;Drupal Meet-up in Suite 2&#039; on Flickr.com"><img src="http://static.flickr.com/3174/3078482652_2d4e9774f9_s.jpg" alt="Drupal Meet-up in Suite 2" border="0" width="" height="" /></a><a href="http://www.flickr.com/photos/28263608@N00/2809809950" title="View &#039;Farewell party for Kevin&#039; on Flickr.com"><img src="http://farm4.static.flickr.com/3104/2809809950_1f51012633_s.jpg" alt="Farewell party for Kevin" border="0" width="75" height="75" /></a><a href="http://www.flickr.com/photos/28263608@N00/2809809994" title="View &#039;Farewell party for Kevin&#039; on Flickr.com"><img src="http://farm4.static.flickr.com/3011/2809809994_7b95f60c8a_s.jpg" alt="Farewell party for Kevin" border="0" width="75" height="75" /></a><a href="http://www.flickr.com/photos/28263608@N00/2763216222" title="View &#039;Boulder DBUG Drupal User Group Meet-Up&#039; on Flickr.com"><img src="http://farm4.static.flickr.com/3040/2763216222_dc2eee29cd_s.jpg" alt="Boulder DBUG Drupal User Group Meet-Up" border="0" width="75" height="75" /></a><a href="http://www.flickr.com/photos/28263608@N00/2763216458" title="View &#039;Boulder DBUG Drupal User Group Meet-Up&#039; on Flickr.com"><img src="http://farm4.static.flickr.com/3116/2763216458_82f37eaf10_s.jpg" alt="Boulder DBUG Drupal User Group Meet-Up" border="0" width="75" height="75" /></a><a href="http://www.flickr.com/photos/28263608@N00/2763216030" title="View &#039;Boulder DBUG Drupal User Group Meet-Up&#039; on Flickr.com"><img src="http://static.flickr.com/3036/2763216030_1ec2ec9735_s.jpg" alt="Boulder DBUG Drupal User Group Meet-Up" border="0" width="" height="" /></a><a href="http://www.flickr.com/photos/28263608@N00/2763216076" title="View &#039;Boulder DBUG Drupal User Group Meet-Up&#039; on Flickr.com"><img src="http://static.flickr.com/3068/2763216076_4722ccdd9a_s.jpg" alt="Boulder DBUG Drupal User Group Meet-Up" border="0" width="" height="" /></a><a href="http://www.flickr.com/photos/28263608@N00/2762372565" title="View &#039;Boulder DBUG Drupal User Group Meet-Up&#039; on Flickr.com"><img src="http://static.flickr.com/3038/2762372565_27f63eeed2_s.jpg" alt="Boulder DBUG Drupal User Group Meet-Up" border="0" width="" height="" /></a><a href="http://www.flickr.com/photos/28263608@N00/2537925964" title="View &#039;Druplicon Cake&#039; on Flickr.com"><img src="http://farm3.static.flickr.com/2001/2537925964_0b007fe6a3_s.jpg" alt="Druplicon Cake" border="0" width="75" height="75" /></a><a href="http://www.flickr.com/photos/28263608@N00/2537545276" title="View &#039;Al Steffen snaps a pic at the meetup&#039; on Flickr.com"><img src="http://farm4.static.flickr.com/3050/2537545276_074cc85d4f_s.jpg" alt="Al Steffen snaps a pic at the meetup" border="0" width="75" height="75" /></a><br />
...including a decent-sized room for our Drupal meet-ups.</p>
<p>Having a bricks-and-mortar presence has really helped us as a company. We start off every day with our morning huddle. We confer on things as they come up. We meet with clients in-person -- which in itself is more valuable than most people imagine. And we learn from each other. </p>
<p><a href="http://www.flickr.com/photos/28263608@N00/3078482570" title="View &#039;Andy, Matthew, Kevin in upstairs office&#039; on Flickr.com"><img src="http://static.flickr.com/3004/3078482570_a1ecb10e2c_t.jpg" alt="Andy, Matthew, Kevin in upstairs office" border="0" width="" height="" /></a><a href="http://www.flickr.com/photos/28263608@N00/3077651415" title="View &#039;Office expansion move-in, June 2007&#039; on Flickr.com"><img src="http://static.flickr.com/3277/3077651415_8da674c0a2_s.jpg" alt="Office expansion move-in, June 2007" border="0" width="" height="" /></a><a href="http://www.flickr.com/photos/28263608@N00/3077651187" title="View &#039;Lasda and Al&#039; on Flickr.com"><img src="http://static.flickr.com/3009/3077651187_942fdfb61e_s.jpg" alt="Lasda and Al" border="0" width="" height="" /></a><br />
While there apparently are <a href="http://techdirt.com/articles/20081202/1813012997.shtml">companies considering going virtual</a> — and there's no doubt many companies are doing well as virtual shops — that is something we will not do, not if we can at all avoid it. The benefits for us from being in the same space to date have far outweighed the savings in lease and commuting costs.</p>
<p><a href="http://www.flickr.com/photos/28263608@N00/2607579269" title="View &#039;pingVision signage&#039; on Flickr.com"><img src="http://static.flickr.com/3185/2607579269_100b426b07_m.jpg" alt="pingVision signage" border="0" width="" height="" /></a><a href="http://www.flickr.com/photos/28263608@N00/2607579161" title="View &#039;pingVision building&#039; on Flickr.com"><img src="http://static.flickr.com/3037/2607579161_cd6529446a.jpg" alt="pingVision building" border="0" width="" height="" /></a><br />
Yes, this little building has done us a good turn.<br />
<br class="break" /> </p>
    ]]></content>
  </entry>
  <entry>
    <title>Drupal on the cover of Information Week magazine</title>
    <link rel="alternate" type="text/html" href="http://pingv.net/press/mentions/drupal-cover-information-week-magazine" />
    <id>http://pingv.net/press/mentions/drupal-cover-information-week-magazine</id>
    <published>2008-11-20T18:13:20-06:00</published>
    <updated>2008-11-20T20:15:30-06:00</updated>
    <author>
      <name>Laura</name>
    </author>
    <category term="Drupal CMS" />
    <content type="html"><![CDATA[    ]]></content>
  </entry>
  <entry>
    <title>Pregnancy.org Relaunches in Drupal 6</title>
    <link rel="alternate" type="text/html" href="http://pingv.net/blog/matthews/2008/pregnancy-org-relaunches-drupal-6" />
    <id>http://pingv.net/blog/matthews/2008/pregnancy-org-relaunches-drupal-6</id>
    <published>2008-11-13T16:32:45-06:00</published>
    <updated>2008-11-13T20:33:43-06:00</updated>
    <author>
      <name>MatthewS</name>
    </author>
    <category term="Drupal" />
    <category term="phpnuke" />
    <category term="pregnancy.org" />
    <content type="html"><![CDATA[<p> This morning <a href="http://pingv.com">pingVision</a> relaunched <a href="http://www.pregnancy.org">Pregnancy.org</a> in Drupal 6.  The site was wholly designed and developed by <a href="http://pingv.com">pingVision</a>  and included several interesting integrations including some custom tools.<br />
&lt;!--break--><br />
<img src="http://pingv.com/files/pregnancy-med.jpg" alt="pregnancy.org screenshot" title="Pregnancy.org Screenshot" style="text-align:center; margin-right: -80px; margin-left: -80px" /></p>
<p>The site allows site members to track their progress within the four primary tracks--"Getting Pregnant", "Pregnancy", "Labor and Delivery", and "Baby and Beyond".</p>
<p><strong>Some of the things we did include:</strong></p>
<ul>
<li>Development of a <a href="http://pregnancy.org/bbt">Basal Body Temperature Tool</a> to help keep track of fertility cycles.  The tool collects data (such as temperature and how you are feeling) and then uses the Google Chart API to generate a visual of when the most likely ovulation times will occur.</li>
<li>Creation of a <a href="http://pregnancy.org/pregnancycalendar">Pregnancy Calendar</a> that follows your pregnancy every day to show you what is happening. </li>
<li>Inclusion of a Fetal Development Tool that gives a visual representation and facts about where the fetus is in development.</li>
<li>Integration of live chat and community forums in vBulletin.</li>
<li>A sizeable import of users and articles from the old and inflexible PHPNuke site.</li>
</ul>
<p>The site includes ad serving from multiple ad services such as DoubleClick Dart, PriceGrabber, and IntelliTXT.  </p>
<p>This project will spawn a new contributed module (by pingVision's <a href="http://pingv.com/about/people/ben-jeavons">Ben Jeavons</a>) called PDS (a generic tool for storing data for blocks) and possibly several others.  We'll be blogging more in upcoming days. </p>
    ]]></content>
  </entry>
  <entry>
    <title>Tips using Eclipse and Drupal, at Wednesday&#039;s Meet-Up at pingVision</title>
    <link rel="alternate" type="text/html" href="http://pingv.net/blog/laura/2008/tips-using-eclipse-and-drupal-wednesdays-meet-up-pingvision" />
    <id>http://pingv.net/blog/laura/2008/tips-using-eclipse-and-drupal-wednesdays-meet-up-pingvision</id>
    <published>2008-11-10T17:49:06-06:00</published>
    <updated>2008-11-10T17:49:06-06:00</updated>
    <author>
      <name>Laura</name>
    </author>
    <category term="DBUG" />
    <category term="development" />
    <category term="Drupal" />
    <category term="Eclipse" />
    <category term="Meet-Up" />
    <content type="html"><![CDATA[<p> <a href="http://drupal.meetup.com/15/calendar/8926979/">This Wednesday's Denver/Boulder Drupal Users' Group Meet-Up</a> will have, among other things, a presentation by <a href="http://pingv.com/about/people/al-steffen">Al Steffen</a> on working on Drupal using Eclipse, the open source integrated development environment that makes coding -- and specifically coding for Drupal -- so much easier.</p>
<p>Also, <a href="http://pingv.com/about/people/matt-tucker">Matt Tucker</a> will continue our ad hoc series on things to do with Views by giving a little overview of Draggable Views, which is a module that pretty much does what you'd expect: drag-and-drop ordering of nodes in Views.</p>
<p>But that's just part of the meet-up. As always, the agenda is open.</p>
<p>Have a question?</p>
<p>Launched a website?</p>
<p>Created a cool new Drupal module?</p>
<p>Share it with fellow Drupal aficionados!</p>
<p><a href="http://www.google.com/maps?f=q&amp;hl=en&amp;q=1350+Pine+Street+Suite+1,+Boulder,+CO+80302&amp;ie=UTF8&amp;z=15&amp;om=1&amp;iwloc=addr" target="_blank"><img src="http://pingv.com/files/images/google-map.png" alt="Google map" title="Click for full Google Map and directions" class="wrapr" /></a><br />
Meet-and-greet-and-Za start at 6:30pm, right here in our main meeting room. (Map below.) Presentations start around 7. All are welcome, from experts to the merely curious! </p>
    ]]></content>
  </entry>
  <entry>
    <title>Node Bodies, Teasers, and hook_nodeapi(&#039;presave&#039;)</title>
    <link rel="alternate" type="text/html" href="http://pingv.net/blog/john-fiala/2008/node-bodies-teasers-and-hooknodeapipresave" />
    <id>http://pingv.net/blog/john-fiala/2008/node-bodies-teasers-and-hooknodeapipresave</id>
    <published>2008-11-05T18:16:43-06:00</published>
    <updated>2008-11-05T18:32:21-06:00</updated>
    <author>
      <name>John Fiala</name>
    </author>
    <category term="code" />
    <category term="development" />
    <category term="Drupal" />
    <category term="Drupal 6" />
    <content type="html"><![CDATA[<p> Here's something interesting to keep in mind the next time you're getting fancy with your nodes during the <code>hook_nodeapi</code> presave step: Don't forget your teaser.</p>
<p>I was having trouble with a Drupal 6 website I've been working on, where it seemed almost as if the body was duplicating part of itself (or sometimes all of itself) on the edit - it looked fine when you were viewing the node, but editing it caused things to duplicate within the body field.  I tried the usual suspects for fixing - I searched for nodeapi calls inside of the custom modules we'd written to find the culprit, and then even just started turning off modules, and the theme, one by one, hoping to find the culprit that way.</p>
<p>Eventually I just tried using sql to modify the teaser in <code>node_revisions</code>, and when this modification showed up in the edit form, I started doing a search in the code for <code>&#039;teaser .&#039;</code> - and I found it in node.pages.inc's node_body_field:</p>
<div class="codeblock"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">node_body_field</span><span style="color: #007700">(&amp;</span><span style="color: #0000BB">$node</span><span style="color: #007700">, </span><span style="color: #0000BB">$label</span><span style="color: #007700">, </span><span style="color: #0000BB">$word_count</span><span style="color: #007700">) {</p>
<p>&nbsp; </span><span style="color: #FF8000">// Check if we need to restore the teaser at the beginning of the body.<br />&nbsp; </span><span style="color: #0000BB">$include </span><span style="color: #007700">= !isset(</span><span style="color: #0000BB">$node</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">teaser</span><span style="color: #007700">) || (</span><span style="color: #0000BB">$node</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">teaser </span><span style="color: #007700">== </span><span style="color: #0000BB">substr</span><span style="color: #007700">(</span><span style="color: #0000BB">$node</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">body</span><span style="color: #007700">, </span><span style="color: #0000BB">0</span><span style="color: #007700">, </span><span style="color: #0000BB">strlen</span><span style="color: #007700">(</span><span style="color: #0000BB">$node</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">teaser</span><span style="color: #007700">)));</p>
<p>...<br />&nbsp; </span><span style="color: #0000BB">$form</span><span style="color: #007700">[</span><span style="color: #DD0000">'body'</span><span style="color: #007700">] = array(<br />&nbsp;&nbsp;&nbsp; </span><span style="color: #DD0000">'#type' </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'textarea'</span><span style="color: #007700">,<br />&nbsp;&nbsp;&nbsp; </span><span style="color: #DD0000">'#title' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">check_plain</span><span style="color: #007700">(</span><span style="color: #0000BB">$label</span><span style="color: #007700">),<br />&nbsp;&nbsp;&nbsp; </span><span style="color: #DD0000">'#default_value' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$include </span><span style="color: #007700">? </span><span style="color: #0000BB">$node</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">body </span><span style="color: #007700">: (</span><span style="color: #0000BB">$node</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">teaser </span><span style="color: #007700">. </span><span style="color: #0000BB">$node</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">body</span><span style="color: #007700">),<br />&nbsp;&nbsp;&nbsp; </span><span style="color: #DD0000">'#rows' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">20</span><span style="color: #007700">,<br />&nbsp;&nbsp;&nbsp; </span><span style="color: #DD0000">'#required' </span><span style="color: #007700">=&gt; (</span><span style="color: #0000BB">$word_count </span><span style="color: #007700">&gt; </span><span style="color: #0000BB">0</span><span style="color: #007700">),<br />&nbsp; );<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
<p>The problem is that the edit form for nodes compares the teaser with the start of the body data.  If they don't match, then it prepends the teaser to the body data - which is normally used for when the person writing the node splits the teaser/body into two parts.  </p>
<p>However, I was changing the body in <code>hook_nodeapi(&#039;presave&#039;)</code>, which turns out to be after the node teaser was created.  The fix was as simple as adding <code>$node-&gt;teaser = node_teaser($node-&gt;body);</code> to the end of the presave code. </p>
    ]]></content>
  </entry>
</feed>
