2011-10-05 7 views
3

Je travaille avec le module commerce pour créer un magasin en ligne. Je modifie le fichier .install de produits pour créer un type de contenu (comme cela m'a été demandé) et dans le cadre de ce type de contenu, j'ai besoin de créer beaucoup de champs. La liste comprend environ 50 à 60 informations différentes.Données de champ dans une table, pas beaucoup. pour drupal7

Idéalement, je voudrais stocker ces dans une seule table avec le productID au début et toutes les autres informations le long, mais cela ne semble pas être le cas; tous les champs sont stockés dans des tables différentes. J'ai remarqué que le module "Adresse" qui est également utilisé avec le commerce crée un type de champ qui a environ 15 valeurs différentes toutes stockées dans la même boîte. Comment est-ce possible? J'ai remarqué que si je règle la cardinalité jusqu'à 5 par exemple, cela crée des rangées différentes. Je veux juste une table avec les éléments suivants:

ID - valeur1 - valeur2 - value3 etc etc

Je ne ai pas besoin aussi des modules/extensions que tout cela doit être écrit dans les fichiers. Je ne pense pas non plus que changer de mongoDB (je pense) est une option, alors quelles sont mes options dans cette situation?

Répondre

6

Ce n'est pas comme cela que fonctionne le système de terrain Drupal, je crains, one field == one table (bien en fait 2 tables si vous incluez la table de révision pour chaque champ).

Le module d'adresse utilise hook_field_schema() pour définir plusieurs colonnes pour ce domaine particulier (un coup d'oeil à address.install et vous verrez ce que je veux dire). Donc, si vous voulez tout mettre dans un tableau, vous devrez simplement définir votre propre type de champ (voir examples module, plus précisément field_example pour obtenir de l'aide). N'oubliez pas que le nombre de colonnes que vous définissez dans hook_field_schema() sera statique une fois le module installé, et la seule façon de l'augmenter ou de le diminuer est de le faire avec un crochet module.

De plus, si vous trafiquez sur des fichiers inclus dans le module Commerce ... stop!: Le commerce n'en est encore qu'à ses balbutiements et vous devrez probablement le mettre à jour bientôt ... une fois que vous l'aurez fait, vos changements de code auront disparu et il y a de fortes chances que votre site soit dans un état incohérent. Le point le plus important pour Drupal est que tout est accroché/cultivé afin qu'il puisse être modifié par d'autres parties du système. Il n'y a rien que vous pouvez changer en product.install qui ne peut pas être fait en implémentant un hook Drupal dans un autre module.

Si vous n'êtes pas sûr, poster une autre question détaillant ce que vous essayez d'accomplir en éditant directement un fichier de module contrib et l'un des gourous de Drupal sur vous PROVOQUERAIT pointer dans la bonne direction :-)

EDIT

Juste pour dire que je travaille avec Ubercart dans Drupal 7 depuis un certain temps maintenant et trouvez une très, très bonne solution (beaucoup de commerce modules a contribué sont encore en dev/alpha/bêta; c'est moins vrai pour les modules Ubercart). Cela pourrait valoir le coup d'oeil.

Quelques infos

Je pense que vous avez essentiellement obtenu deux options ici, mais de toute façon, vous devez créer un module personnalisé (excellent set of instructions here).

Option 1: Créer un champ personnalisé

Si vous êtes un débutant Drupal de codage, je vous suggère de ce qui est probablement la meilleure façon d'accomplir ce que vous voulez, mais il est toujours pas tout à fait simple. Prenez le module field_example à partir du lien du module Drupal Exemples ci-dessus et jetez un oeil dans le fichier .install, plus précisément la fonction field_example_field_schema(). Cela définit les colonnes qui seront dans la table pour ce champ. Alors jetez un oeil à field_example.module ... à peu près toutes les fonctions qui sont commentées avec Implements hook_x sont celles que vous allez vouloir copier dans votre module et modifier pour vos propres besoins.

Je pense que ce sera plus facile parce que Drupal gérera la création de champs table/formulaire pour vous afin que vous n'ayez pas à manipuler la base de données, le schéma ou les API de formulaire.

Option 2: Créer un module personnalisé

Cette option implique la mise en œuvre de votre propre table (comme vous suggérez dans votre commentaire) où la clé primaire serait l'entité ID du produit et contiendra aussi tous vos personnalisés colonnes. (Voir le Schema API documentation pour de l'aide avec ceci).

Ensuite, vous devez implémenter hook_form_alter() pour ajouter les champs de formulaire nécessaires à un utilisateur pour entrer les données, puis implémenter hook_node_insert() et hook_node_update() pour conserver ces données dans votre table de base de données. Il est assez difficile d'entrer dans plus de détails sans écrire du code et c'est pas mal de code!

espoir qui aide, désolé je ne peux pas être plus précis, mais il est pas facile sans connaître tous les tenants et les aboutissants de la situation

+0

Nous vous remercions de clive de réponse très détaillée. Je suis très limité avec les méthodes que je peux utiliser pour le nouveau site car on me dit ce que je dois faire. Le plan était de créer une table "produits" et avoir toutes les valeurs dans cela. Est-ce possible si je crée un type de contenu, puis ajouter des champs à ces valeurs? Techniquement, cela n'a pas d'importance si toutes les tables de champs sont créées, à condition qu'il y ait une seule table avec des "produits" et que toutes les colonnes soient au même endroit. Nous avons un système compliqué avec lequel nous devons établir un lien, donc avoir une table rendrait la vie beaucoup plus facile !! – Terry

+0

Pour clarifier, dites-vous que je devrais faire un nouveau module pour faire tout ce que je veux? Si oui, comment relierais-je cela correctement au système? J'ai remarqué que vous devez conserver tous les noms comme si vous créiez des éléments dans la base de données, des hooks de noms etc., donc si j'ai un autre module, cela ne différera-t-il pas de mon commerce? Je ne peux pas non plus changer pour ubercart car nous devons utiliser le commerce. – Terry

+0

Ouais, les conventions de nommage de Drupal sont les meilleures et les moins bonnes fonctionnalités! Je vais mettre à jour la réponse ci-dessus avec un peu plus d'infos je pense que c'est un peu trop pour tenir dans un seul commentaire – Clive

Questions connexes