From 02dbe1636654546b93d06dd0023eebdcf9ce52ca Mon Sep 17 00:00:00 2001
From: Laurent Destailleur <eldy@destailleur.fr>
Date: Sat, 6 Jun 2015 15:57:59 +0200
Subject: [PATCH] Mutualize code to show block to link an element to another
 one.

---
 dev/skeletons/skeleton_page.php       |   3 +-
 htdocs/comm/askpricesupplier/card.php |   8 +-
 htdocs/comm/propal.php                |   9 +-
 htdocs/commande/card.php              |   9 +-
 htdocs/compta/facture.php             |  71 +-----------
 htdocs/contrat/card.php               |  11 +-
 htdocs/core/class/html.form.class.php | 153 ++++++++++++++++++++++++++
 htdocs/expedition/card.php            |  10 +-
 htdocs/fichinter/card.php             |  14 +--
 htdocs/fourn/commande/card.php        |  11 +-
 htdocs/fourn/facture/card.php         |  76 +------------
 htdocs/livraison/card.php             |   8 +-
 12 files changed, 211 insertions(+), 172 deletions(-)

diff --git a/dev/skeletons/skeleton_page.php b/dev/skeletons/skeleton_page.php
index 482208e8ab1..9e6d76ee6d8 100644
--- a/dev/skeletons/skeleton_page.php
+++ b/dev/skeletons/skeleton_page.php
@@ -352,8 +352,9 @@ if ($id && (empty($action) || $action == 'view'))
 
 
 	// Example 2 : Adding links to objects
-	// The class must extends CommonObject class to have this method available
 	//$somethingshown=$form->showLinkedObjectBlock($object);
+	//$linktoelem = $form->showLinkToObjectBlock($object);
+	//if ($linktoelem) print '<br>'.$linktoelem;
 
 }
 
diff --git a/htdocs/comm/askpricesupplier/card.php b/htdocs/comm/askpricesupplier/card.php
index 939d874a0f2..72654ac3da4 100644
--- a/htdocs/comm/askpricesupplier/card.php
+++ b/htdocs/comm/askpricesupplier/card.php
@@ -1709,11 +1709,13 @@ if ($action == 'create')
 
 		$somethingshown = $formfile->show_documents('askpricesupplier', $filename, $filedir, $urlsource, $genallowed, $delallowed, $object->modelpdf, 1, 0, 0, 28, 0, '', 0, '', $soc->default_lang);
 
-		/*
-		 * Linked object block
-		*/
+		// Linked object block
 		$somethingshown = $form->showLinkedObjectBlock($object);
 
+		// Show links to link elements
+		//$linktoelem = $form->showLinkToObjectBlock($object);
+		//if ($linktoelem) print '<br>'.$linktoelem;
+
 		print '</div><div class="fichehalfright"><div class="ficheaddleft">';
 
 		// List of actions on element
diff --git a/htdocs/comm/propal.php b/htdocs/comm/propal.php
index ccdcd850493..f686109d015 100644
--- a/htdocs/comm/propal.php
+++ b/htdocs/comm/propal.php
@@ -2307,11 +2307,14 @@ if ($action == 'create')
 
 		$somethingshown = $formfile->show_documents('propal', $filename, $filedir, $urlsource, $genallowed, $delallowed, $object->modelpdf, 1, 0, 0, 28, 0, '', 0, '', $soc->default_lang);
 
-		/*
-		 * Linked object block
-		*/
+		// Linked object block
 		$somethingshown = $form->showLinkedObjectBlock($object);
 
+		// Show links to link elements
+		$linktoelem = $form->showLinkToObjectBlock($object);
+		if ($linktoelem) print '<br>'.$linktoelem;
+
+
 		print '</div><div class="fichehalfright"><div class="ficheaddleft">';
 		// print '</td><td valign="top" width="50%">';
 
diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php
index 04ea05d3f5d..84718e7dc89 100644
--- a/htdocs/commande/card.php
+++ b/htdocs/commande/card.php
@@ -2305,11 +2305,14 @@ if ($action == 'create' && $user->rights->commande->creer)
 			$delallowed = $user->rights->commande->supprimer;
 			$somethingshown = $formfile->show_documents('commande', $comref, $filedir, $urlsource, $genallowed, $delallowed, $object->modelpdf, 1, 0, 0, 28, 0, '', '', '', $soc->default_lang);
 
-			/*
-			 * Linked object block
-			 */
+			// Linked object block
 			$somethingshown = $form->showLinkedObjectBlock($object);
 
+			// Show links to link elements
+			//$linktoelem = $form->showLinkToObjectBlock($object);
+			//if ($linktoelem) print '<br>'.$linktoelem;
+
+
 			print '</div><div class="fichehalfright"><div class="ficheaddleft">';
 			// print '</td><td valign="top" width="50%">';
 
diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php
index a73a1de3607..041bb42633f 100644
--- a/htdocs/compta/facture.php
+++ b/htdocs/compta/facture.php
@@ -3778,75 +3778,8 @@ if ($action == 'create')
 		// Linked object block
 		$somethingshown = $form->showLinkedObjectBlock($object);
 
-		$linktoelem='';
-
-		if (! empty($conf->commande->enabled))
-		{
-			$linktoelem.=($linktoelem?' &nbsp; ':'').'<a href="#" id="linktoorder">' . $langs->trans('LinkedOrder') . '</a>';
-
-			print '
-				<script type="text/javascript" language="javascript">
-				jQuery(document).ready(function() {
-					jQuery("#linktoorder").click(function() {
-						jQuery("#orderlist").toggle();
-						jQuery("#linktoorder").toggle();
-					});
-				});
-				</script>
-				';
-
-			print '<div id="orderlist" style="display:none">';
-
-			$sql = "SELECT s.rowid as socid, s.nom as name, s.client, c.rowid, c.ref, c.ref_client, c.total_ht";
-			$sql .= " FROM " . MAIN_DB_PREFIX . "societe as s";
-			$sql .= ", " . MAIN_DB_PREFIX . "commande as c";
-			$sql .= ' WHERE c.fk_soc = s.rowid AND c.fk_soc = ' . $soc->id . '';
-
-			$resqlorderlist = $db->query($sql);
-			if ($resqlorderlist)
-			{
-				$num = $db->num_rows($resqlorderlist);
-				$i = 0;
-
-				print '<br><form action="" method="POST" name="LinkedOrder">';
-				print '<table class="noborder">';
-				print '<tr class="liste_titre">';
-				print '<td class="nowrap"></td>';
-				print '<td align="center">' . $langs->trans("Ref") . '</td>';
-				print '<td align="left">' . $langs->trans("RefCustomer") . '</td>';
-				print '<td align="left">' . $langs->trans("AmountHTShort") . '</td>';
-				print '<td align="left">' . $langs->trans("Company") . '</td>';
-				print '</tr>';
-				while ($i < $num)
-				{
-					$objp = $db->fetch_object($resqlorderlist);
-					if ($objp->socid == $soc->id) {
-						$var = ! $var;
-						print '<tr ' . $bc [$var] . '>';
-						print '<td aling="left">';
-						print '<input type="radio" name="linkedOrder" value=' . $objp->rowid . '>';
-						print '<td align="center">' . $objp->ref . '</td>';
-						print '<td>' . $objp->ref_client . '</td>';
-						print '<td>' . price($objp->total_ht) . '</td>';
-						print '<td>' . $objp->name . '</td>';
-						print '</td>';
-						print '</tr>';
-					}
-
-					$i ++;
-				}
-				print '</table>';
-				print '<div class="center"><input type="submit" class="button" value="' . $langs->trans('ToLink') . '">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="submit" class="button" name="cancel" value="' . $langs->trans('Cancel') . '"></div>';
-				print '</form>';
-				$db->free($resqlorderlist);
-			} else {
-				dol_print_error($db);
-			}
-
-			print '</div>';
-		}
-
-		// Show link to elements
+		// Show links to link elements
+		$linktoelem = $form->showLinkToObjectBlock($object,array('order'));
 		if ($linktoelem) print '<br>'.$linktoelem;
 
 		// Link for paypal payment
diff --git a/htdocs/contrat/card.php b/htdocs/contrat/card.php
index 3df24e4e667..6bf7dcaeacc 100644
--- a/htdocs/contrat/card.php
+++ b/htdocs/contrat/card.php
@@ -1871,10 +1871,13 @@ else
 
         $somethingshown = $formfile->show_documents('contract', $filename, $filedir, $urlsource, $genallowed, $delallowed, $object->modelpdf, 1, 0, 0, 28, 0, '', 0, '', $soc->default_lang);
 
-        /*
-         * Linked object block
-         */
-        $somethingshown=$form->showLinkedObjectBlock($object);
+		// Linked object block
+		$somethingshown = $form->showLinkedObjectBlock($object);
+
+		// Show links to link elements
+		$linktoelem = $form->showLinkToObjectBlock($object);
+		if ($linktoelem) print '<br>'.$linktoelem;
+
 
         print '</div><div class="fichehalfright"><div class="ficheaddleft">';
 
diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php
index be0d2656ec2..cef6d9a0ae4 100644
--- a/htdocs/core/class/html.form.class.php
+++ b/htdocs/core/class/html.form.class.php
@@ -4712,6 +4712,159 @@ class Form
         }
     }
 
+    /**
+     *  Show block with links to link to other objects.
+     *
+     *  @param	CommonObject	$object				Object we want to show links to
+     *  @param	Societe			$thirdparty			Object thirdparty
+     *  @param	array			$restrictlinksto	Restrict links to some elements, for exemple array('order') or array('supplier_order')
+     *  @return	int									<0 if KO, >0 if OK
+     */
+    function showLinkToObjectBlock($object, $restrictlinksto=array())
+    {
+        global $conf, $langs, $hookmanager;
+        global $bc;
+
+		$linktoelem='';
+
+		if (! is_object($object->thirdparty)) $object->fetch_thirdparty();
+
+
+		if (((! is_array($restrictlinksto)) || in_array('order',$restrictlinksto))
+			&& ! empty($conf->commande->enabled))
+		{
+			$linktoelem.=($linktoelem?' &nbsp; ':'').'<a href="#" id="linktoorder">' . $langs->trans('LinkedOrder') . '</a>';
+
+			print '
+				<script type="text/javascript" language="javascript">
+				jQuery(document).ready(function() {
+					jQuery("#linktoorder").click(function() {
+						jQuery("#orderlist").toggle();
+						jQuery("#linktoorder").toggle();
+					});
+				});
+				</script>
+				';
+
+			print '<div id="orderlist"'.(empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)?' style="display:none"':'').'>';
+
+			$sql = "SELECT s.rowid as socid, s.nom as name, s.client, c.rowid, c.ref, c.ref_client, c.total_ht";
+			$sql .= " FROM " . MAIN_DB_PREFIX . "societe as s";
+			$sql .= ", " . MAIN_DB_PREFIX . "commande as c";
+			$sql .= ' WHERE c.fk_soc = s.rowid AND c.fk_soc = ' . $object->thirdparty->id . '';
+
+			$resqlorderlist = $this->db->query($sql);
+			if ($resqlorderlist)
+			{
+				$num = $this->db->num_rows($resqlorderlist);
+				$i = 0;
+
+				print '<br><form action="" method="POST" name="LinkedOrder">';
+				print '<table class="noborder">';
+				print '<tr class="liste_titre">';
+				print '<td class="nowrap"></td>';
+				print '<td align="center">' . $langs->trans("Ref") . '</td>';
+				print '<td align="left">' . $langs->trans("RefCustomer") . '</td>';
+				print '<td align="left">' . $langs->trans("AmountHTShort") . '</td>';
+				print '<td align="left">' . $langs->trans("Company") . '</td>';
+				print '</tr>';
+				while ($i < $num)
+				{
+					$objp = $this->db->fetch_object($resqlorderlist);
+
+					$var = ! $var;
+					print '<tr ' . $bc [$var] . '>';
+					print '<td aling="left">';
+					print '<input type="radio" name="linkedOrder" value=' . $objp->rowid . '>';
+					print '<td align="center">' . $objp->ref . '</td>';
+					print '<td>' . $objp->ref_client . '</td>';
+					print '<td>' . price($objp->total_ht) . '</td>';
+					print '<td>' . $objp->name . '</td>';
+					print '</td>';
+					print '</tr>';
+
+					$i ++;
+				}
+				print '</table>';
+				print '<div class="center"><input type="submit" class="button" value="' . $langs->trans('ToLink') . '">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="submit" class="button" name="cancel" value="' . $langs->trans('Cancel') . '"></div>';
+				print '</form>';
+				$this->db->free($resqlorderlist);
+			} else {
+				dol_print_error($this->db);
+			}
+
+			print '</div>';
+		}
+
+		if (((! is_array($restrictlinksto)) || in_array('supplier_order',$restrictlinksto))
+			&& ! empty($conf->fournisseur->enabled))
+		{
+			$linktoelem.=($linktoelem?' &nbsp; ':'').'<a href="#" id="linktoorder">' . $langs->trans('LinkedOrder') . '</a>';
+
+			print '
+			<script type="text/javascript" language="javascript">
+			jQuery(document).ready(function() {
+				jQuery("#linktoorder").click(function() {
+					jQuery("#orderlist").toggle();
+					jQuery("#linktoorder").toggle();
+				});
+			});
+			</script>
+			';
+
+			print '<div id="orderlist"'.(empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)?' style="display:none"':'').'>';
+
+			$sql = "SELECT s.rowid as socid, s.nom as name, s.client, c.rowid, c.ref, c.ref_supplier, c.total_ht";
+			$sql .= " FROM " . MAIN_DB_PREFIX . "societe as s";
+			$sql .= ", " . MAIN_DB_PREFIX . "commande_fournisseur as c";
+			$sql .= ' WHERE c.fk_soc = s.rowid AND c.fk_soc = ' . $object->thirdparty->id;
+
+			$resqlorderlist = $this->db->query($sql);
+			if ($resqlorderlist)
+			{
+				$num = $this->db->num_rows($resqlorderlist);
+				$i = 0;
+
+				print '<br><form action="" method="POST" name="LinkedOrder">';
+				print '<table class="noborder">';
+				print '<tr class="liste_titre">';
+				print '<td class="nowrap"></td>';
+				print '<td align="center">' . $langs->trans("Ref") . '</td>';
+				print '<td align="left">' . $langs->trans("RefSupplier") . '</td>';
+				print '<td align="left">' . $langs->trans("AmountHTShort") . '</td>';
+				print '<td align="left">' . $langs->trans("Company") . '</td>';
+				print '</tr>';
+				while ($i < $num) {
+					$objp = $this->db->fetch_object($resqlorderlist);
+					if ($objp->socid == $societe->id) {
+						$var = ! $var;
+						print '<tr ' . $bc [$var] . '>';
+						print '<td aling="left">';
+						print '<input type="radio" name="linkedOrder" value=' . $objp->rowid . '>';
+						print '<td align="center">' . $objp->ref . '</td>';
+						print '<td>' . $objp->ref_supplier . '</td>';
+						print '<td>' . price($objp->total_ht) . '</td>';
+						print '<td>' . $objp->name . '</td>';
+						print '</td>';
+						print '</tr>';
+					}
+
+					$i ++;
+				}
+				print '</table>';
+				print '<br><div class="center"><input type="submit" class="button" value="' . $langs->trans('ToLink') . '"> &nbsp; <input type="submit" class="button" name="cancel" value="' . $langs->trans('Cancel') . '"></div>';
+				print '</form>';
+				$this->db->free($resqlorderlist);
+			} else {
+				dol_print_error($this->db);
+			}
+
+			print '</div>';
+		}
+
+
+		return $linktoelem;
+    }
 
     /**
      *	Return an html string with a select combo box to choose yes or no
diff --git a/htdocs/expedition/card.php b/htdocs/expedition/card.php
index 85380907bbf..344e17166ad 100644
--- a/htdocs/expedition/card.php
+++ b/htdocs/expedition/card.php
@@ -1502,12 +1502,12 @@ else if ($id || $ref)
 
 		$somethingshown=$formfile->show_documents('expedition',$objectref,$filedir,$urlsource,$genallowed,$delallowed,$object->modelpdf,1,0,0,28,0,'','','',$soc->default_lang);
 
-		/*
-		 * Linked object block
-		*/
-		$somethingshown=$form->showLinkedObjectBlock($object);
+		// Linked object block
+		$somethingshown = $form->showLinkedObjectBlock($object);
 
-		if ($genallowed && ! $somethingshown) $somethingshown=1;
+		// Show links to link elements
+		//$linktoelem = $form->showLinkToObjectBlock($object);
+		//if ($linktoelem) print '<br>'.$linktoelem;
 
 		print '</td><td valign="top" width="50%">';
 
diff --git a/htdocs/fichinter/card.php b/htdocs/fichinter/card.php
index ad224ab9fe2..9b8e7d9a6a8 100644
--- a/htdocs/fichinter/card.php
+++ b/htdocs/fichinter/card.php
@@ -1701,7 +1701,6 @@ else if ($id > 0 || ! empty($ref))
 	if ($action != 'presend')
 	{
 		print '<div class="fichecenter"><div class="fichehalfleft">';
-		//print '<table width="100%"><tr><td width="50%" valign="top">';
 
 		/*
 		 * Built documents
@@ -1719,12 +1718,14 @@ else if ($id > 0 || ! empty($ref))
 		//print "<br>\n";
 		$somethingshown=$formfile->show_documents('ficheinter',$filename,$filedir,$urlsource,$genallowed,$delallowed,$object->modelpdf,1,0,0,28,0,'','','',$soc->default_lang);
 
-		/*
-		 * Linked object block
-		*/
-		$somethingshown=$form->showLinkedObjectBlock($object);
+		// Linked object block
+		$somethingshown = $form->showLinkedObjectBlock($object);
+
+		// Show links to link elements
+		//$linktoelem = $form->showLinkToObjectBlock($object);
+		//if ($linktoelem) print '<br>'.$linktoelem;
+
 
-		//print '</td><td valign="top" width="50%">';
 		print '</div><div class="fichehalfright"><div class="ficheaddleft">';
 
 		// List of actions on element
@@ -1733,7 +1734,6 @@ else if ($id > 0 || ! empty($ref))
 		$somethingshown=$formactions->showactions($object,'fichinter',$socid);
 
 		print '</div></div></div>';
-		//print "</td></tr></table>\n";
 	}
 
 
diff --git a/htdocs/fourn/commande/card.php b/htdocs/fourn/commande/card.php
index 95442273495..b56bba0c4a5 100644
--- a/htdocs/fourn/commande/card.php
+++ b/htdocs/fourn/commande/card.php
@@ -2763,10 +2763,13 @@ elseif (! empty($object->id))
 		print $formfile->showdocuments('commande_fournisseur',$comfournref,$filedir,$urlsource,$genallowed,$delallowed,$object->modelpdf,1,0,0,0,0,'','','',$object->thirdparty->default_lang);
 		$somethingshown=$formfile->numoffiles;
 
-		/*
-		 * Linked object block
-		 */
-		$somethingshown=$form->showLinkedObjectBlock($object);
+		// Linked object block
+		$somethingshown = $form->showLinkedObjectBlock($object);
+
+		// Show links to link elements
+		//$linktoelem = $form->showLinkToObjectBlock($object);
+		//if ($linktoelem) print '<br>'.$linktoelem;
+
 
 		print '</div><div class="fichehalfright"><div class="ficheaddleft">';
 
diff --git a/htdocs/fourn/facture/card.php b/htdocs/fourn/facture/card.php
index e365f8a7070..2491c6eaff6 100644
--- a/htdocs/fourn/facture/card.php
+++ b/htdocs/fourn/facture/card.php
@@ -2412,80 +2412,14 @@ else
                 print $formfile->showdocuments('facture_fournisseur',$subdir,$filedir,$urlsource,$genallowed,$delallowed,$modelpdf,1,0,0,40,0,'','','',$societe->default_lang);
                 $somethingshown=$formfile->numoffiles;
 
-                /*
-                 * Linked object block
-                 */
-                $somethingshown=$form->showLinkedObjectBlock($object);
-
-                $linktoelem='';
-
-                if (empty($somethingshown) && ! empty($conf->fournisseur->enabled))
-                {
-                	$linktoelem.=($linktoelem?' &nbsp; ':'').'<a href="#" id="linktoorder">' . $langs->trans('LinkedOrder') . '</a>';
-
-                	print '
-						<script type="text/javascript" language="javascript">
-						jQuery(document).ready(function() {
-							jQuery("#linktoorder").click(function() {
-								jQuery("#orderlist").toggle();
-								jQuery("#linktoorder").toggle();
-                			});
-						});
-						</script>
-						';
-
-                	print '<div id="orderlist" style="display:none">';
-
-                	$sql = "SELECT s.rowid as socid, s.nom as name, s.client, c.rowid, c.ref, c.ref_supplier, c.total_ht";
-                	$sql .= " FROM " . MAIN_DB_PREFIX . "societe as s";
-                	$sql .= ", " . MAIN_DB_PREFIX . "commande_fournisseur as c";
-                	$sql .= ' WHERE c.fk_soc = s.rowid AND c.fk_soc = ' . $societe->id;
-
-                	$resqlorderlist = $db->query($sql);
-                	if ($resqlorderlist) {
-                		$num = $db->num_rows($resqlorderlist);
-                		$i = 0;
-
-                		print '<br><form action="" method="POST" name="LinkedOrder">';
-                		print '<table class="noborder">';
-                		print '<tr class="liste_titre">';
-                		print '<td class="nowrap"></td>';
-                		print '<td align="center">' . $langs->trans("Ref") . '</td>';
-                		print '<td align="left">' . $langs->trans("RefSupplier") . '</td>';
-                		print '<td align="left">' . $langs->trans("AmountHTShort") . '</td>';
-                		print '<td align="left">' . $langs->trans("Company") . '</td>';
-                		print '</tr>';
-                		while ($i < $num) {
-                			$objp = $db->fetch_object($resqlorderlist);
-                			if ($objp->socid == $societe->id) {
-                				$var = ! $var;
-                				print '<tr ' . $bc [$var] . '>';
-                				print '<td aling="left">';
-                				print '<input type="radio" name="linkedOrder" value=' . $objp->rowid . '>';
-                				print '<td align="center">' . $objp->ref . '</td>';
-                				print '<td>' . $objp->ref_supplier . '</td>';
-                				print '<td>' . price($objp->total_ht) . '</td>';
-                				print '<td>' . $objp->name . '</td>';
-                				print '</td>';
-                				print '</tr>';
-                			}
-
-                			$i ++;
-                		}
-                		print '</table>';
-                		print '<br><div class="center"><input type="submit" class="button" value="' . $langs->trans('ToLink') . '"> &nbsp; <input type="submit" class="button" name="cancel" value="' . $langs->trans('Cancel') . '"></div>';
-                		print '</form>';
-                		$db->free($resqlorderlist);
-                	} else {
-                		dol_print_error($db);
-                	}
-
-                	print '</div>';
-                }
+				// Linked object block
+				$somethingshown = $form->showLinkedObjectBlock($object);
 
-				// Show link to elements
+				// Show links to link elements
+				$linktoelem = $form->showLinkToObjectBlock($object,array('supplier_order'));
 				if ($linktoelem) print '<br>'.$linktoelem;
 
+
 				print '</div><div class="fichehalfright"><div class="ficheaddleft">';
                 //print '</td><td valign="top" width="50%">';
                 //print '<br>';
diff --git a/htdocs/livraison/card.php b/htdocs/livraison/card.php
index 5e477d1926d..7ea9920d65b 100644
--- a/htdocs/livraison/card.php
+++ b/htdocs/livraison/card.php
@@ -788,10 +788,14 @@ else
 				$shipment = new Expedition($db);
 				$shipment->fetch($object->origin_id);
 
-				$somethingshown=$form->showLinkedObjectBlock($shipment);
+				// Linked object block
+				$somethingshown = $form->showLinkedObjectBlock($shipment);
+
+				// Show links to link elements
+				//$linktoelem = $form->showLinkToObjectBlock($shipment);
+				//if ($linktoelem) print '<br>'.$linktoelem;
 			}
 
-			if ($genallowed && ! $somethingshown) $somethingshown=1;
 
 			print '</td><td valign="top" width="50%">';
 
-- 
GitLab