Changes

m
Line 25: Line 25:  
*Todos los archivos PHP deben empezar con una cabezara como
 
*Todos los archivos PHP deben empezar con una cabezara como
   −
<source lang="php">
+
<syntaxhighlight lang="php">
 
<?php
 
<?php
 
/* Copyright (C) YYYY John Doe  <email@email.com>
 
/* Copyright (C) YYYY John Doe  <email@email.com>
Line 32: Line 32:  
*/
 
*/
 
...
 
...
</source>
+
</syntaxhighlight>
    
Si edita un archivo existente del proyecto, debe añadir una línea de Copyright debajo de las otras.
 
Si edita un archivo existente del proyecto, debe añadir una línea de Copyright debajo de las otras.
Line 40: Line 40:  
*Dolibarr está escrito en PHP y soporta todas las versiones de PHP superiores a la {{PHPMinVersion}}. Todos los archivos deben de contener la extensión .php
 
*Dolibarr está escrito en PHP y soporta todas las versiones de PHP superiores a la {{PHPMinVersion}}. Todos los archivos deben de contener la extensión .php
   −
*La llamada a las variables superglobales PHP deben pasar a través de los operadores dedicados $_COOKIES, $_SERVER, $_ENV y a través de la función dolibarr GETPOST() para obtener el contenido de$_GET o $_POST...
+
*La llamada a las variables superglobales PHP deben pasar a través de los operadores dedicados $_COOKIE, $_SERVER, $_ENV y a través de la función dolibarr GETPOST() para obtener el contenido de$_GET o $_POST...
    
Los otros operadores ($HTTP_SERVER_GET, ...) están siendo depreciados en el seno de PHP, no deben de ser ya utilizados. Por lo tanto, el código debe funcionar incluso cuando la opción '''register_long_arrays''' esté en off.
 
Los otros operadores ($HTTP_SERVER_GET, ...) están siendo depreciados en el seno de PHP, no deben de ser ya utilizados. Por lo tanto, el código debe funcionar incluso cuando la opción '''register_long_arrays''' esté en off.
Line 51: Line 51:  
*Cuando varias variables deben ser inicializadas con el mismo valor, utilice múltiples líneas
 
*Cuando varias variables deben ser inicializadas con el mismo valor, utilice múltiples líneas
   −
<source lang="php">
+
<syntaxhighlight lang="php">
$var1=1;$var2=1;$var3=1;
+
$var1 = 1; $var2 = 1; $var3 = 1;
</source>
+
</syntaxhighlight>
 
en lugar de
 
en lugar de
<source lang="php">
+
<syntaxhighlight lang="php">
$var1=$var2=$var3=1;
+
$var1 = $var2 = $var3 = 1;
</source>
+
</syntaxhighlight>
 
que es menos eficiente.
 
que es menos eficiente.
   −
*las cadenas deben de ser encuadradas con comillas simples y las variables sacadas de la cadena.
+
*las cadenas deben de ser con las variables sacadas de la cadena.
   −
<source lang="php">
+
<syntaxhighlight lang="php">
print 'Mi texo muestra mi '.$variable.' !';
+
print "Mi texo muestra mi ".$variable." !\n";
</source>
+
</syntaxhighlight>
    
*Los comentarios deben seguir la sintaxis de C, es decir, una doble barra invertida para una línea de comentario y el uso de una barra con arterisco para abrir un bloque de varias líneas
 
*Los comentarios deben seguir la sintaxis de C, es decir, una doble barra invertida para una línea de comentario y el uso de una barra con arterisco para abrir un bloque de varias líneas
   −
<source lang="php">
+
<syntaxhighlight lang="php">
 
/* Bloque de comentarios
 
/* Bloque de comentarios
 
  *
 
  *
Line 83: Line 83:  
}
 
}
   −
</source>
+
</syntaxhighlight>
    
*Los ficheros deben ser guardados en formato Unix (LF) y no en formato Windows (CR/LF). El formato Unix es compatible con los SO Unix, Windows, Mac, mientras que el formato de archivo de texto de Windows es problemático en algunos PHP en Unix.
 
*Los ficheros deben ser guardados en formato Unix (LF) y no en formato Windows (CR/LF). El formato Unix es compatible con los SO Unix, Windows, Mac, mientras que el formato de archivo de texto de Windows es problemático en algunos PHP en Unix.
Line 150: Line 150:  
Ejemplos '''Fichero tabla llx_matable.sql''':
 
Ejemplos '''Fichero tabla llx_matable.sql''':
   −
<source lang="sql">
+
<syntaxhighlight lang="sql">
 
-- ===========================================================================
 
-- ===========================================================================
 
-- Copyright (C) 2008 Author <email@author.com>
 
-- Copyright (C) 2008 Author <email@author.com>
Line 177: Line 177:  
   tms        timestamp
 
   tms        timestamp
 
)type=innodb;
 
)type=innodb;
</source>
+
</syntaxhighlight>
    
Ejemplos '''Fichero de claves/índices llx_matable.key.sql'''
 
Ejemplos '''Fichero de claves/índices llx_matable.key.sql'''
   −
<source lang="sql">
+
<syntaxhighlight lang="sql">
 
-- ===========================================================================
 
-- ===========================================================================
 
-- Copyright (C) 2008 Author <email@author.com>
 
-- Copyright (C) 2008 Author <email@author.com>
Line 202: Line 202:     
ALTER TABLE llx_matable ADD CONSTRAINT fk_matable_fk_field FOREIGN KEY (fk_field) REFERENCES llx_matablepere (rowid);
 
ALTER TABLE llx_matable ADD CONSTRAINT fk_matable_fk_field FOREIGN KEY (fk_field) REFERENCES llx_matablepere (rowid);
</source>
+
</syntaxhighlight>
    
==SQL Coding rules==
 
==SQL Coding rules==
Line 209: Line 209:     
Dentro de los selects pueden utilizar alias para simplificar la redacción de las consultas:
 
Dentro de los selects pueden utilizar alias para simplificar la redacción de las consultas:
<source lang="sql">
+
<syntaxhighlight lang="sql">
 
select chp1, chpxxx2 as chp2 from table2 as t1, table2 as t2 where t1.chpx = t2.chpy
 
select chp1, chpxxx2 as chp2 from table2 as t1, table2 as t2 where t1.chpx = t2.chpy
</source>
+
</syntaxhighlight>
 
Sin embargo, no debemos utilizar este alias en las consultas de actualización porque no es compatible con mysql 3.1.
 
Sin embargo, no debemos utilizar este alias en las consultas de actualización porque no es compatible con mysql 3.1.
    
*¡Los SELECT * están prohibidos! Cada Select deberá especificar la lista completa de los campos para recuperar. Esto permitirá evitar confusiones. Ejemplo:
 
*¡Los SELECT * están prohibidos! Cada Select deberá especificar la lista completa de los campos para recuperar. Esto permitirá evitar confusiones. Ejemplo:
   −
<source lang="sql">
+
<syntaxhighlight lang="sql">
 
SELECT field_a, field_b, field_c FROM table_1 WHERE field_d = '$id'
 
SELECT field_a, field_b, field_c FROM table_1 WHERE field_d = '$id'
</source>
+
</syntaxhighlight>
    
*En las consultas SQL, entrecomillaremos los campos, pero no los numéricos que contengan cantidades que se almacenen en los campos de tipo double o real. Los entrecomillados en los numéricos de tipo float se almacenan con un valor diferente. Por ejemplo 412.62 dentro del insert se guardara con el valor 412.61999512 en base si el campo es de tipo double(24,8). Y PHP sólo ve 412.61999512. Otras herramientas verán 412.62 dando la impresión de que no hay problemas. Y PHP tiene razón, hay un problema en base. Mediante la eliminación de las comillas en los numéricos, esto irá  mejor.
 
*En las consultas SQL, entrecomillaremos los campos, pero no los numéricos que contengan cantidades que se almacenen en los campos de tipo double o real. Los entrecomillados en los numéricos de tipo float se almacenan con un valor diferente. Por ejemplo 412.62 dentro del insert se guardara con el valor 412.61999512 en base si el campo es de tipo double(24,8). Y PHP sólo ve 412.61999512. Otras herramientas verán 412.62 dando la impresión de que no hay problemas. Y PHP tiene razón, hay un problema en base. Mediante la eliminación de las comillas en los numéricos, esto irá  mejor.
    
Ejemplo:
 
Ejemplo:
<source lang="sql">
+
<syntaxhighlight lang="sql">
 
Bien:INSERT INTO table_1 (field_txt, field_num) VALUES ('txt', 412.62)
 
Bien:INSERT INTO table_1 (field_txt, field_num) VALUES ('txt', 412.62)
 
Mal: INSERT INTO table_1 (field_txt, field_num) VALUES ('txt', '412.62')
 
Mal: INSERT INTO table_1 (field_txt, field_num) VALUES ('txt', '412.62')
</source>
+
</syntaxhighlight>
    
Nota, el problema de los float es general y no sólamete en el acceso a la base de datos, está presente en todos los lenguajes cuando trabajamos sobre números reales, por lo que deberán ser limpiados por la función price2num con el segundo parámetro rellenado con:
 
Nota, el problema de los float es general y no sólamete en el acceso a la base de datos, está presente en todos los lenguajes cuando trabajamos sobre números reales, por lo que deberán ser limpiados por la función price2num con el segundo parámetro rellenado con:
Line 246: Line 246:     
Para activarla, añada la siguiente línea en su archivo config del servidor MySql (my.cnf o my.ini)
 
Para activarla, añada la siguiente línea en su archivo config del servidor MySql (my.cnf o my.ini)
<source lang="ini">
+
{{MySqlStrictMode}}
sql-mode="STRICT_ALL_TABLES,ONLY_FULL_GROUP_BY,NO_ZERO_DATE"
  −
</source>
      
==Particularidades de PostgreSQL==
 
==Particularidades de PostgreSQL==
Line 261: Line 259:     
Por ejemplo:
 
Por ejemplo:
<source lang="php">
+
<syntaxhighlight lang="php">
 
print '<a href="'.dol_buildpath('/monrep/mapage.php').'">'.img_picto('Texte alt','nompictopng','').'</a>';
 
print '<a href="'.dol_buildpath('/monrep/mapage.php').'">'.img_picto('Texte alt','nompictopng','').'</a>';
</source>
+
</syntaxhighlight>
    
*Las tablas HTML deben tener las columnas sin valores forcados, a excepción de las columnas que contienen información cuya longitud no es variable. Por ejemplo, una columna con una imagen puede forzarse a un with="20px". En los otros casos, hay que evitar forzar la longitud de las columnas. Esto es porque en la mayoría de los casos el navegador realiza un buen trabajo al definir automáticamente la longitud de las columnas, independientemente de la resolución de la pantalla.
 
*Las tablas HTML deben tener las columnas sin valores forcados, a excepción de las columnas que contienen información cuya longitud no es variable. Por ejemplo, una columna con una imagen puede forzarse a un with="20px". En los otros casos, hay que evitar forzar la longitud de las columnas. Esto es porque en la mayoría de los casos el navegador realiza un buen trabajo al definir automáticamente la longitud de las columnas, independientemente de la resolución de la pantalla.
Line 269: Line 267:  
*Javascript/ajax y la llamada a scripts java en las páginas php está fuera de las normas. Si de todas maneras se incluye código javascript, debe estar condicionado mediante el test "$conf->use_javascript_ajax"
 
*Javascript/ajax y la llamada a scripts java en las páginas php está fuera de las normas. Si de todas maneras se incluye código javascript, debe estar condicionado mediante el test "$conf->use_javascript_ajax"
   −
<source lang="php">
+
<syntaxhighlight lang="php">
 
if ($conf->use_javascript_ajax) {
 
if ($conf->use_javascript_ajax) {
 
...  // El código PHP que genera el javascript va aquí
 
...  // El código PHP que genera el javascript va aquí
 
}
 
}
</source>
+
</syntaxhighlight>
    
*Las ventanas emergentes  no deben de ser utilizadas, exceptuando los tooltips (y quedan condicionados por el punto anterior).
 
*Las ventanas emergentes  no deben de ser utilizadas, exceptuando los tooltips (y quedan condicionados por el punto anterior).
Line 316: Line 314:  
Tanto en PHP como en otros lenguajes (Java, por ejemplo), los datos no enteros (float, real, double) no son fialbes.
 
Tanto en PHP como en otros lenguajes (Java, por ejemplo), los datos no enteros (float, real, double) no son fialbes.
 
Pruebe a realizar por ejemplo
 
Pruebe a realizar por ejemplo
<source lang="php">
+
<syntaxhighlight lang="php">
 
print 239.2 - 229.3 - 9.9;
 
print 239.2 - 229.3 - 9.9;
</source>
+
</syntaxhighlight>
 
No obtendrá 0, sino un número muy pequeño en potencia 10 negativo . Si obtiene cero, puede encontrar otros ejemplos que no funcionan.
 
No obtendrá 0, sino un número muy pequeño en potencia 10 negativo . Si obtiene cero, puede encontrar otros ejemplos que no funcionan.
 
El problema de los float es general, una variable resultante del cálculo de números reales debe SISTEMATICAMENTE ser limpiada mediante la función '''price2num()''' con el segundo parámetro rellenado con: 'MU', 'MT' ó 'MS' según el caso (ver doc de la función).
 
El problema de los float es general, una variable resultante del cálculo de números reales debe SISTEMATICAMENTE ser limpiada mediante la función '''price2num()''' con el segundo parámetro rellenado con: 'MU', 'MT' ó 'MS' según el caso (ver doc de la función).
<source lang="php">
+
<syntaxhighlight lang="php">
 
print price2num(239.2 - 229.3 - 9.9, 'MT');
 
print price2num(239.2 - 229.3 - 9.9, 'MT');
</source>
+
</syntaxhighlight>
 
Si no es un precio que se ajuste a los parámetros de MU, MT, MS debe utilizar la función '''round()'''.
 
Si no es un precio que se ajuste a los parámetros de MU, MT, MS debe utilizar la función '''round()'''.
   Line 332: Line 330:  
==Logs==
 
==Logs==
 
Añada traces dentro de su código mediante la función  
 
Añada traces dentro de su código mediante la función  
<source lang="php">
+
<syntaxhighlight lang="php">
 
dol_syslog($yourmessage, LOG_INFO|LOG_DEBUG|LOG_WARNING|LOG_ERR);
 
dol_syslog($yourmessage, LOG_INFO|LOG_DEBUG|LOG_WARNING|LOG_ERR);
</source>
+
</syntaxhighlight>
    
==Carpetas de trabajo==
 
==Carpetas de trabajo==
Line 341: Line 339:     
La carpeta puede crearse en desde su código mediante el código siguiente:
 
La carpeta puede crearse en desde su código mediante el código siguiente:
<source lang="php">
+
<syntaxhighlight lang="php">
 
$mymoduledir=DOL_DATA_ROOT.'/mimodulo';
 
$mymoduledir=DOL_DATA_ROOT.'/mimodulo';
 
dol_mkdir($mymoduledir);
 
dol_mkdir($mymoduledir);
</source>
+
</syntaxhighlight>
    
Si necesita una carpeta de datos temporales, esta carpeta deberá ser '''DOL_DATA_ROOT.'/minmodulo/temp''''
 
Si necesita una carpeta de datos temporales, esta carpeta deberá ser '''DOL_DATA_ROOT.'/minmodulo/temp''''
Line 405: Line 403:  
Más "purista" en el papel ya que el negociado está más cercano, este método también tiene la desventaja de ser más complejo en la práctica.
 
Más "purista" en el papel ya que el negociado está más cercano, este método también tiene la desventaja de ser más complejo en la práctica.
   −
Ejemplo: Es el utilizadao si utilizamos el Framework de ORM '''Propel''' (http://propel.phpdb.org/trac/). Lo encontraremos pues en aplicacciones más pesadas basadas en este ORM.
+
Ejemplo: Es el utilizadao si utilizamos el Framework de ORM '''Propel''' (https://propelorm.org/). Lo encontraremos pues en aplicacciones más pesadas basadas en este ORM.
    
-> Para los desarrollos de Dolibarr, es recomendado utilizar el modo '''Active Record ''' que ofrece las ventajas de un modelo cercano de negociado sin la complejidad y sin dificultar mucho la técnica. Es en este modo mediante el cual el desarrollo, la comprensión del código y el mantenimiento técnico y/o funcional parece ser la más productivo (Sin embargo, se trata de un eterno debate entre los puristas y los pragmáticos, el debate en el que nadie puede realmente estar en lo cierto, porque todo depende de los objetivos a atender).
 
-> Para los desarrollos de Dolibarr, es recomendado utilizar el modo '''Active Record ''' que ofrece las ventajas de un modelo cercano de negociado sin la complejidad y sin dificultar mucho la técnica. Es en este modo mediante el cual el desarrollo, la comprensión del código y el mantenimiento técnico y/o funcional parece ser la más productivo (Sin embargo, se trata de un eterno debate entre los puristas y los pragmáticos, el debate en el que nadie puede realmente estar en lo cierto, porque todo depende de los objetivos a atender).