<HTML>
<HEAD>
<TITLE>Re: [support] Content type modules, install and uninstall code</TITLE>
</HEAD>
<BODY>
<FONT FACE="Calibri, Verdana, Helvetica, Arial"><SPAN STYLE='font-size:11pt'>Next question. &nbsp;How do you copy code out of Dreamweaver and have it come out looking right?<BR>
-- <BR>
Alex Adams<BR>
<BR>
hawkVision &#8212; see the elephant for what it is<BR>
A2 Technology Partners, Inc.<BR>
831-724-1397<BR>
<a href="alex@a2technology.com">alex@a2technology.com</a><BR>
www.a2technology.com<BR>
<BR>
<BR>
<HR ALIGN=CENTER SIZE="3" WIDTH="95%"><B>From: </B>Alex Adams &lt;<a href="alex@a2technology.com">alex@a2technology.com</a>&gt;<BR>
<B>Reply-To: </B>&lt;<a href="support@drupal.org">support@drupal.org</a>&gt;<BR>
<B>Date: </B>Tue, 31 May 2011 16:51:09 -0700<BR>
<B>To: </B>&lt;<a href="support@drupal.org">support@drupal.org</a>&gt;<BR>
<B>Subject: </B>[support] Content type modules, install and uninstall code<BR>
<BR>
I&#8217;m new to Drupal. &nbsp;A very experienced programmer, but new to Drupal. &nbsp;I have worked my way through Beginning Drupal 7 by Todd Tomlinson and Pro Drupal 7 Development by Todd Tomlinson and John K VanDyk. &nbsp;I&#8217;ve watched some videos and online code examples.<BR>
<BR>
Here&#8217;s where I am in my project. &nbsp;The site is set up, contributed modules installed, base theme installed. &nbsp;I&#8217;m beginning to add 13 custom content types. &nbsp;I want them to be added from modules, 1 for each type since there will be a cafeteria plan. &nbsp;There&#8217;s much more, but I&#8217;m stuck here.<BR>
<BR>
In the books there was a example of adding one field to a new content type. &nbsp;All created in a module. &nbsp;The exercise worked great. &nbsp;However, when I try it with one of my modules that has multiple fields, things get screwed up. <BR>
<BR>
&nbsp;- The fields are added to the database, but they do not appear on the form.<BR>
&nbsp;- During uninstall, the field tables are not removed from the database.<BR>
&nbsp;- I don&#8217;t know how to set all of the properties of the data field or widget that I can when I am creating a custom content type using the administrative pages.<BR>
&nbsp;- I want the fields to be contained in fieldsets upon installation. &nbsp;I can do this if I am creating a form from scratch with code, but how do I do this in a custom content type module.install script?<BR>
<BR>
I&#8217;ve screwed around with this so much now that I&#8217;m not sure when what stopped working.<BR>
<BR>
Here are some code snippets I&#8217;ve tried.<BR>
<BR>
----<BR>
function _job_post_installed_fields() { &nbsp;&nbsp;&nbsp;&nbsp;$t = get_t(); &nbsp;&nbsp;&nbsp;&nbsp;return array( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'job_post_company' =&gt; array( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'field_name' =&gt; 'job_post_company', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'label' =&gt; $t('Company posting the job listing'), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'type' =&gt; 'text', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'job_post_color' =&gt; array( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'field_name' =&gt; 'job_post_color', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'label' =&gt; $t('Job post color'), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'type' =&gt; 'text', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;), &nbsp;&nbsp;&nbsp;); } &nbsp;/** * return a structured array defining the field instances associated with this content type */ function _job_post_installed_instances() { &nbsp;&nbsp;&nbsp;&nbsp;$t = get_t(); &nbsp;&nbsp;&nbsp;&nbsp;return array( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'job_post_company' =&gt; array( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'field_name' =&gt; 'job_post_company', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'type' =&gt; 'text', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'label' =&gt; $t('Company posting the job listing'), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'widget' =&gt; array( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'type' =&gt; 'text_textfield', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'display' =&gt; array( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'example_node_list' =&gt; array( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'label' =&gt; $t('Company posting the job listing'), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'type' =&gt; 'text', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'job_post_color' =&gt; array( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'field_name' =&gt; 'job_post_color', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'type' =&gt; 'text', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'label' =&gt; $t('Job post color'), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'widget' =&gt; array( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'type' =&gt; 'text_textfield', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'display' =&gt; array( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'example_node_list' =&gt; array( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'label' =&gt; $t('Job post color'), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'type' =&gt; 'text', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;), &nbsp;&nbsp;&nbsp;); }<BR>
----<BR>
And <BR>
----<BR>
function _hawk_topic_installed_fields() { &nbsp;&nbsp;&nbsp;&nbsp;$t = get_t(); &nbsp;&nbsp;&nbsp;&nbsp;return array( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'hawk_topic_type' =&gt; array( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'field_name' =&gt; 'hawk_topic_type', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'label' =&gt; $t('hawk Topic Type'), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'type' =&gt; 'text', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'settings' =&gt; array( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'max_length' =&gt; 50, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'hawk_topic_color' =&gt; array( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'field_name' =&gt; 'hawk_topic_color', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'label' =&gt; $t('hawk Topic Color'), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'type' =&gt; 'text', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'settings' =&gt; array( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'max_length' =&gt; 20, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;), &nbsp;&nbsp;&nbsp;); } &nbsp;/** * return a structured array defining the field instances associated with this content type */ function _hawk_topic_installed_instances() { &nbsp;&nbsp;&nbsp;&nbsp;$t = get_t(); &nbsp;&nbsp;&nbsp;&nbsp;return array( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'hawk_topic_type' =&gt; array( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'field_name' =&gt; 'hawk_topic_type', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'type' =&gt; 'text', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'label' =&gt; $t('Type of topic'), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'widget' =&gt; array( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'type' =&gt; 'text_textfield', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'settings' =&gt; array('size' =&gt; 60), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'display' =&gt; array( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'example_node_list' =&gt; array( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'label' =&gt; $t('Type of topic'), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'type' =&gt; 'text', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'hawk_topic_color' =&gt; array( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'field_name' =&gt; 'hawk_topic_color', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'type' =&gt; 'text', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'label' =&gt; $t('Color of topic'), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'widget' =&gt; array( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'type' =&gt; 'text_textfield', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'settings' =&gt; array('size' =&gt; 20), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'display' =&gt; array( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'example_node_list' =&gt; array( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'label' =&gt; $t('Color of topic'), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'type' =&gt; 'text', &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;), &nbsp;&nbsp;&nbsp;); }<BR>
----<BR>
The uninstall script seems to be right out of the book (pun intended).<BR>
----<BR>
function hawk_topic_uninstall() { &nbsp;&nbsp;&nbsp;// gather all the example content that might have been created while this &nbsp;&nbsp;&nbsp;// module was enabled &nbsp;&nbsp;&nbsp;$sql = 'SELECT nid FROM {node} n WHERE n.type = :type'; &nbsp;&nbsp;&nbsp;$result = db_query($sql, array(':type' =&gt; 'hawk_topic')); &nbsp;&nbsp;&nbsp;$nids = array (); &nbsp;&nbsp;&nbsp;foreach ($result as $row) { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$nids[] = $row-&gt;nid; &nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// delete all the nodes at once &nbsp;&nbsp;&nbsp;node_delete_multiple($nids); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// loop over each of the fields defined by this moduel and delete &nbsp;&nbsp;&nbsp;// all instance of the field, their data, and the field itself. &nbsp;&nbsp;&nbsp;foreach (array_keys(_hawk_topic_installed_fields()) as $field) { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;field_delete_field($field); &nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// loop over any remaining file instances attached to the hawk_topic &nbsp;&nbsp;&nbsp;// content type (such as body field) and delete them individually &nbsp;&nbsp;&nbsp;$instances = field_info_instances('node', 'hawk_topic'); &nbsp;&nbsp;&nbsp;foreach ($instances as $instance_name =&gt; $instance) { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;field_delete_instance($instance); &nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// delete our content type &nbsp;&nbsp;&nbsp;node_type_delete('hawk_topic'); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// purge all field information &nbsp;&nbsp;&nbsp;field_purge_batch(1000); }<BR>
----<BR>
<BR>
Any ideas? &nbsp;Probably a beginners mistake?<BR>
<BR>
Thanks in advance,<BR>
-- <BR>
Alex Adams<BR>
<BR>
hawkVision &#8212; see the elephant for what it is<BR>
A2 Technology Partners, Inc.<BR>
831-724-1397<BR>
<a href="alex@a2technology.com">alex@a2technology.com</a><BR>
www.a2technology.com<BR>
<BR>
<HR ALIGN=CENTER SIZE="3" WIDTH="95%"></SPAN></FONT><FONT SIZE="2"><FONT FACE="Consolas, Courier New, Courier"><SPAN STYLE='font-size:10pt'>-- <BR>
[ Drupal support list | <a href="http://lists.drupal.org/">http://lists.drupal.org/</a> ]<BR>
</SPAN></FONT></FONT>
</BODY>
</HTML>