Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 19 additions & 6 deletions src/Glpi/Search/Provider/SQLProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -610,11 +610,15 @@ public static function getSelectCriteria(string $itemtype, int $ID, bool $meta =
$SELECT[] = $TRANS;
}
return array_merge($SELECT, $ADDITONALFIELDS);
}
return array_merge([
};
$SELECT = [
$tocompute . ' AS ' . $DB::quoteName($NAME),
$DB::quoteName("{$table}{$addtable}.id AS {$NAME}_id"),
], $ADDITONALFIELDS);
];
if (Session::haveTranslations($opt_itemtype, $field)) {
$SELECT[] = "$tocomputetrans AS " . $DB::quoteName("{$NAME}_trans_{$field}");
}
return array_merge($SELECT, $ADDITONALFIELDS);
}
}

Expand Down Expand Up @@ -5659,16 +5663,25 @@ public static function giveItem(
}
break;
case $table . ".completename":
$completename = !empty($data[$ID][0]['trans_completename'])
? $data[$ID][0]['trans_completename']
: $data[$ID][0]['name'];

if (empty($completename)) {
return '';
}

$completename = (new SanitizedStringsDecoder())->decodeHtmlSpecialCharsInCompletename($completename);

if (
$itemtype != $opt_itemtype
&& $data[$ID][0]['name'] != null //column have value in DB
&& !$_SESSION['glpiuse_flat_dropdowntree_on_search_result'] //user doesn't want the completename
) {
$completename = (new SanitizedStringsDecoder())->decodeHtmlSpecialCharsInCompletename($data[$ID][0]['name']);
$split_name = explode(">", $completename);
return htmlescape(trim(end($split_name)));
}
break;

return htmlescape($completename);

case "glpi_documenttypes.icon":
if (!empty($data[$ID][0]['name'])) {
Expand Down
166 changes: 165 additions & 1 deletion tests/functional/SearchTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,13 +43,16 @@
use DbTestCase;
use Document;
use Document_Item;
use DropdownTranslation;
use Entity;
use Glpi\Asset\Capacity;
use Glpi\Asset\Capacity\HasDocumentsCapacity;
use Glpi\DBAL\QueryExpression;
use Group_User;
use Location;
use PHPUnit\Framework\Attributes\DataProvider;
use Psr\Log\LogLevel;
use TaskCategory;
use Ticket;
use User;

Expand Down Expand Up @@ -2447,7 +2450,7 @@ public function testSearchDdTranslation()
]);
$this->assertGreaterThan(0, $sid);

$ddtrans = new \DropdownTranslation();
$ddtrans = new DropdownTranslation();
$this->assertGreaterThan(
0,
$ddtrans->add([
Expand Down Expand Up @@ -6163,6 +6166,167 @@ public function testExternalRequesterColumnRenderingInSearchResults(): void
$result['data']['rows'][0]['Ticket_4']['displayname']
);
}

/**
* Validate that dropdown complete names are correctly rendered.
*/
public function testCompletenameColumnRenderingInSearchResults(): void
{
$this->login();

$this->createItem(
TaskCategory::class,
[
'name' => 'subcat with <&> chars',
'taskcategories_id' => \getItemByTypeName(TaskCategory::class, '_cat_1', true),
'entities_id' => $this->getTestRootEntity(true),
]
);

// Test with default lang
$result = \Search::getDatas(
TaskCategory::class,
[
'criteria' => [
[
'field' => '1',
'searchtype' => 'contains',
'value' => '_cat_1',
],
],
]
);

$expected = [
'_cat_1',
'_cat_1 &gt; _subcat_1',
'_cat_1 &gt; R&amp;D',
'_cat_1 &gt; subcat with &lt;&amp;&gt; chars',
];

foreach ($expected as $key => $displayname) {
$this->assertTrue(isset($result['data']['rows'][$key]['TaskCategory_1']['displayname']));
$this->assertEquals($displayname, $result['data']['rows'][$key]['TaskCategory_1']['displayname']);
}

// Test with fr_FR
$_SESSION['glpilanguage'] = 'fr_FR';
$_SESSION['glpi_dropdowntranslations'] = DropdownTranslation::getAvailableTranslations('fr_FR');

$result = \Search::getDatas(
TaskCategory::class,
[
'criteria' => [
[
'field' => '1',
'searchtype' => 'contains',
'value' => '_cat_1',
],
],
]
);

$expected = [
'FR - _cat_1',
'FR - _cat_1 &gt; FR - _subcat_1',
'FR - _cat_1 &gt; R&amp;D',
];

foreach ($expected as $key => $displayname) {
$this->assertTrue(isset($result['data']['rows'][$key]['TaskCategory_1']['displayname']));
$this->assertEquals($displayname, $result['data']['rows'][$key]['TaskCategory_1']['displayname']);
}
}


/**
* Validate that dropdown complete names are correctly translated.
*/
public function testCompletenameColumnTranslationsInSearchResults(): void
{
$this->login();

$_SESSION['glpilanguage'] = 'fr_FR';
$_SESSION['glpi_dropdowntranslations'] = DropdownTranslation::getAvailableTranslations('fr_FR');

$result = \Search::getDatas(
TaskCategory::class,
[
'criteria' => [
[
'field' => '1',
'searchtype' => 'contains',
'value' => '_cat_1',
],
],
]
);

$expected = [
'FR - _cat_1',
'FR - _cat_1 &gt; FR - _subcat_1',
'FR - _cat_1 &gt; R&amp;D',
];

foreach ($expected as $key => $displayname) {
$this->assertTrue(isset($result['data']['rows'][$key]['TaskCategory_1']['displayname']));
$this->assertEquals($displayname, $result['data']['rows'][$key]['TaskCategory_1']['displayname']);
}
}


/**
* Validate that `use_flat_dropdowntree_on_search_result` is correctly applied.
*/
public function testLinkedItemCompletenameColumnRenderingInSearchResults(): void
{
$this->login();

$this->createItem(
Computer::class,
[
'name' => __FUNCTION__,
'locations_id' => \getItemByTypeName(Location::class, '_location02 > _sublocation04', true),
'entities_id' => $this->getTestRootEntity(true),
]
);

// Test with `use_flat_dropdowntree_on_search_result=1`
$_SESSION['glpiuse_flat_dropdowntree_on_search_result'] = 1;
$result = \Search::getDatas(
Computer::class,
[
'criteria' => [
[
'field' => '1',
'searchtype' => 'contains',
'value' => __FUNCTION__,
],
],
]
);

$this->assertTrue(isset($result['data']['rows'][0]['Computer_3']['displayname']));
$this->assertEquals('_location02 &gt; _sublocation04', $result['data']['rows'][0]['Computer_3']['displayname']);

// Test with `use_flat_dropdowntree_on_search_result=0`
$_SESSION['glpiuse_flat_dropdowntree_on_search_result'] = 0;
$result = \Search::getDatas(
Computer::class,
[
'criteria' => [
[
'field' => '1',
'searchtype' => 'contains',
'value' => __FUNCTION__,
],
],
]
);

$this->assertTrue(isset($result['data']['rows'][0]['Computer_3']['displayname']));
$this->assertEquals('_sublocation04', $result['data']['rows'][0]['Computer_3']['displayname']);
}
}

// @codingStandardsIgnoreStart
Expand Down
Loading