Filtrer liste déroulante selon le tiers sélectionné

Bonjour,

J’ai créer via le moduleBuilder, un formulaire classique avec 2 champs
image

BESOIN : Lorsque je sélectionne un tiers dans ma liste déroulante, je veux pouvoir afficher seulement l’ adresse/contact relié au tiers renseigné au dessus.

j’ai trouvé une méthode : filtrer le type du champ avec l’ID du tiers :

‹ fk_adresse › => array(‹ type ›=>‹ integer:Contact:contact/class/contact.class.php:1:fk_soc=1 ›

La méthode fonctionne CEPENDANT quelque soit le tiers séléctionné, cela m’affichera tjrs l’adresse/contact du tiers (fk_soc=1) ce qui est logique…

Je ne sais pas si ma méthode est la bonne… Peut-etre faut-il rajouter des informations dans le type de mon champ ‹ fk_adresse › apres fk_soc…

Si quelqu’un a une piste à me conseiller, je suis preneuse :slight_smile:

Merci !

Un petit up ? J’ai bien l’impression que je vais devoir regarder du coté de l’ajax mais j’ai aucune idée de comment manipuler les champs du module builder pour faire une selection en fonction du tiers choisi…

Bonjour, Petit up pour dire que j’ai trouvé comment faire !

Je n’ai pas trouvé d’autres solutions que de recoder le formulaire à la main… MAIS c’est une solution qui est propre et qui fonctionne bien. Tout est perfectible bien entendu :slight_smile:

Voici le code :

// Third party
	print '<tr>';

	$soc = new Societe($db);
	if ($socid > 0) $res = $soc->fetch($socid);

	print '<tr>';
	print '<td class="fieldrequired">Tiers</td>';

	if ($socid > 0) {
		print '<td>';
		print $soc->getNomUrl(1);
		print '<input type="hidden" name="fk_soc" value="' . $soc->id . '">';
		print '</td>';
	} else {
		print '<td>';
		print img_picto('', 'company') . $form->select_company('', 'socid', '(s.client = 1 OR s.client = 2 OR s.client = 3) AND status=1', 'SelectThirdParty', 0, 0, null, 0, 'minwidth300 maxwidth500');

		// reload page to retrieve customer informations
		if (empty($conf->global->RELOAD_PAGE_ON_CUSTOMER_CHANGE_DISABLED)) {
			print '<script type="text/javascript">
			$(document).ready(function() {
				$("#socid").change(function() {
					console.log("We have changed the company - Reload page");
					var socid = $(this).val();
					// reload page
					window.location.href = "' . $_SERVER["PHP_SELF"] . '?action=create&socid="+socid+"&ref_client="+$("input[name=ref_client]").val();
				});
			});
			</script>';
		}
		print ' <a href="' . DOL_URL_ROOT . '/societe/card.php?action=create&client=3&fournisseur=0&backtopage=' . urlencode($_SERVER["PHP_SELF"] . '?action=create') . '"><span class="fa fa-plus-circle valignmiddle paddingleft" title="' . $langs->trans("AddThirdParty") . '"></span></a>';
		print '</td>';
	}
	print '</tr>' . "\n";

?>
	</tr>

	<tr>
		<td class="fieldrequired" name="fk_adresse">Adresse de livraison / Intervention</td>
		<?php
		$key = "fk_adresse";
		$val = $object->fields[$key];

		print '<td>';

		if ($socid > 0) {
			// Contacts (ask contact only if thirdparty already defined).
			$form->select_contacts($socid, $val, 'fk_adresse', 1, $srccontactslist);
			print '<a href="/dolibarr-13.0.4/htdocs/contact/card.php?socid=' . $socid . '&amp;action=create&amp;backtopage=' . urlencode($_SERVER["PHP_SELF"] . '?action=create') . '" title="Créer contact/adresse"><span class="fa fa-plus-circle valignmiddle"></span></a>';
			print '</td></tr>';
		}

		?>
	</tr>

Le code javascript permet de recharger la page et de « fixer le tiers » pour pouvoir aller chercher ses informations. On peut donc ensuite recuperer le contact lié au tiers préselectionné (si il est défini préalablement avant).
Le resultat en image : image

N’oubliez pas de renseigner la valeur de « socid » au debut de votre fichier (myObject_card.php) comme ceci sinon cela ne fonctionnera pas.

// Get parameters
$socid = GETPOST('socid', 'int');

Cela est une solution pour la saisie rapide dans les formulaires !

1 « J'aime »