https://www.dolibarr.es/foro/viewtopic.php?t=8589
El caso es que necesitaba adjuntar automáticamente un archivo adicional al correo, pero desde la ficha de presupuesto. He probado el código hasta entender (creo) cómo ponerlo en la versión 13.0.0, y al ver que funcionaba he probado para adjuntar un tercer archivo repitiendo el mismo código de Aitorxs. He de decir que no estoy muy puesto en php e igual estoy haciendo algo mal.
El código sería así:
• core/lib/files.lib.php
Al ser la versión 13.0.1 me sale que debería poner el código por la línea 2214 en el apartado de << Return file(s) into a directory (by default most recent)>> y añado el código para los dos archivos:
Código: Seleccionar todo
function dol_most_recent_file_1($dir, $regexfilter = '', $excludefilter = array('(\.meta|_preview.*\.png)$', '^\.'), $nohook = false, $mode = '')
{
$tmparray = dol_dir_list($dir, 'files', 0, $regexfilter, $excludefilter, 'date', SORT_DESC, $mode,$nohook);
return $tmparray[1];
}
function dol_most_recent_file_2($dir, $regexfilter = '', $excludefilter = array('(\.meta|_preview.*\.png)$', '^\.'), $nohook = false, $mode = '')
{
$tmparray = dol_dir_list($dir, 'files', 0, $regexfilter, $excludefilter, 'date', SORT_DESC, $mode,$nohook);
return $tmparray[2];
}
En el apartado << Code to ouput content when action is presend >> en la condición que comienza en la línea 44 agrego el código indicado por Aitorxs añadiendo el caso especial de presupuesto (propal)
Código: Seleccionar todo
if (!in_array($object->element, array('societe', 'user', 'member')))
{
// TODO get also the main_lastdoc field of $object. If not found, try to guess with following code
$ref = dol_sanitizeFileName($object->ref);
include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
// Special case
if ($object->element == 'invoice_supplier')
{
$fileparams = dol_most_recent_file($diroutput.'/'.get_exdir($object->id, 2, 0, 0, $object, $object->element).$ref, preg_quote($ref, '/').'([^\-])+');
$fileparams_1 = dol_most_recent_file_1($diroutput .'/'.$ref, preg_quote($ref, '/').'[^\-]+');
$fileparams_2 = dol_most_recent_file_2($diroutput .'/'.$ref, preg_quote($ref, '/').'[^\-]+');
} else {
$fileparams = dol_most_recent_file($diroutput.'/'.$ref, preg_quote($ref, '/').'[^\-]+');
//$fileparams_1 = dol_most_recent_file_1($diroutput .'/'.get_exdir($object->id, 2, 0, 0, $object, $object->element).$ref, preg_quote($ref, '/').'([^\-])+');
//$fileparams_2 = dol_most_recent_file_2($diroutput .'/'.get_exdir($object->id, 2, 0, 0, $object, $object->element).$ref, preg_quote($ref, '/').'([^\-])+');
}
// Special case facture
if ($object->element == 'facture')
{
$fileparams = dol_most_recent_file($diroutput.'/'.get_exdir($object->id, 2, 0, 0, $object, $object->element).$ref, preg_quote($ref, '/').'([^\-])+');
} else {
$fileparams = dol_most_recent_file($diroutput.'/'.$ref, preg_quote($ref, '/').'[^\-]+');
}
// Special case presupuesto
if ($object->element == 'propal')
{
$fileparams = dol_most_recent_file($diroutput.'/'.get_exdir($object->id, 2, 0, 0, $object, $object->element).$ref, preg_quote($ref, '/').'([^\-])+');
$fileparams_1 = dol_most_recent_file_1($diroutput .'/'.$ref, preg_quote($ref, '/').'[^\-]+');
$fileparams_2 = dol_most_recent_file_2($diroutput .'/'.$ref, preg_quote($ref, '/').'[^\-]+');
} else {
$fileparams = dol_most_recent_file($diroutput.'/'.$ref, preg_quote($ref, '/').'[^\-]+');
}
$file = $fileparams['fullname'];
$file_1 = $fileparams_1['fullname'];
$file_2 = $fileparams_2['fullname'];
}
Código: Seleccionar todo
$formmail->param['fileinit_1'] = array($file_1);
$formmail->param['fileinit_2'] = array($file_2);
En el apartado << Add a file into the list of attached files (stored in SECTION array)>> que comienza en la línea 215 añado la siguiente función, aunque uso la original (public function add_attached_files) que es igual por lo que esta sobraría (creo)
Código: Seleccionar todo
public function add_attached_files_1($path, $file='', $type='')
{
$listofpaths=array();
$listofnames=array();
$listofmimes=array();
if (empty($file)) $file=basename($path);
if (empty($type)) $type=dol_mimetype($file);
$keytoavoidconflict = empty($this->trackid)?'':'-'.$this->trackid; // this->trackid must be defined
if (! empty($_SESSION["listofpaths".$keytoavoidconflict])) $listofpaths=explode(';',$_SESSION["listofpaths".$keytoavoidconflict]);
if (! empty($_SESSION["listofnames".$keytoavoidconflict])) $listofnames=explode(';',$_SESSION["listofnames".$keytoavoidconflict]);
if (! empty($_SESSION["listofmimes".$keytoavoidconflict])) $listofmimes=explode(';',$_SESSION["listofmimes".$keytoavoidconflict]);
if (! in_array($file,$listofnames))
{
$listofpaths[]=$path;
$listofnames[]=$file;
$listofmimes[]=$type;
$_SESSION["listofpaths".$keytoavoidconflict]=join(';',$listofpaths);
$_SESSION["listofnames".$keytoavoidconflict]=join(';',$listofnames);
$_SESSION["listofmimes".$keytoavoidconflict]=join(';',$listofmimes);
}
}
Código: Seleccionar todo
if (GETPOST('mode', 'alpha') == 'init' || (GETPOST('modelmailselected', 'alpha') && GETPOST('modelmailselected', 'alpha') != '-1'))
{
if (!empty($arraydefaultmessage->joinfiles) && is_array($this->param['fileinit']))
{
foreach ($this->param['fileinit'] as $file)
{
$this->add_attached_files($file, basename($file), dol_mimetype($file));
}
foreach($this->param['fileinit_1'] as $file_1 )
{
if (!empty($file_1)){
$this->add_attached_files($file_1, basename($file_1), dol_mimetype($file_1));
}
}
foreach($this->param['fileinit_2'] as $file_2 )
{
if (!empty($file_2)){
$this->add_attached_files($file_2, basename($file_2), dol_mimetype($file_2));
}
}
}
}
• El archivo empiece por la referencia del presupuesto seguido de un guion bajo (_) “PR2103-0003_SPECIMEN(6).pdf”
• El archivo termine por la referencia del presupuesto “informePR2103-0003.pdf”
• Por supuesto si el nombre del archivo es la referencia “PR2103-0003.pdf”
Sin embargo cuando el archivo tiene la referencia seguido de un guion medio (-) y otro texto no funciona.
Mi intención es adjuntar junto al presupuesto sólo un archivo que contenga un texto determinado como “informe” he visto en el código que hay un parámetro llamado $regexfilter = ' ' que creo que serviría, pero no encuentro documentación para utilizarlo.
Cualquier ayuda sería de agradecer.
Un saludo