$patterns[] = "[[" . $field->field->name . "#id]]"; $replacements[] = 'field_' . $field->field->id; } $newtext = str_ireplace($patterns, $replacements, $data->{$mode}); } else { //if the add template is not yet defined, print the default form! echo data_generate_default_template($data, 'addtemplate', $rid, true, false); $newtext = ''; } echo $newtext; echo '<div class="mdl-align"><input type="submit" name="saveandview" value="' . get_string('saveandview', 'data') . '" />'; if ($rid) { echo ' <input type="submit" name="cancel" value="' . get_string('cancel') . '" onclick="javascript:history.go(-1)" />'; } else { if (!$data->maxentries || has_capability('mod/data:manageentries', $context) || data_numentries($data) < $data->maxentries - 1) { echo ' <input type="submit" value="' . get_string('saveandadd', 'data') . '" />'; } } echo '</div>'; echo $OUTPUT->box_end(); echo '</div></form>'; /// Finish the page // Print the stuff that need to come after the form fields. if (!($fields = $DB->get_records('data_fields', array('dataid' => $data->id)))) { print_error('nofieldindatabase', 'data'); } foreach ($fields as $eachfield) { $field = data_get_field($eachfield, $data); $field->print_after_form(); } echo $OUTPUT->footer();
/** * Serves the data attachments. Implements needed access control ;-) * * @param object $course * @param object $cm * @param object $context * @param string $filearea * @param array $args * @param bool $forcedownload * @return bool false if file not found, does not return if found - justsend the file */ function data_pluginfile($course, $cm, $context, $filearea, $args, $forcedownload) { global $CFG, $DB; if ($context->contextlevel != CONTEXT_MODULE) { return false; } require_course_login($course, true, $cm); if ($filearea === 'content') { $contentid = (int)array_shift($args); if (!$content = $DB->get_record('data_content', array('id'=>$contentid))) { return false; } if (!$field = $DB->get_record('data_fields', array('id'=>$content->fieldid))) { return false; } if (!$record = $DB->get_record('data_records', array('id'=>$content->recordid))) { return false; } if (!$data = $DB->get_record('data', array('id'=>$field->dataid))) { return false; } if ($data->id != $cm->instance) { // hacker attempt - context does not match the contentid return false; } //check if approved if ($data->approval and !$record->approved and !data_isowner($record) and !has_capability('mod/data:approve', $context)) { return false; } // group access if ($record->groupid) { $groupmode = groups_get_activity_groupmode($cm, $course); if ($groupmode == SEPARATEGROUPS and !has_capability('moodle/site:accessallgroups', $context)) { if (!groups_is_member($record->groupid)) { return false; } } } $fieldobj = data_get_field($field, $data, $cm); $relativepath = implode('/', $args); $fullpath = "/$context->id/mod_data/content/$content->id/$relativepath"; if (!$fieldobj->file_ok($relativepath)) { return false; } $fs = get_file_storage(); if (!$file = $fs->get_file_by_hash(sha1($fullpath)) or $file->is_directory()) { return false; } // finally send the file send_stored_file($file, 0, 0, true); // download MUST be forced - security! } return false; }
require_login($course->id, false, $cm); require_capability(DATA_CAP_EXPORT, $context); // get fields for this database $fieldrecords = $DB->get_records('data_fields', array('dataid' => $data->id), 'id'); if (empty($fieldrecords)) { $context = get_context_instance(CONTEXT_MODULE, $cm->id); if (has_capability('mod/data:managetemplates', $context)) { redirect($CFG->wwwroot . '/mod/data/field.php?d=' . $data->id); } else { print_error('nofieldindatabase', 'data'); } } // populate objets for this databases fields $fields = array(); foreach ($fieldrecords as $fieldrecord) { $fields[] = data_get_field($fieldrecord, $data); } $mform = new mod_data_export_form('export.php?d=' . $data->id, $fields, $cm); if ($mform->is_cancelled()) { redirect('view.php?d=' . $data->id); } elseif (!($formdata = (array) $mform->get_data())) { // build header to match the rest of the UI $nav = build_navigation('', $cm); print_header_simple($data->name, '', $nav, '', '', true, update_module_button($cm->id, $course->id, get_string('modulename', 'data')), navmenu($course, $cm), '', ''); echo $OUTPUT->heading(format_string($data->name)); // these are for the tab display $currentgroup = groups_get_activity_group($cm); $groupmode = groups_get_activity_groupmode($cm); $currenttab = 'export'; include 'tabs.php'; $mform->display();
/** * Check for required fields, and build a list of fields to be updated in a * submission. * * @param $mod stdClass The current recordid - provided as an optimisation. * @param $fields array The field data * @param $datarecord stdClass The submitted data. * @return stdClass containing: * * string[] generalnotifications Notifications for the form as a whole. * * string[] fieldnotifications Notifications for a specific field. * * bool validated Whether the field was validated successfully. * * data_field_base[] fields The field objects to be update. */ function data_process_submission(stdClass $mod, $fields, stdClass $datarecord) { $result = new stdClass(); // Empty form checking - you can't submit an empty form. $emptyform = true; $requiredfieldsfilled = true; $fieldsvalidated = true; // Store the notifications. $result->generalnotifications = array(); $result->fieldnotifications = array(); // Store the instantiated classes as an optimisation when processing the result. // This prevents the fields being re-initialised when updating. $result->fields = array(); $submitteddata = array(); foreach ($datarecord as $fieldname => $fieldvalue) { if (strpos($fieldname, '_')) { $namearray = explode('_', $fieldname, 3); $fieldid = $namearray[1]; if (!isset($submitteddata[$fieldid])) { $submitteddata[$fieldid] = array(); } if (count($namearray) === 2) { $subfieldid = 0; } else { $subfieldid = $namearray[2]; } $fielddata = new stdClass(); $fielddata->fieldname = $fieldname; $fielddata->value = $fieldvalue; $submitteddata[$fieldid][$subfieldid] = $fielddata; } } // Check all form fields which have the required are filled. foreach ($fields as $fieldrecord) { // Check whether the field has any data. $fieldhascontent = false; $field = data_get_field($fieldrecord, $mod); if (isset($submitteddata[$fieldrecord->id])) { // Field validation check. if (method_exists($field, 'field_validation')) { $errormessage = $field->field_validation($submitteddata[$fieldrecord->id]); if ($errormessage) { $result->fieldnotifications[$field->field->name][] = $errormessage; $fieldsvalidated = false; } } foreach ($submitteddata[$fieldrecord->id] as $fieldname => $value) { if ($field->notemptyfield($value->value, $value->fieldname)) { // The field has content and the form is not empty. $fieldhascontent = true; $emptyform = false; } } } // If the field is required, add a notification to that effect. if ($field->field->required && !$fieldhascontent) { if (!isset($result->fieldnotifications[$field->field->name])) { $result->fieldnotifications[$field->field->name] = array(); } $result->fieldnotifications[$field->field->name][] = get_string('errormustsupplyvalue', 'data'); $requiredfieldsfilled = false; } // Update the field. if (isset($submitteddata[$fieldrecord->id])) { foreach ($submitteddata[$fieldrecord->id] as $value) { $result->fields[$value->fieldname] = $field; } } } if ($emptyform) { // The form is empty. $result->generalnotifications[] = get_string('emptyaddform', 'data'); } $result->validated = $requiredfieldsfilled && !$emptyform && $fieldsvalidated; return $result; }
/// Display the main listing of all fields data_print_header($course, $cm, $data, 'fields'); if (!$DB->record_exists('data_fields', array('dataid' => $data->id))) { echo $OUTPUT->notification(get_string('nofieldindatabase', 'data')); // nothing in database echo $OUTPUT->notification(get_string('pleaseaddsome', 'data', 'preset.php?id=' . $cm->id)); // link to presets } else { //else print quiz style list of fields $table = new html_table(); $table->head = array(get_string('fieldname', 'data'), get_string('type', 'data'), get_string('fielddescription', 'data'), get_string('action', 'data')); $table->align = array('left', 'left', 'left', 'center'); $table->wrap = array(false, false, false, false); if ($fff = $DB->get_records('data_fields', array('dataid' => $data->id), 'id')) { foreach ($fff as $ff) { $field = data_get_field($ff, $data); $table->data[] = array('<a href="field.php?mode=display&d=' . $data->id . '&fid=' . $field->field->id . '&sesskey=' . sesskey() . '">' . $field->field->name . '</a>', $field->image() . ' ' . get_string($field->type, 'data'), shorten_text($field->field->description, 30), '<a href="field.php?d=' . $data->id . '&mode=display&fid=' . $field->field->id . '&sesskey=' . sesskey() . '">' . '<img src="' . $OUTPUT->pix_url('t/edit') . '" class="iconsmall" alt="' . get_string('edit') . '" title="' . get_string('edit') . '" /></a>' . ' ' . '<a href="field.php?d=' . $data->id . '&mode=delete&fid=' . $field->field->id . '&sesskey=' . sesskey() . '">' . '<img src="' . $OUTPUT->pix_url('t/delete') . '" class="iconsmall" alt="' . get_string('delete') . '" title="' . get_string('delete') . '" /></a>'); } } echo html_writer::table($table); } echo '<div class="fieldadd">'; echo '<label for="fieldform_jump">' . get_string('newfield', 'data') . '</label>'; $popupurl = $CFG->wwwroot . '/mod/data/field.php?d=' . $data->id . '&mode=new&sesskey=' . sesskey(); echo $OUTPUT->single_select(new moodle_url($popupurl), 'newtype', $menufield, null, array('' => 'choosedots'), 'fieldform'); echo $OUTPUT->help_icon('newfield', 'data'); echo '</div>'; echo '<div class="sortdefault">'; echo '<form id="sortdefault" action="' . $CFG->wwwroot . '/mod/data/field.php" method="get">'; echo '<div>'; echo '<input type="hidden" name="d" value="' . $data->id . '" />';
public static function has_files($data) { global $DB; $fieldrecords = $DB->get_records('data_fields', array('dataid' => $data->id), 'id'); // populate objets for this databases fields foreach ($fieldrecords as $fieldrecord) { $field = data_get_field($fieldrecord, $data); if (is_callable(array($field, 'get_file'))) { return true; } } return false; }
function data_print_preference_form($data, $perpage, $search, $sort = '', $order = 'ASC', $search_array = '', $advanced = 0, $mode = '') { global $CFG; $cm = get_coursemodule_from_instance('data', $data->id); $context = get_context_instance(CONTEXT_MODULE, $cm->id); echo '<br /><div class="datapreferences">'; echo '<form id="options" action="view.php" method="get">'; echo '<div>'; echo '<input type="hidden" name="d" value="' . $data->id . '" />'; if ($mode == 'asearch') { $advanced = 1; echo '<input type="hidden" name="mode" value="list" />'; } echo '<label for="pref_perpage">' . get_string('pagesize', 'data') . '</label> '; $pagesizes = array(2 => 2, 3 => 3, 4 => 4, 5 => 5, 6 => 6, 7 => 7, 8 => 8, 9 => 9, 10 => 10, 15 => 15, 20 => 20, 30 => 30, 40 => 40, 50 => 50, 100 => 100, 200 => 200, 300 => 300, 400 => 400, 500 => 500, 1000 => 1000); choose_from_menu($pagesizes, 'perpage', $perpage, '', '', '0', false, false, 0, 'pref_perpage'); echo '<div id="reg_search" style="display: '; if ($advanced) { echo 'none'; } else { echo 'inline'; } echo ';" > <label for="pref_search">' . get_string('search') . '</label> <input type="text" size="16" name="search" id= "pref_search" value="' . s($search) . '" /></div>'; echo ' <label for="pref_sortby">' . get_string('sortby') . '</label> '; // foreach field, print the option echo '<select name="sort" id="pref_sortby">'; if ($fields = get_records('data_fields', 'dataid', $data->id, 'name')) { echo '<optgroup label="' . get_string('fields', 'data') . '">'; foreach ($fields as $field) { if ($field->id == $sort) { echo '<option value="' . $field->id . '" selected="selected">' . $field->name . '</option>'; } else { echo '<option value="' . $field->id . '">' . $field->name . '</option>'; } } echo '</optgroup>'; } $options = array(); $options[DATA_TIMEADDED] = get_string('timeadded', 'data'); $options[DATA_TIMEMODIFIED] = get_string('timemodified', 'data'); $options[DATA_FIRSTNAME] = get_string('authorfirstname', 'data'); $options[DATA_LASTNAME] = get_string('authorlastname', 'data'); if ($data->approval and has_capability('mod/data:approve', $context)) { $options[DATA_APPROVED] = get_string('approved', 'data'); } echo '<optgroup label="' . get_string('other', 'data') . '">'; foreach ($options as $key => $name) { if ($key == $sort) { echo '<option value="' . $key . '" selected="selected">' . $name . '</option>'; } else { echo '<option value="' . $key . '">' . $name . '</option>'; } } echo '</optgroup>'; echo '</select>'; echo '<label for="pref_order" class="accesshide">' . get_string('order') . '</label>'; echo '<select id="pref_order" name="order">'; if ($order == 'ASC') { echo '<option value="ASC" selected="selected">' . get_string('ascending', 'data') . '</option>'; } else { echo '<option value="ASC">' . get_string('ascending', 'data') . '</option>'; } if ($order == 'DESC') { echo '<option value="DESC" selected="selected">' . get_string('descending', 'data') . '</option>'; } else { echo '<option value="DESC">' . get_string('descending', 'data') . '</option>'; } echo '</select>'; if ($advanced) { $checked = ' checked="checked" '; } else { $checked = ''; } print ' <script type="text/javascript"> //<![CDATA[ <!-- Start // javascript for hiding/displaying advanced search form function showHideAdvSearch(checked) { var divs = document.getElementsByTagName(\'div\'); for(i=0;i<divs.length;i++) { if(divs[i].id.match(\'data_adv_form\')) { if(checked) { divs[i].style.display = \'inline\'; } else { divs[i].style.display = \'none\'; } } else if (divs[i].id.match(\'reg_search\')) { if (!checked) { divs[i].style.display = \'inline\'; } else { divs[i].style.display = \'none\'; } } } } // End --> //]]> </script>'; echo ' <input type="hidden" name="advanced" value="0" />'; echo ' <input type="hidden" name="filter" value="1" />'; echo ' <input type="checkbox" id="advancedcheckbox" name="advanced" value="1" ' . $checked . ' onchange="showHideAdvSearch(this.checked);" /><label for="advancedcheckbox">' . get_string('advancedsearch', 'data') . '</label>'; echo ' <input type="submit" value="' . get_string('savesettings', 'data') . '" />'; echo '<br />'; echo '<div class="dataadvancedsearch" id="data_adv_form" style="display: '; if ($advanced) { echo 'inline'; } else { echo 'none'; } echo ';margin-left:auto;margin-right:auto;" >'; echo '<table class="boxaligncenter">'; // print ASC or DESC echo '<tr><td colspan="2"> </td></tr>'; $i = 0; // Determine if we are printing all fields for advanced search, or the template for advanced search // If a template is not defined, use the deafault template and display all fields. if (empty($data->asearchtemplate)) { data_generate_default_template($data, 'asearchtemplate'); } static $fields = NULL; static $isteacher; static $dataid = NULL; if (empty($dataid)) { $dataid = $data->id; } else { if ($dataid != $data->id) { $fields = NULL; } } if (empty($fields)) { $fieldrecords = get_records('data_fields', 'dataid', $data->id); foreach ($fieldrecords as $fieldrecord) { $fields[] = data_get_field($fieldrecord, $data); } $isteacher = has_capability('mod/data:managetemplates', $context); } // Replacing tags $patterns = array(); $replacement = array(); // Then we generate strings to replace for normal tags foreach ($fields as $field) { $fieldname = $field->field->name; $fieldname = preg_quote($fieldname, '/'); $patterns[] = "/\\[\\[{$fieldname}\\]\\]/i"; $searchfield = data_get_field_from_id($field->field->id, $data); if (!empty($search_array[$field->field->id]->data)) { $replacement[] = $searchfield->display_search_field($search_array[$field->field->id]->data); } else { $replacement[] = $searchfield->display_search_field(); } } $fn = !empty($search_array[DATA_FIRSTNAME]->data) ? $search_array[DATA_FIRSTNAME]->data : ''; $ln = !empty($search_array[DATA_LASTNAME]->data) ? $search_array[DATA_LASTNAME]->data : ''; $patterns[] = '/##firstname##/'; $replacement[] = '<input type="text" size="16" name="u_fn" value="' . $fn . '" />'; $patterns[] = '/##lastname##/'; $replacement[] = '<input type="text" size="16" name="u_ln" value="' . $ln . '" />'; // actual replacement of the tags $newtext = preg_replace($patterns, $replacement, $data->asearchtemplate); $options = new object(); $options->para = false; $options->noclean = true; echo '<tr><td>'; echo format_text($newtext, FORMAT_HTML, $options); echo '</td></tr>'; echo '<tr><td colspan="4" style="text-align: center;"><br/><input type="submit" value="' . get_string('savesettings', 'data') . '" /><input type="submit" name="resetadv" value="' . get_string('resetsettings', 'data') . '" /></td></tr>'; echo '</table>'; echo '</div>'; echo '</div>'; echo '</form>'; echo '</div>'; }
/** * Creates a field for a mod_data instance. * Currently, the field types in the ignoredfieldtypes array aren't supported. * The developers using the generator must adhere to the following format : * * Syntax : $contents[ fieldid ] = fieldvalue * $contents['checkbox'] = array('val1', 'val2', 'val3' .....) * $contents['data'] = 'dd-mm-yyyy' * $contents['menu'] = 'value'; * $contents['multimenu'] = array('val1', 'val2', 'val3' .....) * $contents['number'] = 'numeric value' * $contents['radiobuton'] = 'value' * $contents['text'] = 'text' * $contents['textarea'] = 'text' * $contents['url'] = 'example.url' or array('example.url', 'urlname') * * @param mod_data $data * @param array $contents * @return data_field_{type} */ public function create_entry($data, array $contents) { global $DB; $this->databaserecordcount++; $recordid = data_add_record($data); $fields = $DB->get_records('data_fields', array('dataid' => $data->id)); // Validating whether required field are filled. foreach ($fields as $field) { $fieldhascontent = true; if (in_array($field->type, $this->ignoredfieldtypes)) { continue; } $field = data_get_field($field, $data); $fieldid = $field->field->id; if ($field->type === 'date') { $values = array(); $temp = explode('-', $contents[$fieldid], 3); $values['field_' . $fieldid . '_day'] = (int) trim($temp[0]); $values['field_' . $fieldid . '_month'] = (int) trim($temp[1]); $values['field_' . $fieldid . '_year'] = (int) trim($temp[2]); // Year should be less than 2038, so it can be handled by 32 bit windows. if ($values['field_' . $fieldid . '_year'] > 2038) { throw new coding_exception('DateTime::getTimestamp resturns false on 32 bit win for year beyond ' . '2038. Please use year less than 2038.'); } $contents[$fieldid] = $values; foreach ($values as $fieldname => $value) { if (!$field->notemptyfield($value, $fieldname)) { $fieldhascontent = false; } } } else { if ($field->type === 'textarea') { $values = array(); $values['field_' . $fieldid] = $contents[$fieldid]; $values['field_' . $fieldid . '_content1'] = 1; $contents[$fieldid] = $values; foreach ($values as $fieldname => $value) { if (!$field->notemptyfield($value, $fieldname)) { $fieldhascontent = false; } } } else { if ($field->type === 'url') { $values = array(); if (is_array($contents[$fieldid])) { foreach ($contents[$fieldid] as $key => $value) { $values['field_' . $fieldid . '_' . $key] = $value; } } else { $values['field_' . $fieldid . '_0'] = $contents[$fieldid]; } $contents[$fieldid] = $values; foreach ($values as $fieldname => $value) { if (!$field->notemptyfield($value, $fieldname)) { $fieldhascontent = false; } } } else { if ($field->notemptyfield($contents[$fieldid], 'field_' . $fieldid . '_0')) { continue; } } } } if ($field->field->required && !$fieldhascontent) { return false; } } foreach ($contents as $fieldid => $content) { $field = data_get_field_from_id($fieldid, $data); if (is_array($content)) { foreach ($content as $fieldname => $value) { $field->update_content($recordid, $value, $fieldname); } } else { $field->update_content($recordid, $content); } } return $recordid; }
public function load_data() { global $DB; if (!($this->cm = get_coursemodule_from_id('data', $this->id))) { throw new portfolio_caller_exception('invalidid', 'data'); } $this->data = $DB->get_record('data', array('id' => $this->cm->instance)); $fieldrecords = $DB->get_records('data_fields', array('dataid' => $this->cm->instance), 'id'); // populate objets for this databases fields $this->fields = array(); foreach ($fieldrecords as $fieldrecord) { $tmp = data_get_field($fieldrecord, $this->data); $this->fields[] = $tmp; $this->fieldtypes[] = $tmp->type; } if ($this->recordid) { //user has selected to export one single entry rather than the whole thing // which is completely different $this->singlerecord = $DB->get_record('data_records', array('id' => $this->recordid)); $this->singlerecord->content = $DB->get_records('data_content', array('recordid' => $this->singlerecord->id)); $this->exporttype = 'single'; list($formats, $files) = self::formats($this->fields, $this->singlerecord); $this->supportedformats = $formats; if (count($files) == 1 && count($this->fields) == 1) { $this->singlefile = $files[0]; $this->exporttype = 'singlefile'; } else { if (count($files) > 0) { $this->multifiles = $files; } } } else { // all records as csv or whatever $this->exportdata = data_get_exportdata($this->cm->instance, $this->fields, $this->selectedfields); } }
function data_print_template($template, $records, $data, $search = '', $page = 0, $return = false) { global $CFG; $cm = get_coursemodule_from_instance('data', $data->id); $context = get_context_instance(CONTEXT_MODULE, $cm->id); static $fields = NULL; static $isteacher; static $dataid = NULL; if (empty($dataid)) { $dataid = $data->id; } else { if ($dataid != $data->id) { $fields = NULL; } } if (empty($fields)) { $fieldrecords = get_records('data_fields', 'dataid', $data->id); foreach ($fieldrecords as $fieldrecord) { $fields[] = data_get_field($fieldrecord, $data); } $isteacher = has_capability('mod/data:managetemplates', $context); } if (empty($records)) { return; } foreach ($records as $record) { /// Might be just one for the single template /// Replacing tags $patterns = array(); $replacement = array(); /// Then we generate strings to replace for normal tags foreach ($fields as $field) { $patterns[] = '[[' . $field->field->name . ']]'; $replacement[] = highlight($search, $field->display_browse_field($record->id, $template)); } /// Replacing special tags (##Edit##, ##Delete##, ##More##) $patterns[] = '##edit##'; $patterns[] = '##delete##'; if (has_capability('mod/data:manageentries', $context) or data_isowner($record->id)) { $replacement[] = '<a href="' . $CFG->wwwroot . '/mod/data/edit.php?d=' . $data->id . '&rid=' . $record->id . '&sesskey=' . sesskey() . '"><img src="' . $CFG->pixpath . '/t/edit.gif" class="iconsmall" alt="' . get_string('edit') . '" title="' . get_string('edit') . '" /></a>'; $replacement[] = '<a href="' . $CFG->wwwroot . '/mod/data/view.php?d=' . $data->id . '&delete=' . $record->id . '&sesskey=' . sesskey() . '"><img src="' . $CFG->pixpath . '/t/delete.gif" class="iconsmall" alt="' . get_string('delete') . '" title="' . get_string('delete') . '" /></a>'; } else { $replacement[] = ''; $replacement[] = ''; } $patterns[] = '##more##'; $replacement[] = '<a href="' . $CFG->wwwroot . '/mod/data/view.php?d=' . $data->id . '&rid=' . $record->id . '"><img src="' . $CFG->pixpath . '/i/search.gif" class="iconsmall" alt="' . get_string('more', 'data') . '" title="' . get_string('more', 'data') . '" /></a>'; $patterns[] = '##moreurl##'; $replacement[] = $CFG->wwwroot . '/mod/data/view.php?d=' . $data->id . '&rid=' . $record->id; $patterns[] = '##user##'; $replacement[] = '<a href="' . $CFG->wwwroot . '/user/view.php?id=' . $record->userid . '&course=' . $data->course . '">' . fullname($record) . '</a>'; $patterns[] = '##approve##'; if (has_capability('mod/data:approve', $context) && $data->approval && !$record->approved) { $replacement[] = '<a href="' . $CFG->wwwroot . '/mod/data/view.php?d=' . $data->id . '&approve=' . $record->id . '&sesskey=' . sesskey() . '"><img src="' . $CFG->pixpath . '/i/approve.gif" class="iconsmall" alt="' . get_string('approve') . '" /></a>'; } else { $replacement[] = ''; } $patterns[] = '##comments##'; if ($template == 'listtemplate' && $data->comments) { $comments = count_records('data_comments', 'recordid', $record->id); $replacement[] = '<a href="view.php?rid=' . $record->id . '#comments">' . get_string('commentsn', 'data', $comments) . '</a>'; } else { $replacement[] = ''; } ///actual replacement of the tags $newtext = str_ireplace($patterns, $replacement, $data->{$template}); /// no more html formatting and filtering - see MDL-6635 if ($return) { return $newtext; } else { echo $newtext; // hack alert - return is always false in singletemplate anyway ;-) /********************************** * Printing Ratings Form * *********************************/ if ($template == 'singletemplate') { //prints ratings options data_print_ratings($data, $record); } /********************************** * Printing Ratings Form * *********************************/ if ($template == 'singletemplate' && $data->comments) { //prints ratings options data_print_comments($data, $record, $page); } } } }