Добрый день, я новичок в создание модулей, прошу помощи
Имеется простой модуль на D7, суть которого в создании таблицы в базе данных и предоставление пользователям возможности создания/редактирования/удаления записей
Вопрос состоит в том, что необходимо когда пользователь переходит на страницу редактирования, например: /custom_form/edit/10 нужно сначала проверить, есть ли вообще в таблице такая строка с таким идентификатором, и если есть то сравнить поле uid (при создании записи, в это поле записывается uid текущего пользователя) из этой строки с uid текущего пользователя (т.е. проверить автор ли записи пытается её редактировать)
Т.е. если рассмотреть код редактирования:
<?php
function custom_form_menu() {
$items['custom_form/edit/%'] = array(
'title' => t('Edit item'),
'page callback' => 'drupal_get_form',
'page arguments' => array('custom_form_edit_item', 2),
'access callback' => TRUE,
'type' => MENU_NORMAL_ITEM,
);
return $items;
}
function
custom_form_edit_item($form ,&$form_state, $id) {
$result = db_select('custom_form', 'c')
->fields('c')
->condition('c.id', $id)
->execute()
->fetchObject();
$form = array();
$form['item'] = array(
'#type' => 'value',
'#value' => $id
);
$form['title']=array(
'#title' => t('Title'),
'#type' => 'textfield',
'#default_value' => isset($result->title) ? $result->title : ''
);
return confirm_form($form, t(''),
isset($_GET['destination']) ? $_GET['destination'] : "custom_form/add", t(''), t('Edit'), t('Cancel'));
}
function
custom_form_edit_item_submit($form, &$form_state) {
$form_values = $form_state['values'];
if ($form_state['values']['confirm']) {
$item = $form_state['values']['item'];
$title = $form_state['values']['title'];
db_update('custom_form')
->fields(array('title' => $title))
->condition('id', $item)
->execute();
drupal_set_message(t('Item ' . $item . ' has been updated successfully.'));
}
drupal_goto("custom_form/add");
}
?>
Где здесь по уму нужно вставить сначала логику проверки имеющейся строки в базе, а потом авторство
Ниже прикрепил сам модуль
Вложение | Размер |
---|---|
custom_form.zip | 1.9 КБ |
Комментарии
Сейчас сделал так, но не знаю насколько это правильно (не стал детально логику делать на условия проверки строки и авторства, просто всё в одно засунул)
<?php
function custom_form_edit_item($form ,&$form_state, $id) {
$result = db_select('custom_form', 'c')
->fields('c')
->condition('c.id', $id)
->execute()
->fetchObject();
global $user;
if (!empty($result) && $result->uid == $user->uid) {
$form = array();
$form['item'] = array(
'#type' => 'value',
'#value' => $id
);
$form['title']=array(
'#title' => t('Title'),
'#type' => 'textfield',
'#default_value' => isset($result->title) ? $result->title : ''
);
return confirm_form($form, t(''),
isset($_GET['destination']) ? $_GET['destination'] : "custom_form/add", t(''), t('Edit'), t('Cancel'));
} else {
drupal_set_message(t('Access denied.'), 'error');
drupal_goto("custom_form/add");
}
}
?>
в custom_form_edit_item():
if (!$result || $result->uid != $user->uid) {
drupal_access_denied();
drupal_exit();
}
Более drupal way: в custom_form_menu() указать в 'access callback' вместо TRUE свой колбек, который будет тянуть запись из таблицы и делать ту же проверку, возвращая TRUE или FALSE в результате.
В случае, если у пользователя будет доступ к редактированию записи, то запрос к таблице будет выполняться дважды: в коллбеке проверки доступа, и в коллбеке формы, что неоптимально.
Можно пробросить результат из первого коллбека во второй через статическую переменную (плохо) или при помощи drupal_static() (лучше)
Ну и самый drupal way - использовать Entity API: объявить записи таблицы сущностями, и работать с ними, используя функционал друпала из коробки.
Большое спасибо, сделал по вашему способу.
Entity API не ставил задачу использовать, хотел как раз по "низкоуровневому" методу