Drupal как фреймворк(создание сайта с нуля) Часть 1

В данном топике постараемся создать сайт на Drupal использую по минимуму его графическую составляющую.

Отключаем все ненужные модули, кроме Field,Field SQL storage,Filter,Node,System,Text,User.

Теперь необходимо создать главную страницу для нашего сайта. Для этого необходимо создать нужный нам тип ноды.

В файле install мы добавим поля и экземпляры полей для нашего типа ноды,также напишем функции ,удаляющие все данные при деинсталляции модуля.
/**
* Implements hook_install
* Add field body
* Setting field for title
*/
function mymodule_install() {
$name_type = 'my_type';

node_types_rebuild();//Updates the database cache of node types.

$types = node_type_get_types();//Returns a list of all the available node types.

//Adds default body field to a node type.
node_add_body_field($types[$name_type]);

//Loading a particular instance for body node type
$body_instance = field_info_instance('node', 'body', $name_type);

//Setting fields body
$body_instance['type'] = 'text_summary_or_trimmed';

//Save changes in instance body field
field_update_instance($body_instance);

//Create fields
foreach (_basic_page_installed_fields() as $field) {
field_create_field($field);
}

//Create all fields. are added to the content type
foreach (_basic_page_installed_instances() as $instance) {
$instance['entity_type'] = 'node';
$instance['bundle'] = $name_type;
field_create_instance($instance); //Creates an instance of a field, binding it to a bundle.
}

}

Добавим функцию которая создает поля/**
/ *
*Create field for node type
*/
function _basic_page_installed_fields() {
$t = get_t();//Returns the name of the proper localization function.
return array(
'my_field' => array(
'field_name' => 'my_field',
'label' => $t('my_field'),
'type' => 'text',
),
);
}

Здесь мы можем добавить доп поля которые хотим прикрепить к нашему типу ноды.

Создаем экземпляр для нашего поля или полей.
/**
* Create instance for field
* */
function _basic_page_installed_instances() {
$t = get_t();
return array(
'my_field' => array(
'field_name' => ''my_field',
'type' => 'text',
'label' => $t(''my_field'),
'widget' => array(
'type' => 'text_textfield',
),
'display' => array(
'example_node_list' => array(
'label' => $t('my_field'),
'type' => 'text',
),
),
),
);
}

Далее реализуем функцию удаления всех данных
/**
* Uninstall all fields and instances and nodes
*/
function basic_page_uninstall() {

$sql = 'SELECT nid FROM {node} n WHERE n.type = :type';
$result = db_query($sql, array('type' => 'mymodule'));
$nids = array();
foreach ($result as $row) {
$nids[] = $row->nid;
}

//Delete all nodes
node_delete_multiple($nids);

//Delete all fields
foreach (array_keys(_basic_page_installed_fields()) as $field) {
field_delete_field($field);
}

//Delete all field instances
$instances = field_info_instances('node', 'my_field');
foreach ($instances as $instance_name => $instance) {
field_delete_instance($instance);
}
//Delete node type
node_type_delete('my_module');

//Delete fields info
field_purge_batch(1000);
}

Cоздадим файл модуля определим там тип нашего контента,иначе будет ошибка при установке модуля
/**
* Implement hook_node_info()
*/
function mymodule_node_info() {
return array(
'mymodule' => array(
'name' => t('My type'),
'base' => 'my_type',
'description' => t('My type desct'),
),
);
}

Изменим страницу добавления новых страниц для нашего типа контента
/**
* Implement of hook_menu_alter().
*/
function mymodule_menu_alter(&$items) {
//Replaced standart core path add pages
$items['create/page'] = $items['node/add/mytype'];
unset($items['node/add/mytype']);
}

Добавим гибкие настройки доступа для нашего интерфейса добавления страниц

/**
* Implement hook_permission().
*/
function mymodule_permission() {
return array(
'create page' => array(
'title' => t('Create a page'),

'description' => t('Create a page'),
//Create page
),
'edit own page' => array(
'title' => t('Edit own page'),

'description' => t('Edit your own page'),
//Edit own page
),
'edit any job post' => array(
'title' => t('Edit page'),
//Edit any page
'description' => t('Edit any page'),

),
'delete own job post' => array(
'title' => t('Delete own page'),
//Delete own page
'description' => t('Delete own page'),

),
'delete any job post' => array(
'title' => t('Delete any page'),
//Delete any page
'description' => t('Delete any page'),

),
);
}

/**
* Implement hook_access().
*/
function mymodule_access($op, $node, $account) {
$is_author = $account->uid == $node->uid;
switch ($op) {
case 'create':
// Allow if the user's role has the right to create page..
if (user_access('create page', $account)) {
return NODE_ACCESS_ALLOW;
}
case 'update':
//Allow if the user's role has the right to edit your
// page and the user is the author, or if the role
// User has the right to edit any page.
if (user_access('edit own page', $account) && $is_author ||
user_access('edit any page', $account)) {
return NODE_ACCESS_ALLOW;
}
case 'delete':
// Allow, if the user's role has the right to delete
// page and user is the author,or if the role
// user has the right to delete any page.
if (user_access('delete own page', $account) && $is_author ||
user_access('delete any page', $account)) {
return NODE_ACCESS_ALLOW;
}
}
}

Добавим стандартную форму для редактирования и создания наших страниц
/**
* Implement hook_form() default node add form.
*/
function mymodule_form($node, $form_state) {
return node_content_form($node, $form_state);
}

Продолжение


Drupal как фреймворк(создание сайта с нуля) Часть 2

Категория: 
The code has been tested and works

Add new comment

Filtered HTML

  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.