Archive for April, 2011

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
h1

Rename files in directory with some regex magiks

April 12, 2011

When using drupal I often want to clone a module as a starting point for a new module. I then have to rename all the files in the directory to the new structure. This can be painful if there is more than one file. All files in drupal follow the file naming convention of :
modulename.type
So the following bash script will niftily go through a directory renaming all the files with module1 and replace with module2…


for f in *; do mv $f `echo $f | sed 's/module1\(.*\)/module2\1/g'`; done