Как перед рендерингом формы редактирования записи из базы - проверить её наличие и доступа к ней?

Главные вкладки

Аватар пользователя bad.shape.guy bad.shape.guy 1 ноября 2023 в 19:21

Добрый день, я новичок в создание модулей, прошу помощи
Имеется простой модуль на 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($formt(''),
    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.zip1.9 КБ

Комментарии

Аватар пользователя bad.shape.guy bad.shape.guy 1 ноября 2023 в 19:49

Сейчас сделал так, но не знаю насколько это правильно (не стал детально логику делать на условия проверки строки и авторства, просто всё в одно засунул)

<?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($formt(''),
      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");
  }
}
?>
Аватар пользователя Andruxa Andruxa 1 ноября 2023 в 20:48

в custom_form_edit_item():

global $user;
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: объявить записи таблицы сущностями, и работать с ними, используя функционал друпала из коробки.

Аватар пользователя bad.shape.guy bad.shape.guy 2 ноября 2023 в 18:26

Большое спасибо, сделал по вашему способу.
Entity API не ставил задачу использовать, хотел как раз по "низкоуровневому" методу