h1

Put your Content Types with CCK fields into code [Drupal]

April 18, 2011

Putting a content type into code is a good thing to do since it then follows your module and means you don’t have to recreate content types on each instance of the site (e.g. dev, test and live)

To create basic content types in code, you can use the following code pattern in your mymodule.install file:

function mymodule_install() {
_mymodule_install_content_types();
}

function _mymodule_install_content_types() {
// Create Video Content type
$video_node_type = array(
'type' => 'vzaar_video_page',
'name' => t('Vzaar Video Page'),
'module' => 'node',
'description' => t('A Page containing a video stored on Vzaar'),
'custom' => TRUE,
'modified' => TRUE,
'locked' => FALSE,
);
node_type_save((object)_node_type_set_defaults($video_node_type));
}

Now on installation of the module, mymodule, you will get a new content type called Vzaar Video Page. This only has the Title and Body fields though so isn’t very useful. Using CCK we can add new fields in the interface but how do we get those fields out into code?

One way is to use the content_fields function to get an instance of a field as an array. You can then use that array in your install file to recreate the content. However, running this function is hardwork becaue you’ll need to run it in drupal then copy and paste the data into your file. An alternative is to use Drush, which is a full drupal environment on the command line to execute the function for you, then redirect the output into you install file.

drush ev "var_export( content_fields( 'field_myfield_name' ) );" >> mymodule.install

Now edit mymodule install and you’ll see the array at the end of the file. Move it into your install function and wrap it in the function content_field_instance_create. To test it works, make an update function as well in your install file, delete the content type from your drupal and then run update.php (or drush updb)

You’re final install function might look something like this …

/**
* Implementation of hook_update_N
*
* Add Vzaar Video content type
*/
function mymodule_update_6201() {
_mymodule_install_content_types();
}

function mymodule_install() {
_mymodule_install_content_types();
}

function _mymodule_install_content_types() {
// Create Video Content type
$video_node_type = array(
'type' => 'vzaar_video_page',
'name' => t('Vzaar Video Page'),
'module' => 'node',
'description' => t('A Page containing a video stored on Vzaar'),
'custom' => TRUE,
'modified' => TRUE,
'locked' => FALSE,
);

node_type_save((object)_node_type_set_defaults($video_node_type));

// Create CCK field for media_vzaar
$vzaar_media_field = array (
'field_name' => 'field_vzaar_video_url',
'type_name' => 'vzaar_video_page',
'display_settings' =>
array (
'label' =>
array (
'format' => 'above',
'exclude' => 0,
),
'teaser' =>
array (
'format' => 'default',
'exclude' => 0,
),
'full' =>
array (
'format' => 'default',
'exclude' => 0,
),
4 =>
array (
'format' => 'default',
'exclude' => 0,
),
),
'widget_active' => '1',
'type' => 'emvideo',
'required' => '0',
'multiple' => '0',
'db_storage' => '1',
'module' => 'emvideo',
'active' => '1',
'locked' => '0',
'columns' =>
array (
'embed' =>
array (
'type' => 'text',
'size' => 'big',
'not null' => false,
'sortable' => true,
),
'value' =>
array (
'type' => 'varchar',
'length' => 255,
'not null' => false,
'sortable' => true,
),
'provider' =>
array (
'type' => 'varchar',
'length' => 255,
'not null' => false,
'sortable' => true,
),
'data' =>
array (
'type' => 'text',
'size' => 'big',
'not null' => false,
'sortable' => false,
),
'status' =>
array (
'description' => 'The availability status of this media.',
'type' => 'int',
'unsigned' => 'TRUE',
'not null' => true,
'default' => 1,
),
'version' =>
array (
'description' => 'The version of the provider\'s data.',
'type' => 'int',
'unsigned' => true,
'not null' => true,
'default' => 0,
),
'title' =>
array (
'type' => 'varchar',
'length' => 255,
'not null' => false,
'sortable' => true,
),
'description' =>
array (
'type' => 'varchar',
'length' => 255,
'not null' => false,
'sortable' => true,
),
'duration' =>
array (
'description' => 'Store the duration of a video in seconds.',
'type' => 'int',
'unsigned' => true,
'not null' => true,
'default' => 0,
),
),
'widget' =>
array (
'video_width' => '425',
'video_height' => '350',
'video_autoplay' => 0,
'preview_width' => '425',
'preview_height' => '350',
'preview_autoplay' => 0,
'thumbnail_width' => '120',
'thumbnail_height' => '90',
'thumbnail_default_path' => '',
'thumbnail_link_title' => 'See video',
'meta_fields' =>
array (
'title' => 0,
'description' => 0,
),
'providers' =>
array (
'vzaar' => 'vzaar',
),
'default_value' =>
array (
0 =>
array (
'embed' => '',
'value' => '',
),
),
'default_value_php' => NULL,
'label' => 'Vzaar Video URL',
'weight' => '28',
'description' => '',
'type' => 'emvideo_textfields',
'module' => 'emvideo',
),
);

// Add the new content type to drupal
content_field_instance_create($vzaar_media_field);

}

Advertisements

2 comments

  1. Well The way of creating custom cck field is seems correct but way you created content types is not seems correct.

    You can simply create content types by defining content types in array at hook_node_info which is most correct way for creating content types.


    • How odd, I’ve been looking at this very topic today! I think both ways are valid, but I am tending to agree with the way you suggest. By doing it through the hook the content type can be removed or added bys enabling and disabling the module automatically which is a much cleaner way of doing it. I’ve also been using the function content_field_instance_delete to remove the fields on hook_uninstall



Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: