NEW lazy load to substitute project variables (#26451)

* NEW lazy load to substitute project variables

* FIX load class file

* Keep key to substitute if no link with project
This commit is contained in:
lvessiller-opendsi
2023-11-08 17:30:51 +01:00
committed by GitHub
parent 00cbaa094c
commit 2ff8ddb4fa
2 changed files with 102 additions and 8 deletions

View File

@@ -8252,15 +8252,30 @@ function getCommonSubstitutionArray($outputlangs, $onlykey = 0, $exclude = null,
$substitutionarray['__ATTENDEE_LASTNAME__'] = isset($object->lastname) ? $object->lastname : '';
}
$project = null;
if (is_object($object->project)) {
$substitutionarray['__PROJECT_ID__'] = (is_object($object->project) ? $object->project->id : '');
$substitutionarray['__PROJECT_REF__'] = (is_object($object->project) ? $object->project->ref : '');
$substitutionarray['__PROJECT_NAME__'] = (is_object($object->project) ? $object->project->title : '');
$project = $object->project;
} elseif (is_object($object->projet)) { // Deprecated, for backward compatibility
$project = $object->projet;
}
if (is_object($object->projet)) { // Deprecated, for backward compatibility
$substitutionarray['__PROJECT_ID__'] = (is_object($object->projet) ? $object->projet->id : '');
$substitutionarray['__PROJECT_REF__'] = (is_object($object->projet) ? $object->projet->ref : '');
$substitutionarray['__PROJECT_NAME__'] = (is_object($object->projet) ? $object->projet->title : '');
if ($project) {
$substitutionarray['__PROJECT_ID__'] = $project->id;
$substitutionarray['__PROJECT_REF__'] = $project->ref;
$substitutionarray['__PROJECT_NAME__'] = $project->title;
} else {
// can substitute variables for project : uses lazy load in "make_substitutions" method
$project_id = 0;
if ($object->fk_project > 0) {
$project_id = $object->fk_project;
} elseif ($object->fk_projet > 0) {
$project_id = $object->fk_project;
}
if ($project_id > 0) {
// path:class:method:id
$substitutionarray['__PROJECT_ID__@lazyload'] = '/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
$substitutionarray['__PROJECT_REF__@lazyload'] = '/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
$substitutionarray['__PROJECT_NAME__@lazyload'] = '/projet/class/project.class.php:Project:fetchAndSetSubstitution:' . $project_id;
}
}
if (is_object($object) && $object->element == 'project') {
$substitutionarray['__PROJECT_NAME__'] = $object->title;
@@ -8580,7 +8595,7 @@ function getCommonSubstitutionArray($outputlangs, $onlykey = 0, $exclude = null,
*/
function make_substitutions($text, $substitutionarray, $outputlangs = null, $converttextinhtmlifnecessary = 0)
{
global $conf, $langs;
global $conf, $db, $langs;
if (!is_array($substitutionarray)) {
return 'ErrorBadParameterSubstitutionArrayWhenCalling_make_substitutions';
@@ -8698,6 +8713,53 @@ function make_substitutions($text, $substitutionarray, $outputlangs = null, $con
$valuetouseforsubstitution = $tmpobj->$method($id, '__XXX__');
And make the replacement of "__XXX__@lazyload" with $valuetouseforsubstitution
*/
$memory_object_list = array();
foreach ($substitutionarray as $key => $value) {
$lazy_load_arr = array();
if (preg_match('/(__[A-Z\_]+__)@lazyload$/', $key, $lazy_load_arr)) {
if (isset($lazy_load_arr[1]) && !empty($lazy_load_arr[1])) {
$key_to_substitute = $lazy_load_arr[1];
if (preg_match('/' . preg_quote($key_to_substitute, '/') . '/', $text)) {
$param_arr = explode(':', $value);
// path:class:method:id
if (count($param_arr) == 4) {
$path = $param_arr[0];
$class = $param_arr[1];
$method = $param_arr[2];
$id = (int) $param_arr[3];
// load class file and init object list in memory
if (!isset($memory_object_list[$class])) {
if (dol_is_file(DOL_DOCUMENT_ROOT . $path)) {
require_once DOL_DOCUMENT_ROOT . $path;
if (class_exists($class)) {
$memory_object_list[$class] = array(
'list' => array(),
);
}
}
}
// fetch object and set substitution
if (isset($memory_object_list[$class]) && isset($memory_object_list[$class]['list'])) {
if (method_exists($class, $method)) {
if (!isset($memory_object_list[$class]['list'][$id])) {
$tmpobj = new $class($db);
$valuetouseforsubstitution = $tmpobj->$method($id, $key_to_substitute);
$memory_object_list[$class]['list'][$id] = $tmpobj;
} else {
$tmpobj = $memory_object_list[$class]['list'][$id];
$valuetouseforsubstitution = $tmpobj->$method($id, $key_to_substitute, true);
}
$text = str_replace("$key_to_substitute", "$valuetouseforsubstitution", $text); // We must keep the " to work when value is 123.5 for example
}
}
}
}
}
}
}
return $text;
}

View File

@@ -776,6 +776,38 @@ class Project extends CommonObject
}
}
/**
* Fetch object and substitute key
*
* @param int $id Project id
* @param string $key Key to substitute
* @param bool $fetched [=false] Not already fetched
* @return string Substitute key
*/
public function fetchAndSetSubstitution($id, $key, $fetched = false)
{
$substitution = '';
if ($fetched === false) {
$res = $this->fetch($id);
if ($res > 0) {
$fetched = true;
}
}
if ($fetched === true) {
if ($key == '__PROJECT_ID__') {
$substitution = ($this->id > 0 ? $this->id : '');
} elseif ($key == '__PROJECT_REF__') {
$substitution = $this->ref;
} elseif ($key == '__PROJECT_NAME__') {
$substitution = $this->title;
}
}
return $substitution;
}
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
/**
* Return list of elements for type, linked to a project