2010-04-24 3 views
0

J'écris une application CakePHP pour enregistrer le travail que je fais pour divers clients, mais après avoir essayé pendant des jours, je semble incapable de l'obtenir pour faire ce que je veux. J'ai lu la plupart du site Web du livre CakePHP.CakePHP accès modèle indirectement connexe - question du débutant

et googlé pour tout ce que je vaux, donc je suppose qu'il me manque quelque chose d'évident! Chaque 'élément de journal' appartient à un 'sous-projet', qui à son tour appartient à un 'projet', qui à son tour appartient à un 'sous-client' qui appartient finalement à un client. Ce sont les 5 tables MySQL J'utilise:

mysql> DESCRIBE log_items; 
+-----------------+--------------+------+-----+---------+----------------+ 
| Field   | Type   | Null | Key | Default | Extra   | 
+-----------------+--------------+------+-----+---------+----------------+ 
| id    | int(11)  | NO | PRI | NULL | auto_increment | 
| date   | date   | NO |  | NULL |    | 
| time   | time   | NO |  | NULL |    | 
| time_spent  | int(11)  | NO |  | NULL |    | 
| sub_projects_id | int(11)  | NO | MUL | NULL |    | 
| title   | varchar(100) | NO |  | NULL |    | 
| description  | text   | YES |  | NULL |    | 
| created   | datetime  | YES |  | NULL |    | 
| modified  | datetime  | YES |  | NULL |    | 
+-----------------+--------------+------+-----+---------+----------------+ 


mysql> DESCRIBE sub_projects; 
+-------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| name  | varchar(100) | NO |  | NULL |    | 
| projects_id | int(11)  | NO | MUL | NULL |    | 
| created  | datetime  | YES |  | NULL |    | 
| modified | datetime  | YES |  | NULL |    | 
+-------------+--------------+------+-----+---------+----------------+ 


mysql> DESCRIBE projects; 
+----------------+--------------+------+-----+---------+----------------+ 
| Field   | Type   | Null | Key | Default | Extra   | 
+----------------+--------------+------+-----+---------+----------------+ 
| id    | int(11)  | NO | PRI | NULL | auto_increment | 
| name   | varchar(100) | NO |  | NULL |    | 
| sub_clients_id | int(11)  | NO | MUL | NULL |    | 
| created  | datetime  | YES |  | NULL |    | 
| modified  | datetime  | YES |  | NULL |    | 
+----------------+--------------+------+-----+---------+----------------+ 


mysql> DESCRIBE sub_clients; 
+------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| name  | varchar(100) | NO |  | NULL |    | 
| clients_id | int(11)  | NO | MUL | NULL |    | 
| created | datetime  | YES |  | NULL |    | 
| modified | datetime  | YES |  | NULL |    | 
+------------+--------------+------+-----+---------+----------------+ 


mysql> DESCRIBE clients; 
+----------+--------------+------+-----+---------+----------------+ 
| Field | Type   | Null | Key | Default | Extra   | 
+----------+--------------+------+-----+---------+----------------+ 
| id  | int(11)  | NO | PRI | NULL | auto_increment | 
| name  | varchar(100) | NO |  | NULL |    | 
| created | datetime  | YES |  | NULL |    | 
| modified | datetime  | YES |  | NULL |    | 
+----------+--------------+------+-----+---------+----------------+ 

J'ai mis en place les associations suivantes dans CakePHP:

LogItem belongsTo SubProjects 
SubProject belongsTo Projects 
Project belongsTo SubClients 
SubClient belongsTo Clients 

Client hasMany SubClients 
SubClient hasMany Projects 
Project hasMany SubProjects 
SubProject hasMany LogItems 

En utilisant 'bake gâteau' J'ai créé les modèles, les contrôleurs (index, vue ajouter, modifier et supprimer) et les vues, et les choses semblent fonctionner - comme je suis en mesure d'effectuer des opérations CRUD simples avec succès.

La question

Lors de l'édition d'un 'journal item' à www.mydomain/log_items/modifier Je suis présenté avec la vue que vous feriez tout suspect; Je voudrais également incorporer des boîtes de sélection pour choisir le client, le sous-client, le projet et le sous-projet dans la vue d'édition 'log_items'.

Idéalement, le « sous-client » select case doit remplir lui-même en fonction du choix « client », le « projet » boîte de sélection devrait également remplir lui-même en fonction de la « sous-client » sélectionné, etc., etc.

Je pense que la façon de remplir les boîtes de sélection avec des options pertinentes est Ajax, mais je ne suis pas sûr de savoir comment accéder réellement à un modèle de la vue enfant d'un modèle indirectement lié, par exemple comment créer un case de sélection du client dans la vue d'édition 'log_items'.

J'ai ont trouvé cet exemple:

http://forum.phpsitesolutions.com/php-frameworks/cakephp/ajax-cakephp-dynamically-populate-html-select-dropdown-box-t29.html

où quelqu'un obtient quelque chose de similaire pour les États-Unis, les comtés et les villes. Cependant, j'ai remarqué dans le schéma de base de données - qui est téléchargeable depuis le lien ci-dessus - que les tables de la base de données n'ont pas de clés étrangères, alors maintenant je me demande si je vais bien dans les choses.

Tous les conseils et conseils seraient très appréciés.

Cordialement,

Chris

Répondre

0

Vos noms de clé étrangère doivent être singulier. Donc projects_id devrait être project_id et sub_projects_id devrait être sub_project_id et ainsi de suite. Si vous utilisez un gâteau ou un échafaudage, vous ne devriez pas pouvoir modifier les données associées dans chaque page d'édition de modèle. En remarque, assurez-vous que toutes les classes de modèles que vous avez créées sont singulières (dans le dossier/models /). Pour modifier plusieurs niveaux d'association, il peut être aussi simple que de définir le membre de la classe $ recursive sur 2 dans chacun des modèles où vous souhaitez que la page d'édition ait plusieurs niveaux d'association. Permettez-moi de savoir comment cela fonctionne pour vous.

En réponse à votre deuxième problème.

Assurez-vous que vos modèles ont toutes les associations appropriées. Si vous les avez cuits, ils devraient les inclure, mais compte tenu de votre erreur, il semble qu'ils n'étaient pas inclus. Donc, dans log_item.php vous devriez avoir quelque chose comme

var $belongsTo = array('SubProject');