elabftw/elabftw

View on GitHub
web/search.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

/**
 * @author Nicolas CARPi <nico-git@deltablot.email>
 * @copyright 2012 Nicolas CARPi
 * @see https://www.elabftw.net Official website
 * @license AGPL-3.0
 * @package elabftw
 */

declare(strict_types=1);

namespace Elabftw\Elabftw;

use Elabftw\Controllers\DatabaseController;
use Elabftw\Controllers\ExperimentsController;
use Elabftw\Exceptions\ImproperActionException;
use Elabftw\Models\Experiments;
use Elabftw\Models\ExperimentsCategories;
use Elabftw\Models\ExperimentsStatus;
use Elabftw\Models\ExtraFieldsKeys;
use Elabftw\Models\Items;
use Elabftw\Models\ItemsStatus;
use Elabftw\Models\ItemsTypes;
use Elabftw\Models\TeamGroups;
use Elabftw\Models\Teams;
use Elabftw\Models\TeamTags;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Response;

/**
 * The search page
 * Here be dragons!
 */
require_once 'app/init.inc.php';
$App->pageTitle = _('Advanced search');

// default response is search page without results
$Response = new Response();
$Response->prepare($App->Request);

$Teams = new Teams($App->Users, $App->Users->team);
$TeamTags = new TeamTags($App->Users, $App->Users->userData['team']);

$ExperimentsCategories = new ExperimentsCategories($Teams);
$ExperimentsStatus = new ExperimentsStatus($Teams);
$ItemsTypes = new ItemsTypes($App->Users);
$ItemsStatus = new ItemsStatus($Teams);
$ExtraFieldsKeys = new ExtraFieldsKeys($App->Users, '', -1);

// TEAM GROUPS
$TeamGroups = new TeamGroups($App->Users);
$teamGroupsArr = $TeamGroups->readGroupsWithUsersFromUser();
$PermissionsHelper = new PermissionsHelper();

$usersArr = $App->Users->readAllFromTeam();

// RENDER THE FIRST PART OF THE PAGE (search form)
$renderArr = array(
    'Request' => $App->Request,
    'experimentsCategoriesArr' => $ExperimentsCategories->readAll(),
    'experimentsStatusArr' => $ExperimentsStatus->readAll(),
    'itemsTypesArr' => $ItemsTypes->readAll(),
    'itemsStatusArr' => $ItemsStatus->readAll(),
    'tagsArr' => $TeamTags->readFull(),
    'usersArr' => $usersArr,
    'visibilityArr' => $PermissionsHelper->getAssociativeArray(),
    'teamGroups' => array_column($teamGroupsArr, 'name'),
    'metakeyArrForSelect' => array_column($ExtraFieldsKeys->readAll(), 'extra_fields_key'),
);

$responseContent = $App->render('search.html', $renderArr);

$getFooterContent = fn(): string
    => $App->render('todolist-panel.html', array())
    . $App->render('footer.html', array());

/**
 * Here the search begins
 * If there is a search, there will be get parameters, so this is our main switch
 */
if ($App->Request->query->count() > 0) {
    try {
        // WHERE do we search?
        if ($App->Request->query->get('type') === 'experiments') {
            $Controller = new ExperimentsController($App, new Experiments($App->Users));
        } else {
            $Controller = new DatabaseController($App, new Items($App->Users));
        }

        $controllerResponse = $Controller->show(true);
        if ($controllerResponse instanceof RedirectResponse) {
            $controllerResponse->send();
            exit;
        }
        $responseContent .= $controllerResponse->getContent() ?: '';
    } catch (ImproperActionException $e) {
        $responseContent .= TwigFilters::displayMessage($e->getMessage(), 'ko', false);
        $responseContent .= $getFooterContent();
    }
} else {
    // no search
    $responseContent .= $getFooterContent();
}

$Response->setContent($responseContent);
$Response->send();