Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 3.11.x will end 14 Nov 2022 (12 months plus 6 months extension).
  • Bug fixes for security issues in 3.11.x will end 13 Nov 2023 (18 months plus 12 months extension).
  • PHP version: minimum PHP 7.3.0 Note: minimum PHP version has increased since Moodle 3.10. PHP 7.4.x is supported too.
   1  <?php
   2  // This file is part of Moodle - http://moodle.org/
   3  //
   4  // Moodle is free software: you can redistribute it and/or modify
   5  // it under the terms of the GNU General Public License as published by
   6  // the Free Software Foundation, either version 3 of the License, or
   7  // (at your option) any later version.
   8  //
   9  // Moodle is distributed in the hope that it will be useful,
  10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12  // GNU General Public License for more details.
  13  //
  14  // You should have received a copy of the GNU General Public License
  15  // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
  16  
  17  namespace repository_googledocs;
  18  
  19  /**
  20   * Base class for presenting the googledocs repository contents.
  21   *
  22   * @package    repository_googledocs
  23   * @copyright  2021 Mihail Geshoski <mihail@moodle.com>
  24   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  25   */
  26  abstract class googledocs_content {
  27  
  28      /** @var rest The rest API object. */
  29      protected $service;
  30  
  31      /** @var string The current path. */
  32      protected $path;
  33  
  34      /** @var bool Whether sorting should be applied to the fetched content. */
  35      protected $sortcontent;
  36  
  37      /**
  38       * Constructor.
  39       *
  40       * @param rest $service The rest API object
  41       * @param string $path The current path
  42       * @param bool $sortcontent Whether sorting should be applied to the content
  43       */
  44      public function __construct(rest $service, string $path, bool $sortcontent = true) {
  45          $this->service = $service;
  46          $this->path = $path;
  47          $this->sortcontent = $sortcontent;
  48      }
  49  
  50      /**
  51       * Generate and return an array containing all repository node (files and folders) arrays for the existing content
  52       * based on the path or search query.
  53       *
  54       * @param string $query The search query
  55       * @param callable $isaccepted The callback function which determines whether a given file should be displayed
  56       *                             or filtered based on the existing file restrictions
  57       * @return array The array containing the repository content node arrays
  58       */
  59      public function get_content_nodes(string $query, callable $isaccepted): array {
  60          $files = [];
  61          $folders = [];
  62  
  63          foreach ($this->get_contents($query) as $gdcontent) {
  64              $node = helper::get_node($gdcontent, $this->path);
  65              // Create the repository node array.
  66              $nodearray = $node->create_node_array();
  67              // If the repository node array was successfully generated and the type of the content is accepted,
  68              // add it to the repository content nodes array.
  69              if ($nodearray && $isaccepted($nodearray)) {
  70                  // Group the content nodes by type (files and folders). Generate unique array keys for each content node
  71                  // which will be later used by the sorting function. Note: Using the item id along with the name as key
  72                  // of the array because Google Drive allows files and folders with identical names.
  73                  if (isset($nodearray['source'])) { // If the content node has a source attribute, it is a file node.
  74                      $files["{$nodearray['title']}{$nodearray['id']}"] = $nodearray;
  75                  } else {
  76                      $folders["{$nodearray['title']}{$nodearray['id']}"] = $nodearray;
  77                  }
  78              }
  79          }
  80          // If sorting is required, order the results alphabetically by their array keys.
  81          if ($this->sortcontent) {
  82              \core_collator::ksort($files, \core_collator::SORT_STRING);
  83              \core_collator::ksort($folders, \core_collator::SORT_STRING);
  84          }
  85  
  86          return array_merge(array_values($folders), array_values($files));
  87      }
  88  
  89      /**
  90       * Build the navigation (breadcrumb) from a given path.
  91       *
  92       * @return array Array containing name and path of each navigation node
  93       */
  94      public function get_navigation(): array {
  95          $nav = [];
  96          $navtrail = '';
  97          $pathnodes = explode('/', $this->path);
  98  
  99          foreach ($pathnodes as $node) {
 100              list($id, $name) = helper::explode_node_path($node);
 101              $name = empty($name) ? $id : $name;
 102              $nav[] = [
 103                  'name' => $name,
 104                  'path' => helper::build_node_path($id, $name, $navtrail),
 105              ];
 106              $tmp = end($nav);
 107              $navtrail = $tmp['path'];
 108          }
 109  
 110          return $nav;
 111      }
 112  
 113      /**
 114       * Returns all relevant contents (files and folders) based on the given path or search query.
 115       *
 116       * @param string $query The search query
 117       * @return array The array containing the contents
 118       */
 119      abstract protected function get_contents(string $query): array;
 120  }