Crie conteúdo programaticamente

9

No Drupal 8, como posso criar conteúdo programaticamente? Na administração "Drupal 8", criei um novo tipo "Casa" (contém uma descrição, uma imagem, um campo de referência para os usuários ...). Como posso criar um tipo de entidade "Casa" a partir de um módulo personalizado?

No meu módulo personalizado, tenho um arquivo de formulário (contém uma classe que estende o FormBase). No retorno de chamada de envio, desejo criar uma nova "casa" e definir valores e salvar a nova Entidade.

Não encontro exemplos na web, no núcleo ...

matthieu lopez
fonte
Sua segunda pergunta "Como posso criar um tipo de entidade 'Casa'?" é um pouco confuso. Acho que a pergunta é "Como posso criar um nó do tipo de nó" Casa "a partir de um módulo personalizado?" A ambiguidade decorre do uso de "tipo de entidade", que tem um significado muito específico no Drupal, e a pergunta poderia ser "Como posso criar um tipo de entidade personalizado chamado 'Casa' a partir de um módulo personalizado?" ou "Como posso criar uma entidade personalizada que use o pacote 'Casa'"?
Mestrcliffe

Respostas:

15

Aqui está um exemplo simples de criação de um nó no Drupal 8.

$data = [
  'type' => 'article', 
  'title' => 'My new title', 
  'uid' => 1
];
$node = Drupal::entityTypeManager()
  ->getStorage('node')
  ->create($data);
$node->save();

Atualizado para remover a função obsoleta de acordo com os comentários de @mradcliffe. Obrigado!

Para sua informação, para testar pequenos trechos de código como este, o drush core-clicomando funciona muito bem. Consulte: http://www.drushcommands.com/drush-7x/core/core-cli

cutelo
fonte
11
Antes do salvamento, com o entityManager, é possível saber para cada campo: que tipo de dados deve ser definido? (texto para o campo de texto, fid para o arquivo etc ...)
Matthieu lopez
A única maneira que conheço no momento é usar outro método obsoleto, EntityManager :: getDefinitions (), mas acho que se você instanciar um EntityDataDefinition por meio do método estático de criação, pode chamar getPropertyDefinitions (). Ambos retornarão definições para cada propriedade, como título ou um campo. Há também o getFieldStorageDefinitions () que retorna a mesma coisa, mas da entidade de armazenamento (consulte getStorage ('node') acima). No entanto, isso pode não estar disponível para drivers não-SQL.
Mestrcliffe
0

No Drupal, 8 nós agora são tratados como entidades. Você pode simplesmente criar um nó pelo seguinte código

$new_page_values = array();
$new_page_values['type'] = 'my_content_type';
$new_page_values['title'] = $form_state['values']['page_title'];
$new_page_values['path'] = $new_page_path;

$new_page = entity_create('node', $new_page_values);
$new_page->save();
Shabir A.
fonte
2
entity_create () é um método obsoleto que devemos evitar usar. Injetar o EntityManager na classe Form ou usar \ Drupal :: entityManager são as formas padrão de gerenciar entidades.
Mestrcliffe