Merge branch 'MDL-74500' of https://github.com/paulholden/moodle
This commit is contained in:
@@ -333,7 +333,7 @@ function core_myprofile_navigation(core_user\output\myprofile\tree $tree, $user,
|
||||
$categories = profile_get_user_fields_with_data_by_category($user->id);
|
||||
foreach ($categories as $categoryid => $fields) {
|
||||
foreach ($fields as $formfield) {
|
||||
if ($formfield->is_visible() and !$formfield->is_empty()) {
|
||||
if ($formfield->show_field_content()) {
|
||||
$node = new core_user\output\myprofile\node('contact', 'custom_field_' . $formfield->field->shortname,
|
||||
format_string($formfield->field->name), null, null, $formfield->display_data());
|
||||
$tree->add_node($node);
|
||||
|
||||
+1
-2
@@ -406,8 +406,7 @@ function user_get_user_details($user, $course = null, array $userfields = array(
|
||||
$userdetails['customfields'] = array();
|
||||
foreach ($categories as $categoryid => $fields) {
|
||||
foreach ($fields as $formfield) {
|
||||
if ($formfield->is_visible() and !$formfield->is_empty()) {
|
||||
|
||||
if ($formfield->show_field_content()) {
|
||||
$userdetails['customfields'][] = [
|
||||
'name' => $formfield->field->name,
|
||||
'value' => $formfield->data,
|
||||
|
||||
@@ -39,6 +39,31 @@ class profile_field_checkbox extends profile_field_base {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Override parent {@see profile_field_base::is_empty} check
|
||||
*
|
||||
* We can't check the "data" property, because if not set by the user then it's populated by "defaultdata" of the field,
|
||||
* which can also be 0 (false) therefore ensuring the parent class check could never return true for this comparison
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function is_empty() {
|
||||
return ($this->userid && !$this->field->hasuserdata);
|
||||
}
|
||||
|
||||
/**
|
||||
* Override parent {@see profile_field_base::show_field_content} check
|
||||
*
|
||||
* We only need to determine whether the field is visible, because we also want to show the "defaultdata" of the field,
|
||||
* even if the user hasn't explicitly filled it in
|
||||
*
|
||||
* @param context|null $context
|
||||
* @return bool
|
||||
*/
|
||||
public function show_field_content(?context $context = null): bool {
|
||||
return $this->is_visible($context);
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the data for this field
|
||||
*
|
||||
|
||||
@@ -0,0 +1,122 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
namespace profilefield_checkbox;
|
||||
|
||||
use advanced_testcase;
|
||||
use profile_field_checkbox;
|
||||
|
||||
/**
|
||||
* Unit tests for the field class
|
||||
*
|
||||
* @package profilefield_checkbox
|
||||
* @covers \profile_field_checkbox
|
||||
* @copyright 2024 Paul Holden <[email protected]>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class profile_field_checkbox_test extends advanced_testcase {
|
||||
|
||||
/**
|
||||
* Load required test libraries
|
||||
*/
|
||||
public static function setUpBeforeClass(): void {
|
||||
global $CFG;
|
||||
require_once("{$CFG->dirroot}/user/profile/lib.php");
|
||||
}
|
||||
|
||||
/**
|
||||
* Data provider for {@see test_is_empty}
|
||||
*
|
||||
* @return array[]
|
||||
*/
|
||||
public static function is_empty_provider(): array {
|
||||
return [
|
||||
'No value' => [
|
||||
[],
|
||||
true,
|
||||
],
|
||||
'Value equals 0' => [
|
||||
['profile_field_check' => 0],
|
||||
false,
|
||||
],
|
||||
'Value equals 1' => [
|
||||
['profile_field_check' => 1],
|
||||
false,
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Test field empty state
|
||||
*
|
||||
* @param array $userrecord
|
||||
* @param bool $expected
|
||||
*
|
||||
* @dataProvider is_empty_provider
|
||||
*/
|
||||
public function test_is_empty(array $userrecord, bool $expected): void {
|
||||
$this->resetAfterTest();
|
||||
|
||||
$this->getDataGenerator()->create_custom_profile_field([
|
||||
'datatype' => 'checkbox',
|
||||
'name' => 'My check',
|
||||
'shortname' => 'check',
|
||||
]);
|
||||
|
||||
$user = $this->getDataGenerator()->create_user($userrecord);
|
||||
|
||||
/** @var profile_field_checkbox[] $fields */
|
||||
$fields = profile_get_user_fields_with_data($user->id);
|
||||
$fieldinstance = reset($fields);
|
||||
|
||||
$this->assertEquals($expected, $fieldinstance->is_empty());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test whether to show field content
|
||||
*/
|
||||
public function test_show_field_content(): void {
|
||||
$this->resetAfterTest();
|
||||
|
||||
$this->getDataGenerator()->create_custom_profile_field([
|
||||
'datatype' => 'checkbox',
|
||||
'name' => 'My check',
|
||||
'shortname' => 'check',
|
||||
'visible' => PROFILE_VISIBLE_PRIVATE,
|
||||
]);
|
||||
|
||||
// User can view their own value.
|
||||
$userwith = $this->getDataGenerator()->create_user(['profile_field_check' => 1]);
|
||||
$this->setUser($userwith);
|
||||
|
||||
/** @var profile_field_checkbox[] $fields */
|
||||
$fields = profile_get_user_fields_with_data($userwith->id);
|
||||
$fieldinstance = reset($fields);
|
||||
|
||||
$this->assertTrue($fieldinstance->show_field_content());
|
||||
|
||||
// Another user cannot view the value.
|
||||
$userview = $this->getDataGenerator()->create_user();
|
||||
$this->setUser($userview);
|
||||
|
||||
$this->assertFalse($fieldinstance->show_field_content());
|
||||
|
||||
// Another user with appropriate access can view the value.
|
||||
$this->setAdminUser();
|
||||
$this->assertTrue($fieldinstance->show_field_content());
|
||||
|
||||
}
|
||||
}
|
||||
@@ -587,6 +587,16 @@ class profile_field_base {
|
||||
return array(PARAM_RAW, NULL_NOT_ALLOWED);
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether to display the field and content to the user
|
||||
*
|
||||
* @param context|null $context
|
||||
* @return bool
|
||||
*/
|
||||
public function show_field_content(?context $context = null): bool {
|
||||
return $this->is_visible($context) && !$this->is_empty();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the field should convert the raw data into user-friendly data when exporting
|
||||
*
|
||||
|
||||
@@ -1,5 +1,10 @@
|
||||
This files describes API changes for code that uses the user API.
|
||||
|
||||
=== 4.4 ===
|
||||
|
||||
* The `profile_field_base` class now contains a `show_field_content` method to determine whether the field and
|
||||
content should be shown to the user. Can be overridden in child classes as required
|
||||
|
||||
=== 4.3 ===
|
||||
|
||||
* Added new methods:
|
||||
|
||||
Reference in New Issue
Block a user