Drupal 8 или 9 Сохранение данных в тип контента из настраиваемого модуля
Я использую drupal 8.9.*, Я хочу сохранить данные в тип содержимого из настраиваемого модуля, чтобы я мог видеть данные, введенные на странице общего списка содержимого Drupal.
Я не знаю, как сохранять данные в тип содержимого, я пытался использовать объект $ node, чтобы сохранить его (и какой-то другой метод, который я пробовал, но позже узнал, что он устарел). Я также передал имя машины типа контента. Где я ошибаюсь, вся документация Drupal искажена, трудно найти правильную версию 8 || 9. Вот мой код.
Файл данных маршрутизации, Birth_details.routing.yml
birth_details.newreading:
path: '/new-reading'
defaults:
_title: 'Enter the birth details for reading'
_form: '\Drupal\birth_details\Form\BirthDetails'
requirements:
_permission: 'access content'
Моя форма BirthDetails.php (жестко закодированы некоторые значения для целей тестирования)
<?php
namespace Drupal\birth_details\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
class BirthDetails extends FormBase {
public function getFormId(){
return 'birth_data';
}
public function buildForm(array $form, FormStateInterface $form_state){
$form['title'] = [
'#type' => 'textfield',
'#description' => $this->t('Enter your name here!'),
];
$form['field_birth_date'] = [
'#type' => 'textfield',
'#description' => $this->t('Enter your field_birth_date here!'),
];
$form['field_birth_location'] = [
'#type' => 'textfield',
'#description' => $this->t('Enter your field_birth_location here!'),
];
$form['field_email_id'] = [
'#type' => 'textfield',
'#description' => $this->t('Enter your field_email_id here!'),
];
$form['field_gender'] = [
'#type' => 'textfield',
'#description' => $this->t('Enter your field_gender here!'),
];
$form['actions']['#type'] = 'actions';
$form['actions']['submit'] = [
'#type' => 'submit',
'#value' => $this->t('Save data'),
];
return $form;
}
public function submitForm(array &$form, FormStateInterface $form_state){
$node = new stdClass();
$node = Node::create([
'type' => 'birth_data',
'title' => 'first lastname',
'field_birth_date' => '23 NOV 2020 11:11:11',
'field_birth_location' => 'Osaka',
'field_email_id' => 'test@myid.com',
'field_gender' => 'Male',
]);
$node->save();
echo "<pre>";
print_r($form_state);
exit;
}
}
и, наконец, имя машины типа пользовательского контента является birth_data, я использовал то же самое для формы уникального идентификатора и узла создания типа типа
3 ответа
Baik Ho ответил хорошо. По-прежнему лучше избегать использования статических вызовов (например,
Node::create()
); мы можем легко сделать это, внедрив зависимости в конструктор.
<?php
namespace Drupal\birth_details\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Entity\EntityTypeManager;
use Drupal\Core\Session\AccountProxyInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
class BirthDetails extends FormBase {
/**
* Current user account.
*
* @var \Drupal\Core\Session\AccountProxyInterface
*/
protected $currentUser;
/**
* Node storage.
*
* @var \Drupal\node\NodeStorageInterface
*/
protected $nodeManager;
/**
* {@inheritdoc}
*/
public function __construct(
EntityTypeManager $entity_type_manager,
AccountProxyInterface $current_user
) {
$this->currentUser = $current_user;
$this->nodeManager = $entity_type_manager->getStorage('node');
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('entity_type.manager'),
$container->get('current_user')
);
}
/**
* {@inheritdoc}
*/
public function getFormId(){
return 'birth_data';
}
/**
* {@inheritdoc}
*/
public function buildForm(array $form, FormStateInterface $form_state) {
$form['title'] = [
'#type' => 'textfield',
'#description' => $this->t('Enter your name here!'),
];
$form['field_birth_date'] = [
'#type' => 'textfield',
'#description' => $this->t('Enter your field_birth_date here!'),
];
$form['field_birth_location'] = [
'#type' => 'textfield',
'#description' => $this->t('Enter your field_birth_location here!'),
];
$form['field_email_id'] = [
'#type' => 'textfield',
'#description' => $this->t('Enter your field_email_id here!'),
];
$form['field_gender'] = [
'#type' => 'textfield',
'#description' => $this->t('Enter your field_gender here!'),
];
$form['actions']['#type'] = 'actions';
$form['actions']['submit'] = [
'#type' => 'submit',
'#value' => $this->t('Save data'),
];
return $form;
}
/**
* {@inheritdoc}
*/
public function validateForm(array &$form, FormStateInterface $form_state) {
}
/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
$node = $this->nodeManager->create([
'type' => 'birth_data',
'title' => $values['title'],
'uid' => $this->currentUser->id(),
'status' => 1,
]);
$node->field_birth_date->value = "23 NOV 2020 11:11:11";
$node->field_birth_location->value = "Osaka";
$node->field_email_id->value = "test@myid.com";
$node->field_gender->value = "Male";
$node->save();
}
}
Эта строка лишняя, ее можно отбросить:
$node = new stdClass();
Возможный пример создания узла, если у вас есть Content Type, т.е.
page
:
use Drupal\node\Entity\Node;
...
// Initialise a node object with several field values.
$node = Node::create([
'type' => 'page',
'title' => 'foo',
'field_birth_date' => ['value' => 'bar'],
]);
// Set field values.
$node->field_birth_date->value = 'bar';
$node->field_birth_location->value = 'US';
$node->field_email_id->value = 'hello@example.com';
$node->field_gender->value = 'm'
// You can also use setters but you need to check on the available ones. They are also chainable:
$node
->setTitle('foo')
->setPromoted(TRUE)
->setPublished();
// Save the node.
$node->save();
Ваше решение с предложениями от Baik Ho или MacSim должно работать, но это не в полной мере использовать дизайн в Drupal для пользовательских типов контента. Вы создаете форму и используете ее для маршрутизации информации в узел, который предоставляет механизмы, позволяющие делать то, что вы хотите, без сохранения вашей собственной формы.
Если вы хотите создать настраиваемый тип узла, вы можете настроить модуль для определения типа пакета узлов во время установки, а затем использовать стандартный интерфейс для ввода и редактирования этого содержимого. Если вы хотите изменить форму оттуда, вы должны использовать hook_BASEID_form_alter()
Другой вариант - создать настраиваемую сущность содержимого, которая по сути создает другой элемент, параллельный узлам.