To create a module, in
the sites/all/modules directory
of your Drupal installation create a new directory named mymodule.
Create following three files in mymodule folder:
·
mymodule.info– will contain the information about the
module so that Drupal will recognize it and show it in the list.
·
mymodule.install – will have details about things you are
going to install or uninstall for the module.
·
mymodule.module – will contain code to implement the Drupal
hooks used by the module.
Once you have made the
directory, open mymodule.info and
add the following code to it:
name = mymodule
description = A new custom content type creation by mujuonly
package = mymodule Custom node Type
version = "7.x-1.12"
core = 7.x
files[] = mymodule.install
files[] = mymodule.module
The above simply
defines some parameters for our module (mymodule)
so Drupal can use it and display the information about mymodule.
Once this is done we should see mymodule
in the module list as shown below.
Installing
and Uninstalling Content Type
Once we have the basic
files for the module in place, we can start writing code for installing the
custom node type. The first hook we need to implement is hook_node_info. Using this hook, a module can define one or more
node types in Drupal. The hook implementation returns an array defining the new
node type which the module is going to add.
To implement this hook,
add the following code to mymodule.module
/**
* 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')
)
);
}
The implementation
returns an array defining a new node type news along with some of its properties, such as its
name, description, title, and base.
As we have defined
that this node type has a title, we need to show the title text field when the
form for this node is displayed to add content. To do this, we will have to
implement the hook hook_form.
The hook_form is used to show the form for
create/edit nodes. The hook is implemented in mymodule.module as follows:
/**
* Implement hook_form()
*/
function mymodule_form($node, $form_state) {
return node_content_form($node, $form_state);
}
We simply use the
Drupal API which gives an implementation of hook_form and adds a title field provided the node definition has
the has_title
attribute set .Once we have got this done, we need to implement the hook_install hook to add the body field
to the new node type.
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']);
}
We first save all of
the new node types created by different modules by calling the Drupal API node_types_rebuild() function. Then we
get all of the node types and call node_add_body_field()
on our type to add the body field.
Once we have done this
we can enable mymodule which will install our new node type. Then we should be
able to see our new type when we click on add content as follows:
If we add a new news,
it will also be seen on the Drupal front page.
All modules in Drupal
should clean up any data they create in the database or any types they have
added when it is uninstalled by the user. To support this, we have to implement
the hook_uninstall in ou mymodule.install file
as follows:
/**
* Implements hook_uninstall().
*/
function mymodule_uninstall() {
$customtype = 'news';
$sql = 'SELECT nid FROM {node} n WHERE
n.type = :type';
$result = db_query($sql, array(':type' =>
$customtype));
$nodeids = array();
foreach ($result as $row) {
$nodeids[] = $row->nid;
}
node_delete_multiple($nodeids);
node_type_delete($customtype);
}
We first find out all
of the node IDs which are nodes of our installed content type. Once we have
collected the IDs, we use the API function node_delete_multiple()
to delete multiple nodes. Then we use the node_type_delete()
function to delete our node type.
Now if we uninstall
our module, all of the nodes of our type and our type itself should be deleted.