Merge branch 'MDL-63427-master' of git://github.com/mihailges/moodle
authorEloy Lafuente (stronk7) <stronk7@moodle.org>
Tue, 9 Oct 2018 11:21:11 +0000 (13:21 +0200)
committerEloy Lafuente (stronk7) <stronk7@moodle.org>
Tue, 9 Oct 2018 11:21:11 +0000 (13:21 +0200)
blocks/myprofile/block_myprofile.php
blocks/myprofile/classes/output/myprofile.php [new file with mode: 0644]
blocks/myprofile/classes/output/renderer.php [new file with mode: 0644]
blocks/myprofile/styles.css
blocks/myprofile/templates/myprofile.mustache [new file with mode: 0644]

index b596f15..4b9013f 100644 (file)
@@ -41,7 +41,7 @@ class block_myprofile extends block_base {
      * block initializations
      */
     public function init() {
-        $this->title   = get_string('pluginname', 'block_myprofile');
+        $this->title = get_string('pluginname', 'block_myprofile');
     }
 
     /**
@@ -50,128 +50,22 @@ class block_myprofile extends block_base {
      * @return object
      */
     public function get_content() {
-        global $CFG, $USER, $DB, $OUTPUT, $PAGE;
 
         if ($this->content !== NULL) {
             return $this->content;
         }
 
         if (!isloggedin() or isguestuser()) {
-            return '';      // Never useful unless you are logged in as real users
+            // Only real users can access myprofile block.
+            return;
         }
 
-        $this->content = new stdClass;
-        $this->content->text = '';
-        $this->content->footer = '';
-
-        $course = $this->page->course;
-
-        if (!isset($this->config->display_picture) || $this->config->display_picture == 1) {
-            $this->content->text .= '<div class="myprofileitem picture">';
-            $this->content->text .= $OUTPUT->user_picture($USER, array('courseid'=>$course->id, 'size'=>'100', 'class'=>'profilepicture'));  // The new class makes CSS easier
-            $this->content->text .= '</div>';
-        }
-
-        $this->content->text .= '<div class="myprofileitem fullname">'.fullname($USER).'</div>';
-
-        if(!isset($this->config->display_country) || $this->config->display_country == 1) {
-            $countries = get_string_manager()->get_list_of_countries(true);
-            if (isset($countries[$USER->country])) {
-                $this->content->text .= '<div class="myprofileitem country">';
-                $this->content->text .= get_string('country') . ': ' . $countries[$USER->country];
-                $this->content->text .= '</div>';
-            }
-        }
-
-        if(!isset($this->config->display_city) || $this->config->display_city == 1) {
-            $this->content->text .= '<div class="myprofileitem city">';
-            $this->content->text .= get_string('city') . ': ' . format_string($USER->city);
-            $this->content->text .= '</div>';
-        }
-
-        if(!isset($this->config->display_email) || $this->config->display_email == 1) {
-            $this->content->text .= '<div class="myprofileitem email">';
-            $this->content->text .= obfuscate_mailto($USER->email, '');
-            $this->content->text .= '</div>';
-        }
-
-        if(!empty($this->config->display_icq) && !empty($USER->icq)) {
-            $this->content->text .= '<div class="myprofileitem icq">';
-            $this->content->text .= 'ICQ: ' . s($USER->icq);
-            $this->content->text .= '</div>';
-        }
-
-        if(!empty($this->config->display_skype) && !empty($USER->skype)) {
-            $this->content->text .= '<div class="myprofileitem skype">';
-            $this->content->text .= 'Skype: ' . s($USER->skype);
-            $this->content->text .= '</div>';
-        }
-
-        if(!empty($this->config->display_yahoo) && !empty($USER->yahoo)) {
-            $this->content->text .= '<div class="myprofileitem yahoo">';
-            $this->content->text .= 'Yahoo: ' . s($USER->yahoo);
-            $this->content->text .= '</div>';
-        }
-
-        if(!empty($this->config->display_aim) && !empty($USER->aim)) {
-            $this->content->text .= '<div class="myprofileitem aim">';
-            $this->content->text .= 'AIM: ' . s($USER->aim);
-            $this->content->text .= '</div>';
-        }
+        $renderable = new \block_myprofile\output\myprofile($this->config);
+        $renderer = $this->page->get_renderer('block_myprofile');
 
-        if(!empty($this->config->display_msn) && !empty($USER->msn)) {
-            $this->content->text .= '<div class="myprofileitem msn">';
-            $this->content->text .= 'MSN: ' . s($USER->msn);
-            $this->content->text .= '</div>';
-        }
-
-        if(!empty($this->config->display_phone1) && !empty($USER->phone1)) {
-            $this->content->text .= '<div class="myprofileitem phone1">';
-            $this->content->text .= get_string('phone1').': ' . s($USER->phone1);
-            $this->content->text .= '</div>';
-        }
-
-        if(!empty($this->config->display_phone2) && !empty($USER->phone2)) {
-            $this->content->text .= '<div class="myprofileitem phone2">';
-            $this->content->text .= get_string('phone2').': ' . s($USER->phone2);
-            $this->content->text .= '</div>';
-        }
-
-        if(!empty($this->config->display_institution) && !empty($USER->institution)) {
-            $this->content->text .= '<div class="myprofileitem institution">';
-            $this->content->text .= format_string($USER->institution);
-            $this->content->text .= '</div>';
-        }
-
-        if(!empty($this->config->display_address) && !empty($USER->address)) {
-            $this->content->text .= '<div class="myprofileitem address">';
-            $this->content->text .= format_string($USER->address);
-            $this->content->text .= '</div>';
-        }
-
-        if(!empty($this->config->display_firstaccess) && !empty($USER->firstaccess)) {
-            $this->content->text .= '<div class="myprofileitem firstaccess">';
-            $this->content->text .= get_string('firstaccess').': ' . userdate($USER->firstaccess);
-            $this->content->text .= '</div>';
-        }
-
-        if(!empty($this->config->display_lastaccess) && !empty($USER->lastaccess)) {
-            $this->content->text .= '<div class="myprofileitem lastaccess">';
-            $this->content->text .= get_string('lastaccess').': ' . userdate($USER->lastaccess);
-            $this->content->text .= '</div>';
-        }
-
-        if(!empty($this->config->display_currentlogin) && !empty($USER->currentlogin)) {
-            $this->content->text .= '<div class="myprofileitem currentlogin">';
-            $this->content->text .= get_string('login').': ' . userdate($USER->currentlogin);
-            $this->content->text .= '</div>';
-        }
-
-        if(!empty($this->config->display_lastip) && !empty($USER->lastip)) {
-            $this->content->text .= '<div class="myprofileitem lastip">';
-            $this->content->text .= 'IP: ' . $USER->lastip;
-            $this->content->text .= '</div>';
-        }
+        $this->content = new stdClass();
+        $this->content->text = $renderer->render($renderable);
+        $this->content->footer = '';
 
         return $this->content;
     }
diff --git a/blocks/myprofile/classes/output/myprofile.php b/blocks/myprofile/classes/output/myprofile.php
new file mode 100644 (file)
index 0000000..714c9d0
--- /dev/null
@@ -0,0 +1,141 @@
+<?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/>.
+
+/**
+ * Class containing data for myprofile block.
+ *
+ * @package    block_myprofile
+ * @copyright  2018 Mihail Geshoski <mihail@moodle.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+namespace block_myprofile\output;
+
+defined('MOODLE_INTERNAL') || die();
+
+use renderable;
+use renderer_base;
+use templatable;
+
+/**
+ * Class containing data for myprofile block.
+ *
+ * @copyright  2018 Mihail Geshoski <mihail@moodle.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class myprofile implements renderable, templatable {
+
+    /**
+     * @var object An object containing the configuration information for the current instance of this block.
+     */
+    protected $config;
+
+    /**
+     * Constructor.
+     *
+     * @param object $config An object containing the configuration information for the current instance of this block.
+     */
+    public function __construct($config) {
+        $this->config = $config;
+    }
+
+    /**
+     * Export this data so it can be used as the context for a mustache template.
+     *
+     * @param \renderer_base $output
+     * @return stdClass
+     */
+    public function export_for_template(renderer_base $output) {
+        global $USER, $OUTPUT;
+
+        $data = new \stdClass();
+
+        if (!isset($this->config->display_picture) || $this->config->display_picture == 1) {
+            $data->userpicture = $OUTPUT->user_picture($USER, array('class' => 'userpicture'));
+        }
+
+        $data->userfullname = fullname($USER);
+
+        if (!isset($this->config->display_country) || $this->config->display_country == 1) {
+            $countries = get_string_manager()->get_list_of_countries(true);
+            if (isset($countries[$USER->country])) {
+                $data->usercountry = $countries[$USER->country];
+            }
+        }
+
+        if (!isset($this->config->display_city) || $this->config->display_city == 1) {
+            $data->usercity = $USER->city;
+        }
+
+        if (!isset($this->config->display_email) || $this->config->display_email == 1) {
+            $data->useremail = obfuscate_mailto($USER->email, '');
+        }
+
+        if (!empty($this->config->display_icq) && !empty($USER->icq)) {
+            $data->usericq = s($USER->icq);
+        }
+
+        if (!empty($this->config->display_skype) && !empty($USER->skype)) {
+            $data->userskype = s($USER->skype);
+        }
+
+        if (!empty($this->config->display_yahoo) && !empty($USER->yahoo)) {
+            $data->useryahoo = s($USER->yahoo);
+        }
+
+        if (!empty($this->config->display_aim) && !empty($USER->aim)) {
+            $data->useraim = s($USER->aim);
+        }
+
+        if (!empty($this->config->display_msn) && !empty($USER->msn)) {
+            $data->usermsn = s($USER->msn);
+        }
+
+        if (!empty($this->config->display_phone1) && !empty($USER->phone1)) {
+            $data->userphone1 = s($USER->phone1);
+        }
+
+        if (!empty($this->config->display_phone2) && !empty($USER->phone2)) {
+            $data->userphone2 = s($USER->phone2);
+        }
+
+        if (!empty($this->config->display_institution) && !empty($USER->institution)) {
+            $data->userinstitution = format_string($USER->institution);
+        }
+
+        if (!empty($this->config->display_address) && !empty($USER->address)) {
+            $data->useraddress = format_string($USER->address);
+        }
+
+        if (!empty($this->config->display_firstaccess) && !empty($USER->firstaccess)) {
+            $data->userfirstaccess = userdate($USER->firstaccess);
+        }
+
+        if (!empty($this->config->display_lastaccess) && !empty($USER->lastaccess)) {
+            $data->userlastaccess = userdate($USER->lastaccess);
+        }
+
+        if (!empty($this->config->display_currentlogin) && !empty($USER->currentlogin)) {
+            $data->usercurrentlogin = userdate($USER->currentlogin);
+        }
+
+        if (!empty($this->config->display_lastip) && !empty($USER->lastip)) {
+            $data->userlastip = $USER->lastip;
+        }
+
+        return $data;
+    }
+}
diff --git a/blocks/myprofile/classes/output/renderer.php b/blocks/myprofile/classes/output/renderer.php
new file mode 100644 (file)
index 0000000..4d6ab1f
--- /dev/null
@@ -0,0 +1,49 @@
+<?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/>.
+
+/**
+ * myprofile block rendrer
+ *
+ * @package    block_myprofile
+ * @copyright  2018 Mihail Geshoski <mihail@moodle.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+namespace block_myprofile\output;
+
+defined('MOODLE_INTERNAL') || die;
+
+use plugin_renderer_base;
+
+/**
+ * myprofile block renderer
+ *
+ * @package    block_myprofile
+ * @copyright  2018 Mihail Geshoski <mihail@moodle.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class renderer extends plugin_renderer_base {
+
+    /**
+     * Return the main content for the block myprofile.
+     *
+     * @param myprofile $myprofile The myprofile renderable
+     * @return string HTML string
+     */
+    public function render_myprofile(myprofile $myprofile) {
+        return $this->render_from_template('block_myprofile/myprofile', $myprofile->export_for_template($this));
+    }
+}
index ee3944e..03675b4 100644 (file)
@@ -1,14 +1,28 @@
 .block_myprofile img.profilepicture {
-    height: 100px;
-    width: 100px;
+    height: 50px;
+    width: 50px;
 }
 
 .block_myprofile .myprofileitem.fullname {
     font-size: 1.5em;
     font-weight: bold;
+    margin-bottom: 0.5rem;
 }
 
 .block_myprofile .myprofileitem.edit {
     text-align: right;
 }
 
+.block_myprofile .content {
+    display: flex;
+}
+
+.block_myprofile .myprofileitem.picture img {
+    width: 50px;
+    height: 50px;
+    margin-right: 1rem;
+}
+
+.block_myprofile .myprofileitem span {
+    font-weight: bold;
+}
diff --git a/blocks/myprofile/templates/myprofile.mustache b/blocks/myprofile/templates/myprofile.mustache
new file mode 100644 (file)
index 0000000..e132b0d
--- /dev/null
@@ -0,0 +1,179 @@
+{{!
+    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/>.
+}}
+{{!
+    @template block_myprofile/myprofile
+
+    This template renders the content of the myprofile block.
+
+    Classes required for JS:
+        * none
+
+        Data attributes required for JS:
+        * none
+
+        Context variables required for this template:
+        * userfullname
+
+        Optional context variables for this template:
+        * userpicture
+        * usercountry
+        * usercity
+        * useremail
+        * usericq
+        * userskype
+        * useryahoo
+        * useraim
+        * usermsn
+        * userphone1
+        * userphone2
+        * userinstitution
+        * useraddress
+        * userfirstaccess
+        * userlastaccess
+        * usercurrentlogin
+        * userlastip
+
+    Example context (json):
+    {
+        "userpicture": "<img src='http://example.com/image.png' title='Picture of John Doe'>",
+        "userfullname": "John Doe",
+        "usercountry": "Australia",
+        "usercity": "Perth",
+        "useremail": "<a href=''>john.doe@example.com</a>",
+        "usericq": "12345",
+        "userskype": "john.doe",
+        "useryahoo": "12345",
+        "useraim": "12345",
+        "usermsn": "12345",
+        "userphone1": "123456789",
+        "userphone2": "123456789",
+        "userinstitution": "Institution",
+        "useraddress": "Address",
+        "userfirstaccess": "Friday, 6 July 2018, 9:03 AM",
+        "userlastaccess": "Wednesday, 26 September 2018, 8:05 AM",
+        "usercurrentlogin": "Wednesday, 26 September 2018, 7:17 AM",
+        "userlastip": "0:0:0:0:0:0:0:1"
+    }
+}}
+<div>
+    {{#userpicture}}
+    <div class="myprofileitem picture">
+        {{{ userpicture }}}
+    </div>
+    {{/userpicture}}
+</div>
+<div class="w-100 no-overflow">
+    <div class="myprofileitem fullname">
+        {{ userfullname }}
+    </div>
+    {{#usercountry}}
+    <div class="myprofileitem country">
+        <span>{{#str}} country {{/str}}:</span>
+        {{ usercountry }}
+    </div>
+    {{/usercountry}}
+    {{#usercity}}
+    <div class="myprofileitem city">
+         <span>{{#str}} city {{/str}}:</span>
+         {{ usercity }}
+    </div>
+    {{/usercity}}
+    {{#useremail}}
+        <div class="myprofileitem city">
+             <span>{{#str}} email {{/str}}:</span>
+             {{{ useremail }}}
+        </div>
+    {{/useremail}}
+    {{#usericq}}
+    <div class="myprofileitem icq">
+         <span>ICQ:</span>
+         {{ usericq }}
+    </div>
+    {{/usericq}}
+    {{#userskype}}
+    <div class="myprofileitem skype">
+         <span>Skype:</span>
+         {{ userskype }}
+    </div>
+    {{/userskype}}
+    {{#useryahoo}}
+    <div class="myprofileitem yahoo">
+         <span>Yahoo:</span>
+         {{ useryahoo }}
+    </div>
+    {{/useryahoo}}
+    {{#useraim}}
+    <div class="myprofileitem aim">
+         <span>AIM:</span>
+         {{ useraim }}
+    </div>
+    {{/useraim}}
+    {{#usermsn}}
+    <div class="myprofileitem msn">
+         <span>MSN:</span>
+         {{ usermsn }}
+    </div>
+    {{/usermsn}}
+    {{#userphone1}}
+    <div class="myprofileitem phone1">
+         <span>{{#str}} phone1 {{/str}}:</span>
+         {{ userphone1 }}
+    </div>
+    {{/userphone1}}
+    {{#userphone2}}
+    <div class="myprofileitem phone2">
+         <span>{{#str}} phone2 {{/str}}:</span>
+         {{ userphone2 }}
+    </div>
+    {{/userphone2}}
+    {{#userinstitution}}
+    <div class="myprofileitem institution">
+        <span>{{#str}} institution {{/str}}:</span>
+        {{ userinstitution }}
+    </div>
+    {{/userinstitution}}
+    {{#useraddress}}
+    <div class="myprofileitem address">
+        <span>{{#str}} address {{/str}}:</span>
+        {{ useraddress }}
+    </div>
+    {{/useraddress}}
+    {{#userfirstaccess}}
+    <div class="myprofileitem firstaccess">
+         <span>{{#str}} firstaccess {{/str}}: </span>
+         {{ userfirstaccess }}
+    </div>
+    {{/userfirstaccess}}
+    {{#userlastaccess}}
+    <div class="myprofileitem lastaccess">
+         <span>{{#str}} lastaccess {{/str}}:</span>
+         {{ userlastaccess }}
+    </div>
+    {{/userlastaccess}}
+    {{#usercurrentlogin}}
+    <div class="myprofileitem currentlogin">
+         <span>{{#str}} login {{/str}}:</span>
+         {{ usercurrentlogin }}
+    </div>
+    {{/usercurrentlogin}}
+    {{#userlastip}}
+    <div class="myprofileitem lastip">
+         <span>IP:</span>
+         {{ userlastip }}
+    </div>
+    {{/userlastip}}
+</div>