From cdc40ca76fe9ae6692b3a9ece00924fe5dd8921c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Garci=CC=81a=20de=20La=20Fuente?= Date: Thu, 17 Jul 2014 21:12:50 +0200 Subject: [PATCH 01/37] Optimized is_ip dolibarr function --- htdocs/core/lib/functions2.lib.php | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/htdocs/core/lib/functions2.lib.php b/htdocs/core/lib/functions2.lib.php index 4e9598d5e20..3f13e6dccaa 100644 --- a/htdocs/core/lib/functions2.lib.php +++ b/htdocs/core/lib/functions2.lib.php @@ -2,6 +2,7 @@ /* Copyright (C) 2008-2011 Laurent Destailleur * Copyright (C) 2008-2012 Regis Houssin * Copyright (C) 2008 Raphael Bertrand (Resultic) + * Copyright (C) 2014 Marcos García * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -1370,13 +1371,18 @@ function getListOfModels($db,$type,$maxfilenamelength=0) */ function is_ip($ip) { - if (!preg_match("/^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/", $ip)) return 0; - if (sprintf("%u",ip2long($ip)) == sprintf("%u",ip2long('255.255.255.255'))) return 0; - if (sprintf("%u",ip2long('10.0.0.0')) <= sprintf("%u",ip2long($ip)) and sprintf("%u",ip2long($ip)) <= sprintf("%u",ip2long('10.255.255.255'))) return 2; - if (sprintf("%u",ip2long('172.16.0.0')) <= sprintf("%u",ip2long($ip)) and sprintf("%u",ip2long($ip)) <= sprintf("%u",ip2long('172.31.255.255'))) return 2; - if (sprintf("%u",ip2long('192.168.0.0')) <= sprintf("%u",ip2long($ip)) and sprintf("%u",ip2long($ip)) <= sprintf("%u",ip2long('192.168.255.255'))) return 2; - if (sprintf("%u",ip2long('169.254.0.0')) <= sprintf("%u",ip2long($ip)) and sprintf("%u",ip2long($ip)) <= sprintf("%u",ip2long('169.254.255.255'))) return 2; - return 1; + //First we test if it is a valid IPv4 + if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { + + //Then we test if it is not a private range + if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE)) { + return 1; + } + + return 2; + } + + return 0; } /** From 37d4d303b33d241ab54cc60bf22e6547dc4c54fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Garci=CC=81a=20de=20La=20Fuente?= Date: Thu, 17 Jul 2014 21:19:03 +0200 Subject: [PATCH 02/37] Updated is_ip comment and added a test for is_ip function --- htdocs/core/lib/functions2.lib.php | 6 ++---- test/phpunit/Functions2LibTest.php | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/htdocs/core/lib/functions2.lib.php b/htdocs/core/lib/functions2.lib.php index 3f13e6dccaa..294dbafa82e 100644 --- a/htdocs/core/lib/functions2.lib.php +++ b/htdocs/core/lib/functions2.lib.php @@ -1364,10 +1364,8 @@ function getListOfModels($db,$type,$maxfilenamelength=0) /** * This function evaluates a string that should be a valid IPv4 * - * @param string $ip IP Address - * @return It returns 0 if $ip is not a valid IPv4 - * It returns 1 if $ip is a valid IPv4 and is a public IP - * It returns 2 if $ip is a valid IPv4 and is a private lan IP + * @param string $ip IP Address + * @return int 0 if not valid, 1 if valid and public IP, 2 if valid and private range IP */ function is_ip($ip) { diff --git a/test/phpunit/Functions2LibTest.php b/test/phpunit/Functions2LibTest.php index 8e4bfe7550f..b59b9f3795c 100755 --- a/test/phpunit/Functions2LibTest.php +++ b/test/phpunit/Functions2LibTest.php @@ -154,4 +154,23 @@ class Functions2LibTest extends PHPUnit_Framework_TestCase $this->assertEquals(0,$result); } + /** + * is_ip + * + * @return void + */ + public function testIsIp() { + + //Test not valid IP + $result = is_ip('192.168.1.267'); + $this->assertEquals(0, $result); + + //Test private range IP + $result = is_ip('192.168.1.1'); + $this->assertEquals(2, $result); + + //Test public range IP + $result = is_ip('91.121.33.228'); + $this->assertEquals(1, $result); + } } From 2fdda8cbfb828bd835bd2d8f27e6c818f7744624 Mon Sep 17 00:00:00 2001 From: Scrutinizer Auto-Fixer Date: Sun, 20 Jul 2014 23:46:38 +0200 Subject: [PATCH 03/37] Scrutinizer Auto-Fixes This patch was automatically generated as part of the following inspection: https://scrutinizer-ci.com/g/eldy/dolibarr/inspections/128b4bb3-f689-4974-8fd7-a7b93d012d3f Enabled analysis tools: - PHP Analyzer --- htdocs/adherents/class/adherent.class.php | 2 +- htdocs/cashdesk/class/Facturation.class.php | 6 +-- htdocs/categories/categorie.php | 2 +- htdocs/categories/class/categorie.class.php | 4 +- .../comm/action/class/cactioncomm.class.php | 2 +- htdocs/comm/action/class/ical.class.php | 2 +- htdocs/comm/propal/class/propal.class.php | 16 +++---- htdocs/commande/class/commande.class.php | 20 ++++---- htdocs/compta/bank/class/account.class.php | 4 +- htdocs/compta/bank/class/bankcateg.class.php | 2 +- .../facture/class/facture-rec.class.php | 4 +- htdocs/compta/facture/class/facture.class.php | 18 +++---- .../facture/class/paymentterm.class.php | 2 +- .../compta/localtax/class/localtax.class.php | 2 +- .../cheque/class/remisecheque.class.php | 2 +- .../class/bonprelevement.class.php | 7 +-- .../class/ligneprelevement.class.php | 2 +- .../class/rejetprelevement.class.php | 2 +- .../salaries/class/paymentsalary.class.php | 4 +- .../sociales/class/chargesociales.class.php | 6 +-- .../class/paymentsocialcontribution.class.php | 2 +- htdocs/compta/tva/class/tva.class.php | 4 +- htdocs/contact/class/contact.class.php | 6 +-- htdocs/contrat/class/contrat.class.php | 8 ++-- htdocs/core/class/CMailFile.class.php | 10 ++-- .../core/class/commondocgenerator.class.php | 4 +- htdocs/core/class/commoninvoice.class.php | 6 +-- htdocs/core/class/commonobject.class.php | 20 ++++---- htdocs/core/class/cookie.class.php | 2 +- htdocs/core/class/cpays.class.php | 2 +- htdocs/core/class/ctypent.class.php | 2 +- htdocs/core/class/doleditor.class.php | 2 +- htdocs/core/class/dolgeoip.class.php | 2 +- htdocs/core/class/dolgraph.class.php | 10 ++-- htdocs/core/class/events.class.php | 4 +- htdocs/core/class/extrafields.class.php | 2 +- htdocs/core/class/fileupload.class.php | 14 +++--- htdocs/core/class/html.form.class.php | 36 +++++++------- htdocs/core/class/html.formactions.class.php | 6 +-- htdocs/core/class/html.formadmin.class.php | 6 +-- htdocs/core/class/html.formbank.class.php | 2 +- htdocs/core/class/html.formcompany.class.php | 6 +-- htdocs/core/class/html.formcron.class.php | 4 +- htdocs/core/class/html.formfile.class.php | 16 +++---- htdocs/core/class/html.formmailing.class.php | 2 +- htdocs/core/class/html.formorder.class.php | 2 +- htdocs/core/class/html.formother.class.php | 15 +++--- htdocs/core/class/ldap.class.php | 6 +-- htdocs/core/class/menu.class.php | 4 +- htdocs/core/class/menubase.class.php | 6 +-- htdocs/core/class/openid.class.php | 13 +++-- htdocs/core/class/rssparser.class.php | 2 +- htdocs/core/class/smtps.class.php | 26 +++++----- htdocs/core/class/translate.class.php | 8 ++-- htdocs/core/class/vcard.class.php | 2 +- htdocs/core/datepicker.php | 2 +- htdocs/core/db/Database.interface.php | 8 ++-- htdocs/core/db/DoliDB.class.php | 6 +-- htdocs/core/db/mssql.class.php | 16 +++---- htdocs/core/db/mysql.class.php | 6 +-- htdocs/core/db/mysqli.class.php | 8 ++-- htdocs/core/db/pgsql.class.php | 22 ++++----- htdocs/core/db/sqlite.class.php | 8 ++-- .../filemanagerdol/connectors/php/basexml.php | 5 +- .../connectors/php/commands.php | 12 +++++ .../core/filemanagerdol/connectors/php/io.php | 19 ++++++-- .../filemanagerdol/connectors/php/util.php | 4 +- htdocs/core/lib/ajax.lib.php | 4 +- htdocs/core/lib/bank.lib.php | 2 +- htdocs/core/lib/barcode.lib.php | 6 +-- htdocs/core/lib/company.lib.php | 20 ++++---- htdocs/core/lib/date.lib.php | 12 ++--- htdocs/core/lib/files.lib.php | 6 +-- htdocs/core/lib/functions.lib.php | 48 +++++++++---------- htdocs/core/lib/functions2.lib.php | 8 ++-- htdocs/core/lib/geturl.lib.php | 4 +- htdocs/core/lib/json.lib.php | 2 +- htdocs/core/lib/pdf.lib.php | 10 ++-- htdocs/core/lib/product.lib.php | 4 +- htdocs/core/lib/project.lib.php | 1 + htdocs/core/lib/treeview.lib.php | 2 +- htdocs/core/lib/ws.lib.php | 3 ++ htdocs/core/menus/standard/empty.php | 2 +- htdocs/core/modules/action/rapport.pdf.php | 2 +- .../barcode/doc/phpbarcode.modules.php | 4 +- .../barcode/mod_barcode_product_standard.php | 2 +- .../modules/barcode/modules_barcode.class.php | 2 +- .../cheque/pdf/modules_chequereceipts.php | 2 +- .../modules/cheque/pdf/pdf_blochet.class.php | 2 +- .../modules/commande/mod_commande_marbre.php | 2 +- .../modules/commande/mod_commande_saphir.php | 2 +- .../modules/commande/modules_commande.php | 4 +- .../contract/doc/pdf_strato.modules.php | 6 +-- .../modules/contract/modules_contract.php | 2 +- htdocs/core/modules/dons/modules_don.php | 2 +- .../expedition/doc/pdf_merou.modules.php | 2 +- .../expedition/doc/pdf_rouget.modules.php | 4 +- .../modules/expedition/modules_expedition.php | 2 +- .../modules/export/export_csv.modules.php | 2 +- .../modules/export/export_excel.modules.php | 2 +- .../modules/export/export_tsv.modules.php | 2 +- htdocs/core/modules/export/modules_export.php | 2 +- .../core/modules/facture/modules_facture.php | 4 +- .../fichinter/doc/pdf_soleil.modules.php | 6 +-- htdocs/core/modules/fichinter/mod_arctic.php | 2 +- htdocs/core/modules/fichinter/mod_pacific.php | 2 +- .../modules/fichinter/modules_fichinter.php | 2 +- .../modules/import/import_csv.modules.php | 4 +- htdocs/core/modules/import/modules_import.php | 2 +- .../modules/livraison/mod_livraison_jade.php | 2 +- .../livraison/mod_livraison_saphir.php | 2 +- .../modules/livraison/modules_livraison.php | 2 +- .../modules/mailings/contacts1.modules.php | 2 +- .../core/modules/mailings/example.modules.php | 2 +- .../core/modules/mailings/fraise.modules.php | 2 +- .../modules/mailings/modules_mailings.php | 2 +- .../core/modules/mailings/pomme.modules.php | 2 +- .../modules/mailings/xinputfile.modules.php | 2 +- .../modules/mailings/xinputuser.modules.php | 2 +- htdocs/core/modules/member/modules_cards.php | 2 +- .../modules/printsheet/modules_labels.php | 2 +- .../product/mod_codeproduct_elephant.php | 4 +- .../product/mod_codeproduct_leopard.php | 2 +- .../modules/product/modules_product.class.php | 4 +- .../modules/project/mod_project_simple.php | 2 +- .../modules/project/mod_project_universal.php | 2 +- .../core/modules/project/modules_project.php | 2 +- .../pdf/doc_generic_project_odt.modules.php | 2 +- .../project/pdf/pdf_baleine.modules.php | 6 +-- .../modules/project/task/mod_task_simple.php | 2 +- .../project/task/mod_task_universal.php | 2 +- .../modules/project/task/modules_task.php | 2 +- .../task/pdf/doc_generic_task_odt.modules.php | 2 +- .../core/modules/propale/modules_propale.php | 4 +- .../societe/mod_codeclient_elephant.php | 4 +- .../societe/mod_codeclient_leopard.php | 2 +- .../modules/societe/mod_codeclient_monkey.php | 4 +- .../societe/mod_codecompta_aquarium.php | 2 +- .../societe/mod_codecompta_panicum.php | 2 +- .../modules/societe/modules_societe.class.php | 8 ++-- .../mod_facture_fournisseur_cactus.php | 2 +- .../mod_facture_fournisseur_tulip.php | 2 +- .../modules_facturefournisseur.php | 2 +- .../pdf/pdf_canelle.modules.php | 6 +-- .../mod_commande_fournisseur_muguet.php | 4 +- .../mod_commande_fournisseur_orchidee.php | 4 +- .../modules_commandefournisseur.php | 2 +- .../pdf/pdf_muscadet.modules.php | 10 ++-- htdocs/core/modules/syslog/logHandler.php | 2 +- .../modules/syslog/logHandlerInterface.php | 2 +- .../modules/syslog/mod_syslog_chromephp.php | 4 +- .../core/modules/syslog/mod_syslog_file.php | 2 +- .../modules/syslog/mod_syslog_firephp.php | 4 +- .../core/modules/syslog/mod_syslog_syslog.php | 2 +- htdocs/cron/class/cronjob.class.php | 4 +- htdocs/ecm/class/ecmdirectory.class.php | 2 +- htdocs/expedition/class/expedition.class.php | 2 +- .../class/fournisseur.commande.class.php | 14 +++--- .../fourn/class/fournisseur.facture.class.php | 16 +++---- .../fourn/class/fournisseur.product.class.php | 6 +-- htdocs/ftp/index.php | 2 +- htdocs/holiday/class/holiday.class.php | 14 +++--- htdocs/imports/import.php | 2 +- htdocs/install/etape1.php | 2 +- htdocs/install/inc.php | 4 +- htdocs/install/upgrade2.php | 2 +- htdocs/livraison/class/livraison.class.php | 8 ++-- .../mailmanspip/class/mailmanspip.class.php | 8 ++-- htdocs/main.inc.php | 4 +- .../class/opensurveysondage.class.php | 2 +- htdocs/opensurvey/fonctions.php | 2 +- htdocs/paypal/lib/paypal.lib.php | 10 ++++ .../product/actions_card_product.class.php | 2 +- .../service/actions_card_service.class.php | 2 +- .../product/class/html.formproduct.class.php | 2 +- htdocs/product/class/product.class.php | 26 +++++----- htdocs/product/class/productbatch.class.php | 2 +- .../class/productcustomerprice.class.php | 2 +- .../product/stock/lib/replenishment.lib.php | 2 +- htdocs/projet/class/project.class.php | 2 +- htdocs/projet/class/task.class.php | 12 ++--- htdocs/resource/class/resource.class.php | 4 +- .../canvas/actions_card_common.class.php | 2 +- .../company/actions_card_company.class.php | 2 +- .../actions_card_individual.class.php | 2 +- htdocs/societe/class/address.class.php | 4 +- htdocs/societe/class/societe.class.php | 12 ++--- htdocs/support/inc.php | 2 +- htdocs/user/class/user.class.php | 4 +- 189 files changed, 530 insertions(+), 479 deletions(-) diff --git a/htdocs/adherents/class/adherent.class.php b/htdocs/adherents/class/adherent.class.php index 38032741330..bc91f9bdeed 100644 --- a/htdocs/adherents/class/adherent.class.php +++ b/htdocs/adherents/class/adherent.class.php @@ -1241,7 +1241,7 @@ class Adherent extends CommonObject * @param string $num_chq Numero cheque (if Id bank account provided) * @param string $emetteur_nom Name of cheque writer * @param string $emetteur_banque Name of bank of cheque - * @param timestamp $datesubend Date end subscription + * @param integer $datesubend Date end subscription * @return int rowid of record added, <0 if KO */ function cotisation($date, $montant, $accountid=0, $operation='', $label='', $num_chq='', $emetteur_nom='', $emetteur_banque='', $datesubend=0) diff --git a/htdocs/cashdesk/class/Facturation.class.php b/htdocs/cashdesk/class/Facturation.class.php index 296ced0f172..0e6c2fdd2cb 100644 --- a/htdocs/cashdesk/class/Facturation.class.php +++ b/htdocs/cashdesk/class/Facturation.class.php @@ -266,7 +266,7 @@ class Facturation * Getter for id * * @param int $aId Id - * @return id + * @return null|integer */ public function id($aId=null) { @@ -390,7 +390,7 @@ class Facturation * Getter for montant_remise * * @param int $aMontantRemise Amount - * @return string Amount + * @return null|integer Amount */ public function montantRemise($aMontantRemise=null) { @@ -415,7 +415,7 @@ class Facturation * Getter for prix * * @param int $aPrix Price - * @return string Stock + * @return null|integer Stock */ public function prix ( $aPrix=null ) { diff --git a/htdocs/categories/categorie.php b/htdocs/categories/categorie.php index 7f8ceac853e..3e6dfffdddb 100644 --- a/htdocs/categories/categorie.php +++ b/htdocs/categories/categorie.php @@ -609,7 +609,7 @@ else if ($id || $ref) * @param Object $object Object we want to see categories it can be classified into * @param int $typeid Type of category (0, 1, 2, 3) * @param int $socid Id thirdparty - * @param string $showclassifyform 1=Add form to 'Classify', 0=Do not show form to 'Classify' + * @param integer $showclassifyform 1=Add form to 'Classify', 0=Do not show form to 'Classify' * @return int 0 */ function formCategory($db,$object,$typeid,$socid=0,$showclassifyform=1) diff --git a/htdocs/categories/class/categorie.class.php b/htdocs/categories/class/categorie.class.php index 915a1410933..04f7fa0daca 100644 --- a/htdocs/categories/class/categorie.class.php +++ b/htdocs/categories/class/categorie.class.php @@ -327,7 +327,7 @@ class Categorie extends CommonObject * Delete a category from database * * @param User $user Object user that ask to delete - * @return void + * @return integer */ function delete($user) { @@ -980,7 +980,7 @@ class Categorie extends CommonObject /** * Check if no category with same label already exists for this cat's parent or root and for this cat's type * - * @return boolean 1 if already exist, 0 otherwise, -1 if error + * @return integer 1 if already exist, 0 otherwise, -1 if error */ function already_exists() { diff --git a/htdocs/comm/action/class/cactioncomm.class.php b/htdocs/comm/action/class/cactioncomm.class.php index 8908b4e2a46..04ea49dc43e 100644 --- a/htdocs/comm/action/class/cactioncomm.class.php +++ b/htdocs/comm/action/class/cactioncomm.class.php @@ -100,7 +100,7 @@ class CActionComm * @param int $active 1 or 0 to filter on event state active or not ('' by default = no filter) * @param string $idorcode 'id' or 'code' * @param string $excludetype Type to exclude - * @param string $onlyautoornot Group list by auto events or not + * @param integer $onlyautoornot Group list by auto events or not * @return array Array of all event types if OK, <0 if KO */ function liste_array($active='',$idorcode='id',$excludetype='',$onlyautoornot=0) diff --git a/htdocs/comm/action/class/ical.class.php b/htdocs/comm/action/class/ical.class.php index 717d7269fa2..9bb1e8889f8 100644 --- a/htdocs/comm/action/class/ical.class.php +++ b/htdocs/comm/action/class/ical.class.php @@ -257,7 +257,7 @@ class ICal * Parse RRULE return array * * @param string $value string - * @return array + * @return string */ function ical_rrule($value) { diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index 5a70aa99cbc..3bf4c639122 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -292,12 +292,12 @@ class Propal extends CommonObject * @param double $pu_ht Prix unitaire * @param double $qty Quantite * @param double $txtva Taux de tva - * @param double $txlocaltax1 Local tax 1 rate - * @param double $txlocaltax2 Local tax 2 rate + * @param integer $txlocaltax1 Local tax 1 rate + * @param integer $txlocaltax2 Local tax 2 rate * @param int $fk_product Id du produit/service predefini - * @param double $remise_percent Pourcentage de remise de la ligne + * @param integer $remise_percent Pourcentage de remise de la ligne * @param string $price_base_type HT or TTC - * @param double $pu_ttc Prix unitaire TTC + * @param integer $pu_ttc Prix unitaire TTC * @param int $info_bits Bits de type de lignes * @param int $type Type of line (product, service) * @param int $rang Position of line @@ -308,7 +308,7 @@ class Propal extends CommonObject * @param string $label ??? * @param int $date_start Start date of the line * @param int $date_end End date of the line - * @param array $array_option extrafields array + * @param integer $array_option extrafields array * @return int >0 if OK, <0 if KO * * @see add_product @@ -466,8 +466,8 @@ class Propal extends CommonObject * @param double $qty Quantity * @param double $remise_percent Remise effectuee sur le produit * @param double $txtva Taux de TVA - * @param double $txlocaltax1 Local tax 1 rate - * @param double $txlocaltax2 Local tax 2 rate + * @param integer $txlocaltax1 Local tax 1 rate + * @param integer $txlocaltax2 Local tax 2 rate * @param string $desc Description * @param double $price_base_type HT ou TTC * @param int $info_bits Miscellaneous informations @@ -480,7 +480,7 @@ class Propal extends CommonObject * @param int $type 0/1=Product/service * @param int $date_start Start date of the line * @param int $date_end End date of the line - * @param array $array_option extrafields array + * @param integer $array_option extrafields array * @return int 0 if OK, <0 if KO */ function updateline($rowid, $pu, $qty, $remise_percent, $txtva, $txlocaltax1=0, $txlocaltax2=0, $desc='', $price_base_type='HT', $info_bits=0, $special_code=0, $fk_parent_line=0, $skip_update_total=0, $fk_fournprice=0, $pa_ht=0, $label='', $type=0, $date_start='', $date_end='', $array_option=0) diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index 6c1b5eeed90..b13e4dae424 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -1037,14 +1037,14 @@ class Commande extends CommonOrder * @param double $pu_ht Unit price (without tax) * @param double $qty Quantite * @param double $txtva Taux de tva force, sinon -1 - * @param double $txlocaltax1 Local tax 1 rate - * @param double $txlocaltax2 Local tax 2 rate + * @param integer $txlocaltax1 Local tax 1 rate + * @param integer $txlocaltax2 Local tax 2 rate * @param int $fk_product Id du produit/service predefini - * @param double $remise_percent Pourcentage de remise de la ligne + * @param integer $remise_percent Pourcentage de remise de la ligne * @param int $info_bits Bits de type de lignes * @param int $fk_remise_except Id remise * @param string $price_base_type HT or TTC - * @param double $pu_ttc Prix unitaire TTC + * @param integer $pu_ttc Prix unitaire TTC * @param timestamp $date_start Start date of the line - Added by Matelli (See http://matelli.fr/showcases/patchs-dolibarr/add-dates-in-order-lines.html) * @param timestamp $date_end End date of the line - Added by Matelli (See http://matelli.fr/showcases/patchs-dolibarr/add-dates-in-order-lines.html) * @param int $type Type of line (0=product, 1=service) @@ -1054,7 +1054,7 @@ class Commande extends CommonOrder * @param int $fk_fournprice Id supplier price * @param int $pa_ht Buying price (without tax) * @param string $label Label - * @param array $array_option extrafields array + * @param integer $array_option extrafields array * @return int >0 if OK, <0 if KO * * @see add_product @@ -1233,7 +1233,7 @@ class Commande extends CommonOrder * * @param int $idproduct Product Id * @param double $qty Quantity - * @param double $remise_percent Product discount relative + * @param integer $remise_percent Product discount relative * @param timestamp $date_start Start date of the line - Added by Matelli (See http://matelli.fr/showcases/patchs-dolibarr/add-dates-in-order-lines.html) * @param timestamp $date_end End date of the line - Added by Matelli (See http://matelli.fr/showcases/patchs-dolibarr/add-dates-in-order-lines.html) * @return void @@ -2273,8 +2273,8 @@ class Commande extends CommonOrder * @param double $qty Quantity * @param double $remise_percent Pourcentage de remise de la ligne * @param double $txtva Taux TVA - * @param double $txlocaltax1 Local tax 1 rate - * @param double $txlocaltax2 Local tax 2 rate + * @param integer $txlocaltax1 Local tax 1 rate + * @param integer $txlocaltax2 Local tax 2 rate * @param string $price_base_type HT or TTC * @param int $info_bits Miscellaneous informations on line * @param timestamp $date_start Start date of the line @@ -2286,7 +2286,7 @@ class Commande extends CommonOrder * @param int $pa_ht Price (without tax) of product when it was bought * @param string $label Label * @param int $special_code Special code (also used by externals modules!) - * @param array $array_option extrafields array + * @param integer $array_option extrafields array * @return int < 0 if KO, > 0 if OK */ function updateline($rowid, $desc, $pu, $qty, $remise_percent, $txtva, $txlocaltax1=0,$txlocaltax2=0, $price_base_type='HT', $info_bits=0, $date_start='', $date_end='', $type=0, $fk_parent_line=0, $skip_update_total=0, $fk_fournprice=null, $pa_ht=0, $label='', $special_code=0, $array_option=0) @@ -2932,7 +2932,7 @@ class Commande extends CommonOrder /** * Return an array of order lines * - * @return array Lines of order + * @return integer Lines of order */ function getLinesArray() { diff --git a/htdocs/compta/bank/class/account.class.php b/htdocs/compta/bank/class/account.class.php index e50c7bb34f6..663acd15f63 100644 --- a/htdocs/compta/bank/class/account.class.php +++ b/htdocs/compta/bank/class/account.class.php @@ -1142,7 +1142,7 @@ class AccountLine extends CommonObject /** * Delete transaction bank line record * - * @param User $user User object that delete + * @param integer $user User object that delete * @return int <0 if KO, >0 if OK */ function delete($user=0) @@ -1191,7 +1191,7 @@ class AccountLine extends CommonObject /** * Delete bank line records * - * @param User $user User object that delete + * @param integer $user User object that delete * @return int <0 if KO, >0 if OK */ function delete_urls($user=0) diff --git a/htdocs/compta/bank/class/bankcateg.class.php b/htdocs/compta/bank/class/bankcateg.class.php index a1bc0191175..f6e6adf2a04 100644 --- a/htdocs/compta/bank/class/bankcateg.class.php +++ b/htdocs/compta/bank/class/bankcateg.class.php @@ -168,7 +168,7 @@ class BankCateg // extends CommonObject /** * Update database * - * @param User $user User that modify + * @param integer $user User that modify * @param int $notrigger 0=launch triggers after, 1=disable triggers * @return int <0 if KO, >0 if OK */ diff --git a/htdocs/compta/facture/class/facture-rec.class.php b/htdocs/compta/facture/class/facture-rec.class.php index f6c0ab1a481..6bef070b22d 100644 --- a/htdocs/compta/facture/class/facture-rec.class.php +++ b/htdocs/compta/facture/class/facture-rec.class.php @@ -401,11 +401,11 @@ class FactureRec extends Facture * @param double $qty Quantite * @param double $txtva Taux de tva force, sinon -1 * @param int $fk_product Id du produit/service predefini - * @param double $remise_percent Pourcentage de remise de la ligne + * @param integer $remise_percent Pourcentage de remise de la ligne * @param string $price_base_type HT or TTC * @param int $info_bits Bits de type de lignes * @param int $fk_remise_except Id remise - * @param double $pu_ttc Prix unitaire TTC (> 0 even for credit note) + * @param integer $pu_ttc Prix unitaire TTC (> 0 even for credit note) * @param int $type Type of line (0=product, 1=service) * @param int $rang Position of line * @param int $special_code Special code diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index 7e5af441280..5f68e2a0263 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -1018,7 +1018,7 @@ class Facture extends CommonInvoice /** * Update database * - * @param User $user User that modify + * @param integer $user User that modify * @param int $notrigger 0=launch triggers after, 1=disable triggers * @return int <0 if KO, >0 if OK */ @@ -1885,17 +1885,17 @@ class Facture extends CommonInvoice * @param double $pu_ht Unit price without tax (> 0 even for credit note) * @param double $qty Quantity * @param double $txtva Force vat rate, -1 for auto - * @param double $txlocaltax1 Local tax 1 rate - * @param double $txlocaltax2 Local tax 2 rate + * @param integer $txlocaltax1 Local tax 1 rate + * @param integer $txlocaltax2 Local tax 2 rate * @param int $fk_product Id of predefined product/service - * @param double $remise_percent Percent of discount on line + * @param integer $remise_percent Percent of discount on line * @param timestamp $date_start Date start of service * @param timestamp $date_end Date end of service * @param int $ventil Code of dispatching into accountancy * @param int $info_bits Bits de type de lignes * @param int $fk_remise_except Id discount used * @param string $price_base_type 'HT' or 'TTC' - * @param double $pu_ttc Unit price with tax (> 0 even for credit note) + * @param integer $pu_ttc Unit price with tax (> 0 even for credit note) * @param int $type Type of line (0=product, 1=service) * @param int $rang Position of line * @param int $special_code Special code (also used by externals modules!) @@ -1905,7 +1905,7 @@ class Facture extends CommonInvoice * @param int $fk_fournprice Supplier price id (to calculate margin) or '' * @param int $pa_ht Buying price of line (to calculate margin) or '' * @param string $label Label of the line (deprecated, do not use) - * @param array $array_option extrafields array + * @param integer $array_option extrafields array * @return int <0 if KO, Id of line if OK */ function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1=0, $txlocaltax2=0, $fk_product=0, $remise_percent=0, $date_start='', $date_end='', $ventil=0, $info_bits=0, $fk_remise_except='', $price_base_type='HT', $pu_ttc=0, $type=self::TYPE_STANDARD, $rang=-1, $special_code=0, $origin='', $origin_id=0, $fk_parent_line=0, $fk_fournprice=null, $pa_ht=0, $label='', $array_option=0) @@ -2068,8 +2068,8 @@ class Facture extends CommonInvoice * @param date $date_start Date de debut de validite du service * @param date $date_end Date de fin de validite du service * @param double $txtva VAT Rate - * @param double $txlocaltax1 Local tax 1 rate - * @param double $txlocaltax2 Local tax 2 rate + * @param integer $txlocaltax1 Local tax 1 rate + * @param integer $txlocaltax2 Local tax 2 rate * @param string $price_base_type HT or TTC * @param int $info_bits Miscellaneous informations * @param int $type Type of line (0=product, 1=service) @@ -2079,7 +2079,7 @@ class Facture extends CommonInvoice * @param int $pa_ht Price (without tax) of product when it was bought * @param string $label Label of the line (deprecated, do not use) * @param int $special_code Special code (also used by externals modules!) - * @param array $array_option extrafields array + * @param integer $array_option extrafields array * @return int < 0 if KO, > 0 if OK */ function updateline($rowid, $desc, $pu, $qty, $remise_percent, $date_start, $date_end, $txtva, $txlocaltax1=0, $txlocaltax2=0, $price_base_type='HT', $info_bits=0, $type= self::TYPE_STANDARD, $fk_parent_line=0, $skip_update_total=0, $fk_fournprice=null, $pa_ht=0, $label='', $special_code=0, $array_option=0) diff --git a/htdocs/compta/facture/class/paymentterm.class.php b/htdocs/compta/facture/class/paymentterm.class.php index cdc935cde01..b86e1328736 100644 --- a/htdocs/compta/facture/class/paymentterm.class.php +++ b/htdocs/compta/facture/class/paymentterm.class.php @@ -257,7 +257,7 @@ class PaymentTerm // extends CommonObject /** * Update database * - * @param User $user User that modify + * @param integer $user User that modify * @param int $notrigger 0=launch triggers after, 1=disable triggers * @return int <0 if KO, >0 if OK */ diff --git a/htdocs/compta/localtax/class/localtax.class.php b/htdocs/compta/localtax/class/localtax.class.php index 72ce346abad..fde25befbae 100644 --- a/htdocs/compta/localtax/class/localtax.class.php +++ b/htdocs/compta/localtax/class/localtax.class.php @@ -123,7 +123,7 @@ class Localtax extends CommonObject /** * Update database * - * @param User $user User that modify + * @param integer $user User that modify * @param int $notrigger 0=no, 1=yes (no update trigger) * @return int <0 if KO, >0 if OK */ diff --git a/htdocs/compta/paiement/cheque/class/remisecheque.class.php b/htdocs/compta/paiement/cheque/class/remisecheque.class.php index 39b8f209247..7f5b8e737a4 100644 --- a/htdocs/compta/paiement/cheque/class/remisecheque.class.php +++ b/htdocs/compta/paiement/cheque/class/remisecheque.class.php @@ -274,7 +274,7 @@ class RemiseCheque extends CommonObject * Supprime la remise en base * * @param User $user Utilisateur qui effectue l'operation - * @return void + * @return integer */ function delete($user='') { diff --git a/htdocs/compta/prelevement/class/bonprelevement.class.php b/htdocs/compta/prelevement/class/bonprelevement.class.php index 60b056babf4..b9e82724eb8 100644 --- a/htdocs/compta/prelevement/class/bonprelevement.class.php +++ b/htdocs/compta/prelevement/class/bonprelevement.class.php @@ -172,6 +172,7 @@ class BonPrelevement extends CommonObject * @param string $code_guichet code of bank's office * @param string $number bank account number * @param string $number_key number key of account number + * @param integer $line_id * @return int >0 if OK, <0 if KO */ function addline(&$line_id, $client_id, $client_nom, $amount, $code_banque, $code_guichet, $number, $number_key) @@ -247,7 +248,7 @@ class BonPrelevement extends CommonObject * Read errors * * @param int $error id of error - * @return array Array of errors + * @return string Array of errors */ function ReadError($error) { @@ -1504,7 +1505,7 @@ class BonPrelevement extends CommonObject * @param string $row_bic rib.bic AS bic, * @param string $row_datec soc.datec, * @param string $row_drum soc.rowid AS drum - * @return void + * @return string */ function EnregDestinataireSEPA($row_code_client, $row_nom, $row_address, $row_zip, $row_town, $row_country_code, $row_cb, $row_cg, $row_cc, $row_somme, $row_facnumber, $row_idfac, $row_iban, $row_bic, $row_datec, $row_drum) { @@ -1626,7 +1627,7 @@ class BonPrelevement extends CommonObject * @param int $nombre 0 or 1 * @param float $total Total * @param string $CrLf End of line character - * @return SEPA + * @return string */ function EnregEmetteurSEPA($configuration, $ladate, $nombre, $total, $CrLf='\n') { // SEPA INITIALISATION diff --git a/htdocs/compta/prelevement/class/ligneprelevement.class.php b/htdocs/compta/prelevement/class/ligneprelevement.class.php index 9c4bf96e8b3..1e078ac8c79 100644 --- a/htdocs/compta/prelevement/class/ligneprelevement.class.php +++ b/htdocs/compta/prelevement/class/ligneprelevement.class.php @@ -61,7 +61,7 @@ class LignePrelevement * Recupere l'objet prelevement * * @param int $rowid id de la facture a recuperer - * @return void + * @return integer */ function fetch($rowid) { diff --git a/htdocs/compta/prelevement/class/rejetprelevement.class.php b/htdocs/compta/prelevement/class/rejetprelevement.class.php index 51f9a83ed3c..5ebd4542096 100644 --- a/htdocs/compta/prelevement/class/rejetprelevement.class.php +++ b/htdocs/compta/prelevement/class/rejetprelevement.class.php @@ -317,7 +317,7 @@ class RejetPrelevement * Retrieve withdrawal object * * @param int $rowid id of invoice to retrieve - * @return void + * @return integer */ function fetch($rowid) { diff --git a/htdocs/compta/salaries/class/paymentsalary.class.php b/htdocs/compta/salaries/class/paymentsalary.class.php index 5e728b0cc64..9801c1d7cda 100644 --- a/htdocs/compta/salaries/class/paymentsalary.class.php +++ b/htdocs/compta/salaries/class/paymentsalary.class.php @@ -69,7 +69,7 @@ class PaymentSalary extends CommonObject /** * Update database * - * @param User $user User that modify + * @param integer $user User that modify * @param int $notrigger 0=no, 1=yes (no update trigger) * @return int <0 if KO, >0 if OK */ @@ -141,7 +141,7 @@ class PaymentSalary extends CommonObject * Load object in memory from database * * @param int $id id object - * @param User $user User that load + * @param integer $user User that load * @return int <0 if KO, >0 if OK */ function fetch($id, $user=0) diff --git a/htdocs/compta/sociales/class/chargesociales.class.php b/htdocs/compta/sociales/class/chargesociales.class.php index 09e4ebaef0c..ad3833848d2 100644 --- a/htdocs/compta/sociales/class/chargesociales.class.php +++ b/htdocs/compta/sociales/class/chargesociales.class.php @@ -63,7 +63,7 @@ class ChargeSociales extends CommonObject * Retrouve et charge une charge sociale * * @param int $id 1 si trouve, 0 sinon - * @return void + * @return integer|null */ function fetch($id) { @@ -320,7 +320,7 @@ class ChargeSociales extends CommonObject * Retourne le libelle du statut d'une charge (impaye, payee) * * @param int $mode 0=libelle long, 1=libelle court, 2=Picto + Libelle court, 3=Picto, 4=Picto + Libelle long - * @param double $alreadypaid 0=No payment already done, >0=Some payments were already done (we recommand to put here amount payed if you have it, 1 otherwise) + * @param integer $alreadypaid 0=No payment already done, >0=Some payments were already done (we recommand to put here amount payed if you have it, 1 otherwise) * @return string Label */ function getLibStatut($mode=0,$alreadypaid=-1) @@ -333,7 +333,7 @@ class ChargeSociales extends CommonObject * * @param int $statut Id statut * @param int $mode 0=libelle long, 1=libelle court, 2=Picto + Libelle court, 3=Picto, 4=Picto + Libelle long, 5=Libelle court + Picto - * @param double $alreadypaid 0=No payment already done, >0=Some payments were already done (we recommand to put here amount payed if you have it, 1 otherwise) + * @param integer $alreadypaid 0=No payment already done, >0=Some payments were already done (we recommand to put here amount payed if you have it, 1 otherwise) * @return string Label */ function LibStatut($statut,$mode=0,$alreadypaid=-1) diff --git a/htdocs/compta/sociales/class/paymentsocialcontribution.class.php b/htdocs/compta/sociales/class/paymentsocialcontribution.class.php index 972fa762b96..78d63fc2f71 100644 --- a/htdocs/compta/sociales/class/paymentsocialcontribution.class.php +++ b/htdocs/compta/sociales/class/paymentsocialcontribution.class.php @@ -216,7 +216,7 @@ class PaymentSocialContribution extends CommonObject /** * Update database * - * @param User $user User that modify + * @param integer $user User that modify * @param int $notrigger 0=launch triggers after, 1=disable triggers * @return int <0 if KO, >0 if OK */ diff --git a/htdocs/compta/tva/class/tva.class.php b/htdocs/compta/tva/class/tva.class.php index 312da55f138..f5a8c00b6d1 100644 --- a/htdocs/compta/tva/class/tva.class.php +++ b/htdocs/compta/tva/class/tva.class.php @@ -139,7 +139,7 @@ class Tva extends CommonObject /** * Update database * - * @param User $user User that modify + * @param integer $user User that modify * @param int $notrigger 0=no, 1=yes (no update trigger) * @return int <0 if KO, >0 if OK */ @@ -202,7 +202,7 @@ class Tva extends CommonObject * Load object in memory from database * * @param int $id id object - * @param User $user User that load + * @param integer $user User that load * @return int <0 if KO, >0 if OK */ function fetch($id, $user=0) diff --git a/htdocs/contact/class/contact.class.php b/htdocs/contact/class/contact.class.php index 7858f81dcf9..24b33c3c7c8 100644 --- a/htdocs/contact/class/contact.class.php +++ b/htdocs/contact/class/contact.class.php @@ -215,7 +215,7 @@ class Contact extends CommonObject * Update informations into database * * @param int $id Id of contact/address to update - * @param User $user Objet user making change + * @param integer $user Objet user making change * @param int $notrigger 0=no, 1=yes * @param string $action Current action for hookmanager * @return int <0 if KO, >0 if OK @@ -424,7 +424,7 @@ class Contact extends CommonObject * Update field alert birthday * * @param int $id Id of contact - * @param User $user User asking to change alert or birthday + * @param integer $user User asking to change alert or birthday * @return int <0 if KO, >=0 if OK */ function update_perso($id, $user=0) @@ -489,7 +489,7 @@ class Contact extends CommonObject * Load object contact * * @param int $id id du contact - * @param User $user Utilisateur (abonnes aux alertes) qui veut les alertes de ce contact + * @param integer $user Utilisateur (abonnes aux alertes) qui veut les alertes de ce contact * @return int -1 if KO, 0 if OK but not found, 1 if OK */ function fetch($id, $user=0) diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php index 9c57ff9f570..1c0eeaa86b0 100644 --- a/htdocs/contrat/class/contrat.class.php +++ b/htdocs/contrat/class/contrat.class.php @@ -953,7 +953,7 @@ class Contrat extends CommonObject /** * Update object into database * - * @param User $user User that modifies + * @param integer $user User that modifies * @param int $notrigger 0=launch triggers after, 1=disable triggers * @return int <0 if KO, >0 if OK */ @@ -1061,7 +1061,7 @@ class Contrat extends CommonObject * @param timestamp $date_start Date de debut prevue * @param timestamp $date_end Date de fin prevue * @param float $price_base_type HT or TTC - * @param float $pu_ttc Prix unitaire TTC + * @param integer $pu_ttc Prix unitaire TTC * @param int $info_bits Bits de type de lignes * @param int $fk_fournprice Fourn price id * @param int $pa_ht Buying price HT @@ -1218,8 +1218,8 @@ class Contrat extends CommonObject * @param timestamp $date_start Date de debut prevue * @param timestamp $date_end Date de fin prevue * @param float $tvatx Taux TVA - * @param float $localtax1tx Local tax 1 rate - * @param float $localtax2tx Local tax 2 rate + * @param integer $localtax1tx Local tax 1 rate + * @param integer $localtax2tx Local tax 2 rate * @param timestamp $date_debut_reel Date de debut reelle * @param timestamp $date_fin_reel Date de fin reelle * @param float $price_base_type HT or TTC diff --git a/htdocs/core/class/CMailFile.class.php b/htdocs/core/class/CMailFile.class.php index c16af4c5b24..072a2fa7bbe 100644 --- a/htdocs/core/class/CMailFile.class.php +++ b/htdocs/core/class/CMailFile.class.php @@ -356,7 +356,7 @@ class CMailFile /** * Send mail that was prepared by constructor * - * @return boolean True if mail sent, false otherwise + * @return string|boolean True if mail sent, false otherwise */ function sendfile() { @@ -518,6 +518,10 @@ class CMailFile // Encode subject according to RFC 2822 - http://en.wikipedia.org/wiki/MIME#Encoded-Word + + /** + * @param string $stringtoencode + */ function encodetorfc2822($stringtoencode) { global $conf; @@ -641,7 +645,7 @@ class CMailFile /** * Create SMTP headers (mode = 'mail') * - * @return smtp headers + * @return string headers */ function write_smtpheaders() { @@ -692,7 +696,7 @@ class CMailFile * * @param array $filename_list Array of filenames * @param array $mimefilename_list Array of mime types - * @return array mime headers + * @return string mime headers */ function write_mimeheaders($filename_list, $mimefilename_list) { diff --git a/htdocs/core/class/commondocgenerator.class.php b/htdocs/core/class/commondocgenerator.class.php index 882e0780ed4..e6cfa7a3f55 100644 --- a/htdocs/core/class/commondocgenerator.class.php +++ b/htdocs/core/class/commondocgenerator.class.php @@ -207,7 +207,7 @@ abstract class CommonDocGenerator /** * Define array with couple subtitution key => subtitution value * - * @param Object $object contact + * @param Contact $object contact * @param Translate $outputlangs object for output * @param array_key $array_key Name of the key for return array * @return array of substitution key->code @@ -426,7 +426,7 @@ abstract class CommonDocGenerator /** * Define array with couple substitution key => substitution value * - * @param Object $object Main object to use as data source + * @param Expedition $object Main object to use as data source * @param Translate $outputlangs Lang object to use for output * @param array_key $array_key Name of the key for return array * @return array Array of substitution diff --git a/htdocs/core/class/commoninvoice.class.php b/htdocs/core/class/commoninvoice.class.php index fdc4a35a585..7563b71d9a4 100644 --- a/htdocs/core/class/commoninvoice.class.php +++ b/htdocs/core/class/commoninvoice.class.php @@ -155,7 +155,7 @@ abstract class CommonInvoice extends CommonObject * Return label of object status * * @param int $mode 0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=short label + picto - * @param double $alreadypaid 0=No payment already done, >0=Some payments were already done (we recommand to put here amount payed if you have it, 1 otherwise) + * @param integer $alreadypaid 0=No payment already done, >0=Some payments were already done (we recommand to put here amount payed if you have it, 1 otherwise) * @return string Label */ function getLibStatut($mode=0,$alreadypaid=-1) @@ -169,7 +169,7 @@ abstract class CommonInvoice extends CommonObject * @param int $paye Status field paye * @param int $status Id status * @param int $mode 0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=short label + picto - * @param double $alreadypaid 0=No payment already done, >0=Some payments were already done (we recommand to put here amount payed if you have it, 1 otherwise) + * @param integer $alreadypaid 0=No payment already done, >0=Some payments were already done (we recommand to put here amount payed if you have it, 1 otherwise) * @param int $type Type facture * @return string Libelle du statut */ @@ -293,7 +293,7 @@ abstract class CommonInvoice extends CommonObject * Renvoi une date limite de reglement de facture en fonction des * conditions de reglements de la facture et date de facturation * - * @param string $cond_reglement Condition of payment (code or id) to use. If 0, we use current condition. + * @param integer $cond_reglement Condition of payment (code or id) to use. If 0, we use current condition. * @return date Date limite de reglement si ok, <0 si ko */ function calculate_date_lim_reglement($cond_reglement=0) diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 307164556c7..711152f79b4 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -476,8 +476,8 @@ abstract class CommonObject * * @param string $source 'internal', 'external' or 'all' * @param string $order Sort order by : 'code' or 'rowid' - * @param string $option 0=Return array id->label, 1=Return array code->label - * @param string $activeonly 0=all type of contact, 1=only the active + * @param integer $option 0=Return array id->label, 1=Return array code->label + * @param integer $activeonly 0=all type of contact, 1=only the active * @return array Array list of type of contacts (id->label if option=0, code->label if option=1) */ function liste_type_contact($source='internal', $order='code', $option=0, $activeonly=0) @@ -1117,7 +1117,7 @@ abstract class CommonObject * @param boolean $renum true to renum all already ordered lines, false to renum only not already ordered lines. * @param string $rowidorder ASC or DESC * @param boolean $fk_parent_line Table with fk_parent_line field or not - * @return void + * @return integer|null */ function line_order($renum=false, $rowidorder='ASC', $fk_parent_line=true) { @@ -2293,7 +2293,7 @@ abstract class CommonObject * * @param object $extrafields Extrafield Object * @param string $mode Show output (view) or input (edit) for extrafield - * @param array $params Optionnal parameters + * @param integer $params Optionnal parameters * @param string $keyprefix Prefix string to add into name and id of field (can be used to avoid duplicate names) * * @return string @@ -2525,7 +2525,7 @@ abstract class CommonObject /** * Set extra parameters * - * @return void + * @return integer */ function setExtraParameters() { @@ -2612,7 +2612,7 @@ abstract class CommonObject * TODO Move this into html.class.php * But for the moment we don't know if it's possible as we keep a method available on overloaded objects. * - * @return void + * @return integer|null */ function showLinkedObjectBlock() { @@ -2731,7 +2731,7 @@ abstract class CommonObject * @param string $action Action code * @param string $seller Object of seller third party * @param string $buyer Object of buyer third party - * @param string $selected Object line selected + * @param integer $selected Object line selected * @param int $dateSelector 1=Show also date range input fields * @return void */ @@ -2829,8 +2829,8 @@ abstract class CommonObject * @param int $dateSelector 1=Show also date range input fields * @param string $seller Object of seller third party * @param string $buyer Object of buyer third party - * @param string $selected Object line selected - * @param object $extrafieldsline Object of extrafield line attribute + * @param integer $selected Object line selected + * @param integer $extrafieldsline Object of extrafield line attribute * @return void */ function printObjectLine($action,$line,$var,$num,$i,$dateSelector,$seller,$buyer,$selected=0,$extrafieldsline=0) @@ -3105,7 +3105,7 @@ abstract class CommonObject * get Margin info * * @param string $force_price True of not - * @return mixed Array with info + * @return integer Array with info */ function getMarginInfos($force_price=false) { diff --git a/htdocs/core/class/cookie.class.php b/htdocs/core/class/cookie.class.php index bcca9fcfa73..150d52fae62 100644 --- a/htdocs/core/class/cookie.class.php +++ b/htdocs/core/class/cookie.class.php @@ -109,7 +109,7 @@ class DolCookie * * @param string $cookie Cookie name * @param string $value Cookie value - * @param string $expire Expiration + * @param integer $expire Expiration * @param string $path Path of cookie * @param string $domain Domain name * @param int $secure 0 or 1 diff --git a/htdocs/core/class/cpays.class.php b/htdocs/core/class/cpays.class.php index e75f8a75a1a..e75746f2f66 100644 --- a/htdocs/core/class/cpays.class.php +++ b/htdocs/core/class/cpays.class.php @@ -187,7 +187,7 @@ class Cpays // extends CommonObject /** * Update object into database * - * @param User $user User that modify + * @param integer $user User that modify * @param int $notrigger 0=launch triggers after, 1=disable triggers * @return int <0 if KO, >0 if OK */ diff --git a/htdocs/core/class/ctypent.class.php b/htdocs/core/class/ctypent.class.php index eea64ed10ac..79a919658b6 100644 --- a/htdocs/core/class/ctypent.class.php +++ b/htdocs/core/class/ctypent.class.php @@ -194,7 +194,7 @@ class Ctypent // extends CommonObject /** * Update object into database * - * @param User $user User that modify + * @param integer $user User that modify * @param int $notrigger 0=launch triggers after, 1=disable triggers * @return int <0 if KO, >0 if OK */ diff --git a/htdocs/core/class/doleditor.class.php b/htdocs/core/class/doleditor.class.php index 6dc726b084e..17ea290137c 100644 --- a/htdocs/core/class/doleditor.class.php +++ b/htdocs/core/class/doleditor.class.php @@ -142,7 +142,7 @@ class DolEditor * * @param int $noprint 1=Return HTML string instead of printing it to output * @param string $morejs Add more js. For example: ".on( \'saveSnapshot\', function(e) { alert(\'ee\'); });" - * @return void + * @return string|null */ function Create($noprint=0,$morejs='') { diff --git a/htdocs/core/class/dolgeoip.class.php b/htdocs/core/class/dolgeoip.class.php index 9844e6b74c9..81c4b38510d 100644 --- a/htdocs/core/class/dolgeoip.class.php +++ b/htdocs/core/class/dolgeoip.class.php @@ -40,7 +40,7 @@ class DolGeoIP * * @param string $type 'country' or 'city' * @param string $datfile Data file - * @return GeoIP + * @return integer|null */ function __construct($type,$datfile) { diff --git a/htdocs/core/class/dolgraph.class.php b/htdocs/core/class/dolgraph.class.php index 33888b057b7..afb42b82d82 100644 --- a/htdocs/core/class/dolgraph.class.php +++ b/htdocs/core/class/dolgraph.class.php @@ -115,7 +115,7 @@ class DolGraph * Set Y precision * * @param float $which_prec Precision - * @return string + * @return boolean */ function SetPrecisionY($which_prec) { @@ -187,7 +187,7 @@ class DolGraph * Set y label * * @param string $label Y label - * @return boolean True + * @return boolean|null True */ function SetYLabel($label) { @@ -198,7 +198,7 @@ class DolGraph * Set width * * @param int $w Width - * @return boolean True + * @return boolean|null True */ function SetWidth($w) { @@ -554,7 +554,7 @@ class DolGraph /** * Return min value of all data * - * @return int Max value of all data + * @return double Max value of all data */ function GetFloorMinValue() { @@ -578,7 +578,7 @@ class DolGraph * * @param string $file Image file name to use to save onto disk (also used as javascript unique id) * @param string $fileurl Url path to show image if saved onto disk - * @return void + * @return integer|null */ function draw($file,$fileurl='') { diff --git a/htdocs/core/class/events.class.php b/htdocs/core/class/events.class.php index ba4dcfb94f6..5fa639d1560 100644 --- a/htdocs/core/class/events.class.php +++ b/htdocs/core/class/events.class.php @@ -150,7 +150,7 @@ class Events // extends CommonObject /** * Update database * - * @param User $user User that modify + * @param integer $user User that modify * @param int $notrigger 0=no, 1=yes (no update trigger) * @return int <0 if KO, >0 if OK */ @@ -188,7 +188,7 @@ class Events // extends CommonObject * Load object in memory from database * * @param int $id Id object - * @param User $user User that load + * @param integer $user User that load * @return int <0 if KO, >0 if OK */ function fetch($id, $user=0) diff --git a/htdocs/core/class/extrafields.class.php b/htdocs/core/class/extrafields.class.php index c9aa1405ff7..34ca247a96f 100644 --- a/htdocs/core/class/extrafields.class.php +++ b/htdocs/core/class/extrafields.class.php @@ -102,7 +102,7 @@ class ExtraFields * @param int $unique Is field unique or not * @param int $required Is field required or not * @param string $default_value Defaulted value - * @param array $param Params for field + * @param integer $param Params for field * @return int <=0 if KO, >0 if OK */ function addExtraField($attrname, $label, $type, $pos, $size, $elementtype, $unique=0, $required=0,$default_value='', $param=0) diff --git a/htdocs/core/class/fileupload.class.php b/htdocs/core/class/fileupload.class.php index 520ab7634be..b17bf166dd4 100644 --- a/htdocs/core/class/fileupload.class.php +++ b/htdocs/core/class/fileupload.class.php @@ -261,7 +261,7 @@ class FileUpload * * @param string $file_name Filename * @param string $options is array('max_width', 'max_height') - * @return void + * @return boolean */ protected function createScaledImage($file_name, $options) { @@ -296,7 +296,7 @@ class FileUpload * @param string $file File * @param string $error Error * @param string $index Index - * @return unknown|string + * @return boolean */ protected function validate($uploaded_file, $file, $error, $index) { @@ -378,10 +378,10 @@ class FileUpload /** * Enter description here ... * - * @param unknown_type $name Filename - * @param unknown_type $type ??? - * @param unknown_type $index ??? - * @return void + * @param string $name Filename + * @param string $type ??? + * @param string $index ??? + * @return string */ protected function trimFileName($name, $type, $index) { @@ -408,7 +408,7 @@ class FileUpload * Enter description here ... * * @param unknown_type $file_path ??? - * @return int Success or not + * @return boolean Success or not */ protected function orientImage($file_path) { diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 010e023b285..cf6ae5ed941 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -468,7 +468,7 @@ class Form * @param string $selected Id or Code or Label of preselected country * @param string $htmlname Name of html select object * @param string $htmloption Options html on select object - * @param string $maxlength Max length for labels (0=no limit) + * @param integer $maxlength Max length for labels (0=no limit) * @return string HTML string with select */ function select_country($selected='',$htmlname='country_id',$htmloption='',$maxlength=0) @@ -544,7 +544,7 @@ class Form * @param string $htmlname Name of field in html form * @param int $showempty Add an empty field * @param int $hidetext Do not show label 'Type' before combo box (used only if there is at least 2 choices to select) - * @param string $forceall 1=Force to show products and services in combo list, whatever are activated modules, 0=No force, -1=Force none (and set hidden field to 'service') + * @param integer $forceall 1=Force to show products and services in combo list, whatever are activated modules, 0=No force, -1=Force none (and set hidden field to 'service') * @return void */ function select_type_of_lines($selected='',$htmlname='type',$showempty=0,$hidetext=0,$forceall=0) @@ -947,9 +947,9 @@ class Form * @param int $showempty 0=no empty value, 1=add an empty value * @param string $exclude List of contacts id to exclude * @param string $limitto Disable answers that are not id in this array list - * @param string $showfunction Add function into label + * @param integer $showfunction Add function into label * @param string $moreclass Add more class to class style - * @param string $showsoc Add company into label + * @param integer $showsoc Add company into label * @param int $forcecombo Force to use combo box * @param array $events Event options. Example: array(array('method'=>'getContacts', 'url'=>dol_buildpath('/core/ajax/contacts.php',1), 'htmlname'=>'contactid', 'params'=>array('add-customer-contact'=>'disabled'))) * @param bool $options_only Return options only (for ajax treatment) @@ -970,10 +970,10 @@ class Form * @param int $showempty 0=no empty value, 1=add an empty value, 2=add line 'Internal' (used by user edit) * @param string $exclude List of contacts id to exclude * @param string $limitto Disable answers that are not id in this array list - * @param string $showfunction Add function into label + * @param integer $showfunction Add function into label * @param string $moreclass Add more class to class style * @param bool $options_only Return options only (for ajax treatment) - * @param string $showsoc Add company into label + * @param integer $showsoc Add company into label * @param int $forcecombo Force to use combo box * @param array $events Event options. Example: array(array('method'=>'getContacts', 'url'=>dol_buildpath('/core/ajax/contacts.php',1), 'htmlname'=>'contactid', 'params'=>array('add-customer-contact'=>'disabled'))) * @return int <0 if KO, Nb of contact in list if OK @@ -1907,7 +1907,7 @@ class Form * * @param int $productid Id of product * @param string $htmlname Name of HTML field - * @return void + * @return string|null */ function select_product_fourn_price($productid,$htmlname='productfournpriceid') { @@ -2001,7 +2001,7 @@ class Form * @param int $socid Id of company * @param string $htmlname Name of HTML field * @param int $showempty Add an empty field - * @return void + * @return integer|null */ function select_address($selected, $socid, $htmlname='address_id',$showempty=0) { @@ -2286,7 +2286,7 @@ class Form * * @param string $selected Id du type de paiement pre-selectionne * @param string $htmlname Nom de la zone select - * @param string $filtertype Pour filtre + * @param integer $filtertype Pour filtre * @param int $addempty Ajoute entree vide * @return void */ @@ -2389,7 +2389,7 @@ class Form * * @param string $selected Id pre-selectionne * @param string $htmlname Nom de la zone select - * @return void + * @return string */ function load_PriceBaseType($selected='',$htmlname='price_base_type') { @@ -2527,7 +2527,7 @@ class Form * @param string $htmlname HTML field name * @param int $maxlength Maximum length for labels * @param int $excludeafterid Exclude all categories after this leaf in category tree. - * @return void + * @return string */ function select_all_categories($type, $selected='', $htmlname="parent", $maxlength=64, $excludeafterid=0) { @@ -3299,7 +3299,7 @@ class Form * * @param string $selected preselected currency code * @param string $htmlname name of HTML select list - * @return void + * @return string */ function selectCurrency($selected='',$htmlname='currency_id') { @@ -3398,7 +3398,7 @@ class Form * Si vendeur et acheteur dans Communauté européenne et acheteur= entreprise alors TVA par défaut=0. Fin de règle. * Sinon la TVA proposee par defaut=0. Fin de regle. * @param bool $options_only Return options only (for ajax treatment) - * @return void + * @return string */ function load_tva($htmlname='tauxtva', $selectedrate='', $societe_vendeuse='', $societe_acheteuse='', $idprod=0, $info_bits=0, $type='', $options_only=false) { @@ -3550,7 +3550,7 @@ class Form * @param int $nooutput Do not output html string but return it * @param int $disabled Disable input fields * @param int $fullday When a checkbox with this html name is on, hour and day are set with 00:00 or 23:59 - * @return mixed Nothing or string if nooutput is 1 + * @return string|null Nothing or string if nooutput is 1 * @see form_date */ function select_date($set_time='', $prefix='re', $h=0, $m=0, $empty=0, $form_name="", $d=1, $addnowbutton=0, $nooutput=0, $disabled=0, $fullday='') @@ -3777,7 +3777,7 @@ class Form * @param int $iSecond Default preselected duration (number of seconds) * @param int $disabled Disable the combo box * @param string $typehour If 'select' then input hour and input min is a combo, if 'text' input hour is in text and input min is a combo - * @param string $minunderhours If 1, show minutes selection under the hours + * @param integer $minunderhours If 1, show minutes selection under the hours * @return void */ function select_duration($prefix, $iSecond='', $disabled=0, $typehour='select', $minunderhours=0) @@ -3977,7 +3977,7 @@ class Form * @param string $value Pre-selected value * @param int $option 0 return yes/no, 1 return 1/0 * @param bool $disabled true or false - * @return mixed See option + * @return string See option */ function selectyesno($htmlname,$value='',$option=0,$disabled=false) { @@ -4072,7 +4072,7 @@ class Form * @param string $morehtmlref Code html supplementaire a afficher apres ref * @param string $moreparam More param to add in nav link url. * @param int $nodbprefix Do not include DB prefix to forge table name - * @return tring Portion HTML avec ref + boutons nav + * @return string Portion HTML avec ref + boutons nav */ function showrefnav($object,$paramid,$morehtml='',$shownav=1,$fieldid='rowid',$fieldref='ref',$morehtmlref='',$moreparam='',$nodbprefix=0) { @@ -4235,7 +4235,7 @@ class Form * @param string $include Array list of groups id to include * @param int $enableonly Array list of groups id to be enabled. All other must be disabled * @param int $force_entity 0 or Id of environment to force - * @return void + * @return string * @see select_dolusers */ function select_dolgroups($selected='', $htmlname='groupid', $show_empty=0, $exclude='', $disabled=0, $include='', $enableonly='', $force_entity=0) diff --git a/htdocs/core/class/html.formactions.class.php b/htdocs/core/class/html.formactions.class.php index ed32fcc9f0d..b35e290e9d5 100644 --- a/htdocs/core/class/html.formactions.class.php +++ b/htdocs/core/class/html.formactions.class.php @@ -52,8 +52,8 @@ class FormActions * @param string $selected Preselected value (-1..100) * @param int $canedit 1=can edit, 0=read only * @param string $htmlname Name of html prefix for html fields (selectX and valX) - * @param string $showempty Show an empty line if select is used - * @param string $onlyselect 0=Standard, 1=Hide percent of completion and force usage of a select list, 2=Same than 1 and add "Incomplete (Todo+Running) + * @param integer $showempty Show an empty line if select is used + * @param integer $onlyselect 0=Standard, 1=Hide percent of completion and force usage of a select list, 2=Same than 1 and add "Incomplete (Todo+Running) * @return void */ function form_select_status_action($formname,$selected,$canedit=1,$htmlname='complete',$showempty=0,$onlyselect=0) @@ -229,7 +229,7 @@ class FormActions * @param string $selected Type pre-selected (can be 'manual', 'auto' or 'AC_xxx' * @param string $htmlname Nom champ formulaire * @param string $excludetype Type to exclude - * @param string $onlyautoornot Group list by auto events or not: We keep only the 2 generic lines (AC_OTH and AC_OTH_AUTO) + * @param integer $onlyautoornot Group list by auto events or not: We keep only the 2 generic lines (AC_OTH and AC_OTH_AUTO) * @param int $hideinfohelp 1=Do not show info help * @return void */ diff --git a/htdocs/core/class/html.formadmin.class.php b/htdocs/core/class/html.formadmin.class.php index f7a6154706f..b632bda4b80 100644 --- a/htdocs/core/class/html.formadmin.class.php +++ b/htdocs/core/class/html.formadmin.class.php @@ -50,7 +50,7 @@ class FormAdmin * @param string $selected Langue pre-selectionnee * @param string $htmlname Nom de la zone select * @param int $showauto Affiche choix auto - * @param array $filter Array of keys to exclude in list + * @param integer $filter Array of keys to exclude in list * @param int $showempty Add empty value * @param int $showwarning Show a warning if language is not complete * @return string Return HTML select string with list of languages @@ -114,7 +114,7 @@ class FormAdmin * @param string $htmlname Name of html select * @param array $dirmenuarray Array of directories to scan * @param string $moreattrib More attributes on html select tag - * @return void + * @return integer|null */ function select_menu($selected, $htmlname, $dirmenuarray, $moreattrib='') { @@ -324,7 +324,7 @@ class FormAdmin * * @param string $selected Paper format pre-selected * @param string $htmlname Name of HTML select field - * @param string $filter Value to filter on code + * @param integer $filter Value to filter on code * @param int $showempty Add empty value * @return string Return HTML output */ diff --git a/htdocs/core/class/html.formbank.class.php b/htdocs/core/class/html.formbank.class.php index 647688bb641..c666c759fad 100644 --- a/htdocs/core/class/html.formbank.class.php +++ b/htdocs/core/class/html.formbank.class.php @@ -44,7 +44,7 @@ class FormBank /** * Retourne la liste des types de comptes financiers * - * @param string $selected Type pre-selectionne + * @param integer $selected Type pre-selectionne * @param string $htmlname Nom champ formulaire * @return void */ diff --git a/htdocs/core/class/html.formcompany.class.php b/htdocs/core/class/html.formcompany.class.php index fd7db5fa94f..ad0064b0a98 100644 --- a/htdocs/core/class/html.formcompany.class.php +++ b/htdocs/core/class/html.formcompany.class.php @@ -207,7 +207,7 @@ class FormCompany * Ainsi les liens avec les departements se font sur un departement independemment de son nom. * * @param string $selected Code state preselected (mus be state id) - * @param string $country_codeid Country code or id: 0=list for all countries, otherwise country code or country rowid to show + * @param integer $country_codeid Country code or id: 0=list for all countries, otherwise country code or country rowid to show * @param string $htmlname Id of department * @return string String with HTML select */ @@ -413,7 +413,7 @@ class FormCompany * Dans le cas d'une liste tous pays confondu, on affiche une rupture sur le pays. * * @param string $selected Code forme juridique a pre-selectionne - * @param mixed $country_codeid 0=liste tous pays confondus, sinon code du pays a afficher + * @param integer $country_codeid 0=liste tous pays confondus, sinon code du pays a afficher * @param string $filter Add a SQL filter on list * @return void * @deprecated Use print xxx->select_juridicalstatus instead @@ -711,7 +711,7 @@ class FormCompany * @param string $fields Fields * @param int $fieldsize Field size * @param int $disableautocomplete 1 To disable autocomplete features - * @return void + * @return string */ function select_ziptown($selected='', $htmlname='zipcode', $fields='', $fieldsize=0, $disableautocomplete=0) { diff --git a/htdocs/core/class/html.formcron.class.php b/htdocs/core/class/html.formcron.class.php index bce8d9f041e..35ff7388293 100644 --- a/htdocs/core/class/html.formcron.class.php +++ b/htdocs/core/class/html.formcron.class.php @@ -46,8 +46,8 @@ class FormCron extends Form * Display On Off selector * * @param string $htmlname Html control name - * @param string $selected selected value - * @param string $readonly Select is read only or not + * @param integer $selected selected value + * @param integer $readonly Select is read only or not * @return string HTML select field */ function select_typejob($htmlname,$selected=0,$readonly=0) diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php index 6e764941d31..28b0c1c4540 100644 --- a/htdocs/core/class/html.formfile.class.php +++ b/htdocs/core/class/html.formfile.class.php @@ -62,9 +62,9 @@ class FormFile * @param int $size Length of input file area * @param Object $object Object to use (when attachment is done on an element) * @param string $options Add an option column - * @param boolean $useajax Use fileupload ajax (0=never, 1=if enabled, 2=always whatever is option). 2 should never be used. + * @param integer $useajax Use fileupload ajax (0=never, 1=if enabled, 2=always whatever is option). 2 should never be used. * @param string $savingdocmask Mask to use to define output filename. For example 'XXXXX-__YYYYMMDD__-__file__' - * @param string $linkfiles 1=Also add form to link files, 0=Do not show form to link files + * @param integer $linkfiles 1=Also add form to link files, 0=Do not show form to link files * @param string $htmlname Name and id of HTML form * @return int <0 if KO, >0 if OK */ @@ -215,11 +215,11 @@ class FormFile * @param int $genallowed Generation is allowed (1/0 or array of formats) * @param int $delallowed Remove is allowed (1/0) * @param string $modelselected Model to preselect by default - * @param string $allowgenifempty Show warning if no model activated - * @param string $forcenomultilang Do not show language option (even if MAIN_MULTILANGS defined) + * @param integer $allowgenifempty Show warning if no model activated + * @param integer $forcenomultilang Do not show language option (even if MAIN_MULTILANGS defined) * @param int $iconPDF Show only PDF icon with link (1/0) * @param int $maxfilenamelength Max length for filename shown - * @param string $noform Do not output html form tags + * @param integer $noform Do not output html form tags * @param string $param More param on http links * @param string $title Title to show on top of form * @param string $buttonlabel Label on submit button @@ -244,11 +244,11 @@ class FormFile * @param int $genallowed Generation is allowed (1/0 or array list of templates) * @param int $delallowed Remove is allowed (1/0) * @param string $modelselected Model to preselect by default - * @param string $allowgenifempty Allow generation even if list of template ($genallowed) is empty (show however a warning) - * @param string $forcenomultilang Do not show language option (even if MAIN_MULTILANGS defined) + * @param integer $allowgenifempty Allow generation even if list of template ($genallowed) is empty (show however a warning) + * @param integer $forcenomultilang Do not show language option (even if MAIN_MULTILANGS defined) * @param int $iconPDF Obsolete, see getDocumentsLink * @param int $maxfilenamelength Max length for filename shown - * @param string $noform Do not output html form tags + * @param integer $noform Do not output html form tags * @param string $param More param on http links * @param string $title Title to show on top of form * @param string $buttonlabel Label on submit button diff --git a/htdocs/core/class/html.formmailing.class.php b/htdocs/core/class/html.formmailing.class.php index 98a76c84686..93fdac553a3 100644 --- a/htdocs/core/class/html.formmailing.class.php +++ b/htdocs/core/class/html.formmailing.class.php @@ -48,7 +48,7 @@ class FormMailing extends Form * * @param string $selectedid the selected id * @param string $htmlname name of controm - * @param number $show_empty show empty option + * @param integer $show_empty show empty option * @return string HTML select */ public function selectDestinariesStatus($selectedid='',$htmlname='dest_status', $show_empty=0) { diff --git a/htdocs/core/class/html.formorder.class.php b/htdocs/core/class/html.formorder.class.php index 5ea5b33c1f4..b267e14b1dd 100644 --- a/htdocs/core/class/html.formorder.class.php +++ b/htdocs/core/class/html.formorder.class.php @@ -102,7 +102,7 @@ class FormOrder * @param string $selected Id of preselected input method * @param string $htmlname Name of HTML select list * @param int $addempty 0=list with no empty value, 1=list with empty value - * @return array Tableau des sources de commandes + * @return integer Tableau des sources de commandes */ function selectInputMethod($selected='',$htmlname='source_id',$addempty=0) { diff --git a/htdocs/core/class/html.formother.class.php b/htdocs/core/class/html.formother.class.php index ab924d482a7..9cbe4418bbe 100644 --- a/htdocs/core/class/html.formother.class.php +++ b/htdocs/core/class/html.formother.class.php @@ -157,7 +157,7 @@ class FormOther * * @param string $selected Preselected ecotaxes * @param string $htmlname Name of combo list - * @return void + * @return integer */ function select_ecotaxes($selected='',$htmlname='ecotaxe_id') { @@ -268,7 +268,7 @@ class FormOther /** * Return a HTML select list to select a percent * - * @param string $selected pourcentage pre-selectionne + * @param integer $selected pourcentage pre-selectionne * @param string $htmlname nom de la liste deroulante * @param int $disabled Disabled or not * @param int $increment increment value @@ -303,7 +303,7 @@ class FormOther * Return select list for categories (to use in form search selectors) * * @param int $type Type of categories (0=product, 1=suppliers, 2=customers, 3=members) - * @param string $selected Preselected value + * @param integer $selected Preselected value * @param string $htmlname Name of combo list * @param int $nocateg Show also an entry "Not categorized" * @return string Html combo list code @@ -469,6 +469,7 @@ class FormOther * @param int $selectedtask Id selected task * @param int $selectedproject Id selected project * @param int $disablechildoftaskid 1=Disable task that are child of the provided task id + * @param integer $inc * @return void */ private function _pLineSelect(&$inc, $parent, $lines, $level=0, $selectedtask=0, $selectedproject=0, $disablechildoftaskid=0) @@ -579,7 +580,7 @@ class FormOther * @param int $showcolorbox 1=Show color code and color box, 0=Show only color code * @param array $arrayofcolors Array of colors. Example: array('29527A','5229A3','A32929','7A367A','B1365F','0D7813') * @param string $morecss Add css style into input field - * @return void + * @return string */ function selectColor($set_color='', $prefix='f_color', $form_name='objForm', $showcolorbox=1, $arrayofcolors='', $morecss='') { @@ -709,7 +710,7 @@ class FormOther * @param string $selected Preselected value * @param string $htmlname Nom de la zone select * @param int $useempty Affiche valeur vide dans liste - * @return void + * @return string */ function select_dayofweek($selected='',$htmlname='weekid',$useempty=0) { @@ -750,7 +751,7 @@ class FormOther * @param string $selected Preselected value * @param string $htmlname Nom de la zone select * @param int $useempty Affiche valeur vide dans liste - * @return void + * @return string */ function select_month($selected='',$htmlname='monthid',$useempty=0) { @@ -810,7 +811,7 @@ class FormOther * @param int $offset Offset * @param int $invert Invert * @param string $option Option - * @return void + * @return string */ function selectyear($selected='',$htmlname='yearid',$useempty=0, $min_year=10, $max_year=5, $offset=0, $invert=0, $option='') { diff --git a/htdocs/core/class/ldap.class.php b/htdocs/core/class/ldap.class.php index 30eeca5a486..03020d12f99 100644 --- a/htdocs/core/class/ldap.class.php +++ b/htdocs/core/class/ldap.class.php @@ -345,7 +345,7 @@ class Ldap /** * Change ldap protocol version to use. * - * @return string version + * @return boolean version */ function setVersion() { // LDAP_OPT_PROTOCOL_VERSION est une constante qui vaut 17 @@ -356,7 +356,7 @@ class Ldap /** * changement du referrals. * - * @return string referrals + * @return boolean referrals */ function setReferrals() { // LDAP_OPT_REFERRALS est une constante qui vaut ? @@ -1308,7 +1308,7 @@ class Ldap * Convertit le temps ActiveDirectory en Unix timestamp * * @param string $value AD time to convert - * @return string Unix timestamp + * @return integer Unix timestamp */ function convert_time($value) { diff --git a/htdocs/core/class/menu.class.php b/htdocs/core/class/menu.class.php index 411158dea84..dff357d8f91 100644 --- a/htdocs/core/class/menu.class.php +++ b/htdocs/core/class/menu.class.php @@ -53,7 +53,7 @@ class Menu * * @param string $url Url to follow on click * @param string $titre Label of menu to add - * @param string $level Level of menu to add + * @param integer $level Level of menu to add * @param int $enabled Menu active or not (0=Not active, 1=Active, 2=Active but grey) * @param string $target Target lien * @param string $mainmenu Main menu ('home', 'companies', 'products', ...) @@ -71,7 +71,7 @@ class Menu * @param int $idafter Array key after which inserting new entry * @param string $url Url to follow on click * @param string $titre Label of menu to add - * @param string $level Level of menu to add + * @param integer $level Level of menu to add * @param int $enabled Menu active or not * @param string $target Target lien * @param string $mainmenu Main menu ('home', 'companies', 'products', ...) diff --git a/htdocs/core/class/menubase.class.php b/htdocs/core/class/menubase.class.php index aa43c545c8d..256eec469c7 100644 --- a/htdocs/core/class/menubase.class.php +++ b/htdocs/core/class/menubase.class.php @@ -71,7 +71,7 @@ class Menubase /** * Create menu entry into database * - * @param User $user User that create + * @param integer $user User that create * @return int <0 if KO, Id of record if OK */ function create($user=0) @@ -181,7 +181,7 @@ class Menubase /** * Update menu entry into database. * - * @param User $user User that modify + * @param integer $user User that modify * @param int $notrigger 0=no, 1=yes (no update trigger) * @return int <0 if KO, >0 if OK */ @@ -247,7 +247,7 @@ class Menubase * Load object in memory from database * * @param int $id Id object - * @param User $user User that load + * @param integer $user User that load * @return int <0 if KO, >0 if OK */ function fetch($id, $user=0) diff --git a/htdocs/core/class/openid.class.php b/htdocs/core/class/openid.class.php index 5165dcb4994..29ad98cc204 100644 --- a/htdocs/core/class/openid.class.php +++ b/htdocs/core/class/openid.class.php @@ -150,7 +150,7 @@ class SimpleOpenID /** * GetIdentity * - * @return void + * @return string */ function GetIdentity() { // Get Identity @@ -187,7 +187,7 @@ class SimpleOpenID /** * IsError * - * @return void + * @return boolean */ function IsError() { @@ -225,7 +225,7 @@ class SimpleOpenID * OpenID_Standarize * * @param string $openid_identity Server - * @return void + * @return string */ function OpenID_Standarize($openid_identity = null) { @@ -283,6 +283,9 @@ class SimpleOpenID } } + /** + * @param string $url + */ function CURL_Request($url, $method="GET", $params = "") { // Remember, SSL MUST BE SUPPORTED if (is_array($params)) $params = $this->array2url($params); @@ -356,7 +359,7 @@ class SimpleOpenID /** * GetRedirectURL * - * @return void + * @return string */ function GetRedirectURL() { @@ -400,7 +403,7 @@ class SimpleOpenID /** * ValidateWithServer * - * @return void + * @return boolean */ function ValidateWithServer() { diff --git a/htdocs/core/class/rssparser.class.php b/htdocs/core/class/rssparser.class.php index 80ca1b155b7..c68cf4002f5 100644 --- a/htdocs/core/class/rssparser.class.php +++ b/htdocs/core/class/rssparser.class.php @@ -151,7 +151,7 @@ class RssParser /** * getLastFetchDate * - * @return string + * @return integer */ public function getLastFetchDate() { diff --git a/htdocs/core/class/smtps.class.php b/htdocs/core/class/smtps.class.php index 61a098330c2..cfc502c4239 100644 --- a/htdocs/core/class/smtps.class.php +++ b/htdocs/core/class/smtps.class.php @@ -362,7 +362,7 @@ class SMTPs /** * Attempt mail server authentication for a secure connection * - * @return mixed $_retVal Boolean indicating success or failure of authentication + * @return boolean|null $_retVal Boolean indicating success or failure of authentication */ function _server_authenticate() { @@ -399,7 +399,7 @@ class SMTPs * * @param boolean $_bolTestMsg whether to run this method in 'Test' mode. * @param boolean $_bolDebug whether to log all communication between this Class and the Mail Server. - * @return mixed void + * @return boolean|null void * $_strMsg If this is run in 'Test' mode, the actual message structure will be returned */ function sendMsg($_bolTestMsg = false, $_bolDebug = false) @@ -499,7 +499,7 @@ class SMTPs * defined. * * @param mixed $_strConfigPath path to config file or VOID - * @return void + * @return boolean */ function setConfig ( $_strConfigPath = null ) { @@ -573,7 +573,7 @@ class SMTPs * Path to the sendmail execuable * * @param string $_path Path to the sendmail execuable - * @return void + * @return boolean * */ function setMailPath($_path) @@ -949,8 +949,8 @@ class SMTPs /** * Returns an array of addresses for a specific type; TO, CC or BCC * - * @param mixed $_which Which collection of adresses to return - * @return array Array of emaill address + * @param string $_which Which collection of adresses to return + * @return string|false Array of emaill address */ function get_email_list($_which = null) { @@ -1000,7 +1000,7 @@ class SMTPs /** * TO Address[es] inwhich to send mail to * - * @param mixed $_addrTo TO Address[es] inwhich to send mail to + * @param string $_addrTo TO Address[es] inwhich to send mail to * @return void */ function setTO($_addrTo) @@ -1370,7 +1370,7 @@ class SMTPs * - [2] Private * - [3] Company Confidential * - * @param string $_value Message Sensitivity + * @param integer $_value Message Sensitivity * @return void */ function setSensitivity($_value = 0) @@ -1405,7 +1405,7 @@ class SMTPs * - [4] 'Low' * - [5] 'Lowest' * - * @param string $_value Message Priority + * @param integer $_value Message Priority * @return void */ function setPriority ( $_value = 3 ) @@ -1425,7 +1425,7 @@ class SMTPs * - [4] 'Low' * - [5] 'Lowest' * - * @return void + * @return string */ function getPriority() { @@ -1448,7 +1448,7 @@ class SMTPs /** * Gets flag which determines whether to calculate message MD5 checksum. * - * @return string Message Priority + * @return boolean Message Priority */ function getMD5flag() { @@ -1472,7 +1472,7 @@ class SMTPs /** * Retrieves the Message X-Header Content * - * @return string $_msgContent Message X-Header Content + * @return string[] $_msgContent Message X-Header Content */ function getXheader() { @@ -1546,7 +1546,7 @@ class SMTPs * @param string $_strSend String to send * @param string $_returnCode Return code * @param string $CRLF CRLF - * @return boolean True or false + * @return boolean|null True or false */ function socket_send_str( $_strSend, $_returnCode = null, $CRLF = "\r\n" ) { diff --git a/htdocs/core/class/translate.class.php b/htdocs/core/class/translate.class.php index f86681f5c76..2b00c74568a 100644 --- a/htdocs/core/class/translate.class.php +++ b/htdocs/core/class/translate.class.php @@ -154,7 +154,7 @@ class Translate * If $domain is "file@module" instead of "file" then we look for module lang file * in htdocs/custom/modules/mymodule/langs/code_CODE/file.lang * then in htdocs/module/langs/code_CODE/file.lang instead of htdocs/langs/code_CODE/file.lang - * @param string $alt 0 (try xx_ZZ then 1), 1 (try xx_XX then 2), 2 (try en_US or fr_FR or es_ES) + * @param integer $alt 0 (try xx_ZZ then 1), 1 (try xx_XX then 2), 2 (try en_US or fr_FR or es_ES) * @param int $stopafterdirection Stop when the DIRECTION tag is found (optimize speed) * @param int $forcelangdir To force a different lang directory * @return int <0 if KO, 0 if already loaded or loading not required, >0 if OK @@ -543,7 +543,7 @@ class Translate * Return list of all available languages * * @param string $langdir Directory to scan - * @param string $maxlength Max length for each value in combo box (will be truncated) + * @param integer $maxlength Max length for each value in combo box (will be truncated) * @param int $usecode Show code instead of country name for language variant * @return array List of languages */ @@ -578,7 +578,7 @@ class Translate * Return if a filename $filename exists for current language (or alternate language) * * @param string $filename Language filename to search - * @param string $searchalt Search also alernate language file + * @param integer $searchalt Search also alernate language file * @return boolean true if exists and readable */ function file_exists($filename,$searchalt=0) @@ -714,7 +714,7 @@ class Translate * Return a currency code into its symbol * * @param string $currency_code Currency code - * @param string $forceloadall 1=Force to load all currencies into cache. We know we need to use all of them. By default read and cache only required currency. + * @param integer $forceloadall 1=Force to load all currencies into cache. We know we need to use all of them. By default read and cache only required currency. * @return string Currency symbol encoded into UTF8 */ function getCurrencySymbol($currency_code, $forceloadall=0) diff --git a/htdocs/core/class/vcard.class.php b/htdocs/core/class/vcard.class.php index 512aa011d98..bc9f9081a49 100644 --- a/htdocs/core/class/vcard.class.php +++ b/htdocs/core/class/vcard.class.php @@ -306,7 +306,7 @@ class vCard /** * permet d'obtenir une vcard * - * @return void + * @return string */ function getVCard() { diff --git a/htdocs/core/datepicker.php b/htdocs/core/datepicker.php index 7e0333bc5aa..0001bec0514 100644 --- a/htdocs/core/datepicker.php +++ b/htdocs/core/datepicker.php @@ -119,7 +119,7 @@ print ''."\n"; * Convert date to timestamp * * @param string $mysqldate Date YYYMMDD - * @return timestamp Timestamp + * @return integer Timestamp */ function xyzToUnixTimestamp($mysqldate) { diff --git a/htdocs/core/db/Database.interface.php b/htdocs/core/db/Database.interface.php index 8b5f2c86810..cd607a72b58 100644 --- a/htdocs/core/db/Database.interface.php +++ b/htdocs/core/db/Database.interface.php @@ -137,8 +137,8 @@ interface Database /** * Define sort criteria of request * - * @param string $sortfield List of sort fields - * @param string $sortorder Sort order + * @param integer $sortfield List of sort fields + * @param integer $sortorder Sort order * @return string String to provide syntax of a sort sql string */ function order($sortfield = 0, $sortorder = 0); @@ -216,7 +216,7 @@ interface Database * @param string $login login * @param string $passwd password * @param string $name name of database (not used for mysql, used for pgsql) - * @param string $port Port of database server + * @param integer $port Port of database server * @return resource Database access handler * @see close */ @@ -421,7 +421,7 @@ interface Database /** * Free last resultset used. * - * @param resource $resultset Curseur de la requete voulue + * @param integer $resultset Curseur de la requete voulue * @return void */ function free($resultset = 0); diff --git a/htdocs/core/db/DoliDB.class.php b/htdocs/core/db/DoliDB.class.php index aa0792c5970..179eb81fefc 100644 --- a/htdocs/core/db/DoliDB.class.php +++ b/htdocs/core/db/DoliDB.class.php @@ -223,8 +223,8 @@ abstract class DoliDB implements Database /** * Define sort criteria of request * - * @param string $sortfield List of sort fields - * @param string $sortorder Sort order + * @param integer $sortfield List of sort fields + * @param integer $sortorder Sort order * @return string String to provide syntax of a sort sql string */ function order($sortfield=0,$sortorder=0) @@ -266,7 +266,7 @@ abstract class DoliDB implements Database * * @param string $string Date in a string (YYYYMMDDHHMMSS, YYYYMMDD, YYYY-MM-DD HH:MM:SS) * @param int $gm 1=Input informations are GMT values, otherwise local to server TZ - * @return date Date TMS + * @return integer Date TMS */ function jdate($string, $gm=false) { diff --git a/htdocs/core/db/mssql.class.php b/htdocs/core/db/mssql.class.php index d0b454168df..c03baa2b04c 100644 --- a/htdocs/core/db/mssql.class.php +++ b/htdocs/core/db/mssql.class.php @@ -155,7 +155,7 @@ class DoliDBMssql extends DoliDB * @param string $login login * @param string $passwd password * @param string $name name of database (not used for mysql, used for pgsql) - * @param string $port Port of database server + * @param integer $port Port of database server * @return resource Database access handler * @see close */ @@ -399,7 +399,7 @@ class DoliDBMssql extends DoliDB /** * Return datas as an array * - * @param Resultset $resultset Resultset of request + * @param resource $resultset Resultset of request * @return array Array */ function fetch_array($resultset) @@ -413,7 +413,7 @@ class DoliDBMssql extends DoliDB /** * Return datas as an array * - * @param Resultset $resultset Resultset of request + * @param resource $resultset Resultset of request * @return array Array */ function fetch_row($resultset) @@ -441,7 +441,7 @@ class DoliDBMssql extends DoliDB * Renvoie le nombre de lignes dans le resultat d'une requete INSERT, DELETE ou UPDATE * * @param resultset $resultset Curseur de la requete voulue - * @return int Nombre de lignes + * @return string Nombre de lignes * @see num_rows */ function affected_rows($resultset) @@ -459,7 +459,7 @@ class DoliDBMssql extends DoliDB /** * Free last resultset used. * - * @param resultset $resultset Curseur de la requete voulue + * @param integer $resultset Curseur de la requete voulue * @return void */ function free($resultset=0) @@ -588,7 +588,7 @@ class DoliDBMssql extends DoliDB * * @param string $fieldorvalue Field name or value to encrypt * @param int $withQuotes Return string with quotes - * @return return XXX(field) or XXX('value') or field or 'value' + * @return string XXX(field) or XXX('value') or field or 'value' */ function encrypt($fieldorvalue, $withQuotes=0) { @@ -903,7 +903,7 @@ class DoliDBMssql extends DoliDB /** * Return list of available charset that can be used to store data in database * - * @return array List of Charset + * @return string List of Charset */ function getListOfCharacterSet() { @@ -932,7 +932,7 @@ class DoliDBMssql extends DoliDB /** * Return list of available collation that can be used for database * - * @return array Liste of Collation + * @return string Liste of Collation */ function getListOfCollation() { diff --git a/htdocs/core/db/mysql.class.php b/htdocs/core/db/mysql.class.php index bfa2d39b093..2b5ecd6c32a 100644 --- a/htdocs/core/db/mysql.class.php +++ b/htdocs/core/db/mysql.class.php @@ -182,7 +182,7 @@ class DoliDBMysql extends DoliDB * @param string $login login * @param string $passwd password * @param string $name name of database (not used for mysql, used for pgsql) - * @param string $port Port of database server + * @param integer $port Port of database server * @return resource Database access handler * @see close */ @@ -314,7 +314,7 @@ class DoliDBMysql extends DoliDB /** * Return datas as an array * - * @param Resultset $resultset Resultset of request + * @param resource $resultset Resultset of request * @return array Array */ function fetch_row($resultset) @@ -358,7 +358,7 @@ class DoliDBMysql extends DoliDB /** * Free last resultset used. * - * @param resultset $resultset Curseur de la requete voulue + * @param integer $resultset Curseur de la requete voulue * @return void */ function free($resultset=0) diff --git a/htdocs/core/db/mysqli.class.php b/htdocs/core/db/mysqli.class.php index da16c1a7971..89ed3cbc1d7 100644 --- a/htdocs/core/db/mysqli.class.php +++ b/htdocs/core/db/mysqli.class.php @@ -185,7 +185,7 @@ class DoliDBMysqli extends DoliDB * @param string $login login * @param string $passwd password * @param string $name name of database (not used for mysql, used for pgsql) - * @param string $port Port of database server + * @param integer $port Port of database server * @return resource Database access handler * @see close */ @@ -316,7 +316,7 @@ class DoliDBMysqli extends DoliDB /** * Return datas as an array * - * @param Resultset $resultset Resultset of request + * @param resource $resultset Resultset of request * @return array Array */ function fetch_row($resultset) @@ -369,7 +369,7 @@ class DoliDBMysqli extends DoliDB /** * Libere le dernier resultset utilise sur cette connexion * - * @param resultset $resultset Curseur de la requete voulue + * @param integer $resultset Curseur de la requete voulue * @return void */ function free($resultset=0) @@ -716,7 +716,7 @@ class DoliDBMysqli extends DoliDB * * @param string $table Name of table * @param string $field Optionnel : Name of field if we want description of field - * @return resultset Resultset x (x->Field, x->Type, ...) + * @return resource Resultset x (x->Field, x->Type, ...) */ function DDLDescTable($table,$field="") { diff --git a/htdocs/core/db/pgsql.class.php b/htdocs/core/db/pgsql.class.php index f6759e087c8..d2f17427d42 100644 --- a/htdocs/core/db/pgsql.class.php +++ b/htdocs/core/db/pgsql.class.php @@ -145,7 +145,7 @@ class DoliDBPgsql extends DoliDB * * @param string $line SQL request line to convert * @param string $type Type of SQL order ('ddl' for insert, update, select, delete or 'dml' for create, alter...) - * @param string $unescapeslashquot Unescape slash quote with quote quote + * @param integer $unescapeslashquot Unescape slash quote with quote quote * @return string SQL request line converted */ static function convertSQLFromMysql($line,$type='auto',$unescapeslashquot=0) @@ -361,7 +361,7 @@ class DoliDBPgsql extends DoliDB * @param string $login Login * @param string $passwd Password * @param string $name Name of database (not used for mysql, used for pgsql) - * @param string $port Port of database server + * @param integer $port Port of database server * @return resource Database access handler * @see close */ @@ -539,7 +539,7 @@ class DoliDBPgsql extends DoliDB /** * Return datas as an array * - * @param Resultset $resultset Resultset of request + * @param resource $resultset Resultset of request * @return array Array */ function fetch_array($resultset) @@ -552,7 +552,7 @@ class DoliDBPgsql extends DoliDB /** * Return datas as an array * - * @param Resultset $resultset Resultset of request + * @param resource $resultset Resultset of request * @return array Array */ function fetch_row($resultset) @@ -596,7 +596,7 @@ class DoliDBPgsql extends DoliDB /** * Libere le dernier resultset utilise sur cette connexion * - * @param Resultset $resultset Result set of request + * @param integer $resultset Result set of request * @return void */ function free($resultset=0) @@ -664,7 +664,7 @@ class DoliDBPgsql extends DoliDB /** * Renvoie le code erreur generique de l'operation precedente. * - * @return error_num (Exemples: DB_ERROR_TABLE_ALREADY_EXISTS, DB_ERROR_RECORD_ALREADY_EXISTS...) + * @return string (Exemples: DB_ERROR_TABLE_ALREADY_EXISTS, DB_ERROR_RECORD_ALREADY_EXISTS...) */ function errno() { @@ -730,7 +730,7 @@ class DoliDBPgsql extends DoliDB /** * Renvoie le texte de l'erreur pgsql de l'operation precedente * - * @return error_text + * @return string */ function error() { @@ -742,7 +742,7 @@ class DoliDBPgsql extends DoliDB * * @param string $tab Table name concerned by insert. Ne sert pas sous MySql mais requis pour compatibilite avec Postgresql * @param string $fieldid Field name - * @return int Id of row + * @return null|string Id of row */ function last_insert_id($tab,$fieldid='rowid') { @@ -764,7 +764,7 @@ class DoliDBPgsql extends DoliDB * * @param string $fieldorvalue Field name or value to encrypt * @param int $withQuotes Return string with quotes - * @return return XXX(field) or XXX('value') or field or 'value' + * @return string XXX(field) or XXX('value') or field or 'value' */ function encrypt($fieldorvalue, $withQuotes=0) { @@ -785,7 +785,7 @@ class DoliDBPgsql extends DoliDB * Decrypt sensitive data in database * * @param int $value Value to decrypt - * @return string Decrypted value if used + * @return integer Decrypted value if used */ function decrypt($value) { @@ -1002,7 +1002,7 @@ class DoliDBPgsql extends DoliDB * * @param string $table Name of table * @param string $field Optionnel : Name of field if we want description of field - * @return resultset Resultset x (x->attname) + * @return resource Resultset x (x->attname) */ function DDLDescTable($table,$field="") { diff --git a/htdocs/core/db/sqlite.class.php b/htdocs/core/db/sqlite.class.php index 34ee2a41b6d..8bc030ecae7 100644 --- a/htdocs/core/db/sqlite.class.php +++ b/htdocs/core/db/sqlite.class.php @@ -294,7 +294,7 @@ class DoliDBSqlite extends DoliDB * @param string $login login * @param string $passwd password * @param string $name name of database (not used for mysql, used for pgsql) - * @param string $port Port of database server + * @param integer $port Port of database server * @return resource Database access handler * @see close */ @@ -457,7 +457,7 @@ class DoliDBSqlite extends DoliDB /** * Return datas as an array * - * @param Resultset $resultset Resultset of request + * @param resource $resultset Resultset of request * @return array Array */ function fetch_row($resultset) @@ -509,7 +509,7 @@ class DoliDBSqlite extends DoliDB /** * Free last resultset used. * - * @param resultset $resultset Curseur de la requete voulue + * @param integer $resultset Curseur de la requete voulue * @return void */ function free($resultset=0) @@ -627,7 +627,7 @@ class DoliDBSqlite extends DoliDB * * @param string $fieldorvalue Field name or value to encrypt * @param int $withQuotes Return string with quotes - * @return return XXX(field) or XXX('value') or field or 'value' + * @return string XXX(field) or XXX('value') or field or 'value' */ function encrypt($fieldorvalue, $withQuotes=0) { diff --git a/htdocs/core/filemanagerdol/connectors/php/basexml.php b/htdocs/core/filemanagerdol/connectors/php/basexml.php index 439353b4e26..715ac667448 100644 --- a/htdocs/core/filemanagerdol/connectors/php/basexml.php +++ b/htdocs/core/filemanagerdol/connectors/php/basexml.php @@ -47,6 +47,9 @@ function SetXmlHeaders() header('Content-Type: text/xml; charset=utf-8'); } +/** + * @param string $currentFolder + */ function CreateXmlHeader( $command, $resourceType, $currentFolder ) { SetXmlHeaders(); @@ -71,7 +74,7 @@ function CreateXmlFooter() /** * SendError * - * @param unknown_type $number Number + * @param integer $number Number * @param unknown_type $text Text * @return void */ diff --git a/htdocs/core/filemanagerdol/connectors/php/commands.php b/htdocs/core/filemanagerdol/connectors/php/commands.php index 6369ac9d3ae..f0b7fc0798b 100644 --- a/htdocs/core/filemanagerdol/connectors/php/commands.php +++ b/htdocs/core/filemanagerdol/connectors/php/commands.php @@ -22,6 +22,9 @@ * This is the File Manager Connector for PHP. */ +/** + * @param string $currentFolder + */ function GetFolders( $resourceType, $currentFolder ) { // Map the virtual path to the local server path. @@ -53,6 +56,9 @@ function GetFolders( $resourceType, $currentFolder ) echo "" ; } +/** + * @param string $currentFolder + */ function GetFoldersAndFiles( $resourceType, $currentFolder ) { // Map the virtual path to the local server path. @@ -111,6 +117,9 @@ function GetFoldersAndFiles( $resourceType, $currentFolder ) echo '' ; } +/** + * @param string $currentFolder + */ function CreateFolder( $resourceType, $currentFolder ) { if (!isset($_GET)) { @@ -164,6 +173,9 @@ function CreateFolder( $resourceType, $currentFolder ) // DOL_CHANGE //function FileUpload( $resourceType, $currentFolder, $sCommand ) +/** + * @param string $currentFolder + */ function FileUpload($resourceType, $currentFolder, $sCommand, $CKEcallback = '') { if (!isset($_FILES)) { diff --git a/htdocs/core/filemanagerdol/connectors/php/io.php b/htdocs/core/filemanagerdol/connectors/php/io.php index 50ce4a33f05..08e31491898 100644 --- a/htdocs/core/filemanagerdol/connectors/php/io.php +++ b/htdocs/core/filemanagerdol/connectors/php/io.php @@ -21,6 +21,9 @@ * * This is the File Manager Connector for PHP. */ +/** + * @param string $sBasePath + */ function CombinePaths( $sBasePath, $sFolder ) { return RemoveFromEnd($sBasePath, '/') . '/' . RemoveFromStart($sFolder, '/'); @@ -45,8 +48,8 @@ function GetResourceTypePath($resourceType, $sCommand) /** * GetResourceTypeDirectory * - * @param unknown_type $resourceType Resource type - * @param unknown_type $sCommand Command + * @param string $resourceType Resource type + * @param string $sCommand Command * @return string */ function GetResourceTypeDirectory($resourceType, $sCommand) @@ -91,7 +94,7 @@ function RemoveExtension($fileName) * @param string $resourceType Resource type * @param string $folderPath Folder * @param string $sCommand Command - * @return void + * @return string */ function ServerMapFolder($resourceType, $folderPath, $sCommand) { @@ -107,6 +110,9 @@ function ServerMapFolder($resourceType, $folderPath, $sCommand) return CombinePaths($sResourceTypePath, $folderPath); } +/** + * @param string $folderPath + */ function GetParentFolder( $folderPath ) { $sPattern = "-[/\\\\][^/\\\\]+[/\\\\]?$-" ; @@ -221,6 +227,9 @@ function Server_MapPath( $path ) return GetRootPath() . $path ; } +/** + * @param string $sExtension + */ function IsAllowedExt($sExtension, $resourceType) { global $Config ; @@ -348,6 +357,10 @@ EOF; // DOL_CHANGE // This is the function that sends the results of the uploading process to CKE. +/** + * @param string $callback + * @param string $sFileUrl + */ function SendCKEditorResults ($callback, $sFileUrl, $customMsg = '') { echo ' - -
+ + + +
This page is a sample of page using tables. To make test with
- css (edit page to change)
- jmobile (edit page to enable/disable)
- dataTables
- tablednd
-
-Example 0a : Table with div+div+div containg a select that should be overflowed and truncated
+


Example 0a : Table with div+div+div containg a select that should be overflowed and truncated => Use this to align text or form
+ +
@@ -55,7 +76,9 @@ Example 0a : Table with div+div+div containg a select that should be overflowed
-Example 0b: Table with div+form+div containg a select that should be overflowed and truncated
+ +


Example 0b: Table with div+form+div containg a select that should be overflowed and truncated => Use this to align text or form
+
@@ -66,7 +89,9 @@ Example 0b: Table with div+form+div containg a select that should be overflowed
-Example 0c: Table with table+tr+td containg a select that should be overflowed and truncated
+ +


Example 0c: Table with table+tr+td containg a select that should be overflowed and truncated => Use this to align text or form
+ '."\n"; $var=!$var; -print ''."\n"; +print ''."\n"; $var=!$var; print ''."\n"; $var=!$var; diff --git a/htdocs/core/class/MobileDetect.class.php b/htdocs/core/class/MobileDetect.class.php new file mode 100644 index 00000000000..1f1795f51ea --- /dev/null +++ b/htdocs/core/class/MobileDetect.class.php @@ -0,0 +1,1248 @@ +, Nick Ilyin + * Original author: Victor Stanciu + * + * @license Code and contributions have 'MIT License' + * More details: https://github.com/serbanghita/Mobile-Detect/blob/master/LICENSE.txt + * + * @link Homepage: http://mobiledetect.net + * GitHub Repo: https://github.com/serbanghita/Mobile-Detect + * Google Code: http://code.google.com/p/php-mobile-detect/ + * README: https://github.com/serbanghita/Mobile-Detect/blob/master/README.md + * HOWTO: https://github.com/serbanghita/Mobile-Detect/wiki/Code-examples + * + * @version 2.8.3 + */ + +class MobileDetect +{ + /** + * Mobile detection type. + * + * @deprecated since version 2.6.9 + */ + const DETECTION_TYPE_MOBILE = 'mobile'; + + /** + * Extended detection type. + * + * @deprecated since version 2.6.9 + */ + const DETECTION_TYPE_EXTENDED = 'extended'; + + /** + * A frequently used regular expression to extract version #s. + * + * @deprecated since version 2.6.9 + */ + const VER = '([\w._\+]+)'; + + /** + * Top-level device. + */ + const MOBILE_GRADE_A = 'A'; + + /** + * Mid-level device. + */ + const MOBILE_GRADE_B = 'B'; + + /** + * Low-level device. + */ + const MOBILE_GRADE_C = 'C'; + + /** + * Stores the version number of the current release. + */ + const VERSION = '2.8.3'; + + /** + * A type for the version() method indicating a string return value. + */ + const VERSION_TYPE_STRING = 'text'; + + /** + * A type for the version() method indicating a float return value. + */ + const VERSION_TYPE_FLOAT = 'float'; + + /** + * The User-Agent HTTP header is stored in here. + * @var string + */ + protected $userAgent = null; + + /** + * HTTP headers in the PHP-flavor. So HTTP_USER_AGENT and SERVER_SOFTWARE. + * @var array + */ + protected $httpHeaders = array(); + + /** + * The detection type, using self::DETECTION_TYPE_MOBILE or self::DETECTION_TYPE_EXTENDED. + * + * @deprecated since version 2.6.9 + * + * @var string + */ + protected $detectionType = self::DETECTION_TYPE_MOBILE; + + /** + * HTTP headers that trigger the 'isMobile' detection + * to be true. + * + * @var array + */ + protected static $mobileHeaders = array( + + 'HTTP_ACCEPT' => array('matches' => array( + // Opera Mini; @reference: http://dev.opera.com/articles/view/opera-binary-markup-language/ + 'application/x-obml2d', + // BlackBerry devices. + 'application/vnd.rim.html', + 'text/vnd.wap.wml', + 'application/vnd.wap.xhtml+xml' + )), + 'HTTP_X_WAP_PROFILE' => null, + 'HTTP_X_WAP_CLIENTID' => null, + 'HTTP_WAP_CONNECTION' => null, + 'HTTP_PROFILE' => null, + // Reported by Opera on Nokia devices (eg. C3). + 'HTTP_X_OPERAMINI_PHONE_UA' => null, + 'HTTP_X_NOKIA_GATEWAY_ID' => null, + 'HTTP_X_ORANGE_ID' => null, + 'HTTP_X_VODAFONE_3GPDPCONTEXT' => null, + 'HTTP_X_HUAWEI_USERID' => null, + // Reported by Windows Smartphones. + 'HTTP_UA_OS' => null, + // Reported by Verizon, Vodafone proxy system. + 'HTTP_X_MOBILE_GATEWAY' => null, + // Seend this on HTC Sensation. @ref: SensationXE_Beats_Z715e. + 'HTTP_X_ATT_DEVICEID' => null, + // Seen this on a HTC. + 'HTTP_UA_CPU' => array('matches' => array('ARM')), + ); + + /** + * List of mobile devices (phones). + * + * @var array + */ + protected static $phoneDevices = array( + 'iPhone' => '\biPhone.*(Mobile|PhoneGap)|\biPod', // |\biTunes + 'BlackBerry' => 'BlackBerry|\bBB10\b|rim[0-9]+', + 'HTC' => 'HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\bEVO\b|T-Mobile G1|Z520m', + 'Nexus' => 'Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile', + // @todo: Is 'Dell Streak' a tablet or a phone? ;) + 'Dell' => 'Dell.*Streak|Dell.*Aero|Dell.*Venue|DELL.*Venue Pro|Dell Flash|Dell Smoke|Dell Mini 3iX|XCD28|XCD35|\b001DL\b|\b101DL\b|\bGS01\b', + 'Motorola' => 'Motorola|DROIDX|DROID BIONIC|\bDroid\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925', + 'Samsung' => 'Samsung|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E', + 'LG' => '\bLG\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802)', + 'Sony' => 'SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i', + 'Asus' => 'Asus.*Galaxy|PadFone.*Mobile', + // @ref: http://www.micromaxinfo.com/mobiles/smartphones + // Added because the codes might conflict with Acer Tablets. + 'Micromax' => 'Micromax.*\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\b', + 'Palm' => 'PalmSource|Palm', // avantgo|blazer|elaine|hiptop|plucker|xiino ; @todo - complete the regex. + 'Vertu' => 'Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature', // Just for fun ;) + // @ref: http://www.pantech.co.kr/en/prod/prodList.do?gbrand=VEGA (PANTECH) + // Most of the VEGA devices are legacy. PANTECH seem to be newer devices based on Android. + 'Pantech' => 'PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790', + // @ref: http://www.fly-phone.com/devices/smartphones/ ; Included only smartphones. + 'Fly' => 'IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250', + 'iMobile' => 'i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)', + // Added simvalley mobile just for fun. They have some interesting devices. + // @ref: http://www.simvalley.fr/telephonie---gps-_22_telephonie-mobile_telephones_.html + 'SimValley' => '\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\b', + // @Tapatalk is a mobile app; @ref: http://support.tapatalk.com/threads/smf-2-0-2-os-and-browser-detection-plugin-and-tapatalk.15565/#post-79039 + 'GenericPhone' => 'Tapatalk|PDA;|SAGEM|\bmmp\b|pocket|\bpsp\b|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|\bwap\b|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser' + ); + + /** + * List of tablet devices. + * + * @var array + */ + protected static $tabletDevices = array( + 'iPad' => 'iPad|iPad.*Mobile', // @todo: check for mobile friendly emails topic. + 'NexusTablet' => 'Android.*Nexus[\s]+(7|10)|^.*Android.*Nexus(?:(?!Mobile).)*$', + 'SamsungTablet' => 'SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-I9205|GT-P5200|GT-P5210|GT-P5210X|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T330|SM-T530|SM-T705C|SM-T535|SM-T331', // SCH-P709|SCH-P729|SM-T2558 - Samsung Mega - treat them like a regular phone. + // @reference: http://www.labnol.org/software/kindle-user-agent-string/20378/ + 'Kindle' => 'Kindle|Silk.*Accelerated|Android.*\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE)\b', + // Only the Surface tablets with Windows RT are considered mobile. + // @ref: http://msdn.microsoft.com/en-us/library/ie/hh920767(v=vs.85).aspx + 'SurfaceTablet' => 'Windows NT [0-9.]+; ARM;', + // @ref: http://shopping1.hp.com/is-bin/INTERSHOP.enfinity/WFS/WW-USSMBPublicStore-Site/en_US/-/USD/ViewStandardCatalog-Browse?CatalogCategoryID=JfIQ7EN5lqMAAAEyDcJUDwMT + 'HPTablet' => 'HP Slate 7|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8', + // @note: watch out for PadFone, see #132 + 'AsusTablet' => '^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\bK00F\b|TX201LA', + 'BlackBerryTablet' => 'PlayBook|RIM Tablet', + 'HTCtablet' => 'HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200', + 'MotorolaTablet' => 'xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617', + 'NookTablet' => 'Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2', + // @ref: http://www.acer.ro/ac/ro/RO/content/drivers + // @ref: http://www.packardbell.co.uk/pb/en/GB/content/download (Packard Bell is part of Acer) + // @ref: http://us.acer.com/ac/en/US/content/group/tablets + // @note: Can conflict with Micromax and Motorola phones codes. + 'AcerTablet' => 'Android.*; \b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-830)\b|W3-810|\bA3-A10\b', + // @ref: http://eu.computers.toshiba-europe.com/innovation/family/Tablets/1098744/banner_id/tablet_footerlink/ + // @ref: http://us.toshiba.com/tablets/tablet-finder + // @ref: http://www.toshiba.co.jp/regza/tablet/ + 'ToshibaTablet' => 'Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO', + // @ref: http://www.nttdocomo.co.jp/english/service/developer/smart_phone/technical_info/spec/index.html + // @ref: http://www.lg.com/us/tablets + 'LGTablet' => '\bL-06C|LG-V900|LG-V500|LG-V909|LG-V500|LG-V510|LG-VK810\b', + 'FujitsuTablet' => 'Android.*\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\b', + // Prestigio Tablets http://www.prestigio.com/support + 'PrestigioTablet' => 'PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|PMP5297C|PMP5297C_QUAD', + // @ref: http://support.lenovo.com/en_GB/downloads/default.page?# + 'LenovoTablet' => 'IdeaTab|ThinkPad([ ]+)?Tablet|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A1000|A2107|A2109|A1107|B6000|B8000|B8080-F)', + // @ref: http://www.yarvik.com/en/matrix/tablets/ + 'YarvikTablet' => 'Android.*\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151|TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485|TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211|TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\b', + 'MedionTablet' => 'Android.*\bOYO\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB', + 'ArnovaTablet' => 'AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT', + // http://www.intenso.de/kategorie_en.php?kategorie=33 + // @todo: http://www.nbhkdz.com/read/b8e64202f92a2df129126bff.html - investigate + 'IntensoTablet' => 'INM8002KP|INM1010FP|INM805ND|Intenso Tab', + // IRU.ru Tablets http://www.iru.ru/catalog/soho/planetable/ + 'IRUTablet' => 'M702pro', + 'MegafonTablet' => 'MegaFon V9|\bZTE V9\b|Android.*\bMT7A\b', + // @ref: http://www.e-boda.ro/tablete-pc.html + 'EbodaTablet' => 'E-Boda (Supreme|Impresspeed|Izzycomm|Essential)', + // @ref: http://www.allview.ro/produse/droseries/lista-tablete-pc/ + 'AllViewTablet' => 'Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)', + // @reference: http://wiki.archosfans.com/index.php?title=Main_Page + 'ArchosTablet' => '\b(101G9|80G9|A101IT)\b|Qilive 97R|ARCHOS 101G10|Archos 101 Neon', + // @ref: http://www.ainol.com/plugin.php?identifier=ainol&module=product + 'AinolTablet' => 'NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark', + // @todo: inspect http://esupport.sony.com/US/p/select-system.pl?DIRECTOR=DRIVER + // @ref: Readers http://www.atsuhiro-me.net/ebook/sony-reader/sony-reader-web-browser + // @ref: http://www.sony.jp/support/tablet/ + 'SonyTablet' => 'Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551', + // @ref: db + http://www.cube-tablet.com/buy-products.html + 'CubeTablet' => 'Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT', + // @ref: http://www.cobyusa.com/?p=pcat&pcat_id=3001 + 'CobyTablet' => 'MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010', + // @ref: http://www.match.net.cn/products.asp + 'MIDTablet' => 'M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733', + // @ref: http://pdadb.net/index.php?m=pdalist&list=SMiT (NoName Chinese Tablets) + // @ref: http://www.imp3.net/14/show.php?itemid=20454 + 'SMiTTablet' => 'Android.*(\bMID\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)', + // @ref: http://www.rock-chips.com/index.php?do=prod&pid=2 + 'RockChipTablet' => 'Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A', + // @ref: http://www.fly-phone.com/devices/tablets/ ; http://www.fly-phone.com/service/ + 'FlyTablet' => 'IQ310|Fly Vision', + // @ref: http://www.bqreaders.com/gb/tablets-prices-sale.html + 'bqTablet' => 'bq.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant)|Maxwell.*Lite|Maxwell.*Plus', + // @ref: http://www.huaweidevice.com/worldwide/productFamily.do?method=index&directoryId=5011&treeId=3290 + // @ref: http://www.huaweidevice.com/worldwide/downloadCenter.do?method=index&directoryId=3372&treeId=0&tb=1&type=software (including legacy tablets) + 'HuaweiTablet' => 'MediaPad|MediaPad 7 Youth|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim', + // Nec or Medias Tab + 'NecTablet' => '\bN-06D|\bN-08D', + // Pantech Tablets: http://www.pantechusa.com/phones/ + 'PantechTablet' => 'Pantech.*P4100', + // Broncho Tablets: http://www.broncho.cn/ (hard to find) + 'BronchoTablet' => 'Broncho.*(N701|N708|N802|a710)', + // @ref: http://versusuk.com/support.html + 'VersusTablet' => 'TOUCHPAD.*[78910]|\bTOUCHTAB\b', + // @ref: http://www.zync.in/index.php/our-products/tablet-phablets + 'ZyncTablet' => 'z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900', + // @ref: http://www.positivoinformatica.com.br/www/pessoal/tablet-ypy/ + 'PositivoTablet' => 'TB07STA|TB10STA|TB07FTA|TB10FTA', + // @ref: https://www.nabitablet.com/ + 'NabiTablet' => 'Android.*\bNabi', + 'KoboTablet' => 'Kobo Touch|\bK080\b|\bVox\b Build|\bArc\b Build', + // French Danew Tablets http://www.danew.com/produits-tablette.php + 'DanewTablet' => 'DSlide.*\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\b', + // Texet Tablets and Readers http://www.texet.ru/tablet/ + 'TexetTablet' => 'NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|TB-436|TB-416|TB-146SE|TB-126SE', + // @note: Avoid detecting 'PLAYSTATION 3' as mobile. + 'PlaystationTablet' => 'Playstation.*(Portable|Vita)', + // @ref: http://www.trekstor.de/surftabs.html + 'TrekstorTablet' => 'ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A', + // @ref: http://www.pyleaudio.com/Products.aspx?%2fproducts%2fPersonal-Electronics%2fTablets + 'PyleAudioTablet' => '\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\b', + // @ref: http://www.advandigital.com/index.php?link=content-product&jns=JP001 + // @Note: because of the short codenames we have to include whitespaces to reduce the possible conflicts. + 'AdvanTablet' => 'Android.* \b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci|T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\b ', + // @ref: http://www.danytech.com/category/tablet-pc + 'DanyTechTablet' => 'Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II|Genius TAB GII|Genius TAB GIII|Genius Tab S1', + // @ref: http://www.galapad.net/product.html + 'GalapadTablet' => 'Android.*\bG1\b', + // @ref: http://www.micromaxinfo.com/tablet/funbook + 'MicromaxTablet' => 'Funbook|Micromax.*\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\b', + // http://www.karbonnmobiles.com/products_tablet.php + 'KarbonnTablet' => 'Android.*\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\b', + // @ref: http://www.myallfine.com/Products.asp + 'AllFineTablet' => 'Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide', + // @ref: http://www.proscanvideo.com/products-search.asp?itemClass=TABLET&itemnmbr= + 'PROSCANTablet' => '\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\b', + // @ref: http://www.yonesnav.com/products/products.php + 'YONESTablet' => 'BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026', + // @ref: http://www.cjshowroom.com/eproducts.aspx?classcode=004001001 + // China manufacturer makes tablets for different small brands (eg. http://www.zeepad.net/index.html) + 'ChangJiaTablet' => 'TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|TPC10111|TPC10203|TPC10205|TPC10503', + // @ref: http://www.gloryunion.cn/products.asp + // @ref: http://www.allwinnertech.com/en/apply/mobile.html + // @ref: http://www.ptcl.com.pk/pd_content.php?pd_id=284 (EVOTAB) + // @todo: Softwiner tablets? + // aka. Cute or Cool tablets. Not sure yet, must research to avoid collisions. + 'GUTablet' => 'TX-A1301|TX-M9002|Q702|kf026', // A12R|D75A|D77|D79|R83|A95|A106C|R15|A75|A76|D71|D72|R71|R73|R77|D82|R85|D92|A97|D92|R91|A10F|A77F|W71F|A78F|W78F|W81F|A97F|W91F|W97F|R16G|C72|C73E|K72|K73|R96G + // @ref: http://www.pointofview-online.com/showroom.php?shop_mode=product_listing&category_id=118 + 'PointOfViewTablet' => 'TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10', + // @ref: http://www.overmax.pl/pl/katalog-produktow,p8/tablety,c14/ + // @todo: add more tests. + 'OvermaxTablet' => 'OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)', + // @ref: http://hclmetablet.com/India/index.php + 'HCLTablet' => 'HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync', + // @ref: http://www.edigital.hu/Tablet_es_e-book_olvaso/Tablet-c18385.html + 'DPSTablet' => 'DPS Dream 9|DPS Dual 7', + // @ref: http://www.visture.com/index.asp + 'VistureTablet' => 'V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10', + // @ref: http://www.mijncresta.nl/tablet + 'CrestaTablet' => 'CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989', + // MediaTek - http://www.mediatek.com/_en/01_products/02_proSys.php?cata_sn=1&cata1_sn=1&cata2_sn=309 + 'MediatekTablet' => '\bMT8125|MT8389|MT8135|MT8377\b', + // Concorde tab + 'ConcordeTablet' => 'Concorde([ ]+)?Tab|ConCorde ReadMan', + // GoClever Tablets - http://www.goclever.com/uk/products,c1/tablet,c5/ + 'GoCleverTablet' => 'GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G|TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721|GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72|TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2|TAB R104|TAB R83.3|TAB A1042', + // Modecom Tablets - http://www.modecom.eu/tablets/portal/ + 'ModecomTablet' => 'FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014|FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801|FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003', + // Vonino Tablets - http://www.vonino.eu/tablets + 'VoninoTablet' => '\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z|Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD|Primus[ _]?QS|Android.*\bQ8\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\b', + // ECS Tablets - http://www.ecs.com.tw/ECSWebSite/Product/Product_Tablet_List.aspx?CategoryID=14&MenuID=107&childid=M_107&LanID=0 + 'ECSTablet' => 'V07OT2|TM105A|S10OT1|TR10CS1', + // Storex Tablets - http://storex.fr/espace_client/support.html + // @note: no need to add all the tablet codes since they are guided by the first regex. + 'StorexTablet' => 'eZee[_\']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab', + // Generic Vodafone tablets. + 'VodafoneTablet' => 'SmartTab([ ]+)?[0-9]+|SmartTabII10', + // French tablets - Essentiel B http://www.boulanger.fr/tablette_tactile_e-book/tablette_tactile_essentiel_b/cl_68908.htm?multiChoiceToDelete=brand&mc_brand=essentielb + // Aka: http://www.essentielb.fr/ + 'EssentielBTablet' => 'Smart[ \']?TAB[ ]+?[0-9]+|Family[ \']?TAB2', + // Ross & Moor - http://ross-moor.ru/ + 'RossMoorTablet' => 'RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711', + // i-mobile http://product.i-mobilephone.com/Mobile_Device + 'iMobileTablet' => 'i-mobile i-note', + // @ref: http://www.tolino.de/de/vergleichen/ + 'TolinoTablet' => 'tolino tab [0-9.]+|tolino shine', + // AudioSonic - a Kmart brand + // http://www.kmart.com.au/webapp/wcs/stores/servlet/Search?langId=-1&storeId=10701&catalogId=10001&categoryId=193001&pageSize=72¤tPage=1&searchCategory=193001%2b4294965664&sortBy=p_MaxPrice%7c1 + 'AudioSonicTablet' => '\bC-22Q|T7-QC|T-17B|T-17P\b', + // AMPE Tablets - http://www.ampe.com.my/product-category/tablets/ + // @todo: add them gradually to avoid conflicts. + 'AMPETablet' => 'Android.* A78 ', + // Skk Mobile - http://skkmobile.com.ph/product_tablets.php + 'SkkTablet' => 'Android.* (SKYPAD|PHOENIX|CYCLOPS)', + // Tecno Mobile (only tablet) - http://www.tecno-mobile.com/index.php/product?filterby=smart&list_order=all&page=1 + 'TecnoTablet' => 'TECNO P9', + // JXD (consoles & tablets) - http://jxd.hk/products.asp?selectclassid=009008&clsid=3 + 'JXDTablet' => 'Android.*\b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300|S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908|P1000|P300|S18|S6600|S9100)\b', + // i-Joy tablets - http://www.i-joy.es/en/cat/products/tablets/ + 'iJoyTablet' => 'Tablet (Spirit 7|Essentia|Galatea|Fusion|Onix 7|Landa|Titan|Scooby|Deox|Stella|Themis|Argon|Unique 7|Sygnus|Hexen|Finity 7|Cream|Cream X2|Jade|Neon 7|Neron 7|Kandy|Scape|Saphyr 7|Rebel|Biox|Rebel|Rebel 8GB|Myst|Draco 7|Myst|Tab7-004|Myst|Tadeo Jones|Tablet Boing|Arrow|Draco Dual Cam|Aurix|Mint|Amity|Revolution|Finity 9|Neon 9|T9w|Amity 4GB Dual Cam|Stone 4GB|Stone 8GB|Andromeda|Silken|X2|Andromeda II|Halley|Flame|Saphyr 9,7|Touch 8|Planet|Triton|Unique 10|Hexen 10|Memphis 4GB|Memphis 8GB|Onix 10)', + // http://www.intracon.eu/tablet + 'FX2Tablet' => 'FX2 PAD7|FX2 PAD10', + // http://www.xoro.de/produkte/ + // @note: Might be the same brand with 'Simply tablets' + 'XoroTablet' => 'KidsPAD 701|PAD[ ]?712|PAD[ ]?714|PAD[ ]?716|PAD[ ]?717|PAD[ ]?718|PAD[ ]?720|PAD[ ]?721|PAD[ ]?722|PAD[ ]?790|PAD[ ]?792|PAD[ ]?900|PAD[ ]?9715D|PAD[ ]?9716DR|PAD[ ]?9718DR|PAD[ ]?9719QR|PAD[ ]?9720QR|TelePAD1030|Telepad1032|TelePAD730|TelePAD731|TelePAD732|TelePAD735Q|TelePAD830|TelePAD9730|TelePAD795|MegaPAD 1331|MegaPAD 1851|MegaPAD 2151', + // http://www1.viewsonic.com/products/computing/tablets/ + 'ViewsonicTablet' => 'ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a', + // http://www.odys.de/web/internet-tablet_en.html + 'OdysTablet' => 'LOOX|XENO10|ODYS Space', + // http://www.captiva-power.de/products.html#tablets-en + 'CaptivaTablet' => 'CAPTIVA PAD', + // IconBIT - http://www.iconbit.com/products/tablets/ + 'IconbitTablet' => 'NetTAB|NT-3702|NT-3702S|NT-3702S|NT-3603P|NT-3603P|NT-0704S|NT-0704S|NT-3805C|NT-3805C|NT-0806C|NT-0806C|NT-0909T|NT-0909T|NT-0907S|NT-0907S|NT-0902S|NT-0902S', + // @ref: http://www.tesco.com/direct/hudl/ + 'Hudl' => 'Hudl HT7S3', + // @ref: http://www.telstra.com.au/home-phone/thub-2/ + 'TelstraTablet' => 'T-Hub2', + 'GenericTablet' => 'Android.*\b97D\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\bA7EB\b|CatNova8|A1_07|CT704|CT1002|\bM721\b|rk30sdk|\bEVOTAB\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010|Tablet-PC-4', + ); + + /** + * List of mobile Operating Systems. + * + * @var array + */ + protected static $operatingSystems = array( + 'AndroidOS' => 'Android', + 'BlackBerryOS' => 'blackberry|\bBB10\b|rim tablet os', + 'PalmOS' => 'PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino', + 'SymbianOS' => 'Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\bS60\b', + // @reference: http://en.wikipedia.org/wiki/Windows_Mobile + 'WindowsMobileOS' => 'Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window Mobile|Windows Phone [0-9.]+|WCE;', + // @reference: http://en.wikipedia.org/wiki/Windows_Phone + // http://wifeng.cn/?r=blog&a=view&id=106 + // http://nicksnettravels.builttoroam.com/post/2011/01/10/Bogus-Windows-Phone-7-User-Agent-String.aspx + 'WindowsPhoneOS' => 'Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7', + 'iOS' => '\biPhone.*Mobile|\biPod|\biPad', + // http://en.wikipedia.org/wiki/MeeGo + // @todo: research MeeGo in UAs + 'MeeGoOS' => 'MeeGo', + // http://en.wikipedia.org/wiki/Maemo + // @todo: research Maemo in UAs + 'MaemoOS' => 'Maemo', + 'JavaOS' => 'J2ME/|\bMIDP\b|\bCLDC\b', // '|Java/' produces bug #135 + 'webOS' => 'webOS|hpwOS', + 'badaOS' => '\bBada\b', + 'BREWOS' => 'BREW', + ); + + /** + * List of mobile User Agents. + * + * @var array + */ + protected static $browsers = array( + // @reference: https://developers.google.com/chrome/mobile/docs/user-agent + 'Chrome' => '\bCrMo\b|CriOS|Android.*Chrome/[.0-9]* (Mobile)?', + 'Dolfin' => '\bDolfin\b', + 'Opera' => 'Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR/[0-9.]+|Coast/[0-9.]+', + 'Skyfire' => 'Skyfire', + 'IE' => 'IEMobile|MSIEMobile', // |Trident/[.0-9]+ + 'Firefox' => 'fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile', + 'Bolt' => 'bolt', + 'TeaShark' => 'teashark', + 'Blazer' => 'Blazer', + // @reference: http://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariWebContent/OptimizingforSafarioniPhone/OptimizingforSafarioniPhone.html#//apple_ref/doc/uid/TP40006517-SW3 + 'Safari' => 'Version.*Mobile.*Safari|Safari.*Mobile', + // @ref: http://en.wikipedia.org/wiki/Midori_(web_browser) + //'Midori' => 'midori', + 'Tizen' => 'Tizen', + 'UCBrowser' => 'UC.*Browser|UCWEB', + // @ref: https://github.com/serbanghita/Mobile-Detect/issues/7 + 'DiigoBrowser' => 'DiigoBrowser', + // http://www.puffinbrowser.com/index.php + 'Puffin' => 'Puffin', + // @ref: http://mercury-browser.com/index.html + 'Mercury' => '\bMercury\b', + // @reference: http://en.wikipedia.org/wiki/Minimo + // http://en.wikipedia.org/wiki/Vision_Mobile_Browser + 'GenericBrowser' => 'NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger' + ); + + /** + * Utilities. + * + * @var array + */ + protected static $utilities = array( + // Experimental. When a mobile device wants to switch to 'Desktop Mode'. + // @ref: http://scottcate.com/technology/windows-phone-8-ie10-desktop-or-mobile/ + // @ref: https://github.com/serbanghita/Mobile-Detect/issues/57#issuecomment-15024011 + 'DesktopMode' => 'WPDesktop', + 'TV' => 'SonyDTV|HbbTV', // experimental + 'WebKit' => '(webkit)[ /]([\w.]+)', + 'Bot' => 'Googlebot|DoCoMo|YandexBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|facebookexternalhit', + 'MobileBot' => 'Googlebot-Mobile|DoCoMo|YahooSeeker/M1A1-R2D2', + // @todo: Include JXD consoles. + 'Console' => '\b(Nintendo|Nintendo WiiU|PLAYSTATION|Xbox)\b', + 'Watch' => 'SM-V700', + ); + + /** + * All possible HTTP headers that represent the + * User-Agent string. + * + * @var array + */ + protected static $uaHttpHeaders = array( + // The default User-Agent string. + 'HTTP_USER_AGENT', + // Header can occur on devices using Opera Mini. + 'HTTP_X_OPERAMINI_PHONE_UA', + // Vodafone specific header: http://www.seoprinciple.com/mobile-web-community-still-angry-at-vodafone/24/ + 'HTTP_X_DEVICE_USER_AGENT', + 'HTTP_X_ORIGINAL_USER_AGENT', + 'HTTP_X_SKYFIRE_PHONE', + 'HTTP_X_BOLT_PHONE_UA', + 'HTTP_DEVICE_STOCK_UA', + 'HTTP_X_UCBROWSER_DEVICE_UA' + ); + + /** + * The individual segments that could exist in a User-Agent string. VER refers to the regular + * expression defined in the constant self::VER. + * + * @var array + */ + protected static $properties = array( + + // Build + 'Mobile' => 'Mobile/[VER]', + 'Build' => 'Build/[VER]', + 'Version' => 'Version/[VER]', + 'VendorID' => 'VendorID/[VER]', + + // Devices + 'iPad' => 'iPad.*CPU[a-z ]+[VER]', + 'iPhone' => 'iPhone.*CPU[a-z ]+[VER]', + 'iPod' => 'iPod.*CPU[a-z ]+[VER]', + //'BlackBerry' => array('BlackBerry[VER]', 'BlackBerry [VER];'), + 'Kindle' => 'Kindle/[VER]', + + // Browser + 'Chrome' => array('Chrome/[VER]', 'CriOS/[VER]', 'CrMo/[VER]'), + 'Coast' => array('Coast/[VER]'), + 'Dolfin' => 'Dolfin/[VER]', + // @reference: https://developer.mozilla.org/en-US/docs/User_Agent_Strings_Reference + 'Firefox' => 'Firefox/[VER]', + 'Fennec' => 'Fennec/[VER]', + // @reference: http://msdn.microsoft.com/en-us/library/ms537503(v=vs.85).aspx + 'IE' => array('IEMobile/[VER];', 'IEMobile [VER]', 'MSIE [VER];'), + // http://en.wikipedia.org/wiki/NetFront + 'NetFront' => 'NetFront/[VER]', + 'NokiaBrowser' => 'NokiaBrowser/[VER]', + 'Opera' => array( ' OPR/[VER]', 'Opera Mini/[VER]', 'Version/[VER]' ), + 'Opera Mini' => 'Opera Mini/[VER]', + 'Opera Mobi' => 'Version/[VER]', + 'UC Browser' => 'UC Browser[VER]', + 'MQQBrowser' => 'MQQBrowser/[VER]', + 'MicroMessenger' => 'MicroMessenger/[VER]', + // @note: Safari 7534.48.3 is actually Version 5.1. + // @note: On BlackBerry the Version is overwriten by the OS. + 'Safari' => array( 'Version/[VER]', 'Safari/[VER]' ), + 'Skyfire' => 'Skyfire/[VER]', + 'Tizen' => 'Tizen/[VER]', + 'Webkit' => 'webkit[ /][VER]', + + // Engine + 'Gecko' => 'Gecko/[VER]', + 'Trident' => 'Trident/[VER]', + 'Presto' => 'Presto/[VER]', + + // OS + 'iOS' => ' \bOS\b [VER] ', + 'Android' => 'Android [VER]', + 'BlackBerry' => array('BlackBerry[\w]+/[VER]', 'BlackBerry.*Version/[VER]', 'Version/[VER]'), + 'BREW' => 'BREW [VER]', + 'Java' => 'Java/[VER]', + // @reference: http://windowsteamblog.com/windows_phone/b/wpdev/archive/2011/08/29/introducing-the-ie9-on-windows-phone-mango-user-agent-string.aspx + // @reference: http://en.wikipedia.org/wiki/Windows_NT#Releases + 'Windows Phone OS' => array( 'Windows Phone OS [VER]', 'Windows Phone [VER]'), + 'Windows Phone' => 'Windows Phone [VER]', + 'Windows CE' => 'Windows CE/[VER]', + // http://social.msdn.microsoft.com/Forums/en-US/windowsdeveloperpreviewgeneral/thread/6be392da-4d2f-41b4-8354-8dcee20c85cd + 'Windows NT' => 'Windows NT [VER]', + 'Symbian' => array('SymbianOS/[VER]', 'Symbian/[VER]'), + 'webOS' => array('webOS/[VER]', 'hpwOS/[VER];'), + ); + + /** + * Construct an instance of this class. + * + * @param array $headers Specify the headers as injection. Should be PHP _SERVER flavored. + * If left empty, will use the global _SERVER['HTTP_*'] vars instead. + * @param string $userAgent Inject the User-Agent header. If null, will use HTTP_USER_AGENT + * from the $headers array instead. + */ + public function __construct( + array $headers = null, + $userAgent = null + ){ + $this->setHttpHeaders($headers); + $this->setUserAgent($userAgent); + } + + /** + * Get the current script version. + * This is useful for the demo.php file, + * so people can check on what version they are testing + * for mobile devices. + * + * @return string The version number in semantic version format. + */ + public static function getScriptVersion() + { + return self::VERSION; + } + + /** + * Set the HTTP Headers. Must be PHP-flavored. This method will reset existing headers. + * + * @param array $httpHeaders The headers to set. If null, then using PHP's _SERVER to extract + * the headers. The default null is left for backwards compatibilty. + */ + public function setHttpHeaders($httpHeaders = null) + { + //use global _SERVER if $httpHeaders aren't defined + if (!is_array($httpHeaders) || !count($httpHeaders)) { + $httpHeaders = $_SERVER; + } + + //clear existing headers + $this->httpHeaders = array(); + + //Only save HTTP headers. In PHP land, that means only _SERVER vars that + //start with HTTP_. + foreach ($httpHeaders as $key => $value) { + if (substr($key,0,5) == 'HTTP_') { + $this->httpHeaders[$key] = $value; + } + } + } + + /** + * Retrieves the HTTP headers. + * + * @return array + */ + public function getHttpHeaders() + { + return $this->httpHeaders; + } + + /** + * Retrieves a particular header. If it doesn't exist, no exception/error is caused. + * Simply null is returned. + * + * @param string $header The name of the header to retrieve. Can be HTTP compliant such as + * "User-Agent" or "X-Device-User-Agent" or can be php-esque with the + * all-caps, HTTP_ prefixed, underscore seperated awesomeness. + * + * @return string|null The value of the header. + */ + public function getHttpHeader($header) + { + //are we using PHP-flavored headers? + if (strpos($header, '_') === false) { + $header = str_replace('-', '_', $header); + $header = strtoupper($header); + } + + //test the alternate, too + $altHeader = 'HTTP_' . $header; + + //Test both the regular and the HTTP_ prefix + if (isset($this->httpHeaders[$header])) { + return $this->httpHeaders[$header]; + } elseif (isset($this->httpHeaders[$altHeader])) { + return $this->httpHeaders[$altHeader]; + } + + return null; + } + + public function getMobileHeaders() + { + return self::$mobileHeaders; + } + + /** + * Get all possible HTTP headers that + * can contain the User-Agent string. + * + * @return array List of HTTP headers. + */ + public function getUaHttpHeaders() + { + return self::$uaHttpHeaders; + } + + /** + * Set the User-Agent to be used. + * + * @param string $userAgent The user agent string to set. + * + * @return string|null + */ + public function setUserAgent($userAgent = null) + { + if (!empty($userAgent)) { + return $this->userAgent = $userAgent; + } else { + + $this->userAgent = null; + + foreach($this->getUaHttpHeaders() as $altHeader){ + if(!empty($this->httpHeaders[$altHeader])){ // @todo: should use getHttpHeader(), but it would be slow. (Serban) + $this->userAgent .= $this->httpHeaders[$altHeader] . " "; + } + } + + return $this->userAgent = (!empty($this->userAgent) ? trim($this->userAgent) : null); + + } + } + + /** + * Retrieve the User-Agent. + * + * @return string|null The user agent if it's set. + */ + public function getUserAgent() + { + return $this->userAgent; + } + + /** + * Set the detection type. Must be one of self::DETECTION_TYPE_MOBILE or + * self::DETECTION_TYPE_EXTENDED. Otherwise, nothing is set. + * + * @deprecated since version 2.6.9 + * + * @param string $type The type. Must be a self::DETECTION_TYPE_* constant. The default + * parameter is null which will default to self::DETECTION_TYPE_MOBILE. + */ + public function setDetectionType($type = null) + { + if ($type === null) { + $type = self::DETECTION_TYPE_MOBILE; + } + + if ($type != self::DETECTION_TYPE_MOBILE && $type != self::DETECTION_TYPE_EXTENDED) { + return; + } + + $this->detectionType = $type; + } + + /** + * Retrieve the list of known phone devices. + * + * @return array List of phone devices. + */ + public static function getPhoneDevices() + { + return self::$phoneDevices; + } + + /** + * Retrieve the list of known tablet devices. + * + * @return array List of tablet devices. + */ + public static function getTabletDevices() + { + return self::$tabletDevices; + } + + /** + * Alias for getBrowsers() method. + * + * @return array List of user agents. + */ + public static function getUserAgents() + { + return self::getBrowsers(); + } + + /** + * Retrieve the list of known browsers. Specifically, the user agents. + * + * @return array List of browsers / user agents. + */ + public static function getBrowsers() + { + return self::$browsers; + } + + /** + * Retrieve the list of known utilities. + * + * @return array List of utilities. + */ + public static function getUtilities() + { + return self::$utilities; + } + + /** + * Method gets the mobile detection rules. This method is used for the magic methods $detect->is*(). + * + * @deprecated since version 2.6.9 + * + * @return array All the rules (but not extended). + */ + public static function getMobileDetectionRules() + { + static $rules; + + if (!$rules) { + $rules = array_merge( + self::$phoneDevices, + self::$tabletDevices, + self::$operatingSystems, + self::$browsers + ); + } + + return $rules; + + } + + /** + * Method gets the mobile detection rules + utilities. + * The reason this is separate is because utilities rules + * don't necessary imply mobile. This method is used inside + * the new $detect->is('stuff') method. + * + * @deprecated since version 2.6.9 + * + * @return array All the rules + extended. + */ + public function getMobileDetectionRulesExtended() + { + static $rules; + + if (!$rules) { + // Merge all rules together. + $rules = array_merge( + self::$phoneDevices, + self::$tabletDevices, + self::$operatingSystems, + self::$browsers, + self::$utilities + ); + } + + return $rules; + } + + /** + * Retrieve the current set of rules. + * + * @deprecated since version 2.6.9 + * + * @return array + */ + public function getRules() + { + if ($this->detectionType == self::DETECTION_TYPE_EXTENDED) { + return self::getMobileDetectionRulesExtended(); + } else { + return self::getMobileDetectionRules(); + } + } + + /** + * Retrieve the list of mobile operating systems. + * + * @return array The list of mobile operating systems. + */ + public static function getOperatingSystems() + { + return self::$operatingSystems; + } + + /** + * Check the HTTP headers for signs of mobile. + * This is the fastest mobile check possible; it's used + * inside isMobile() method. + * + * @return bool + */ + public function checkHttpHeadersForMobile() + { + + foreach($this->getMobileHeaders() as $mobileHeader => $matchType){ + if( isset($this->httpHeaders[$mobileHeader]) ){ + if( is_array($matchType['matches']) ){ + foreach($matchType['matches'] as $_match){ + if( strpos($this->httpHeaders[$mobileHeader], $_match) !== false ){ + return true; + } + } + return false; + } else { + return true; + } + } + } + + return false; + + } + + /** + * Magic overloading method. + * + * @method boolean is[...]() + * @param string $name + * @param array $arguments + * @return mixed + * @throws BadMethodCallException when the method doesn't exist and doesn't start with 'is' + */ + public function __call($name, $arguments) + { + //make sure the name starts with 'is', otherwise + if (substr($name, 0, 2) != 'is') { + throw new BadMethodCallException("No such method exists: $name"); + } + + $this->setDetectionType(self::DETECTION_TYPE_MOBILE); + + $key = substr($name, 2); + + return $this->matchUAAgainstKey($key); + } + + /** + * Find a detection rule that matches the current User-agent. + * + * @param null $userAgent deprecated + * @return boolean + */ + protected function matchDetectionRulesAgainstUA($userAgent = null) + { + // Begin general search. + foreach ($this->getRules() as $_regex) { + if (empty($_regex)) { + continue; + } + if ($this->match($_regex, $userAgent)) { + return true; + } + } + + return false; + } + + /** + * Search for a certain key in the rules array. + * If the key is found the try to match the corresponding + * regex agains the User-Agent. + * + * @param string $key + * @param null $userAgent deprecated + * @return mixed + */ + protected function matchUAAgainstKey($key, $userAgent = null) + { + // Make the keys lowercase so we can match: isIphone(), isiPhone(), isiphone(), etc. + $key = strtolower($key); + + //change the keys to lower case + $_rules = array_change_key_case($this->getRules()); + + if (array_key_exists($key, $_rules)) { + if (empty($_rules[$key])) { + return null; + } + + return $this->match($_rules[$key], $userAgent); + } + + return false; + } + + /** + * Check if the device is mobile. + * Returns true if any type of mobile device detected, including special ones + * @param null $userAgent deprecated + * @param null $httpHeaders deprecated + * @return bool + */ + public function isMobile($userAgent = null, $httpHeaders = null) + { + + if ($httpHeaders) { + $this->setHttpHeaders($httpHeaders); + } + + if ($userAgent) { + $this->setUserAgent($userAgent); + } + + $this->setDetectionType(self::DETECTION_TYPE_MOBILE); + + if ($this->checkHttpHeadersForMobile()) { + return true; + } else { + return $this->matchDetectionRulesAgainstUA(); + } + + } + + /** + * Check if the device is a tablet. + * Return true if any type of tablet device is detected. + * + * @param string $userAgent deprecated + * @param array $httpHeaders deprecated + * @return bool + */ + public function isTablet($userAgent = null, $httpHeaders = null) + { + $this->setDetectionType(self::DETECTION_TYPE_MOBILE); + + foreach (self::$tabletDevices as $_regex) { + if ($this->match($_regex, $userAgent)) { + return true; + } + } + + return false; + } + + /** + * This method checks for a certain property in the + * userAgent. + * @todo: The httpHeaders part is not yet used. + * + * @param string $key + * @param string $userAgent deprecated + * @param string $httpHeaders deprecated + * @return bool|int|null + */ + public function is($key, $userAgent = null, $httpHeaders = null) + { + // Set the UA and HTTP headers only if needed (eg. batch mode). + if ($httpHeaders) { + $this->setHttpHeaders($httpHeaders); + } + + if ($userAgent) { + $this->setUserAgent($userAgent); + } + + $this->setDetectionType(self::DETECTION_TYPE_EXTENDED); + + return $this->matchUAAgainstKey($key); + } + + /** + * Some detection rules are relative (not standard), + * because of the diversity of devices, vendors and + * their conventions in representing the User-Agent or + * the HTTP headers. + * + * This method will be used to check custom regexes against + * the User-Agent string. + * + * @param $regex + * @param string $userAgent + * @return bool + * + * @todo: search in the HTTP headers too. + */ + public function match($regex, $userAgent = null) + { + // Escape the special character which is the delimiter. + $regex = str_replace('/', '\/', $regex); + + return (bool) preg_match('/'.$regex.'/is', (!empty($userAgent) ? $userAgent : $this->userAgent)); + } + + /** + * Get the properties array. + * + * @return array + */ + public static function getProperties() + { + return self::$properties; + } + + /** + * Prepare the version number. + * + * @todo Remove the error supression from str_replace() call. + * + * @param string $ver The string version, like "2.6.21.2152"; + * + * @return float + */ + public function prepareVersionNo($ver) + { + $ver = str_replace(array('_', ' ', '/'), '.', $ver); + $arrVer = explode('.', $ver, 2); + + if (isset($arrVer[1])) { + $arrVer[1] = @str_replace('.', '', $arrVer[1]); // @todo: treat strings versions. + } + + return (float) implode('.', $arrVer); + } + + /** + * Check the version of the given property in the User-Agent. + * Will return a float number. (eg. 2_0 will return 2.0, 4.3.1 will return 4.31) + * + * @param string $propertyName The name of the property. See self::getProperties() array + * keys for all possible properties. + * @param string $type Either self::VERSION_TYPE_STRING to get a string value or + * self::VERSION_TYPE_FLOAT indicating a float value. This parameter + * is optional and defaults to self::VERSION_TYPE_STRING. Passing an + * invalid parameter will default to the this type as well. + * + * @return string|float The version of the property we are trying to extract. + */ + public function version($propertyName, $type = self::VERSION_TYPE_STRING) + { + if (empty($propertyName)) { + return false; + } + + //set the $type to the default if we don't recognize the type + if ($type != self::VERSION_TYPE_STRING && $type != self::VERSION_TYPE_FLOAT) { + $type = self::VERSION_TYPE_STRING; + } + + $properties = self::getProperties(); + + // Check if the property exists in the properties array. + if (array_key_exists($propertyName, $properties)) { + + // Prepare the pattern to be matched. + // Make sure we always deal with an array (string is converted). + $properties[$propertyName] = (array) $properties[$propertyName]; + + foreach ($properties[$propertyName] as $propertyMatchString) { + + $propertyPattern = str_replace('[VER]', self::VER, $propertyMatchString); + + // Escape the special character which is the delimiter. + $propertyPattern = str_replace('/', '\/', $propertyPattern); + + // Identify and extract the version. + preg_match('/'.$propertyPattern.'/is', $this->userAgent, $match); + + if (!empty($match[1])) { + $version = ( $type == self::VERSION_TYPE_FLOAT ? $this->prepareVersionNo($match[1]) : $match[1] ); + + return $version; + } + + } + + } + + return false; + } + + /** + * Retrieve the mobile grading, using self::MOBILE_GRADE_* constants. + * + * @return string One of the self::MOBILE_GRADE_* constants. + */ + public function mobileGrade() + { + $isMobile = $this->isMobile(); + + if ( + // Apple iOS 3.2-5.1 - Tested on the original iPad (4.3 / 5.0), iPad 2 (4.3), iPad 3 (5.1), original iPhone (3.1), iPhone 3 (3.2), 3GS (4.3), 4 (4.3 / 5.0), and 4S (5.1) + $this->isIOS() && $this->version('iPad', self::VERSION_TYPE_FLOAT)>=4.3 || + $this->isIOS() && $this->version('iPhone', self::VERSION_TYPE_FLOAT)>=3.1 || + $this->isIOS() && $this->version('iPod', self::VERSION_TYPE_FLOAT)>=3.1 || + + // Android 2.1-2.3 - Tested on the HTC Incredible (2.2), original Droid (2.2), HTC Aria (2.1), Google Nexus S (2.3). Functional on 1.5 & 1.6 but performance may be sluggish, tested on Google G1 (1.5) + // Android 3.1 (Honeycomb) - Tested on the Samsung Galaxy Tab 10.1 and Motorola XOOM + // Android 4.0 (ICS) - Tested on a Galaxy Nexus. Note: transition performance can be poor on upgraded devices + // Android 4.1 (Jelly Bean) - Tested on a Galaxy Nexus and Galaxy 7 + ( $this->version('Android', self::VERSION_TYPE_FLOAT)>2.1 && $this->is('Webkit') ) || + + // Windows Phone 7-7.5 - Tested on the HTC Surround (7.0) HTC Trophy (7.5), LG-E900 (7.5), Nokia Lumia 800 + $this->version('Windows Phone OS', self::VERSION_TYPE_FLOAT)>=7.0 || + + // Blackberry 7 - Tested on BlackBerry Torch 9810 + // Blackberry 6.0 - Tested on the Torch 9800 and Style 9670 + $this->is('BlackBerry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)>=6.0 || + // Blackberry Playbook (1.0-2.0) - Tested on PlayBook + $this->match('Playbook.*Tablet') || + + // Palm WebOS (1.4-2.0) - Tested on the Palm Pixi (1.4), Pre (1.4), Pre 2 (2.0) + ( $this->version('webOS', self::VERSION_TYPE_FLOAT)>=1.4 && $this->match('Palm|Pre|Pixi') ) || + // Palm WebOS 3.0 - Tested on HP TouchPad + $this->match('hp.*TouchPad') || + + // Firefox Mobile (12 Beta) - Tested on Android 2.3 device + ( $this->is('Firefox') && $this->version('Firefox', self::VERSION_TYPE_FLOAT)>=12 ) || + + // Chrome for Android - Tested on Android 4.0, 4.1 device + ( $this->is('Chrome') && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT)>=4.0 ) || + + // Skyfire 4.1 - Tested on Android 2.3 device + ( $this->is('Skyfire') && $this->version('Skyfire', self::VERSION_TYPE_FLOAT)>=4.1 && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT)>=2.3 ) || + + // Opera Mobile 11.5-12: Tested on Android 2.3 + ( $this->is('Opera') && $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT)>11 && $this->is('AndroidOS') ) || + + // Meego 1.2 - Tested on Nokia 950 and N9 + $this->is('MeeGoOS') || + + // Tizen (pre-release) - Tested on early hardware + $this->is('Tizen') || + + // Samsung Bada 2.0 - Tested on a Samsung Wave 3, Dolphin browser + // @todo: more tests here! + $this->is('Dolfin') && $this->version('Bada', self::VERSION_TYPE_FLOAT)>=2.0 || + + // UC Browser - Tested on Android 2.3 device + ( ($this->is('UC Browser') || $this->is('Dolfin')) && $this->version('Android', self::VERSION_TYPE_FLOAT)>=2.3 ) || + + // Kindle 3 and Fire - Tested on the built-in WebKit browser for each + ( $this->match('Kindle Fire') || + $this->is('Kindle') && $this->version('Kindle', self::VERSION_TYPE_FLOAT)>=3.0 ) || + + // Nook Color 1.4.1 - Tested on original Nook Color, not Nook Tablet + $this->is('AndroidOS') && $this->is('NookTablet') || + + // Chrome Desktop 11-21 - Tested on OS X 10.7 and Windows 7 + $this->version('Chrome', self::VERSION_TYPE_FLOAT)>=11 && !$isMobile || + + // Safari Desktop 4-5 - Tested on OS X 10.7 and Windows 7 + $this->version('Safari', self::VERSION_TYPE_FLOAT)>=5.0 && !$isMobile || + + // Firefox Desktop 4-13 - Tested on OS X 10.7 and Windows 7 + $this->version('Firefox', self::VERSION_TYPE_FLOAT)>=4.0 && !$isMobile || + + // Internet Explorer 7-9 - Tested on Windows XP, Vista and 7 + $this->version('MSIE', self::VERSION_TYPE_FLOAT)>=7.0 && !$isMobile || + + // Opera Desktop 10-12 - Tested on OS X 10.7 and Windows 7 + // @reference: http://my.opera.com/community/openweb/idopera/ + $this->version('Opera', self::VERSION_TYPE_FLOAT)>=10 && !$isMobile + + ){ + return self::MOBILE_GRADE_A; + } + + if ( + $this->isIOS() && $this->version('iPad', self::VERSION_TYPE_FLOAT)<4.3 || + $this->isIOS() && $this->version('iPhone', self::VERSION_TYPE_FLOAT)<3.1 || + $this->isIOS() && $this->version('iPod', self::VERSION_TYPE_FLOAT)<3.1 || + + // Blackberry 5.0: Tested on the Storm 2 9550, Bold 9770 + $this->is('Blackberry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)>=5 && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)<6 || + + //Opera Mini (5.0-6.5) - Tested on iOS 3.2/4.3 and Android 2.3 + ( $this->version('Opera Mini', self::VERSION_TYPE_FLOAT)>=5.0 && $this->version('Opera Mini', self::VERSION_TYPE_FLOAT)<=6.5 && + ($this->version('Android', self::VERSION_TYPE_FLOAT)>=2.3 || $this->is('iOS')) ) || + + // Nokia Symbian^3 - Tested on Nokia N8 (Symbian^3), C7 (Symbian^3), also works on N97 (Symbian^1) + $this->match('NokiaN8|NokiaC7|N97.*Series60|Symbian/3') || + + // @todo: report this (tested on Nokia N71) + $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT)>=11 && $this->is('SymbianOS') + ){ + return self::MOBILE_GRADE_B; + } + + if ( + // Blackberry 4.x - Tested on the Curve 8330 + $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)<5.0 || + // Windows Mobile - Tested on the HTC Leo (WinMo 5.2) + $this->match('MSIEMobile|Windows CE.*Mobile') || $this->version('Windows Mobile', self::VERSION_TYPE_FLOAT)<=5.2 + + ){ + return self::MOBILE_GRADE_C; + } + + //All older smartphone platforms and featurephones - Any device that doesn't support media queries + //will receive the basic, C grade experience. + return self::MOBILE_GRADE_C; + } +} diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 3ee4206258a..caa812a82a6 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -120,11 +120,11 @@ function getEntity($element=false, $shared=false) /** * Return information about user browser * - * @return array Array of information ('browsername'=>,'browseros'=>,'phone'=>,'browserversion'=>) + * @return array Array of information ('browsername'=>,'browseros'=>,'browserversion'=>,'layout'=>(classic|phone|tablet)) */ function getBrowserInfo() { - $name='unknown'; $version=''; $os='unknown'; $phone=''; + $name='unknown'; $version=''; $os='unknown'; $phone=''; $tablet=''; // If phone/smartphone, we set phone os name. if (preg_match('/android/i',$_SERVER["HTTP_USER_AGENT"])) { $os=$phone='android'; } @@ -156,7 +156,12 @@ function getBrowserInfo() $firefox=0; if (in_array($name,array('firefox','iceweasel'))) $firefox=1; - return array('browsername'=>$name, 'browserversion'=>$version, 'browseros'=>$os, 'phone'=>$phone, 'browserfirefox'=>$firefox); + include_once DOL_DOCUMENT_ROOT.'/core/class/MobileDetect.class.php'; + $detectmobile=new MobileDetect(); + $phone=$detectmobile->isMobile(); + $tablet=$detectmobile->isTablet(); + + return array('browsername'=>$name, 'browserversion'=>$version, 'browseros'=>$os, 'browserfirefox'=>$firefox, 'layout'=> ($tablet?'tablet':($phone?'phone':'classic')), 'phone'=>$phone, 'tablet'=>$tablet); } /** diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index 1be7d8a9a7a..72c156c8f3e 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -209,10 +209,12 @@ register_shutdown_function('dol_shutdown'); if (isset($_SERVER["HTTP_USER_AGENT"])) { $tmp=getBrowserInfo(); - $conf->browser->phone=$tmp['phone']; $conf->browser->name=$tmp['browsername']; $conf->browser->os=$tmp['browseros']; $conf->browser->version=$tmp['browserversion']; + $conf->browser->layout=$tmp['layout']; + $conf->browser->phone=$tmp['phone']; // deprecated, use layout + $conf->browser->tablet=$tmp['tablet']; // deprecated, use layout } diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index 043718d4222..e7967a1d5fb 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -460,25 +460,25 @@ div.fichecenter { clear: both; /* This is to have div fichecenter that are true rectangles */ } div.fichethirdleft { - dol_optimize_smallscreen)) { print "float: ".$left.";\n"; } ?> - dol_optimize_smallscreen)) { print "width: 35%;\n"; } ?> - dol_optimize_smallscreen)) { print "padding-bottom: 6px;\n"; } ?> + browser->layout != 'phone') { print "float: ".$left.";\n"; } ?> + browser->layout != 'phone') { print "width: 35%;\n"; } ?> + browser->layout == 'phone') { print "padding-bottom: 6px;\n"; } ?> } div.fichetwothirdright { - dol_optimize_smallscreen)) { print "float: ".$right.";\n"; } ?> - dol_optimize_smallscreen)) { print "width: 65%;\n"; } ?> - dol_optimize_smallscreen)) { print "padding-bottom: 6px\n"; } ?> + browser->layout != 'phone') { print "float: ".$right.";\n"; } ?> + browser->layout != 'phone') { print "width: 65%;\n"; } ?> + browser->layout == 'phone') { print "padding-bottom: 6px\n"; } ?> } div.fichehalfleft { - dol_optimize_smallscreen)) { print "float: ".$left.";\n"; } ?> - dol_optimize_smallscreen)) { print "width: 50%;\n"; } ?> + browser->layout != 'phone') { print "float: ".$left.";\n"; } ?> + browser->layout != 'phone') { print "width: 50%;\n"; } ?> } div.fichehalfright { - dol_optimize_smallscreen)) { print "float: ".$right.";\n"; } ?> - dol_optimize_smallscreen)) { print "width: 50%;\n"; } ?> + browser->layout != 'phone') { print "float: ".$right.";\n"; } ?> + browser->layout != 'phone') { print "width: 50%;\n"; } ?> } div.ficheaddleft { - dol_optimize_smallscreen)) { print "padding-".$left.": 16px;\n"; } + browser->layout != 'phone') { print "padding-".$left.": 16px;\n"; } else print "margin-top: 10px;\n"; ?> } .containercenter { From 9e91baca36047954314e011328f94d12e1551b9b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 27 Jul 2014 23:23:29 +0200 Subject: [PATCH 34/37] Fix: Log must be done before query. --- htdocs/core/db/mssql.class.php | 4 ++-- htdocs/core/db/mysql.class.php | 6 +++--- htdocs/core/db/mysqli.class.php | 7 ++++--- htdocs/core/db/pgsql.class.php | 4 ++-- htdocs/core/db/sqlite.class.php | 6 +++--- 5 files changed, 14 insertions(+), 13 deletions(-) diff --git a/htdocs/core/db/mssql.class.php b/htdocs/core/db/mssql.class.php index d0b454168df..39b9afdb75b 100644 --- a/htdocs/core/db/mssql.class.php +++ b/htdocs/core/db/mssql.class.php @@ -349,6 +349,8 @@ class DoliDBMssql extends DoliDB //print ""; + dol_syslog('sql='.$query, LOG_DEBUG); + if (! $this->database_name) { // Ordre SQL ne necessitant pas de connexion a une base (exemple: CREATE DATABASE) @@ -359,8 +361,6 @@ class DoliDBMssql extends DoliDB $ret = mssql_query($query, $this->db); } - dol_syslog('sql='.$query, LOG_DEBUG); - if (! preg_match("/^COMMIT/i",$query) && ! preg_match("/^ROLLBACK/i",$query)) { // Si requete utilisateur, on la sauvegarde ainsi que son resultset diff --git a/htdocs/core/db/mysql.class.php b/htdocs/core/db/mysql.class.php index bfa2d39b093..8f852aba3ec 100644 --- a/htdocs/core/db/mysql.class.php +++ b/htdocs/core/db/mysql.class.php @@ -252,6 +252,8 @@ class DoliDBMysql extends DoliDB { $query = trim($query); + dol_syslog('sql='.$query, LOG_DEBUG); + if (! $this->database_name) { // Ordre SQL ne necessitant pas de connexion a une base (exemple: CREATE DATABASE) @@ -263,8 +265,6 @@ class DoliDBMysql extends DoliDB $ret = mysql_query($query, $this->db); } - dol_syslog('sql='.$query, LOG_DEBUG); - if (! preg_match("/^COMMIT/i",$query) && ! preg_match("/^ROLLBACK/i",$query)) { // Si requete utilisateur, on la sauvegarde ainsi que son resultset @@ -829,7 +829,7 @@ class DoliDBMysql extends DoliDB $resql=$this->query($sql); if (! $resql) { - if ($this->lasterrno != 'DB_ERROR_USER_ALREADY_EXISTS') + if ($this->lasterrno != 'DB_ERROR_USER_ALREADY_EXISTS') { return -1; } diff --git a/htdocs/core/db/mysqli.class.php b/htdocs/core/db/mysqli.class.php index da16c1a7971..d44e37b7591 100644 --- a/htdocs/core/db/mysqli.class.php +++ b/htdocs/core/db/mysqli.class.php @@ -255,6 +255,9 @@ class DoliDBMysqli extends DoliDB function query($query,$usesavepoint=0,$type='auto') { $query = trim($query); + + dol_syslog('sql='.$query, LOG_DEBUG); + if (! $this->database_name) { // Ordre SQL ne necessitant pas de connexion a une base (exemple: CREATE DATABASE) @@ -265,8 +268,6 @@ class DoliDBMysqli extends DoliDB $ret = mysqli_query($this->db,$query); } - dol_syslog('sql='.$query, LOG_DEBUG); - if (! preg_match("/^COMMIT/i",$query) && ! preg_match("/^ROLLBACK/i",$query)) { // Si requete utilisateur, on la sauvegarde ainsi que son resultset @@ -833,7 +834,7 @@ class DoliDBMysqli extends DoliDB $resql=$this->query($sql); if (! $resql) { - if ($this->lasterrno != 'DB_ERROR_USER_ALREADY_EXISTS') + if ($this->lasterrno != 'DB_ERROR_USER_ALREADY_EXISTS') { return -1; } diff --git a/htdocs/core/db/pgsql.class.php b/htdocs/core/db/pgsql.class.php index f6759e087c8..61de279e24c 100644 --- a/htdocs/core/db/pgsql.class.php +++ b/htdocs/core/db/pgsql.class.php @@ -491,10 +491,10 @@ class DoliDBPgsql extends DoliDB @pg_query($this->db, 'SAVEPOINT mysavepoint'); } - $ret = @pg_query($this->db, $query); - dol_syslog('sql='.$query, LOG_DEBUG); + $ret = @pg_query($this->db, $query); + //print $query; if (! preg_match("/^COMMIT/i",$query) && ! preg_match("/^ROLLBACK/i",$query)) // Si requete utilisateur, on la sauvegarde ainsi que son resultset { diff --git a/htdocs/core/db/sqlite.class.php b/htdocs/core/db/sqlite.class.php index 34ee2a41b6d..924f489fc4d 100644 --- a/htdocs/core/db/sqlite.class.php +++ b/htdocs/core/db/sqlite.class.php @@ -389,7 +389,9 @@ class DoliDBSqlite extends DoliDB $query=$this->convertSQLFromMysql($query,$type); //print "After convertSQLFromMysql:\n".$query."
\n"; - // Ordre SQL ne necessitant pas de connexion a une base (exemple: CREATE DATABASE) + dol_syslog('sql='.$query, LOG_DEBUG); + + // Ordre SQL ne necessitant pas de connexion a une base (exemple: CREATE DATABASE) try { //$ret = $this->db->exec($query); $ret = $this->db->query($query); // $ret is a PDO object @@ -399,8 +401,6 @@ class DoliDBSqlite extends DoliDB $this->error=$e->getMessage(); } - dol_syslog('sql='.$query, LOG_DEBUG); - if (! preg_match("/^COMMIT/i",$query) && ! preg_match("/^ROLLBACK/i",$query)) { // Si requete utilisateur, on la sauvegarde ainsi que son resultset From 25d18f225fb61b8903162016aa72226a927e8b5c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 27 Jul 2014 23:51:58 +0200 Subject: [PATCH 35/37] Fix: Restore compatibility with old modules. --- htdocs/core/lib/admin.lib.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/core/lib/admin.lib.php b/htdocs/core/lib/admin.lib.php index cb338ff53f1..899de9a5ec1 100644 --- a/htdocs/core/lib/admin.lib.php +++ b/htdocs/core/lib/admin.lib.php @@ -887,7 +887,7 @@ function complete_dictionary_with_modules(&$taborder,&$tabname,&$tablib,&$tabsql { while (($file = readdir($handle))!==false) { - if (is_dir($dirroot.'/'.$file) && substr($file, 0, 1) <> '.' && substr($file, 0, 3) <> 'CVS' && $file != 'includes') + if (is_dir($dirroot.'/'.$file) && substr($file, 0, 1) <> '.' && substr($file, 0, 3) <> 'CVS' && $file != 'includes') { if (is_dir($dirroot . '/' . $file . '/core/modules/')) { @@ -898,7 +898,6 @@ function complete_dictionary_with_modules(&$taborder,&$tabname,&$tablib,&$tabsql closedir($handle); } } - //var_dump($modulesdir); foreach ($modulesdir as $dir) { @@ -959,7 +958,8 @@ function complete_dictionary_with_modules(&$taborder,&$tabname,&$tablib,&$tabsql // Complete arrays //&$tabname,&$tablib,&$tabsql,&$tabsqlsort,&$tabfield,&$tabfieldvalue,&$tabfieldinsert,&$tabrowid,&$tabcond - //$objMod + if (empty($objMod->dictionaries) && ! empty($objMod->dictionnaries)) $objMod->dictionaries=$objMod->dictionnaries; // For backward compatibility + if (! empty($objMod->dictionaries)) { //var_dump($objMod->dictionaries['tabname']); From 355ec7fd276dcab5461ccf8a43323bc1e395729c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 27 Jul 2014 23:52:42 +0200 Subject: [PATCH 36/37] Fix: Avoid pgsql error of duplicate record making rollback. --- htdocs/core/modules/DolibarrModules.class.php | 85 +++++++++++-------- 1 file changed, 49 insertions(+), 36 deletions(-) diff --git a/htdocs/core/modules/DolibarrModules.class.php b/htdocs/core/modules/DolibarrModules.class.php index 1cbf5f08009..1657efa6e46 100644 --- a/htdocs/core/modules/DolibarrModules.class.php +++ b/htdocs/core/modules/DolibarrModules.class.php @@ -852,6 +852,7 @@ abstract class DolibarrModules dol_syslog(get_class($this)."::insert_permissions", LOG_DEBUG); $resql=$this->db->query($sql_del); + if ($resql) { $obj=$this->db->fetch_object($resql); @@ -870,45 +871,57 @@ abstract class DolibarrModules if (empty($r_type)) $r_type='w'; - if (dol_strlen($r_perms) ) + // Search if perm already present + $sql = "SELECT count(*) as nb FROM ".MAIN_DB_PREFIX."rights_def"; + $sql.= " WHERE id = ".$r_id." AND entity = ".$entity; + $resqlselect=$this->db->query($sql); + + $obj = $this->db->fetch_object($resqlselect); + if ($obj->nb == 0) { - if (dol_strlen($r_subperms) ) - { - $sql = "INSERT INTO ".MAIN_DB_PREFIX."rights_def"; - $sql.= " (id, entity, libelle, module, type, bydefault, perms, subperms)"; - $sql.= " VALUES "; - $sql.= "(".$r_id.",".$entity.",'".$this->db->escape($r_desc)."','".$r_modul."','".$r_type."',".$r_def.",'".$r_perms."','".$r_subperms."')"; - } - else - { - $sql = "INSERT INTO ".MAIN_DB_PREFIX."rights_def"; - $sql.= " (id, entity, libelle, module, type, bydefault, perms)"; - $sql.= " VALUES "; - $sql.= "(".$r_id.",".$entity.",'".$this->db->escape($r_desc)."','".$r_modul."','".$r_type."',".$r_def.",'".$r_perms."')"; - } - } - else - { - $sql = "INSERT INTO ".MAIN_DB_PREFIX."rights_def "; - $sql .= " (id, entity, libelle, module, type, bydefault)"; - $sql .= " VALUES "; - $sql .= "(".$r_id.",".$entity.",'".$this->db->escape($r_desc)."','".$r_modul."','".$r_type."',".$r_def.")"; + if (dol_strlen($r_perms) ) + { + if (dol_strlen($r_subperms) ) + { + $sql = "INSERT INTO ".MAIN_DB_PREFIX."rights_def"; + $sql.= " (id, entity, libelle, module, type, bydefault, perms, subperms)"; + $sql.= " VALUES "; + $sql.= "(".$r_id.",".$entity.",'".$this->db->escape($r_desc)."','".$r_modul."','".$r_type."',".$r_def.",'".$r_perms."','".$r_subperms."')"; + } + else + { + $sql = "INSERT INTO ".MAIN_DB_PREFIX."rights_def"; + $sql.= " (id, entity, libelle, module, type, bydefault, perms)"; + $sql.= " VALUES "; + $sql.= "(".$r_id.",".$entity.",'".$this->db->escape($r_desc)."','".$r_modul."','".$r_type."',".$r_def.",'".$r_perms."')"; + } + } + else + { + $sql = "INSERT INTO ".MAIN_DB_PREFIX."rights_def "; + $sql .= " (id, entity, libelle, module, type, bydefault)"; + $sql .= " VALUES "; + $sql .= "(".$r_id.",".$entity.",'".$this->db->escape($r_desc)."','".$r_modul."','".$r_type."',".$r_def.")"; + } + + $resqlinsert=$this->db->query($sql,1); + + if (! $resqlinsert) + { + if ($this->db->errno() != "DB_ERROR_RECORD_ALREADY_EXISTS") + { + $this->error=$this->db->lasterror(); + $err++; + break; + } + else dol_syslog(get_class($this)."::insert_permissions record already exists", LOG_INFO); + + } + + $this->db->free($resqlinsert); } - dol_syslog(get_class($this)."::insert_permissions", LOG_DEBUG); - $resqlinsert=$this->db->query($sql,1); - if (! $resqlinsert) - { - if ($this->db->errno() != "DB_ERROR_RECORD_ALREADY_EXISTS") - { - $this->error=$this->db->lasterror(); - $err++; - break; - } - else dol_syslog(get_class($this)."::insert_permissions record already exists", LOG_INFO); - - } - $this->db->free($resqlinsert); + $this->db->free($resqlselect); // If we want to init permissions on admin users if ($reinitadminperms) From b31bf68376e282bc04050295c2307437cc95858a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 28 Jul 2014 00:47:27 +0200 Subject: [PATCH 37/37] New: Start to work on data check for dictionnary tables. --- htdocs/admin/dict.php | 31 ++++++++++++++++++++++++++++++- htdocs/core/lib/admin.lib.php | 4 +++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/htdocs/admin/dict.php b/htdocs/admin/dict.php index 788483196e4..654d8cf10ba 100644 --- a/htdocs/admin/dict.php +++ b/htdocs/admin/dict.php @@ -364,8 +364,37 @@ $tabhelp[24] = array(); $tabhelp[25] = array(); $tabhelp[26] = array(); +// List of check for fields (NOT USED YET) +$tabfieldcheck=array(); +$tabfieldcheck[1] = array(); +$tabfieldcheck[2] = array(); +$tabfieldcheck[3] = array(); +$tabfieldcheck[4] = array(); +$tabfieldcheck[5] = array(); +$tabfieldcheck[6] = array(); +$tabfieldcheck[7] = array(); +$tabfieldcheck[8] = array(); +$tabfieldcheck[9] = array(); +$tabfieldcheck[10] = array(); +$tabfieldcheck[11] = array(); +$tabfieldcheck[12] = array(); +$tabfieldcheck[13] = array(); +$tabfieldcheck[14] = array(); +$tabfieldcheck[15] = array(); +$tabfieldcheck[16] = array(); +$tabfieldcheck[17] = array(); +$tabfieldcheck[18] = array(); +$tabfieldcheck[19] = array(); +$tabfieldcheck[20] = array(); +$tabfieldcheck[21] = array(); +$tabfieldcheck[22] = array(); +$tabfieldcheck[23] = array(); +$tabfieldcheck[24] = array(); +$tabfieldcheck[25] = array(); +$tabfieldcheck[26] = array(); + // Complete all arrays with entries found into modules -complete_dictionary_with_modules($taborder,$tabname,$tablib,$tabsql,$tabsqlsort,$tabfield,$tabfieldvalue,$tabfieldinsert,$tabrowid,$tabcond,$tabhelp); +complete_dictionary_with_modules($taborder,$tabname,$tablib,$tabsql,$tabsqlsort,$tabfield,$tabfieldvalue,$tabfieldinsert,$tabrowid,$tabcond,$tabhelp,$tabfieldcheck); // Define elementList and sourceList (used for dictionary "type of contacts") diff --git a/htdocs/core/lib/admin.lib.php b/htdocs/core/lib/admin.lib.php index 899de9a5ec1..b6f2b02567a 100644 --- a/htdocs/core/lib/admin.lib.php +++ b/htdocs/core/lib/admin.lib.php @@ -862,9 +862,10 @@ function unActivateModule($value, $requiredby=1) * @param array &$tabrowid Tabrowid * @param array &$tabcond Tabcond * @param array &$tabhelp Tabhelp + * @param array &$tabfieldcheck Tabfieldcheck * @return int 1 */ -function complete_dictionary_with_modules(&$taborder,&$tabname,&$tablib,&$tabsql,&$tabsqlsort,&$tabfield,&$tabfieldvalue,&$tabfieldinsert,&$tabrowid,&$tabcond,&$tabhelp) +function complete_dictionary_with_modules(&$taborder,&$tabname,&$tablib,&$tabsql,&$tabsqlsort,&$tabfield,&$tabfieldvalue,&$tabfieldinsert,&$tabrowid,&$tabcond,&$tabhelp,&$tabfieldcheck) { global $db, $modules, $conf, $langs; @@ -977,6 +978,7 @@ function complete_dictionary_with_modules(&$taborder,&$tabname,&$tablib,&$tabsql foreach($objMod->dictionaries['tabfieldinsert'] as $val) $tabfieldinsert[] = $val; foreach($objMod->dictionaries['tabrowid'] as $val) $tabrowid[] = $val; foreach($objMod->dictionaries['tabcond'] as $val) $tabcond[] = $val; + foreach($objMod->dictionaries['tabfieldcheck'] as $val) $tabfieldcheck[] = $val; if (! empty($objMod->dictionaries['tabhelp'])) foreach($objMod->dictionaries['tabhelp'] as $val) $tabhelp[] = $val; //foreach($objMod->dictionaries['tabsqlsort'] as $val) $tablib[] = $val; //$tabname = array_merge ($tabname, $objMod->dictionaries['tabname']);
@@ -80,8 +105,9 @@ Example 0c: Table with table+tr+td containg a select that should be overflowed a -
-Example 1 : Table using tags: div.tagtable+div.tagtr+div or div.tagtable+div.tagtr+div.tagtd
+


Example 1 : Table using tags: div.tagtable+div.tagtr+div or div.tagtable+div.tagtr+div.tagtd => Use this for tables that are edited forms

+ +
+


Example 2 : Table using tags: table/thead/tbody/tr/td + dataTable => Use this for long result tables
-Example 2 : Table using tags: table/thead/tbody/tr/td + dataTable
- - +
@@ -249,12 +304,9 @@ $('xxxth').replaceWith(
snake
-

+


Example 3 : Standard table => Use this if you need the drag and drop for lines
- -
-Example 3 : Standard table

+ + + \ No newline at end of file diff --git a/htdocs/theme/auguria/style.css.php b/htdocs/theme/auguria/style.css.php index 36c2fd81689..8e2ed1da79e 100644 --- a/htdocs/theme/auguria/style.css.php +++ b/htdocs/theme/auguria/style.css.php @@ -2296,6 +2296,11 @@ div.ecmjqft { { text-decoration: underline !important; } +.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled, .paginate_button_disabled { + opacity: .35; + filter: Alpha(Opacity=35); + background-image: none; +} /* ============================================================================== */ diff --git a/htdocs/theme/bureau2crea/style.css.php b/htdocs/theme/bureau2crea/style.css.php index 66cb23f2451..83e8a14efda 100644 --- a/htdocs/theme/bureau2crea/style.css.php +++ b/htdocs/theme/bureau2crea/style.css.php @@ -384,7 +384,6 @@ div.tmenu { border-left: 0px; padding: 0px; margin: 5px 0px 10px 0px; - font-size: 13px; background-image : url(); background-repeat: no-repeat; background-color: #996644; @@ -408,7 +407,7 @@ div.mainmenu { /* Do not load menu img if hidden to save bandwidth */ - +'name of class for div') @@ -784,6 +783,7 @@ div.blockvmenusearch div.menu_titre { #blockvmenusearch form { clear: both; + margin-bottom: 14px; } div.blockvmenubookmarks @@ -2482,6 +2482,11 @@ div.ecmjqft { { text-decoration: underline !important; } +.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled, .paginate_button_disabled { + opacity: .35; + filter: Alpha(Opacity=35); + background-image: none; +} /* ============================================================================== */ diff --git a/htdocs/theme/cameleo/style.css.php b/htdocs/theme/cameleo/style.css.php index 9031ea72895..72d67b1c491 100644 --- a/htdocs/theme/cameleo/style.css.php +++ b/htdocs/theme/cameleo/style.css.php @@ -859,6 +859,7 @@ div.blockvmenusearch div.menu_titre { #blockvmenusearch form { clear: both; + margin-bottom: 14px; } div.blockvmenubookmarks @@ -2376,7 +2377,11 @@ div.ecmjqft { { text-decoration: underline !important; } - +.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled, .paginate_button_disabled { + opacity: .35; + filter: Alpha(Opacity=35); + background-image: none; +} /* ============================================================================== */ /* JMobile */ diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index ccb72fa2f25..043718d4222 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -1645,11 +1645,10 @@ table.noborder, table.formdoc, div.noborder { border-bottom-style: solid; margin: 0px 0px 2px 0px; - /*padding: 1px 2px 1px 2px;*/ - -moz-box-shadow: 3px 3px 4px #DDD; - -webkit-box-shadow: 3px 3px 4px #DDD; - box-shadow: 3px 3px 4px #DDD; + -moz-box-shadow: 2px 2px 4px #DDD; + -webkit-box-shadow: 2px 2px 4px #DDD; + box-shadow: 2px 2px 4px #DDD; -moz-border-radius: 0.2em; -webkit-border-radius: 0.2em; @@ -2703,6 +2702,12 @@ div.dolEventError h1, div.dolEventError h2 { /* Disable this. It breaks wrapping of boxes .ui-corner-all { white-space: nowrap; } */ +.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled, .paginate_button_disabled { + opacity: .35; + filter: Alpha(Opacity=35); + background-image: none; +} + /* ============================================================================== */ /* JMobile */ From bf9313dd87d4ee887c13bea1c3c152c85cdb16a9 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 27 Jul 2014 20:56:26 +0200 Subject: [PATCH 33/37] getBrowserInfo can return type of layout (classic/phone/tablet) --- ChangeLog | 1 + htdocs/admin/system/browser.php | 2 +- htdocs/core/class/MobileDetect.class.php | 1248 ++++++++++++++++++++++ htdocs/core/lib/functions.lib.php | 11 +- htdocs/main.inc.php | 4 +- htdocs/theme/eldy/style.css.php | 22 +- 6 files changed, 1272 insertions(+), 16 deletions(-) create mode 100644 htdocs/core/class/MobileDetect.class.php diff --git a/ChangeLog b/ChangeLog index ce5f819bb6b..08e75ecb34b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -51,6 +51,7 @@ For translators: - Update language files. For developers: +- New: getBrowserInfo can return type of layout (classic/phone/tablet) - New: Add hook "searchAgendaFrom". - New: Add trigger DON_UPDATE, DON_DELETE - New: Add country iso code on 3 chars into table of countries. diff --git a/htdocs/admin/system/browser.php b/htdocs/admin/system/browser.php index 2a97cf8e8eb..58601c6e998 100644 --- a/htdocs/admin/system/browser.php +++ b/htdocs/admin/system/browser.php @@ -59,7 +59,7 @@ print '
'.$langs->trans("BrowserOS").''.$langs->trans("Version").''.$tmp['browserversion'].'
'.$langs->trans("Smartphone").' ?'.$tmp['phone'].'
'.$langs->trans("Layout").' (phone/tablet/classic)'.$tmp['layout'].'
'.$langs->trans("IPAddress").''.$_SERVER['REMOTE_ADDR'].'