Note:

If you want to create a new page for developers, you should create it on the Moodle Developer Resource site.

Do we need named parameters: Difference between revisions

From MoodleDocs
No edit summary
(Note about plan not to migrate this page to the new developer resources. See template for more info.)
 
(2 intermediate revisions by one other user not shown)
Line 1: Line 1:
{{Template:WillNotMigrate}}
Many Moodle functions end up to have 4 or (a lot) more parameters. It could be good to study if we could group most of these parameters into an object. Following a refactor of datalib.php/get_users()
Many Moodle functions end up to have 4 or (a lot) more parameters. It could be good to study if we could group most of these parameters into an object. Following a refactor of datalib.php/get_users()


<code php>
<syntaxhighlight lang="php">
//named parameters function call
//named parameters function call
$parameters = new object();
$parameters = new object();
Line 152: Line 153:




</code>
</syntaxhighlight>

Latest revision as of 13:41, 24 June 2022


Warning: This page is no longer in use. The information contained on the page should NOT be seen as relevant or reliable.


Many Moodle functions end up to have 4 or (a lot) more parameters. It could be good to study if we could group most of these parameters into an object. Following a refactor of datalib.php/get_users()

//named parameters function call
$parameters = new object();
$parameters->search = 'arthur';
namedparams_get_users($parameters, 'firstname ASC', '', $fields='id, username');

//current function call
get_users(true, 'arthur', false, null, 'firstname ASC', '', '', '', '', 'id, username');

/**
 * Returns a subset of users (DO NOT COUNT)
 * @global object $DB
 * @param string $sort A SQL snippet for the sorting criteria to use
 * @param string $recordsperpage how many records do pages have
 * @param string $page which page to return (starts from 0)
 * @param string $fields A comma separated list of fields to be returned from the chosen table.
 * @param object $selectioncriteria:
 *      ->search         string     A simple string to search for
 *      ->confirmed      bool       A switch to allow/disallow unconfirmed users
 *      ->exceptions     array(int) A list of IDs to ignore, eg 2,4,5,8,9,10
 *      ->firstinitial   string     ?
 *      ->lastinitial    string     ?
 * @return array|false Array of {@link $USER} objects. False is returned if an error is encountered.
 */
function namedparams_get_users($sort='firstname ASC', $recordsperpage=999999, $page=0, $fields='*', $selectioncriteria=NULL) {
    global $DB;

    if (empty($selectioncriteria->recordsperpage)){
        $selectioncriteria->recordsperpage='';
    }

    $LIKE      = $DB->sql_ilike();
    $fullname  = $DB->sql_fullname();

    $select = " username <> :guest AND deleted = 0";
    $params = array('guest'=>'guest');

    if (!empty($selectioncriteria->search)){
        $selectioncriteria->search = trim($selectioncriteria->search);
        $select .= " AND ($fullname $LIKE :search1 OR email $LIKE :search2 OR username = :search3)";
        $params['search1'] = "%".$selectioncriteria->search."%";
        $params['search2'] = "%".$selectioncriteria->search."%";
        $params['search3'] = $selectioncriteria->search;
    }

    if (!empty($selectioncriteria->confirmed)) {
        $select .= " AND confirmed = 1";
    }

    if (!empty($selectioncriteria->exceptions)) {
        list($selectioncriteria->exceptions, $eparams) = $DB->get_in_or_equal($selectioncriteria->exceptions, SQL_PARAMS_NAMED, 'ex0000', false);
        $params = $params + $eparams;
        $except = " AND id ".$selectioncriteria->exceptions;
    }

    if (!empty($selectioncriteria->firstinitial)) {
        $select .= " AND firstname $LIKE :fni";
        $params['fni'] = $selectioncriteria->firstinitial."%";
    }
    if (!empty($selectioncriteria->lastinitial)) {
        $select .= " AND lastname $LIKE :lni";
        $params['lni'] = $selectioncriteria->lastinitial."%";
    }

    if (!empty($selectioncriteria->extraselect)) {
        $select .= " AND ".$selectioncriteria->extraselect;
        if (empty($selectioncriteria->extraparams)){
            $params = $params + (array)$selectioncriteria->extraparams;
        }
    }

    return $DB->get_records_select('user', $select, $params, $sort, $fields, $page, $selectioncriteria->recordsperpage);
}

/**
 * Returns a subset of users
 *
 * @uses $CFG
 * @param bool $get If false then only a count of the records is returned
 * @param string $search A simple string to search for
 * @param bool $confirmed A switch to allow/disallow unconfirmed users
 * @param array(int) $exceptions A list of IDs to ignore, eg 2,4,5,8,9,10
 * @param string $sort A SQL snippet for the sorting criteria to use
 * @param string $firstinitial ?
 * @param string $lastinitial ?
 * @param string $page ?
 * @param string $recordsperpage ?
 * @param string $fields A comma separated list of fields to be returned from the chosen table.
 * @return object|false|int  {@link $USER} records unless get is false in which case the integer count of the records found is returned. False is returned if an error is encountered.
 */
function get_users($get=true, $search='', $confirmed=false, array $exceptions=null, $sort='firstname ASC',
                   $firstinitial='', $lastinitial='', $page='', $recordsperpage='', $fields='*', $extraselect='', array $extraparams=null) {
    global $DB;

    if ($get && !$recordsperpage) {
        debugging('Call to get_users with $get = true no $recordsperpage limit. ' .
                'On large installations, this will probably cause an out of memory error. ' .
                'Please think again and change your code so that it does not try to ' .
                'load so much data into memory.', DEBUG_DEVELOPER);
    }

    $LIKE      = $DB->sql_ilike();
    $fullname  = $DB->sql_fullname();

    $select = " username <> :guest AND deleted = 0";
    $params = array('guest'=>'guest');

    if (!empty($search)){
        $search = trim($search);
        $select .= " AND ($fullname $LIKE :search1 OR email $LIKE :search2 OR username = :search3)";
        $params['search1'] = "%$search%";
        $params['search2'] = "%$search%";
        $params['search3'] = "$search";
    }

    if ($confirmed) {
        $select .= " AND confirmed = 1";
    }

    if ($exceptions) {
        list($exceptions, $eparams) = $DB->get_in_or_equal($exceptions, SQL_PARAMS_NAMED, 'ex0000', false);
        $params = $params + $eparams;
        $except = " AND id $exceptions";
    }

    if ($firstinitial) {
        $select .= " AND firstname $LIKE :fni";
        $params['fni'] = "$firstinitial%";
    }
    if ($lastinitial) {
        $select .= " AND lastname $LIKE :lni";
        $params['lni'] = "$lastinitial%";
    }

    if ($extraselect) {
        $select .= " AND $extraselect";
        $params = $params + (array)$extraparams;
    }

    if ($get) {
        return $DB->get_records_select('user', $select, $params, $sort, $fields, $page, $recordsperpage);
    } else {
        return $DB->count_records_select('user', $select, $params);
    }
}