Начал разрабатывать свой модуль

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

Аватар пользователя Николай_новичок Николай_новичок 2 октября 2018 в 5:43

Доброе время суток.

Начал знакомиться с созданием собственных модулей. Разрабатывать форму (запись производится в ДБ), возник момент при записи даты в бд.

Кусок кода из формы:

<?php
$form
['DatePast'] = [
  
'#type' => 'date',
  
'#default_value' => $date $date date('y-m-d'),
];
?>

Необходимо перевести дату в int формат при записи в MySQL
Кусок кода из запроса:

<?php
$query 
db_insert('database_exform')                        
  ->
fields(array(                                             
      
'institution' => $form_state->getValue('institution'),  
      
'problem_desc' => $form_state->getValue('Disck'),
      
'timestamp' => $form_state->getValue('DatePast')
  ))
  ->
execute();
?>
ВложениеРазмер
Иконка пакета ex_form.zip4.4 КБ

Комментарии

Аватар пользователя Orion76 Orion76 2 октября 2018 в 8:20
1

drupal 8 использовать "голые" таблицы для хранения данных и их последующего использования как-то не айс.

Гораздо продуктивнее использовать для этого кастомные сущности
примерно как-то так: http://blog.oskoui-oskoui.com/?p=8218

Если очень надо, можно даже относительно несложно (переопределением и расширением стандартных классов сущностей) добавить сущность, которая будет хранить свои данные в кастомной таблице БД.

Все это сразу добавляет Вашей таблице(сущности) всю мощь друпал:
готовый формы редактирования сущности (и стандартная раобта с ними)
готовые варианты отображения (и стандартная раобта с ними)
интеграция вашей сущности с другими модулями (views и т.п.)
и еще кучу всякого полезного..

Аватар пользователя bsyomov bsyomov 2 октября 2018 в 15:15
1

В php есть класс для работы с датами/временем: http://php.net/manual/ru/class.datetime.php который умеет, как собирать дату из строки по формату, так и форматировать её в строку, или в unix time, который, вероятно вам нужен, с помощью DateTime::getTimestamp.

P.S. А вообще, выше правильно вам написали про использование сущностей, а не кастомной таблицы, и sql запросов для организации хранения данных. Так иногда, может и полезно делать, но когда это необходимо, и это вряд-ли ваш случай. В большинстве случаев, лучше всё же пользоваться https://www.drupal.org/docs/8/api/entity-api а не работать с базой напрямую.

Аватар пользователя Николай_новичок Николай_новичок 3 октября 2018 в 2:14

Orion76 wrote:

drupal 8 использовать "голые" таблицы для хранения данных и их последующего использования как-то не айс.
Гораздо продуктивнее использовать для этого кастомные сущности

примерно как-то так: http://blog.oskoui-oskoui.com/?p=8218

Как я понимаю (может и ошибаюсь), данный функционал позволяет проще спроектировать сам модуль. Когда делал свой модуль по примерам, сталкивался со штангой не один раз (в основном наименование файлов, машинное имя и т.д.). Но разве в моем примере я не использую сущность (вложил файл с моим модулем)? Я как бы сказать тока начал познавать азы.
bsyomov wrote:

В php есть класс для работы с датами/временем: http://php.net/manual/ru/class.datetime.php который умеет, как собирать дату из строки по формату, так и форматировать её в строку, или в unix time, который, вероятно вам нужен, с помощью DateTime::getTimestamp.

Я постепенно хочу усложнять задачу. Объясню свою задачу (которую сам себе и создал). У меня есть сайт на друпале 8, простой сайт с информацией (не коммерческая основа), на сайте выложена структура нашей организации (типо так положено). Т.е. заведены пользователи. И есть файл заявок созданный в екселе. Я часто слышу закройте файл заявок!!!
В файле заявок есть поля: № п/п; Организация; Перечень работ; Дата подачи заявления; и т.д.
Ну и решил, а что хороший пример для написания модуля. Конечным результатом которого должен быть вывод отчетов в Ексель варианте (потраченые часы и т.д.) и Верд варианте (отчет сотрудника для начальника). Ну и может быть какие то бланки отчетов типо отпуск и т.д. (Планы Napoléon Bonaparte).
Вот и начал потихоньку изучать формы и работу БД.
Аватар пользователя Николай_новичок Николай_новичок 8 октября 2018 в 2:40

<a href="mailto:sas@drupal.org">sas@drupal.org</a> wrote:

Я бы создал на D8 entity -> node -> bundle -> bid с нужными поля и import туда заявку из excel далее все отчеты в D8


Я понял, что я сделал не правильно. По сути мне если и нужен свой модуль, то только для добавления в базовый класс, новый вид формы (может привязанной к определенному виду материалов, а может и нет). Максимум, что мне дополнительно нужно так это добавление нового типа поля в типе материалов (и то это очень сомнительно).

Аватар пользователя Николай_новичок Николай_новичок 9 октября 2018 в 0:46

Но пока буду делать не правильно=) До момента создания сложных запросов в БД. Пока нет понимания, что за что отвечает и как это можно использовать. К примеру, не могу пока что вывести в блоке, данные из БД (в виде таблицы). Читаю про контроллеры.

Аватар пользователя Orion76 Orion76 9 октября 2018 в 7:31

Со сложными запросами к БД отлично справляется модуль Views.
Правда, для его использования необходимо разобраться с "теорией" его использования, хотя бы, для начала, с фильтрами и связями.

Аватар пользователя gun_dose gun_dose 9 октября 2018 в 9:23

Это смотря насколько сложные. Вьюс кстати бывает глючит неслабо, например если есть фильтр по полю сущности из необязательного референса, он всё равно ставит INNER JOIN. Приходится это в hook_views_query_alter исправлять.

Аватар пользователя Orion76 Orion76 9 октября 2018 в 10:01
1

да.. при решении каких-либо слишком специфичных задач приходится как-то выкручиваться..
Но в большинстве, даже достаточно сложных случаев, вьюс практически идеален.
если правильно его готовить-)

Аватар пользователя Николай_новичок Николай_новичок 10 октября 2018 в 3:03

Orion76 wrote:

Со сложными запросами к БД отлично справляется модуль Views.

Правда, для его использования необходимо разобраться с "теорией" его использования, хотя бы, для начала, с фильтрами и связями.


Скорее всего мне придется делать промежуточную таблицу в БД (об этом я пока не думаю). Чтоб было белее понятно объясню свою собственную задачу:

  1. Нужна форма чтобы начальник и доверенные люди вносили заявку (может сразу назначить ответственного)
  2. Вывод данной заявки в блоке с возможностью взять в работу (исключение это статус) заявку
  3. Форма сотрудника в которой есть возможность
    • выбора статуса: в работе, выполнено, переназначено и отказ
    • выбор вида заявки: платная (ввод потраченного времени), бесплатная
    • ввод даты и потраченного времени

Одну и ту же заявку может выполнять сразу несколько сотрудников, при этом, вид заявки может быть разным (одновременно платная и бесплатная). После выполнения платных заявок идет подсчет часов.
Вьюха конечно поможет отобразить саму Заявку, но вот в работе формы никак.

Аватар пользователя gun_dose gun_dose 10 октября 2018 в 7:10

Первая форма - это стандартная форма создания ноды. Вторая форма делается либо программным вызовом собственного режима формы той же ноды. Либо просто форма с 2-3 полями, в которой редактируется нода.

Аватар пользователя Orion76 Orion76 10 октября 2018 в 6:14

Николай_новичок wrote:

Скорее всего мне придется делать промежуточную таблицу в БД (об этом я пока не думаю).

Не "таблицу", а сущность с необходимыми полями.

Николай_новичок wrote:

Нужна форма чтобы начальник и доверенные люди вносили заявку (может сразу назначить ответственного)

Если это будет сущность, то форма (код формы)с базовым функционалом у Вас уже есть.

Николай_новичок wrote:

Вывод данной заявки в блоке с возможностью взять в работу (исключение это статус) заявку

Если это блок со списком заявок, и заявка - это сущность, а не таблица, то вьюс - однозначно.

Кстати, вьюс (выборка и темизация списка сущностей при помощи модуля Views) предназначен, в основном, для выборки именно "списка" сущностей, а не одной сущности.

Далее, т.к. "базовый" код формы Заявки у Вас уже есть, просто дорабатываете его по необходимости.
Как я понял, Вам просто нужно 3 режима отображения формы Заявки:
1.Нужна форма чтобы начальник и доверенные люди вносили заявку (может сразу назначить ответственного)
2.Вывод данной заявки в блоке с возможностью взять в работу (исключение это статус) заявку
3.Форма сотрудника в которой есть возможность

т.е. на основании некоторого контекста(пользователь с ролью "начальник", пользователь с ролью "сотрудник" и т.п.) выводите-скрываете в форме нужные поля.

Аватар пользователя Николай_новичок Николай_новичок 10 октября 2018 в 8:07

Николай_новичок wrote:

sas@drupal.org написал:

Вам достаточно enity -> node

Да это то понятно, пока читаю


Хм... действительно... тока много не понятно... как например работает
* "form" = {
* "default" = "Drupal\content_entity_example\Form\ContactForm",
* "delete" = "Drupal\content_entity_example\Form\ContactDeleteForm",
* },
и интересно, если это так работает с формой, то можно ли таким же образом добавить тип материала

Аватар пользователя gun_dose gun_dose 10 октября 2018 в 8:54
1

Чтобы не утонуть в пучине аннотаций плагинов, просто необходимо поручить написание этого кода друпал-консоли. Да, именно, она сама пишет код и весьма недурно. Всяко лучше, чем новички)))

Аватар пользователя Николай_новичок Николай_новичок 11 октября 2018 в 1:44

gun_dose wrote:

Чтобы не утонуть в пучине аннотаций плагинов, просто необходимо поручить написание этого кода друпал-консоли. Да, именно, она сама пишет код и весьма недурно. Всяко лучше, чем новички)))


Не получилось ее установить=(

Аватар пользователя Николай_новичок Николай_новичок 11 октября 2018 в 6:57

gun_dose wrote:

У вас какая операционная система?


Получилось запустить консоль... Через мучения... В самом конце начал смотреть почему не запускается, нашел путь ..\vendor\bin там искомый файл... запустилось... Я прям рад как будто теперь я всемогущ=).... Теперь возникли новые вопросы...
Мне с помощью консоли используя команду generate:module можно весь модуль сделать или нужно по кускам

Аватар пользователя gun_dose gun_dose 11 октября 2018 в 9:02

Генерируются только заготовки файлов. То есть они сразу рабгтают, но ничего не делают, например просто выводят тестовый текст. По поводу services, если не знаете, что такое сервисы в друпал и dependency injection, то пока просто пропустите этот пункт.