Look: Meilleur comportement des formulaires ajax qui ne "bouge plus".

This commit is contained in:
Laurent Destailleur 2007-05-25 23:24:21 +00:00
parent b3fdf3e836
commit 4f383835f4
11 changed files with 151 additions and 137 deletions

View File

@ -1349,7 +1349,7 @@ if ($_GET['propalid'] > 0)
$var=true;
print '<tr '.$bc[$var].">\n";
print '<td><textarea cols="70" name="np_desc" rows="'.ROWS_2.'"></textarea></td>';
print '<td><textarea class="flat" cols="70" name="np_desc" rows="'.ROWS_2.'"></textarea></td>';
print '<td align="center">';
if($societe->tva_assuj == "0")
{
@ -1389,7 +1389,7 @@ if ($_GET['propalid'] > 0)
$html->select_produits('','idprod','',$conf->produit->limit_size);
}
if (! $conf->global->PRODUIT_USE_SEARCH_TO_SELECT) print '<br>';
print '<textarea cols="70" name="np_desc" rows="'.ROWS_2.'"></textarea>';
print '<textarea cols="70" name="np_desc" rows="'.ROWS_2.'" class="flat"></textarea>';
print '</td>';
print '<td>&nbsp;</td>';
print '<td align="right"><input type="text" size="2" name="qty" value="1"></td>';

View File

@ -818,60 +818,72 @@ class Form
global $langs,$conf;
if ($conf->global->PRODUIT_USE_SEARCH_TO_SELECT)
{
print $langs->trans("RefOrLabel").' : <input type="text" size="16" name="keysearch'.$htmlname.'" id="keysearch'.$htmlname.'">';
print ajax_updater($htmlname,'keysearch','/product/ajaxproducts.php','&price_level='.$price_level.'&type=1','working');
}
print '<table class="nobordernopadding"><tr class="nocellnopadd">';
print '<td class="nobordernopadding" width="30" nowrap="nowrap">';
print $langs->trans("RefOrLabel").':</td>';
print '<td class="nobordernopadding" align="left" width="16">';
print ajax_updater_indicator($htmlname,'working');
print '</td>';
print '<td><input type="text" size="16" name="keysearch'.$htmlname.'" id="keysearch'.$htmlname.'">';
print '</td>';
print '</tr>';
print '<tr class="nocellnopadd">';
print '<td class="nobordernopadding" colspan="3">';
print ajax_updater($htmlname,'keysearch','/product/ajaxproducts.php','&price_level='.$price_level.'&type=1','');
print '</td></tr>';
print '</table>';
}
else
{
$this->select_produits_do($selected,$htmlname,$filtretype,$limit,$price_level);
}
}
/**
\brief Retourne la liste des produits
\param selected Produit présélectionné
\param htmlname Nom de la zone select
\param filtretype Pour filtre sur type de produit
\param limit Limite sur le nombre de lignes retournées
\param price_level Niveau de prix en fonction du client
\param ajaxkeysearch Filtre des produits si ajax est utilisé
*/
function select_produits_do($selected='',$htmlname='productid',$filtretype='',$limit=20,$price_level=0,$ajaxkeysearch='')
{
global $langs,$conf,$user;
$user->getrights("categorie");
$sql = "SELECT ";
if ($conf->categorie->enabled && ! $user->rights->categorie->voir)
{
$sql.="DISTINCT";
}
$sql.= " p.rowid, p.label, p.ref, p.price, p.duration";
$sql.= " FROM ".MAIN_DB_PREFIX."product as p ";
if ($conf->categorie->enabled && ! $user->rights->categorie->voir)
{
$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."categorie_product as cp ON p.rowid = cp.fk_product";
$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."categorie as c ON cp.fk_categorie = c.rowid";
}
$sql.= " WHERE p.envente = 1";
if ($conf->categorie->enabled && ! $user->rights->categorie->voir)
{
$sql.= ' AND IFNULL(c.visible,1)=1';
}
if ($filtretype && $filtretype != '') $sql.=" AND p.fk_product_type=".$filtretype;
if ($ajaxkeysearch && $ajaxkeysearch != '') $sql.=" AND p.ref like '%".$ajaxkeysearch."%' OR p.label like '%".$ajaxkeysearch."%'";
$sql.= " ORDER BY p.nbvente DESC";
if ($limit) $sql.= " LIMIT $limit";
dolibarr_syslog("Form::select_produits_do sql=$sql",LOG_DEBUG);
/**
\brief Retourne la liste des produits
\param selected Produit présélectionné
\param htmlname Nom de la zone select
\param filtretype Pour filtre sur type de produit
\param limit Limite sur le nombre de lignes retournées
\param price_level Niveau de prix en fonction du client
\param ajaxkeysearch Filtre des produits si ajax est utilisé
*/
function select_produits_do($selected='',$htmlname='productid',$filtretype='',$limit=20,$price_level=0,$ajaxkeysearch='')
{
global $langs,$conf,$user;
$user->getrights("categorie");
$sql = "SELECT ";
if ($conf->categorie->enabled && ! $user->rights->categorie->voir)
{
$sql.="DISTINCT";
}
$sql.= " p.rowid, p.label, p.ref, p.price, p.duration";
$sql.= " FROM ".MAIN_DB_PREFIX."product as p ";
if ($conf->categorie->enabled && ! $user->rights->categorie->voir)
{
$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."categorie_product as cp ON p.rowid = cp.fk_product";
$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."categorie as c ON cp.fk_categorie = c.rowid";
}
$sql.= " WHERE p.envente = 1";
if ($conf->categorie->enabled && ! $user->rights->categorie->voir)
{
$sql.= ' AND IFNULL(c.visible,1)=1';
}
if ($filtretype && $filtretype != '') $sql.=" AND p.fk_product_type=".$filtretype;
if ($ajaxkeysearch && $ajaxkeysearch != '') $sql.=" AND p.ref like '%".$ajaxkeysearch."%' OR p.label like '%".$ajaxkeysearch."%'";
$sql.= " ORDER BY p.nbvente DESC";
if ($limit) $sql.= " LIMIT $limit";
dolibarr_syslog("Form::select_produits_do sql=$sql",LOG_DEBUG);
$result=$this->db->query($sql);
if (! $result) dolibarr_print_error($this->db);
// Multilang : on construit une liste des traductions des produits listés
if ($conf->global->MAIN_MULTILANGS)
{
$sqld = "SELECT d.fk_product, d.label";
$result=$this->db->query($sql);
if (! $result) dolibarr_print_error($this->db);
// Multilang : on construit une liste des traductions des produits listés
if ($conf->global->MAIN_MULTILANGS)
{
$sqld = "SELECT d.fk_product, d.label";
$sqld.= " FROM ".MAIN_DB_PREFIX."product as p, ".MAIN_DB_PREFIX."product_det as d ";
$sqld.= " WHERE d.fk_product=p.rowid AND p.envente=1 AND d.lang='". $langs->getDefaultLang() ."'";
$sqld.= " ORDER BY p.nbvente DESC";
@ -893,20 +905,20 @@ class Form
else
{
print '<select class="flat" name="'.$htmlname.'" onchange="publish_selvalue(this);">';
print '<option value="0" selected="true">-- '.$langs->trans("MatchingProducts").' --</option>';
print '<option value="0" selected="true">-- '.$langs->trans("MatchingProducts").' --</option>';
}
}
else
{
print '<select class="flat" name="'.$htmlname.'">';
print '<option value="0" selected="true">&nbsp;</option>';
}
$i = 0;
while ($num && $i < $num)
{
$objp = $this->db->fetch_object($result);
print '<option value="0" selected="true">&nbsp;</option>';
}
$i = 0;
while ($num && $i < $num)
{
$objp = $this->db->fetch_object($result);
// Multilangs : modification des donnée si une traduction existe
if ($conf->global->MAIN_MULTILANGS)
{
@ -918,24 +930,24 @@ class Form
}
$opt = '<option value="'.$objp->rowid.'">'.$objp->ref.' - ';
$opt.= dolibarr_trunc($objp->label,32).' - ';
// Multiprix
if ($price_level > 1)
{
$sql= "SELECT price ";
$sql.= "FROM ".MAIN_DB_PREFIX."product_price ";
$sql.= "where fk_product='".$objp->rowid."' and price_level=".$price_level;
$sql.= " order by date_price DESC limit 1";
$result2 = $this->db->query($sql) ;
$objp2 = $this->db->fetch_object($result2);
if ($objp2->price)
{
$opt.= $objp2->price.' '.$langs->trans("Currency".$conf->monnaie);
}
else
{
$opt.= $objp->price.' '.$langs->trans("Currency".$conf->monnaie);
}
$sql= "SELECT price ";
$sql.= "FROM ".MAIN_DB_PREFIX."product_price ";
$sql.= "where fk_product='".$objp->rowid."' and price_level=".$price_level;
$sql.= " order by date_price DESC limit 1";
$result2 = $this->db->query($sql) ;
$objp2 = $this->db->fetch_object($result2);
if ($objp2->price)
{
$opt.= $objp2->price.' '.$langs->trans("Currency".$conf->monnaie);
}
else
{
$opt.= $objp->price.' '.$langs->trans("Currency".$conf->monnaie);
}
}
else
{
@ -945,19 +957,19 @@ class Form
if ($objp->duration) $opt.= ' - '.$objp->duration;
$opt.= "</option>\n";
print $opt;
$i++;
}
print '</select>';
$this->db->free($result);
}
else
{
dolibarr_print_error($db);
}
}
print $opt;
$i++;
}
print '</select>';
$this->db->free($result);
}
else
{
dolibarr_print_error($db);
}
}
/**
\brief Retourne la liste des produits fournisseurs en Ajax si ajax activé ou renvoie à select_produits_fournisseurs_do

View File

@ -100,19 +100,18 @@ $bc[true]=' class="bg2"';
function pHeader($soutitre,$next,$action='set')
{
global $charset;
global $conf;
global $langs;
$langs->load("main");
$langs->load("admin");
// On force contenu en ISO-8859-1
header("Content-type: text/html; charset=".$charset);
//header("Content-type: text/html; charset=UTF-8");
// On force contenu dans format sortie
header("Content-type: text/html; charset=".$conf->character_set_client);
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">'."\n";
print '<html>';
print '<head>';
print '<meta http-equiv="content-type" content="text/html; charset='.$charset.'">';
print '<meta http-equiv="content-type" content="text/html; charset='.$conf->character_set_client.'">';
print '<link rel="stylesheet" type="text/css" href="./default.css">';
print '<title>'.$langs->trans("DolibarrSetup").'</title>';
print '</head>';

View File

@ -322,7 +322,7 @@ class CMailFile
$out.= "--" . $this->mime_boundary . $this->eol;
if ($this->msgishtml)
{
$out.= "Content-Type: text/html; charset=iso-8859-1".$this->eol;
$out.= "Content-Type: text/html; charset=".$conf->charset_output.$this->eol;
}
$out.= $this->eol;
}

View File

@ -2638,21 +2638,27 @@ function num_lines($texte)
return $nblines;
}
function ajax_updater_indicator($htmlname,$indicator='working')
{
$script.='<span id="indicator'.$htmlname.'" style="display: none">'.img_gif('Working...',$indicator).'</span>';
return $script;
}
/**
\brief Récupère la valeur d'un champ, effectue un traitement Ajax et affiche le résultat
\param htmlname nom et id du champ
\param htmlname nom et id du champ
\param keysearch nom et id complémentaire du champ de collecte
\param url chemin du fichier de réponse : /chemin/fichier.php
\param url chemin du fichier de réponse : /chemin/fichier.php
\param option champ supplémentaire de recherche dans les paramètres
\param indicator nom de l'image gif sans l'extension
\param indicator Nom de l'image gif sans l'extension
\return script script complet
*/
function ajax_updater($htmlname,$keysearch,$url,$option='',$indicator='working')
{
$script = '<input type="hidden" name="'.$htmlname.'" id="'.$htmlname.'" value="">';
$script.= '<span id="indicator'.$htmlname.'" style="display: none">'.img_gif('Working...',$indicator).'</span>';
$script.= '<script type="text/javascript">';
$script.= 'var myIndicator'.$htmlname.' = {
$script='';
if ($indicator) $script.=ajax_updater_indicator($htmlname,$indicator);
$script.='<script type="text/javascript">';
$script.='var myIndicator'.$htmlname.' = {
onCreate: function(){
if($F("'.$keysearch.$htmlname.'")){
Element.show(\'indicator'.$htmlname.'\');
@ -2665,20 +2671,21 @@ function ajax_updater($htmlname,$keysearch,$url,$option='',$indicator='working')
}
}
};';
$script.= 'Ajax.Responders.register(myIndicator'.$htmlname.');';
$script.= 'new Form.Element.Observer($("'.$keysearch.$htmlname.'"), 1,
function(){
var myAjax = new Ajax.Updater( {
success: \'ajdynfield'.$htmlname.'\'},
\''.DOL_URL_ROOT.$url.'\', {
method: \'get\',
parameters: "'.$keysearch.'="+$F("'.$keysearch.$htmlname.'")+"&htmlname='.$htmlname.$option.'"
});
});';
$script.= '</script>';
$script.= '<div class="notopnoleftnoright" id="ajdynfield'.$htmlname.'"></div>';
$script.='Ajax.Responders.register(myIndicator'.$htmlname.');';
$script.='new Form.Element.Observer($("'.$keysearch.$htmlname.'"), 1,
function(){
var myAjax = new Ajax.Updater( {
success: \'ajdynfield'.$htmlname.'\'},
\''.DOL_URL_ROOT.$url.'\', {
method: \'get\',
parameters: "'.$keysearch.'="+$F("'.$keysearch.$htmlname.'")+"&htmlname='.$htmlname.$option.'"
});
});';
$script.='</script>';
$script.='<div class="nocellnopadd" id="ajdynfield'.$htmlname.'"></div>';
$script.='<input type="hidden" name="'.$htmlname.'" id="'.$htmlname.'" value="">';
return $script;
return $script;
}
/**

View File

@ -521,11 +521,11 @@ else
/**
* \brief Affiche en-tete HTML
* \param head lignes d'en-tete head
* \param title titre page web
* \param target target du menu Accueil
* \param head Lignes d'en-tete head optionnelles
* \param title Titre page web
* \param disablejs N'affiche pas les liens vers les js (Ex: qd fonction utilisée par sous formulaire Ajax)
*/
function top_htmlhead($head, $title="", $target="")
function top_htmlhead($head, $title='', $disablejs=0)
{
global $user, $conf, $langs, $db, $micro_start_time;
@ -536,10 +536,10 @@ function top_htmlhead($head, $title="", $target="")
if (! $conf->css) $conf->css ='/theme/eldy/eldy.css.php';
//header("Content-type: text/html; charset=UTF-8");
header("Content-type: text/html; charset=".$_SESSION['charset']);
header("Content-type: text/html; charset=".$conf->character_set_client);
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">';
// print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd>';
//print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd>';
print "\n";
print "<html>\n";
print "<head>\n";
@ -549,10 +549,10 @@ function top_htmlhead($head, $title="", $target="")
// Affiche meta
print '<meta name="robots" content="noindex,nofollow">'."\n"; // Evite indexation par robots
print '<meta name="author" content="'.$langs->trans("DevelopmentTeam").'">'."\n";
print '<meta name="author" content="DevelopmentTeam">'."\n";
// Affiche title
if (strlen($title) > 0)
if ($title)
{
print '<title>Dolibarr - '.$title.'</title>';
}
@ -574,20 +574,22 @@ function top_htmlhead($head, $title="", $target="")
print '<link rel="stylesheet" type="text/css" media="print" HREF="'.DOL_URL_ROOT.'/theme/print.css">'."\n";
// Definition en alternate style sheet des feuilles de styles les plus maintenues
// Les navigateurs qui supportent sont rares.
// Les navigateurs qui supportent sont rares. Plus aucun connu.
/*
print '<link rel="alternate stylesheet" type="text/css" title="Eldy" href="'.DOL_URL_ROOT.'/theme/eldy/eldy.css.php">'."\n";
print '<link rel="alternate stylesheet" type="text/css" title="Freelug" href="'.DOL_URL_ROOT.'/theme/freelug/freelug.css.php">'."\n";
print '<link rel="alternate stylesheet" type="text/css" title="Yellow" href="'.DOL_URL_ROOT.'/theme/yellow/yellow.css">'."\n";
*/
print '<link rel="top" title="'.$langs->trans("Home").'" href="'.DOL_URL_ROOT.'/">'."\n";
print '<link rel="copyright" title="GNU General Public License" href="http://www.gnu.org/copyleft/gpl.html#SEC1">'."\n";
print '<link rel="author" title="'.$langs->trans("DevelopmentTeam").'" href="http://www.dolibarr.org">'."\n";
if ($conf->use_javascript || $conf->use_ajax)
if (! $disablejs && ($conf->use_javascript || $conf->use_ajax))
{
print '<script language="javascript" type="text/javascript" src="'.DOL_URL_ROOT.'/lib/lib_head.js"></script>'."\n";
}
if ($conf->use_ajax)
if (! $disablejs && $conf->use_ajax)
{
print '<script language="javascript" type="text/javascript" src="'.DOL_URL_ROOT.'/includes/scriptaculous/lib/prototype.js"></script>'."\n";
print '<script language="javascript" type="text/javascript" src="'.DOL_URL_ROOT.'/includes/scriptaculous/src/scriptaculous.js"></script>'."\n";

View File

@ -34,7 +34,7 @@ $langs->load("main");
top_htmlhead("", "", 1);
print '<body id="mainbody">'."\n";
print '<body class="nocellnopadd">'."\n";
// Generation liste de produits
if(isset($_GET['keysearch']) && !empty($_GET['keysearch']))

View File

@ -81,7 +81,7 @@ if ($user->societe_id > 0)
top_htmlhead("", $langs->trans("SearchTown"), "");
top_htmlhead("", $langs->trans("SearchTown"));
print "<body>";

View File

@ -26,13 +26,11 @@
\version $Revision$
*/
require('../master.inc.php');
require('../main.inc.php');
//header("Content-type: text/html; charset=UTF-8");
header("Content-type: text/html; charset=iso-8859-1");
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">';
print "\n<html>";
print "\n<body>";
top_htmlhead("", "", 1);
print '<body id="mainbody">';
// Generation liste des pays
if(isset($_POST['pays']) && !empty($_POST['pays']))

View File

@ -36,7 +36,7 @@ $WS_DOL_URL='http://ec.europa.eu/taxation_customs/vies/api/checkVatPort';
$WS_METHOD = 'checkVat';
top_htmlhead("", $langs->trans("VATIntraCheckableOnEUSite"), "");
top_htmlhead("", $langs->trans("VATIntraCheckableOnEUSite"));
print '<body style="margin: 10px">';
print '<div>';
print '<div>';

View File

@ -348,12 +348,9 @@ class Translate {
* [en] Send header and return a string of html start page
* \return string html header avec charset
*/
function lang_header()
{
//header("Content-Type: text/html; charset=$charset");
$texte = "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=".$this->charset_output."\">\n";
return $texte;
}
@ -364,7 +361,6 @@ class Translate {
* \param searchalt cherche aussi dans langue alternative
* \return boolean true si existe, false sinon
*/
function file_exists($filename,$searchalt=0)
{
// Test si fichier dans répertoire de la langue