9
votes

Obtenir des nœuds programmés par titre à Drupal 7

J'ai un module qui ajoute de manière programmable beaucoup de nœuds à mon site Drupal 7. Pour éviter les doublons, je veux vérifier si le titre de mon noeud nouvellement créé n'existe pas déjà dans le système. Il n'y aura jamais de cas où deux nœuds ont le même nom. J'ai essayé d'utiliser node_load () , mais cela ne semble pas me permettre de charger des nœuds basés sur un titre.

Je suis excité sur la façon de procéder, alors je me demandais si quelqu'un ici pourrait m'aider.

résumer: comment puis-je vérifier si un noeud avec un titre de certains titre existe déjà?

Merci.


2 commentaires

Si vous voulez que nous puissions déplacer cela sur notre [site drupal] (drupal.stackexchange.com) où il pourrait obtenir une meilleure couverture. S'il vous plaît signaler si vous souhaitez que nous fassions cela (mais ne vous croisez pas). Merci.


Connexes: Comment charger un nœud basé sur son titre? à DS


6 Réponses :


8
votes

Vous pouvez obtenir tous les titres de nœud avec une requête SQL comme: xxx

et s'il n'y a aucun résultat renvoyé, vous pouvez supposer que vous êtes prêt à partir. < P> ou vous pouvez également modifier la table des nœuds pour rendre le champ de titre unique et gérer l'erreur lancée par MySQL. Ne sais pas vraiment à quel point cela est réalisable.


2 commentaires

+1 C'est le meilleur moyen d'accomplir cela. Vous devriez envisager de rejoindre le tableau des révisions pour obtenir la dernière version des données.


S'il vous plaît, enveloppez votre nom de table dans une attelle bouclée lors de la rédaction de la requête de DB personnalisée.



18
votes

nœud sont des entités, vous pouvez donc utiliser le EntityFieldQuery classe à interroger pour eux. De cette façon, vous n'avez pas à vous déranger comment les informations sont stockées dans la base de données. Et devrez-vous ajouter des filtres supplémentaires en fonction des valeurs de champs, l'évolution du code sera facile. XXX


4 commentaires

C'est une énormément de surcharge pour une requête aussi simple, le stockage sur le terrain ne s'étend pas aux propriétés de l'entité afin d'utiliser EntityFieldQuery ici n'a pas d'avantage réel


Oui, il y a des frais généraux en utilisant l'entitéfieldQuery pour interroger une propriété de nœud unique. Mais comme cela ne s'appliquera qu'à un processus de création multi-nœuds, il est possible que le coût de la performance soit marginal. Et il sera plus facile de maintenir si le processus de création de nœud évolue dans quelque chose qui devrait vérifier plusieurs conditions.


Si vous utilisez la traduction d'entité et le module de titre, le code doit être mis à jour pour interroger le champ Title_field au lieu de la propriété Titre.


Je sais que c'est de nombreuses années plus tard, mais il y a un bogue dans ce code - vous ne pouvez pas chaîner un constructeur PHP. En 5.4 et up, vous pouvez utiliser (nouvelle entitéfieldQuery ()) -> , mais comme écrit cela devrait donner une erreur fatale.



2
votes

juste une headsup amicale. Pour la sécurité, vous devriez TOUJOURS Utilisez des crochets autour des tables dans Drupal SQL Query! Il empêche les attaques d'injection SQL.

Donc, il devrait être: (Avis {noeud}) xxx


2 commentaires

Pour une requête de nœud, il semble que, pour avoir la vérification des restrictions d'accès au nœud, vous devez utiliser une requête dynamique avec la balise "Node_Access", voir drupal.org/update/modules/6/7#db_rewrite_sql . Pour ce cas, cela n'a pas d'importance car la détection du titre en double ne devrait pas s'inquiéter des restrictions d'accès au nœud. Mais en utilisant une requête dynamique pour les nœuds, c'est une bonne habitude de prendre.


Les supports bouclés ne sont que pour préfixer la table si vous avez votre préfixe dans votre fichier de paramètres. n'a rien à voir avec l'injection SQL. J'utilise l'API D7 SQL pour ajouter des champs et des conditions dans votre exemple si je devais deviner, votre variable $ MyNewtiTle n'est pas échappée?



4
votes

Voici cette approche D7 utilise l'API et la fonction de comptage.

$query = db_select('node', 'n')
  ->fields('n', array('nid'))
  ->condition('n.title', $myNewTitle, '=');

return $query->countQuery()->execute()->fetchField();


0 commentaires

4
votes
node_load_multiple(array(), array('title' => $title));
Source: The guts of DrupalWebTestCase::DrupalGetNodeByTitle

0 commentaires

1
votes

La bonne façon est d'ajouter un index unique à la base de données. Ensuite, vous serez sûr que tous les titres sont uniques. Est facile: xxx


0 commentaires