Как создать первую форму в Drupal для отображения результатов выполнения SQL-запроса?

Здравствуйте, коллеги! У меня возникла задача перевести существующее win32 приложение на платформу Drupal. Нужно реализовать возможность взаимодействия с базой данных PostgreSQL, включая добавление и удаление данных в таблицах, что уже успешно реализовано в GUI (Visual C++). Однако в Drupal не могу понять, как подойти к этому вопросу. Я создал виртуальную машину и зашел под учетной записью администратора. Как можно создать простую форму, которая будет выполнять запросы и выводить результаты в виде списка? Буду признателен за любую шпаргалку или пример. Спасибо заранее!
  • 20 октября 2024 г. 12:02
Ответы на вопрос 2
Здравствуйте!

Создать форму в Drupal для выполнения SQL-запросов и отображения результатов можно с помощью создания собственного модуля. Здесь я дам вам шаги и пример кода, который поможет вам начать.

### Шаг 1: Создайте новый модуль

1. В директории `modules/custom` (если ее нет, создайте) создайте новую папку для вашего модуля. Назовем его, например, `my_custom_module`.

2. Внутри этой папки создайте файл `my_custom_module.info.yml` и добавьте следующий код:

   ```yaml
   name: 'My Custom Module'
   type: module
   description: 'A custom module to execute SQL queries and display results.'
   core_version_requirement: ^8 || ^9
   package: Custom
   dependencies:
     - drupal:database
   ```

3. Создайте файл `my_custom_module.module`, который может остаться пустым, если не требуется дополнительная логика.

### Шаг 2: Создание маршрута и контроллера

4. Создайте файл `my_custom_module.routing.yml` и добавьте следующий код:

   ```yaml
   my_custom_module.form:
     path: '/my-custom-form'
     defaults:
       _form: '\Drupal\my_custom_module\Form\MyCustomForm'
       _title: 'Custom SQL Form'
     requirements:
       _permission: 'access content'
   ```

### Шаг 3: Создание формы

5. Создайте папку `src/Form` внутри вашего модуля и добавьте туда файл `MyCustomForm.php`:

   ```php
   <?php

   namespace Drupal\my_custom_module\Form;

   use Drupal\Core\Form\FormBase;
   use Drupal\Core\Form\FormStateInterface;
   use Drupal\Core\Database\Database;

   class MyCustomForm extends FormBase {
     /**
      * {@inheritdoc}
      */
     public function getFormId() {
       return 'my_custom_form';
     }

     /**
      * {@inheritdoc}
      */
     public function buildForm(array $form, FormStateInterface $form_state) {
       $form['query'] = [
         '#type' => 'textarea',
         '#title' => $this->t('SQL Query'),
         '#description' => $this->t('Enter your SQL query here.'),
         '#rows' => 6,
       ];

       $form['submit'] = [
         '#type' => 'submit',
         '#value' => $this->t('Execute'),
       ];

       if ($form_state->get('results')) {
         $form['results'] = [
           '#type' => 'markup',
           '#markup' => '<pre>' . print_r($form_state->get('results'), TRUE) . '</pre>',
         ];
       }

       return $form;
     }

     /**
      * {@inheritdoc}
      */
     public function submitForm(array &$form, FormStateInterface $form_state) {
       $query = $form_state->getValue('query');
       $database = Database::getConnection();

       try {
         // Выполняем запрос (в данном примере SELECT).
         $results = $database->query($query)->fetchAllAssoc('id'); // предположим, id - это поле в таблице.
         $form_state->set('results', $results);
       } catch (\Exception $e) {
         // Обработка ошибок.
         drupal_set_message($this->t('Error executing query: @message', ['@message' => $e->getMessage()]), 'error');
       }
     }
   }
   ```

### Шаг 4: Включите модуль

6. Перейдите в административный интерфейс Drupal (`/admin/modules`), найдите ваш модуль и включите его.

### Шаг 5: Доступ к форме

7. Теперь вы можете перейти по адресу `/my-custom-form`, и у вас будет форма для ввода SQL-запроса и отображения результатов.

### Примечание

- Убедитесь, что ваш SQL-запрос корректен и безопасен. Следует принимать во внимание защиту от SQL-инъекций.
- Вы можете настроить разрешения и безопасность вашего модуля в зависимости от требований вашего приложения.
  
Этот пример даст вам базовую структуру, с которой вы можете начать работу. Удачи!
https://www.drupal.org/project/examples 

Работа с формами в подмодуле form_api_example
Работа с базой в подмодуле dbtng_example
Создание страниц в подмодуле page_example
Похожие вопросы