From: mudrd8mz Date: Mon, 13 Jul 2009 11:10:30 +0000 (+0000) Subject: MDL-19755 print_table replaced with $OUTPUT->table X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=480b0720ae7d0eb0ea5f6b90ab162e9c67fbdbf7;p=moodle.git MDL-19755 print_table replaced with $OUTPUT->table rowclass property has been deprecated, rowclasses should be used. Direct assigning of the class has been deprecated, moodle_html_elements::set_classes() should be used instead. In both cases, debugging message is displayed. --- diff --git a/lib/deprecatedlib.php b/lib/deprecatedlib.php index 57cc441533..44ea6bfa52 100644 --- a/lib/deprecatedlib.php +++ b/lib/deprecatedlib.php @@ -2347,3 +2347,35 @@ function blocks_preferred_width($instances) { $width = 210; } +/** + * Print a nicely formatted table. + * + * @deprecated since Moodle 2.0 + * + * @param array $table is an object with several properties. + */ +function print_table($table, $return=false) { + global $OUTPUT; + // TODO MDL-19755 turn debugging on once we migrate the current core code to use the new API + // debugging('print_table() has been deprecated. Please change your code to use $OUTPUT->table().'); + $newtable = new html_table(); + foreach ($table as $property => $value) { + if (property_exists($newtable, $property)) { + $newtable->{$property} = $value; + } + } + if (isset($table->class)) { + $newtable->set_classes($table->class); + } + if (isset($table->rowclass) && is_array($table->rowclass)) { + debugging('rowclass[] has been deprecated for html_table and should be replaced by rowclasses[]. please fix the code.'); + $newtable->rowclasses = $table->rowclass; + } + $output = $OUTPUT->table($newtable); + if ($return) { + return $output; + } else { + echo $output; + return true; + } +} diff --git a/lib/outputlib.php b/lib/outputlib.php index ff2a23f4c9..5f545c1c64 100644 --- a/lib/outputlib.php +++ b/lib/outputlib.php @@ -2307,6 +2307,118 @@ class moodle_core_renderer extends moodle_renderer_base { print_single_button($link->out(true), $link->params(), get_string('continue'), 'get', '', true)); } + /** + * Render a HTML table + * + * @param object $table {@link html_table} instance containing all the information needed + * @return string the HTML to output. + */ + public function table(html_table $table) { + $table->prepare(); + $attributes = array( + 'id' => $table->id, + 'width' => $table->width, + 'summary' => $table->summary, + 'cellpadding' => $table->cellpadding, + 'cellspacing' => $table->cellspacing, + 'class' => $table->get_classes_string()); + $output = $this->output_start_tag('table', $attributes) . "\n"; + + $countcols = 0; + + if (!empty($table->head)) { + $countcols = count($table->head); + $output .= $this->output_start_tag('thead', array()) . "\n"; + $output .= $this->output_start_tag('tr', array()) . "\n"; + $keys = array_keys($table->head); + $lastkey = end($keys); + foreach ($table->head as $key => $heading) { + $classes = array('header', 'c' . $key); + if (isset($table->headspan[$key]) && $table->headspan[$key] > 1) { + $colspan = $table->headspan[$key]; + $countcols += $table->headspan[$key] - 1; + } else { + $colspan = ''; + } + if ($key == $lastkey) { + $classes[] = 'lastcol'; + } + if (isset($table->colclasses[$key])) { + $classes[] = $table->colclasses[$key]; + } + if ($table->rotateheaders) { + // we need to wrap the heading content + $heading = $this->output_tag('span', '', $heading); + } + $attributes = array( + 'style' => $table->align[$key] . $table->size[$key] . 'white-space:nowrap;', + 'class' => moodle_renderer_base::prepare_classes($classes), + 'scope' => 'col', + 'colspan' => $colspan); + $output .= $this->output_tag('th', $attributes, $heading) . "\n"; + } + $output .= $this->output_end_tag('tr') . "\n"; + $output .= $this->output_end_tag('thead') . "\n"; + } + + if (!empty($table->data)) { + $oddeven = 1; + $keys = array_keys($table->data); + $lastrowkey = end($keys); + $output .= $this->output_start_tag('tbody', array()) . "\n"; + foreach ($table->data as $key => $row) { + $oddeven = $oddeven ? 0 : 1; + if (isset($table->rowclasses[$key])) { + $classes = array_unique(moodle_html_component::clean_classes($table->rowclasses[$key])); + } else { + $classes = array(); + } + $classes[] = 'r' . $oddeven; + if ($key == $lastrowkey) { + $classes[] = 'lastrow'; + } + $output .= $this->output_start_tag('tr', array('class' => moodle_renderer_base::prepare_classes($classes))) . "\n"; + if (($row === 'hr') && ($countcols)) { + $output .= $this->output_tag('td', array('colspan' => $countcols), + $this->output_tag('div', array('class' => 'tabledivider'), '')) . "\n"; + } else { /// it's a normal row of data + $keys2 = array_keys($row); + $lastkey = end($keys2); + foreach ($row as $key => $item) { + if (isset($table->colclasses[$key])) { + $classes = array_unique(moodle_html_component::clean_classes($table->colclasses[$key])); + } else { + $classes = array(); + } + $classes[] = 'cell'; + $classes[] = 'c' . $key; + if ($key == $lastkey) { + $classes[] = 'lastcol'; + } + $tdstyle = ''; + $tdstyle .= isset($table->align[$key]) ? $table->align[$key] : ''; + $tdstyle .= isset($table->size[$key]) ? $table->size[$key] : ''; + $tdstyle .= isset($table->wrap[$key]) ? $table->wrap[$key] : ''; + $output .= $this->output_tag('td', + array('style' => $tdstyle, + 'class' => moodle_renderer_base::prepare_classes($classes)), + $item) . "\n"; + } + } + $output .= $this->output_end_tag('tr') . "\n"; + } + $output .= $this->output_end_tag('tbody') . "\n"; + } + $output .= $this->output_end_tag('table') . "\n"; + + if ($table->rotateheaders && can_use_rotated_text()) { + $this->page->requires->yui_lib('event'); + $this->page->requires->js('course/report/progress/textrotate.js'); + } + + return $output; + } + /** * Output the place a skip link goes to. * @param $id The target name from the corresponding $PAGE->requires->skip_link_to($target) call. @@ -2429,6 +2541,20 @@ class moodle_html_component { public function prepare() { $this->classes = array_unique(self::clean_classes($this->classes)); } + + /** + * This checks developer do not try to assign a property directly + * if we have a setter for it. Otherwise, the property is set as expected. + */ + public function __set($name, $value) { + if ($name == 'class') { + debugging('this way of setting css class has been deprecated. use set_classes() method instead.'); + $this->set_classes($value); + } else { + $this->{$name} = $value; + } + } + } @@ -2647,6 +2773,195 @@ class block_contents extends moodle_html_component { } +/** + * Holds all the information required to render a by + * {@see moodle_core_renderer::table()} or by an overridden version of that + * method in a subclass. + * + * Example of usage: + * $t = new html_table(); + * ... // set various properties of the object $t as described below + * echo $OUTPUT->table($t); + * + * @copyright 2009 David Mudrak + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @since Moodle 2.0 + */ +class html_table extends moodle_html_component { + /** + * @var array of headings. The n-th array item is used as a heading of the n-th column. + * + * Example of usage: + * $t->head = array('Student', 'Grade'); + */ + public $head; + /** + * @var array can be used to make a heading span multiple columns + * + * Example of usage: + * $t->headspan = array(2,1); + * + * In this example, {@see html_table:$data} is supposed to have three columns. For the first two columns, + * the same heading is used. Therefore, {@see html_table::$head} should consist of two items. + */ + public $headspan; + /** + * @var array of column alignments. The value is used as CSS 'text-align' property. Therefore, possible + * values are 'left', 'right', 'center' and 'justify'. Specify 'right' or 'left' from the perspective + * of a left-to-right (LTR) language. For RTL, the values are flipped automatically. + * + * Examples of usage: + * $t->align = array(null, 'right'); + * or + * $t->align[1] = 'right'; + * + */ + public $align; + /** + * @var array of column sizes. The value is used as CSS 'size' property. + * + * Examples of usage: + * $t->size = array('50%', '50%'); + * or + * $t->size[1] = '120px'; + */ + public $size; + /** + * @var array of wrapping information. The only possible value is 'nowrap' that sets the + * CSS property 'white-space' to the value 'nowrap' in the given column. + * + * Example of usage: + * $t->wrap = array(null, 'nowrap'); + */ + public $wrap; + /** + * @var array of arrays containing the data. Alternatively, if you have + * $head specified, the string 'hr' (for horizontal ruler) can be used + * instead of an array of cells data resulting in a divider rendered. + * + * Example if usage: + * $row1 = array('Harry Potter', '76 %'); + * $row2 = array('Hermione Granger', '100 %'); + * $t->data = array($row1, $row2); + */ + public $data; + /** + * @var string width of the table, percentage of the page prefered. Defaults to 80% of the page width. + */ + public $width = '80%'; + /** + * @var string alignment the whole table. Can be 'right', 'left' or 'center' (default). + */ + public $tablealign = 'center'; + /** + * @var int padding on each cell, in pixels + */ + public $cellpadding = 5; + /** + * @var int spacing between cells, in pixels + */ + public $cellspacing = 1; + /** + * @var array classes to add to particular rows, space-separated string. + * Classes 'r0' or 'r1' are added automatically for every odd or even row, + * respectively. Class 'lastrow' is added automatically for the last row + * in the table. + * + * Example of usage: + * $t->rowclasses[9] = 'tenth' + */ + public $rowclasses; + /** + * @var array classes to add to every cell in a particular colummn, + * space-separated string. Class 'cell' is added automatically by the renderer. + * Classes 'c0' or 'c1' are added automatically for every odd or even column, + * respectively. Class 'lastcol' is added automatically for all last cells + * in a row. + * + * Example of usage: + * $t->colclasses = array(null, 'grade'); + */ + public $colclasses; + /** + * @var string description of the contents for screen readers. + */ + public $summary; + /** + * @var bool true causes the contents of the heading cells to be rotated 90 degrees. + */ + public $rotateheaders = false; + + /** + * @see moodle_html_component::prepare() + */ + public function prepare() { + if (!empty($this->align)) { + foreach ($this->align as $key => $aa) { + if ($aa) { + $this->align[$key] = 'text-align:'. fix_align_rtl($aa) .';'; // Fix for RTL languages + } else { + $this->align[$key] = ''; + } + } + } + if (!empty($this->size)) { + foreach ($this->size as $key => $ss) { + if ($ss) { + $this->size[$key] = 'width:'. $ss .';'; + } else { + $this->size[$key] = ''; + } + } + } + if (!empty($this->wrap)) { + foreach ($this->wrap as $key => $ww) { + if ($ww) { + $this->wrap[$key] = 'white-space:nowrap;'; + } else { + $this->wrap[$key] = ''; + } + } + } + if (!empty($this->head)) { + foreach ($this->head as $key => $val) { + if (!isset($this->align[$key])) { + $this->align[$key] = ''; + } + if (!isset($this->size[$key])) { + $this->size[$key] = ''; + } + if (!isset($this->wrap[$key])) { + $this->wrap[$key] = ''; + } + + } + } + if (!empty($this->tablealign)) { + $this->add_class('boxalign' . $this->tablealign); + } + if (!empty($this->rotateheaders)) { + $this->add_class('rotateheaders'); + } else { + $this->rotateheaders = false; // Makes life easier later. + } + if (empty($this->classes)) { + $this->set_classes(array('generaltable')); + } + parent::prepare(); + } + + public function __set($name, $value) { + if ($name == 'rowclass') { + debugging('rowclass[] has been deprecated for html_table ' . + 'and should be replaced with rowclasses[]. please fix the code.'); + $this->rowclasses = $value; + } else { + parent::__set($name, $value); + } + } +} + + /** * A renderer that generates output for commandlines scripts. * diff --git a/lib/weblib.php b/lib/weblib.php index 9f22472932..cf319a86f2 100644 --- a/lib/weblib.php +++ b/lib/weblib.php @@ -3628,191 +3628,6 @@ function print_png($url, $sizex, $sizey, $return, $parameters='alt=""') { } } -/** - * Print a nicely formatted table. - * - * @param array $table is an object with several properties. - * - * @param bool $return whether to return an output string or echo now - * @return boolean|string depending on $return - */ -function print_table($table, $return=false) { - $output = ''; - - if (isset($table->align)) { - foreach ($table->align as $key => $aa) { - if ($aa) { - $align[$key] = ' text-align:'. fix_align_rtl($aa) .';'; // Fix for RTL languages - } else { - $align[$key] = ''; - } - } - } - if (isset($table->size)) { - foreach ($table->size as $key => $ss) { - if ($ss) { - $size[$key] = ' width:'. $ss .';'; - } else { - $size[$key] = ''; - } - } - } - if (isset($table->wrap)) { - foreach ($table->wrap as $key => $ww) { - if ($ww) { - $wrap[$key] = ' white-space:nowrap;'; - } else { - $wrap[$key] = ''; - } - } - } - - if (empty($table->width)) { - $table->width = '80%'; - } - - if (empty($table->tablealign)) { - $table->tablealign = 'center'; - } - - if (!isset($table->cellpadding)) { - $table->cellpadding = '5'; - } - - if (!isset($table->cellspacing)) { - $table->cellspacing = '1'; - } - - if (empty($table->class)) { - $table->class = 'generaltable'; - } - if (!empty($table->rotateheaders)) { - $table->class .= ' rotateheaders'; - } else { - $table->rotateheaders = false; // Makes life easier later. - } - - $tableid = empty($table->id) ? '' : 'id="'.$table->id.'"'; - - $output .= '
summary)) { - $output .= " summary=\"$table->summary\""; - } - $output .= " cellpadding=\"$table->cellpadding\" cellspacing=\"$table->cellspacing\" class=\"$table->class boxalign$table->tablealign\" $tableid>\n"; - - $countcols = 0; - - if (!empty($table->head)) { - $countcols = count($table->head); - $output .= ''; - $keys = array_keys($table->head); - $lastkey = end($keys); - foreach ($table->head as $key => $heading) { - $classes = array('header', 'c' . $key); - if (!isset($size[$key])) { - $size[$key] = ''; - } - if (!isset($align[$key])) { - $align[$key] = ''; - } - if (isset($table->headspan[$key]) && $table->headspan[$key] > 1) { - $colspan = ' colspan="' . $table->headspan[$key] . '"'; - } else { - $colspan = ''; - } - if ($key == $lastkey) { - $classes[] = 'lastcol'; - } - if (isset($table->colclasses[$key])) { - $classes[] = $table->colclasses[$key]; - } - if ($table->rotateheaders) { - $wrapperstart = ''; - $wrapperend = ''; - } else { - $wrapperstart = ''; - $wrapperend = ''; - } - - $output .= ''; - } - $output .= ''."\n"; - } - - if (!empty($table->data)) { - $oddeven = 1; - $keys=array_keys($table->data); - $lastrowkey = end($keys); - foreach ($table->data as $key => $row) { - $oddeven = $oddeven ? 0 : 1; - if (!isset($table->rowclass[$key])) { - $table->rowclass[$key] = ''; - } - if ($key == $lastrowkey) { - $table->rowclass[$key] .= ' lastrow'; - } - $output .= ''."\n"; - if ($row == 'hr' and $countcols) { - $output .= ''; - } else { /// it's a normal row of data - $keys2 = array_keys($row); - $lastkey = end($keys2); - foreach ($row as $key => $item) { - $classes = array('cell', 'c' . $key); - if (!isset($size[$key])) { - $size[$key] = ''; - } - if (!isset($align[$key])) { - $align[$key] = ''; - } - if (!isset($wrap[$key])) { - $wrap[$key] = ''; - } - if ($key == $lastkey) { - $classes[] = 'lastcol'; - } - if (isset($table->colclasses[$key])) { - $classes[] = $table->colclasses[$key]; - } - $output .= ''; - } - } - $output .= ''."\n"; - } - } - $output .= '
'. - $wrapperstart . $heading . $wrapperend . '
'. $item .'
'."\n"; - - if ($table->rotateheaders && can_use_rotated_text()) { - $PAGE->requires->yui_lib('event'); - $PAGE->requires->js('course/report/progress/textrotate.js'); - } - - if ($return) { - return $output; - } - - echo $output; - return true; -} /** * Display a recent activity note