[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/blocks/ -> moodleblock.class.php (source)

   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  /**
  18   * This file contains the parent class for moodle blocks, block_base.
  19   *
  20   * @package    core_block
  21   * @license    http://www.gnu.org/copyleft/gpl.html GNU Public License
  22   */
  23  
  24  /// Constants
  25  
  26  /**
  27   * Block type of list. Contents of block should be set as an associative array in the content object as items ($this->content->items). Optionally include footer text in $this->content->footer.
  28   */
  29  define('BLOCK_TYPE_LIST',    1);
  30  
  31  /**
  32   * Block type of text. Contents of block should be set to standard html text in the content object as items ($this->content->text). Optionally include footer text in $this->content->footer.
  33   */
  34  define('BLOCK_TYPE_TEXT',    2);
  35  /**
  36   * Block type of tree. $this->content->items is a list of tree_item objects and $this->content->footer is a string.
  37   */
  38  define('BLOCK_TYPE_TREE',    3);
  39  
  40  /**
  41   * Class for describing a moodle block, all Moodle blocks derive from this class
  42   *
  43   * @author Jon Papaioannou
  44   * @package core_block
  45   */
  46  class block_base {
  47  
  48      /**
  49       * Internal var for storing/caching translated strings
  50       * @var string $str
  51       */
  52      var $str;
  53  
  54      /**
  55       * The title of the block to be displayed in the block title area.
  56       * @var string $title
  57       */
  58      var $title         = NULL;
  59  
  60      /**
  61       * The name of the block to be displayed in the block title area if the title is empty.
  62       * @var string arialabel
  63       */
  64      var $arialabel         = NULL;
  65  
  66      /**
  67       * The type of content that this block creates. Currently support options - BLOCK_TYPE_LIST, BLOCK_TYPE_TEXT
  68       * @var int $content_type
  69       */
  70      var $content_type  = BLOCK_TYPE_TEXT;
  71  
  72      /**
  73       * An object to contain the information to be displayed in the block.
  74       * @var stdObject $content
  75       */
  76      var $content       = NULL;
  77  
  78      /**
  79       * The initialized instance of this block object.
  80       * @var block $instance
  81       */
  82      var $instance      = NULL;
  83  
  84      /**
  85       * The page that this block is appearing on.
  86       * @var moodle_page
  87       */
  88      public $page       = NULL;
  89  
  90      /**
  91       * This blocks's context.
  92       * @var stdClass
  93       */
  94      public $context    = NULL;
  95  
  96      /**
  97       * An object containing the instance configuration information for the current instance of this block.
  98       * @var stdObject $config
  99       */
 100      var $config        = NULL;
 101  
 102      /**
 103       * How often the cronjob should run, 0 if not at all.
 104       * @var int $cron
 105       */
 106  
 107      var $cron          = NULL;
 108  
 109  /// Class Functions
 110  
 111      /**
 112       * Fake constructor to keep PHP5 happy
 113       *
 114       */
 115      function __construct() {
 116          $this->init();
 117      }
 118  
 119      /**
 120       * Function that can be overridden to do extra cleanup before
 121       * the database tables are deleted. (Called once per block, not per instance!)
 122       */
 123      function before_delete() {
 124      }
 125  
 126      /**
 127       * Returns the block name, as present in the class name,
 128       * the database, the block directory, etc etc.
 129       *
 130       * @return string
 131       */
 132      function name() {
 133          // Returns the block name, as present in the class name,
 134          // the database, the block directory, etc etc.
 135          static $myname;
 136          if ($myname === NULL) {
 137              $myname = strtolower(get_class($this));
 138              $myname = substr($myname, strpos($myname, '_') + 1);
 139          }
 140          return $myname;
 141      }
 142  
 143      /**
 144       * Parent class version of this function simply returns NULL
 145       * This should be implemented by the derived class to return
 146       * the content object.
 147       *
 148       * @return stdObject
 149       */
 150      function get_content() {
 151          // This should be implemented by the derived class.
 152          return NULL;
 153      }
 154  
 155      /**
 156       * Returns the class $title var value.
 157       *
 158       * Intentionally doesn't check if a title is set.
 159       * This is already done in {@link _self_test()}
 160       *
 161       * @return string $this->title
 162       */
 163      function get_title() {
 164          // Intentionally doesn't check if a title is set. This is already done in _self_test()
 165          return $this->title;
 166      }
 167  
 168      /**
 169       * Returns the class $content_type var value.
 170       *
 171       * Intentionally doesn't check if content_type is set.
 172       * This is already done in {@link _self_test()}
 173       *
 174       * @return string $this->content_type
 175       */
 176      function get_content_type() {
 177          // Intentionally doesn't check if a content_type is set. This is already done in _self_test()
 178          return $this->content_type;
 179      }
 180  
 181      /**
 182       * Returns true or false, depending on whether this block has any content to display
 183       * and whether the user has permission to view the block
 184       *
 185       * @return boolean
 186       */
 187      function is_empty() {
 188          if ( !has_capability('moodle/block:view', $this->context) ) {
 189              return true;
 190          }
 191  
 192          $this->get_content();
 193          return(empty($this->content->text) && empty($this->content->footer));
 194      }
 195  
 196      /**
 197       * First sets the current value of $this->content to NULL
 198       * then calls the block's {@link get_content()} function
 199       * to set its value back.
 200       *
 201       * @return stdObject
 202       */
 203      function refresh_content() {
 204          // Nothing special here, depends on content()
 205          $this->content = NULL;
 206          return $this->get_content();
 207      }
 208  
 209      /**
 210       * Return a block_contents object representing the full contents of this block.
 211       *
 212       * This internally calls ->get_content(), and then adds the editing controls etc.
 213       *
 214       * You probably should not override this method, but instead override
 215       * {@link html_attributes()}, {@link formatted_contents()} or {@link get_content()},
 216       * {@link hide_header()}, {@link (get_edit_controls)}, etc.
 217       *
 218       * @return block_contents a representation of the block, for rendering.
 219       * @since Moodle 2.0.
 220       */
 221      public function get_content_for_output($output) {
 222          global $CFG;
 223  
 224          $bc = new block_contents($this->html_attributes());
 225          $bc->attributes['data-block'] = $this->name();
 226          $bc->blockinstanceid = $this->instance->id;
 227          $bc->blockpositionid = $this->instance->blockpositionid;
 228  
 229          if ($this->instance->visible) {
 230              $bc->content = $this->formatted_contents($output);
 231              if (!empty($this->content->footer)) {
 232                  $bc->footer = $this->content->footer;
 233              }
 234          } else {
 235              $bc->add_class('invisible');
 236          }
 237  
 238          if (!$this->hide_header()) {
 239              $bc->title = $this->title;
 240          }
 241  
 242          if (empty($bc->title)) {
 243              $bc->arialabel = new lang_string('pluginname', get_class($this));
 244              $this->arialabel = $bc->arialabel;
 245          }
 246  
 247          if ($this->page->user_is_editing()) {
 248              $bc->controls = $this->page->blocks->edit_controls($this);
 249          } else {
 250              // we must not use is_empty on hidden blocks
 251              if ($this->is_empty() && !$bc->controls) {
 252                  return null;
 253              }
 254          }
 255  
 256          if (empty($CFG->allowuserblockhiding)
 257                  || (empty($bc->content) && empty($bc->footer))
 258                  || !$this->instance_can_be_collapsed()) {
 259              $bc->collapsible = block_contents::NOT_HIDEABLE;
 260          } else if (get_user_preferences('block' . $bc->blockinstanceid . 'hidden', false)) {
 261              $bc->collapsible = block_contents::HIDDEN;
 262          } else {
 263              $bc->collapsible = block_contents::VISIBLE;
 264          }
 265  
 266          if ($this->instance_can_be_docked() && !$this->hide_header()) {
 267              $bc->dockable = true;
 268          }
 269  
 270          $bc->annotation = ''; // TODO MDL-19398 need to work out what to say here.
 271  
 272          return $bc;
 273      }
 274  
 275      /**
 276       * Convert the contents of the block to HTML.
 277       *
 278       * This is used by block base classes like block_list to convert the structured
 279       * $this->content->list and $this->content->icons arrays to HTML. So, in most
 280       * blocks, you probaby want to override the {@link get_contents()} method,
 281       * which generates that structured representation of the contents.
 282       *
 283       * @param $output The core_renderer to use when generating the output.
 284       * @return string the HTML that should appearn in the body of the block.
 285       * @since Moodle 2.0.
 286       */
 287      protected function formatted_contents($output) {
 288          $this->get_content();
 289          $this->get_required_javascript();
 290          if (!empty($this->content->text)) {
 291              return $this->content->text;
 292          } else {
 293              return '';
 294          }
 295      }
 296  
 297      /**
 298       * Tests if this block has been implemented correctly.
 299       * Also, $errors isn't used right now
 300       *
 301       * @return boolean
 302       */
 303  
 304      function _self_test() {
 305          // Tests if this block has been implemented correctly.
 306          // Also, $errors isn't used right now
 307          $errors = array();
 308  
 309          $correct = true;
 310          if ($this->get_title() === NULL) {
 311              $errors[] = 'title_not_set';
 312              $correct = false;
 313          }
 314          if (!in_array($this->get_content_type(), array(BLOCK_TYPE_LIST, BLOCK_TYPE_TEXT, BLOCK_TYPE_TREE))) {
 315              $errors[] = 'invalid_content_type';
 316              $correct = false;
 317          }
 318          //following selftest was not working when roles&capabilities were used from block
 319  /*        if ($this->get_content() === NULL) {
 320              $errors[] = 'content_not_set';
 321              $correct = false;
 322          }*/
 323          $formats = $this->applicable_formats();
 324          if (empty($formats) || array_sum($formats) === 0) {
 325              $errors[] = 'no_formats';
 326              $correct = false;
 327          }
 328  
 329          return $correct;
 330      }
 331  
 332      /**
 333       * Subclasses should override this and return true if the
 334       * subclass block has a settings.php file.
 335       *
 336       * @return boolean
 337       */
 338      function has_config() {
 339          return false;
 340      }
 341  
 342      /**
 343       * Default behavior: save all variables as $CFG properties
 344       * You don't need to override this if you 're satisfied with the above
 345       *
 346       * @deprecated since Moodle 2.9 MDL-49385 - Please use Admin Settings functionality to save block configuration.
 347       */
 348      function config_save($data) {
 349          throw new coding_exception('config_save() can not be used any more, use Admin Settings functionality to save block configuration.');
 350      }
 351  
 352      /**
 353       * Which page types this block may appear on.
 354       *
 355       * The information returned here is processed by the
 356       * {@link blocks_name_allowed_in_format()} function. Look there if you need
 357       * to know exactly how this works.
 358       *
 359       * Default case: everything except mod and tag.
 360       *
 361       * @return array page-type prefix => true/false.
 362       */
 363      function applicable_formats() {
 364          // Default case: the block can be used in courses and site index, but not in activities
 365          return array('all' => true, 'mod' => false, 'tag' => false);
 366      }
 367  
 368  
 369      /**
 370       * Default return is false - header will be shown
 371       * @return boolean
 372       */
 373      function hide_header() {
 374          return false;
 375      }
 376  
 377      /**
 378       * Return any HTML attributes that you want added to the outer <div> that
 379       * of the block when it is output.
 380       *
 381       * Because of the way certain JS events are wired it is a good idea to ensure
 382       * that the default values here still get set.
 383       * I found the easiest way to do this and still set anything you want is to
 384       * override it within your block in the following way
 385       *
 386       * <code php>
 387       * function html_attributes() {
 388       *    $attributes = parent::html_attributes();
 389       *    $attributes['class'] .= ' mynewclass';
 390       *    return $attributes;
 391       * }
 392       * </code>
 393       *
 394       * @return array attribute name => value.
 395       */
 396      function html_attributes() {
 397          $attributes = array(
 398              'id' => 'inst' . $this->instance->id,
 399              'class' => 'block_' . $this->name(). '  block',
 400              'role' => $this->get_aria_role()
 401          );
 402          if ($this->hide_header()) {
 403              $attributes['class'] .= ' no-header';
 404          }
 405          if ($this->instance_can_be_docked() && get_user_preferences('docked_block_instance_'.$this->instance->id, 0)) {
 406              $attributes['class'] .= ' dock_on_load';
 407          }
 408          return $attributes;
 409      }
 410  
 411      /**
 412       * Set up a particular instance of this class given data from the block_insances
 413       * table and the current page. (See {@link block_manager::load_blocks()}.)
 414       *
 415       * @param stdClass $instance data from block_insances, block_positions, etc.
 416       * @param moodle_page $the page this block is on.
 417       */
 418      function _load_instance($instance, $page) {
 419          if (!empty($instance->configdata)) {
 420              $this->config = unserialize(base64_decode($instance->configdata));
 421          }
 422          $this->instance = $instance;
 423          $this->context = context_block::instance($instance->id);
 424          $this->page = $page;
 425          $this->specialization();
 426      }
 427  
 428      /**
 429       * Allows the block to load any JS it requires into the page.
 430       *
 431       * By default this function simply permits the user to dock the block if it is dockable.
 432       */
 433      function get_required_javascript() {
 434          if ($this->instance_can_be_docked() && !$this->hide_header()) {
 435              user_preference_allow_ajax_update('docked_block_instance_'.$this->instance->id, PARAM_INT);
 436          }
 437      }
 438  
 439      /**
 440       * This function is called on your subclass right after an instance is loaded
 441       * Use this function to act on instance data just after it's loaded and before anything else is done
 442       * For instance: if your block will have different title's depending on location (site, course, blog, etc)
 443       */
 444      function specialization() {
 445          // Just to make sure that this method exists.
 446      }
 447  
 448      /**
 449       * Is each block of this type going to have instance-specific configuration?
 450       * Normally, this setting is controlled by {@link instance_allow_multiple()}: if multiple
 451       * instances are allowed, then each will surely need its own configuration. However, in some
 452       * cases it may be necessary to provide instance configuration to blocks that do not want to
 453       * allow multiple instances. In that case, make this function return true.
 454       * I stress again that this makes a difference ONLY if {@link instance_allow_multiple()} returns false.
 455       * @return boolean
 456       */
 457      function instance_allow_config() {
 458          return false;
 459      }
 460  
 461      /**
 462       * Are you going to allow multiple instances of each block?
 463       * If yes, then it is assumed that the block WILL USE per-instance configuration
 464       * @return boolean
 465       */
 466      function instance_allow_multiple() {
 467          // Are you going to allow multiple instances of each block?
 468          // If yes, then it is assumed that the block WILL USE per-instance configuration
 469          return false;
 470      }
 471  
 472      /**
 473       * Serialize and store config data
 474       */
 475      function instance_config_save($data, $nolongerused = false) {
 476          global $DB;
 477          $DB->set_field('block_instances', 'configdata', base64_encode(serialize($data)),
 478                  array('id' => $this->instance->id));
 479      }
 480  
 481      /**
 482       * Replace the instance's configuration data with those currently in $this->config;
 483       */
 484      function instance_config_commit($nolongerused = false) {
 485          global $DB;
 486          $this->instance_config_save($this->config);
 487      }
 488  
 489      /**
 490       * Do any additional initialization you may need at the time a new block instance is created
 491       * @return boolean
 492       */
 493      function instance_create() {
 494          return true;
 495      }
 496  
 497      /**
 498       * Copy any block-specific data when copying to a new block instance.
 499       * @param int $fromid the id number of the block instance to copy from
 500       * @return boolean
 501       */
 502      public function instance_copy($fromid) {
 503          return true;
 504      }
 505  
 506      /**
 507       * Delete everything related to this instance if you have been using persistent storage other than the configdata field.
 508       * @return boolean
 509       */
 510      function instance_delete() {
 511          return true;
 512      }
 513  
 514      /**
 515       * Allows the block class to have a say in the user's ability to edit (i.e., configure) blocks of this type.
 516       * The framework has first say in whether this will be allowed (e.g., no editing allowed unless in edit mode)
 517       * but if the framework does allow it, the block can still decide to refuse.
 518       * @return boolean
 519       */
 520      function user_can_edit() {
 521          global $USER;
 522  
 523          if (has_capability('moodle/block:edit', $this->context)) {
 524              return true;
 525          }
 526  
 527          // The blocks in My Moodle are a special case.  We want them to inherit from the user context.
 528          if (!empty($USER->id)
 529              && $this->instance->parentcontextid == $this->page->context->id   // Block belongs to this page
 530              && $this->page->context->contextlevel == CONTEXT_USER             // Page belongs to a user
 531              && $this->page->context->instanceid == $USER->id) {               // Page belongs to this user
 532              return has_capability('moodle/my:manageblocks', $this->page->context);
 533          }
 534  
 535          return false;
 536      }
 537  
 538      /**
 539       * Allows the block class to have a say in the user's ability to create new instances of this block.
 540       * The framework has first say in whether this will be allowed (e.g., no adding allowed unless in edit mode)
 541       * but if the framework does allow it, the block can still decide to refuse.
 542       * This function has access to the complete page object, the creation related to which is being determined.
 543       *
 544       * @param moodle_page $page
 545       * @return boolean
 546       */
 547      function user_can_addto($page) {
 548          global $USER;
 549  
 550          // The blocks in My Moodle are a special case and use a different capability.
 551          if (!empty($USER->id)
 552              && $page->context->contextlevel == CONTEXT_USER // Page belongs to a user
 553              && $page->context->instanceid == $USER->id // Page belongs to this user
 554              && $page->pagetype == 'my-index') { // Ensure we are on the My Moodle page
 555  
 556              // If the block cannot be displayed on /my it is ok if the myaddinstance capability is not defined.
 557              $formats = $this->applicable_formats();
 558              // Is 'my' explicitly forbidden?
 559              // If 'all' has not been allowed, has 'my' been explicitly allowed?
 560              if ((isset($formats['my']) && $formats['my'] == false)
 561                  || (empty($formats['all']) && empty($formats['my']))) {
 562  
 563                  // Block cannot be added to /my regardless of capabilities.
 564                  return false;
 565              } else {
 566                  $capability = 'block/' . $this->name() . ':myaddinstance';
 567                  return $this->has_add_block_capability($page, $capability)
 568                         && has_capability('moodle/my:manageblocks', $page->context);
 569              }
 570          }
 571  
 572          $capability = 'block/' . $this->name() . ':addinstance';
 573          if ($this->has_add_block_capability($page, $capability)
 574                  && has_capability('moodle/block:edit', $page->context)) {
 575              return true;
 576          }
 577  
 578          return false;
 579      }
 580  
 581      /**
 582       * Returns true if the user can add a block to a page.
 583       *
 584       * @param moodle_page $page
 585       * @param string $capability the capability to check
 586       * @return boolean true if user can add a block, false otherwise.
 587       */
 588      private function has_add_block_capability($page, $capability) {
 589          // Check if the capability exists.
 590          if (!get_capability_info($capability)) {
 591              // Debug warning that the capability does not exist, but no more than once per page.
 592              static $warned = array();
 593              if (!isset($warned[$this->name()])) {
 594                  debugging('The block ' .$this->name() . ' does not define the standard capability ' .
 595                          $capability , DEBUG_DEVELOPER);
 596                  $warned[$this->name()] = 1;
 597              }
 598              // If the capability does not exist, the block can always be added.
 599              return true;
 600          } else {
 601              return has_capability($capability, $page->context);
 602          }
 603      }
 604  
 605      static function get_extra_capabilities() {
 606          return array('moodle/block:view', 'moodle/block:edit');
 607      }
 608  
 609      /**
 610       * Can be overridden by the block to prevent the block from being dockable.
 611       *
 612       * @return bool
 613       */
 614      public function instance_can_be_docked() {
 615          global $CFG;
 616          return (!empty($CFG->allowblockstodock) && $this->page->theme->enable_dock);
 617      }
 618  
 619      /**
 620       * If overridden and set to false by the block it will not be hidable when
 621       * editing is turned on.
 622       *
 623       * @return bool
 624       */
 625      public function instance_can_be_hidden() {
 626          return true;
 627      }
 628  
 629      /**
 630       * If overridden and set to false by the block it will not be collapsible.
 631       *
 632       * @return bool
 633       */
 634      public function instance_can_be_collapsed() {
 635          return true;
 636      }
 637  
 638      /** @callback callback functions for comments api */
 639      public static function comment_template($options) {
 640          $ret = <<<EOD
 641  <div class="comment-userpicture">___picture___</div>
 642  <div class="comment-content">
 643      ___name___ - <span>___time___</span>
 644      <div>___content___</div>
 645  </div>
 646  EOD;
 647          return $ret;
 648      }
 649      public static function comment_permissions($options) {
 650          return array('view'=>true, 'post'=>true);
 651      }
 652      public static function comment_url($options) {
 653          return null;
 654      }
 655      public static function comment_display($comments, $options) {
 656          return $comments;
 657      }
 658      public static function comment_add(&$comments, $options) {
 659          return true;
 660      }
 661  
 662      /**
 663       * Returns the aria role attribute that best describes this block.
 664       *
 665       * Region is the default, but this should be overridden by a block is there is a region child, or even better
 666       * a landmark child.
 667       *
 668       * Options are as follows:
 669       *    - landmark
 670       *      - application
 671       *      - banner
 672       *      - complementary
 673       *      - contentinfo
 674       *      - form
 675       *      - main
 676       *      - navigation
 677       *      - search
 678       *
 679       * @return string
 680       */
 681      public function get_aria_role() {
 682          return 'complementary';
 683      }
 684  }
 685  
 686  /**
 687   * Specialized class for displaying a block with a list of icons/text labels
 688   *
 689   * The get_content method should set $this->content->items and (optionally)
 690   * $this->content->icons, instead of $this->content->text.
 691   *
 692   * @author Jon Papaioannou
 693   * @package core_block
 694   */
 695  
 696  class block_list extends block_base {
 697      var $content_type  = BLOCK_TYPE_LIST;
 698  
 699      function is_empty() {
 700          if ( !has_capability('moodle/block:view', $this->context) ) {
 701              return true;
 702          }
 703  
 704          $this->get_content();
 705          return (empty($this->content->items) && empty($this->content->footer));
 706      }
 707  
 708      protected function formatted_contents($output) {
 709          $this->get_content();
 710          $this->get_required_javascript();
 711          if (!empty($this->content->items)) {
 712              return $output->list_block_contents($this->content->icons, $this->content->items);
 713          } else {
 714              return '';
 715          }
 716      }
 717  
 718      function html_attributes() {
 719          $attributes = parent::html_attributes();
 720          $attributes['class'] .= ' list_block';
 721          return $attributes;
 722      }
 723  
 724  }
 725  
 726  /**
 727   * Specialized class for displaying a tree menu.
 728   *
 729   * The {@link get_content()} method involves setting the content of
 730   * <code>$this->content->items</code> with an array of {@link tree_item}
 731   * objects (these are the top-level nodes). The {@link tree_item::children}
 732   * property may contain more tree_item objects, and so on. The tree_item class
 733   * itself is abstract and not intended for use, use one of it's subclasses.
 734   *
 735   * Unlike {@link block_list}, the icons are specified as part of the items,
 736   * not in a separate array.
 737   *
 738   * @author Alan Trick
 739   * @package core_block
 740   * @internal this extends block_list so we get is_empty() for free
 741   */
 742  class block_tree extends block_list {
 743  
 744      /**
 745       * @var int specifies the manner in which contents should be added to this
 746       * block type. In this case <code>$this->content->items</code> is used with
 747       * {@link tree_item}s.
 748       */
 749      public $content_type = BLOCK_TYPE_TREE;
 750  
 751      /**
 752       * Make the formatted HTML ouput.
 753       *
 754       * Also adds the required javascript call to the page output.
 755       *
 756       * @param core_renderer $output
 757       * @return string HTML
 758       */
 759      protected function formatted_contents($output) {
 760          // based of code in admin_tree
 761          global $PAGE; // TODO change this when there is a proper way for blocks to get stuff into head.
 762          static $eventattached;
 763          if ($eventattached===null) {
 764              $eventattached = true;
 765          }
 766          if (!$this->content) {
 767              $this->content = new stdClass;
 768              $this->content->items = array();
 769          }
 770          $this->get_required_javascript();
 771          $this->get_content();
 772          $content = $output->tree_block_contents($this->content->items,array('class'=>'block_tree list'));
 773          if (isset($this->id) && !is_numeric($this->id)) {
 774              $content = $output->box($content, 'block_tree_box', $this->id);
 775          }
 776          return $content;
 777      }
 778  }


Generated: Thu Aug 11 10:00:09 2016 Cross-referenced by PHPXref 0.7.1