alsator
alsator

Reputation: 121

How To Create New Content Type Programmatically in Drupal 7?

I'm building a module (my_module) in Drupal 7.

It has some functionality and also will create new content type.

In my_module.install I implemented the hook_install (my_module_install).

Can I use more one implementation of hook_install to create new content type (my_cck_install) in this module?

If (yes), how should I do this?

Else: have I do this in another module? :-)

Upvotes: 10

Views: 16116

Answers (4)

/* * Implementation in hook node info in .Module file */

function test_node_info() {
return array(
  'product' => array(
    'name' => t('Product'),
    'base' => 'product',
    'description' => t('Product Title'),
  )
);

}

/** * Implement hook_form() */

function product_form($node, $form_state) {
return node_content_form($node, $form_state);

} /** * Implements hook_install() in .install file. */

function test_install() {
node_types_rebuild();
$types = node_type_get_types();
node_add_body_field($types['product']);
//New way to implement to add fields in your content type
foreach (_test_installed_fields() as $field) {
    field_create_field($field);
}
foreach (_test_installed_instances() as $fieldinstance) {
    $fieldinstance['entity_type'] = 'node';
    $fieldinstance['bundle'] = 'product';
    field_create_instance($fieldinstance);
}

}

/* * Define your fields */

function _test_installed_fields() {
$t = get_t();
return array(
  'product_title123' => array(
    'field_name' => 'product_title123',
    'label' => $t('Product Title'),
    'type' => 'text'
  ),
  'description123' => array(
    'field_name' => 'description123',
    'label' => $t('Description'),
    'type' => 'text'
  ),

);

}

/* * Define your instance of fields */

function _test_installed_instances() {
$t = get_t();
return array(
  'product_title123' => array(
    'field_name' => 'product_title123',
    'type' => 'text',
    'label' => $t('Product Title'),
    'widget' => array(
      'type' => 'text_textfield'
    ),
    'display' => array(
      'example_node_list' => array(
        'label' => $t('Product Title'),
        'type' => 'text'
      )
    )
  ),
  'description123' => array(
    'field_name' => 'description123',
    'type' => 'text',
    'label' => $t('Description'),
    'widget' => array(
      'type' => 'text_textarea_with_summary'
    ),
    'display' => array(
      'example_node_list' => array(
        'label' => $t('Description'),
        'type' => 'text'
      )
    )
  ),

);

}

/** * Implements hook_uninstall(). */

function test_uninstall() {
$ournewtype = 'product';
$sql = 'SELECT nid FROM {node} n WHERE n.type = :type';
$result = db_query($sql, array(':type' => $ournewtype));
$nodeids = array();
foreach ($result as $row) {
    $nodeids[] = $row->nid;
}
node_delete_multiple($nodeids);
node_type_delete($ournewtype);

}

That's it.

Upvotes: 0

mujuonly
mujuonly

Reputation: 11861

     /**
     * Implements hook_node_info()
     */
    function mymodule_node_info() {
        return array(
            'news' => array(
                'name' => t('News'),
                'base' => 'news',
                'description' => t('You can add  News here'),
                'has_title' => TRUE,
                'title_label' => t('News title')
             )
        );
    }

 /**
 * Implement hook_form()
 */
function mymodule_form($node, $form_state) {
    return node_content_form($node, $form_state);
}

Add the implementation to mymodule.install is as follows:

/**
 * Implements hook_install().
 */
function mymodule_install() {
    node_types_rebuild();
    $types = node_type_get_types();|
      node_add_body_field($types['news']);
}

You can get a detailed description with code from here

Upvotes: 0

DataB
DataB

Reputation: 161

The following code will create a content type called "Event" with a machine name of 'event' and a title field -

//CREATE NEW CONTENT TYPE
function orderform_node_info() {
  return array(
    'event' => array(
    'name' => t('Event'),
    'base' => 'event',
    'description' => t('A event content type'),
    'has_title' => TRUE
    ),
  );
}


function event_form($node,$form_state) {
  $form['title'] = array(
    '#type' => 'textfield',
    '#title' => t('event Title'),
    '#default_value' => !empty($node->title) ? $node->title : '',
    '#required' => TRUE,
    '#weight' => -5
  );
  return $form;
}
//END CONTENT TYPE

you should place it in your .module file... if you want do add additional fields to it, let me know and I'll patch you up with the code... good luck!

Upvotes: 3

Clive
Clive

Reputation: 36957

You can't use more than one implementation of hook_install in the same module; in PHP you can't have 2 function with the same name which rules this out.

You would just need to add your new content type in the same hook_install anyway (have a look at how the standard installation profile does it at /profiles/standard/standard.install). This is how I always add new content types from the install file (using the example of a testimonials module):

function testimonial_install() {
  // Make sure a testimonial content type doesn't already exist
  if (!in_array('testimonial', node_type_get_names())) {
    $type = array(
      'type' => 'testimonial',
      'name' => st('Testimonial'),
      'base' => 'node_content',
      'custom' => 1,
      'modified' => 1,
      'locked' => 0,
      'title_label' => 'Customer / Client Name'
    );

    $type = node_type_set_defaults($type);
    node_type_save($type);
    node_add_body_field($type);
  }
}

Upvotes: 10

Related Questions