2010-09-14 3 views
1

Mon application de répertoire d'entreprise appelle 3 boîtes de sélection chaînées et j'utilise cakephp pour créer cette application.comment créer un formulaire de sélection de chaîne dans cakephp

La hiérarchie et l'ordre des choix pour les sections est la suivante:

1 - groupe d'affaires

2 - Type d'entreprise

3 - ville (inclus dans le client de la table)

Le les relations sont:

  • client bus HABTM types Iness

  • groupes d'affaires ont de nombreux types d'entreprises

  • types d'entreprises ont un groupe d'affaires, les clients HABTM

J'ai cherché pour les plugins jquery qui aident à cela, et a trouvé un par Remy Sharp, mais il n'a pas les relations plus complexes que j'ai. http://remysharp.com/2007/09/18/auto-populate-multiple-select-boxes/

Ce que j'imagine passe est la première zone de sélection (groupes d'affaires) est prérempli et une fois la sélection effectuée, un écouteur d'événement envoyer un message qui filtre la deuxième boîte de sélection, et même pour la troisième.

Ce que je ne sais pas, c'est comment structurer l'action de recherche en fonction de l'écouteur d'événement.

Un conseil ou suis-je loin de la base?

Comme toujours, je viens au puits pour obtenir de l'aide.

Très apprécié. Paul


Merci beaucoup Nick, je l'ai lu beaucoup de vos messages, je vous remercie de votre réponse.

J'ai suivi vos instructions mais j'ai eu des problèmes. J'ai fait de mon mieux pour les résoudre mais je n'ai pas compris.

C'est ce que je l'ai fait jusqu'à présent.

1) créé actions « enchaînées » tant dans le business_type et business_directory (client renommé dans le répertoire des entreprises, ce qui est plus approprié)

type d'entreprise l'action enchaînée:

function chained($business_group_id) { 
    $business_types = $this->BusinessType->find('list', array(
     'conditions' => array('BusinessType.business_group_id' => $business_group_id) 
     )); 

     $this->set('business_types', $business_types); 
    } 

annuaire professionnel l'action enchaînée:

function chained($business_type_id) { 
    $business_directories = $this->BusinessDirectory->bindModel(array('hasOne' => array('business_directories_business_types')));   
    $business_directories = $this->BusinessDirectory->find('all', array(
     'fields' => array(' BusinessDirectory.city'), 
     'conditions' => array('business_directories_business_types.business_type_id' => $business_type_id) 
     )); 
      $this->set('business_directories', $business_directories); 
    } 

J'ai trouvé qu'avec une relation HABTM, l'utilisation de find 'list' n'a pas créé la requête de jointure, alors que find 'all' l'a fait.

2) J'ai ensuite créé une action de recherche dans le répertoire de l'entreprise et la vue correspondante.

Pour les groupes d'affaires que je crée une action getList pour remplir la liste d'options dans le formulaire de recherche:

function getList() { 
    return $this->BusinessGroup->find('list'); 
} 

De l'avis de recherche, j'ai ajouté le javascript pour la chaîne sélectionnez:

<script type="text/javascript"> 
<!-- 
$(function() { 
    var group = $('#businessGoup'); 
    var type = $('#businessType'); 
    var city = $('#businessDirectoryCity'); 

    type.selectChain({ 
     target: city, 
     url: '../business_directories/chained/'+$(this).val(), 
    data: { ajax: true, anotherval: "anotherAction" } 
    }); 

    group.selectChain({ 
     target: type, 
     url: '../business_types/chained/'+$(this).val() 
    }).trigger('change'); 

}); 
//--> 
</script> 

Et le formulaire:

create ('business_directories', array ('action' => '/ search_results')); ?> entrée ('de business_group_id', array ('type' => 'select', 'id' => 'businessGoup', 'vide' => '- Select Business Group -' 'Multiple' => true, 'options' => $ this-> requestAction ('/ business_groups/getList'), 'label' => 'Groupe d'entreprises')); ? > entrée ('business_type.id', array ('type' => 'select', 'id' => 'BusinessType', 'vide' => « - Sélectionner le type d'entreprise - - ', ' multiple '=> true, ' options '=>' non sélectionné ', ' label '=>' Business Type ')); ? > entrée ('de business_directories.id', array ('type' => 'select', 'id' => 'businessDirectoryCity', 'vide' => « - Sélectionner Ville - ', ' multiple '=> true, ' options '=>' options ', ' label '=>' Ville ')); ?> fin ('Recherche'); ?>

Lorsque je teste la fonction de chaîne de type d'entreprise,/business_types/chained/1, tout fonctionne. Mais quand je teste la vue de recherche, j'obtiens une erreur d'alerte de javascript. Puis, quand je vérifie Firebug, je reçois les deux erreurs suivantes:

Attention (2): Missing argument 1 pour BusinessTypesController :: enchaînés() [contrôleurs APP \ \ business_types_controller.php, ligne 71]

Avis (8): Variable indéfinie: business_group_id [APP \ controllers \ business_types_controller.php, ligne 73]

Toute aide supplémentaire est très appréciée.

Merci, Paul

+0

Regardez comme vous ne l'avez pas passé les variables dans l'action. c'est-à-dire que la fonction chaînée ($ business_group_id) n'a pas le paramètre $ business_group_id et la deuxième erreur est postérieure. Avec firebug, vérifiez quelle est l'URL déclenchée après la sélection d'un élément. Je crois que ce sera quelque chose comme:/business_directories/chained/undefined. Il y a de très mauvaises pratiques dans votre code, mais je n'en parlerai pas. Mais à coup sûr, essayez de remplacer requestAction par une variable régulière du contrôleur. Après tout, c'est une liste. J'espère que vous convertissez la réponse en chaîne correctement formatée, comme le montre la démo. –

Répondre

2

Ce que vous avez besoin est d'avoir 2 actions dans les contrôleurs (business_type et clients).

chaque action devrait ressembler à ceci. Dans ce cas, pour le type d'entreprise

function chained($parent_id){ 
    $business_types = $this->BusinessType->find('list', array('conditions'=>'BusinessType.business_group_id'=>$parent_id)); 
    $this->set('business_types', $business_types); 
} 

Bien sûr, vous devez voir également pour cette action qui forme les valeurs dans le format approprié pour la sélection en chaîne.

Pour le groupe Business, vous devez afficher toutes les valeurs directement, donc aucun ajax n'est nécessaire.

L'action du contrôleur client est similaire, mais vous devez sélectionner les villes de tous les clients associés. Ensuite, avec la sélection chaînée, vous devez définir les éléments appropriés et définir les actions appropriées qui doivent être appelées.

i.e. .:

$('#id-of-the-business-group').selectChain({ 
    target: $('#id-of-the-business-type-field'), 
    url: '/business_types/chained/'+$(this).val() 
}); 
+0

Merci Nick. J'ai ajouté quelques modifications à ma question pour expliquer les problèmes que j'ai rencontrés. Toute aide est très appréciée. – Paul