Como posso obter o pacote de uma entidade do tipo e ID?

11

Eu preciso identificar bundleuma entidade a partir de typee id.

Por exemplo, se typeis é 'node' e idé 7, posso obter 'page' como bundle.

obrigado

Junaid
fonte

Respostas:

11

Use entity_loadpara carregar a entidade conforme mencionado por @Nikhil.

Em seguida, use entity_extract_ids , para extrair o pacote. Exemplo:

$entity = entity_load('node', array('7'));

list(, , $bundle) = entity_extract_ids('node', $entity);

echo "Bundle name is : " . $bundle;

A função entity_extract_idsretorna uma matriz indexada numericamente (não uma tabela de hash) contendo os elementos:

  • 0: ID primário da entidade.
  • 1: ID da revisão da entidade ou NULL se $ entity_type não estiver com versão.
  • 2: Nome do pacote da entidade ou NULL se $ entity_type não tiver pacotes.

onde, 0, 1, e 2são índices de matriz. No entanto, a abordagem usada pelos módulos core e contrib é usar a list()função.

AjitS
fonte
Eu acho que não é bom depender do índice numérico da matriz.
Junaid
3
@ Junaid Esse índice é previsível, então está bom. É assim que o núcleo do Drupal lida com essa tarefa. Se o 'número mágico' incomodar, basta usar os recursos do idioma:list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
Clive
@Junaid Você pode depender do índice numérico, quando tiver certeza de que eles não serão alterados. Veja a edição para a explicação de por que usei o índice numérico. Isso ocorre porque a função API foi projetada dessa maneira. Além disso, a solução não é dependente do módulo entidade ;-)
AjitS
7

Aqui está o mais limpo que recebi do código do módulo de grupos orgânicos.

$wrapper = entity_metadata_wrapper($entity_type, $entity_id);
$bundle = $wrapper->getBundle();

Por exemplo, eu posso chamar assim:

$wrapper = entity_metadata_wrapper('node', 1);
$bundle = $wrapper->getBundle();

Edit: Como o @Clive apontou, o método acima depende do módulo da entidade.

Aqui está outro método que não depende de nenhum módulo extra. É explicado aqui https://forrst.com/posts/Get_the_bundle_of_a_Drupal_7_entity-0xW

Copie colando esse método:

function _entity_get_bundle($entity, $entity_type) {
  $info = entity_get_info($entity_type);
  if (empty($info['entity keys']['bundle'])) {
    return $entity_type;
  } else {
    return $entity->{$info['entity keys']['bundle']};
  }
}
Junaid
fonte
O que é $group_type, $gid? e qual é o valor $bundle ?
Niksmac 19/03/2013
Desculpe, esqueci de usar nomes de parâmetros adequados. Está corrigido agora.
Junaid
Você pode fazer o mesmo por entity_load, a propósito, como é mais limpo?
Niksmac 19/03/2013
1
Pessoalmente, não acho que entity_metadata_wrapper()seja mais limpo que o entity_extract_ids()método. Além disso, você confia no módulo de entidade que está sendo instalado ...
Clive
Não é necessariamente mais limpo, mas é uma alternativa válida, especialmente se você estiver usando wrappers de metadados de qualquer maneira. Talvez @develkar ou Junaid possam editar sua resposta para incluir as duas alternativas? (Junaid, talvez você poderia adicionar links para o módulo entidade e para a página sobre entity_metadata_wrappers também?)
Alice Heaton
3

Tente entity_load

Carregar entidades do banco de dados.

As entidades são armazenadas em um cache de memória estática e não exigirão acesso ao banco de dados se forem carregadas novamente durante a mesma solicitação de página.

Parâmetros

$ entity_type : o tipo de entidade a ser carregado, por exemplo, nó ou usuário.

$ ids : uma matriz de IDs de entidade ou FALSE para carregar todas as entidades.

$ conditions : (descontinuado) Uma matriz associativa de condições na tabela base, onde as chaves são os campos do banco de dados e os valores são os valores que esses campos devem ter. Em vez disso, é preferível usar EntityFieldQuery para recuperar uma lista de IDs de entidades carregáveis ​​por essa função.

$ reset : se deve redefinir o cache interno para o tipo de entidade solicitado.

Valor de retorno

Uma matriz de objetos de entidade indexados por seus IDs. Quando nenhum resultado é encontrado, uma matriz vazia é retornada.

niksmac
fonte
3

Se você deseja uma maneira muito leve, em termos de desempenho, para obter o tipo de nó a partir da identificação do nó - é possível usar uma única consulta de seleção na tabela de nós.

$type = db_query("SELECT type FROM {node} WHERE nid = :nid", 
                  array(':nid' => $nid))->fetchField();

Dessa forma, você não precisa invocar todo o sistema de ganchos de entidade, com entity_load etc.

É uma consulta de seleção única usando o ID do nó indexado.

David Thomas
fonte
não estamos jogando apenas com nós aqui.
Junaid
O OP escreveu "Por exemplo, se o tipo for 'node' e o id for 7, posso obter 'page' como pacote." portanto, o exemplo baseado em nó responde.
David Thomas