MDL-5583 mod_data: Add required fields
This is implemented for most fields but not all. The reason is that there are
some fields for which this does not make sense because no entry is a valid entry.
The supported fields are:
checkbox
file
latlong
menu
number
picture
radio
text
textarea
url
The unsupported fields are:
date
multimenu
This commit is contained in:
@@ -50,7 +50,7 @@ class backup_data_activity_structure_step extends backup_activity_structure_step
|
||||
$fields = new backup_nested_element('fields');
|
||||
|
||||
$field = new backup_nested_element('field', array('id'), array(
|
||||
'type', 'name', 'description', 'param1', 'param2',
|
||||
'type', 'name', 'description', 'required', 'param1', 'param2',
|
||||
'param3', 'param4', 'param5', 'param6',
|
||||
'param7', 'param8', 'param9', 'param10'));
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<XMLDB PATH="mod/data/db" VERSION="20120122" COMMENT="XMLDB file for Moodle mod/data"
|
||||
<XMLDB PATH="mod/data/db" VERSION="20141001" COMMENT="XMLDB file for Moodle mod/data"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:noNamespaceSchemaLocation="../../../lib/xmldb/xmldb.xsd"
|
||||
>
|
||||
@@ -54,6 +54,7 @@
|
||||
<FIELD NAME="type" TYPE="char" LENGTH="255" NOTNULL="true" SEQUENCE="false"/>
|
||||
<FIELD NAME="name" TYPE="char" LENGTH="255" NOTNULL="true" SEQUENCE="false"/>
|
||||
<FIELD NAME="description" TYPE="text" NOTNULL="true" SEQUENCE="false"/>
|
||||
<FIELD NAME="required" TYPE="int" LENGTH="1" NOTNULL="true" DEFAULT="0" SEQUENCE="false" COMMENT="Private fields are only visible or editable by users with additional capabilities"/>
|
||||
<FIELD NAME="param1" TYPE="text" NOTNULL="false" SEQUENCE="false"/>
|
||||
<FIELD NAME="param2" TYPE="text" NOTNULL="false" SEQUENCE="false"/>
|
||||
<FIELD NAME="param3" TYPE="text" NOTNULL="false" SEQUENCE="false"/>
|
||||
@@ -93,11 +94,11 @@
|
||||
<FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true"/>
|
||||
<FIELD NAME="fieldid" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false"/>
|
||||
<FIELD NAME="recordid" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false"/>
|
||||
<FIELD NAME="content" TYPE="text" LENGTH="big" NOTNULL="false" SEQUENCE="false"/>
|
||||
<FIELD NAME="content1" TYPE="text" LENGTH="big" NOTNULL="false" SEQUENCE="false"/>
|
||||
<FIELD NAME="content2" TYPE="text" LENGTH="big" NOTNULL="false" SEQUENCE="false"/>
|
||||
<FIELD NAME="content3" TYPE="text" LENGTH="big" NOTNULL="false" SEQUENCE="false"/>
|
||||
<FIELD NAME="content4" TYPE="text" LENGTH="big" NOTNULL="false" SEQUENCE="false"/>
|
||||
<FIELD NAME="content" TYPE="text" NOTNULL="false" SEQUENCE="false"/>
|
||||
<FIELD NAME="content1" TYPE="text" NOTNULL="false" SEQUENCE="false"/>
|
||||
<FIELD NAME="content2" TYPE="text" NOTNULL="false" SEQUENCE="false"/>
|
||||
<FIELD NAME="content3" TYPE="text" NOTNULL="false" SEQUENCE="false"/>
|
||||
<FIELD NAME="content4" TYPE="text" NOTNULL="false" SEQUENCE="false"/>
|
||||
</FIELDS>
|
||||
<KEYS>
|
||||
<KEY NAME="primary" TYPE="primary" FIELDS="id"/>
|
||||
|
||||
+12
-2
@@ -133,11 +133,21 @@ function xmldb_data_upgrade($oldversion) {
|
||||
|
||||
// Moodle v2.7.0 release upgrade line.
|
||||
// Put any upgrade step following this.
|
||||
if ($oldversion < 2014051201) {
|
||||
// Define field required to be added to data_fields.
|
||||
$table = new xmldb_table('data_fields');
|
||||
$field = new xmldb_field('required', XMLDB_TYPE_INTEGER, '1', null, XMLDB_NOTNULL, null, '0', 'description');
|
||||
|
||||
// Conditionally launch add field required.
|
||||
if (!$dbman->field_exists($table, $field)) {
|
||||
$dbman->add_field($table, $field);
|
||||
}
|
||||
|
||||
upgrade_mod_savepoint(true, 2014051201, 'data');
|
||||
}
|
||||
|
||||
// Moodle v2.8.0 release upgrade line.
|
||||
// Put any upgrade step following this.
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
+106
-72
@@ -34,8 +34,14 @@ $rid = optional_param('rid', 0, PARAM_INT); //record id
|
||||
$cancel = optional_param('cancel', '', PARAM_RAW); // cancel an add
|
||||
$mode ='addtemplate'; //define the mode for this page, only 1 mode available
|
||||
|
||||
|
||||
|
||||
$url = new moodle_url('/mod/data/edit.php');
|
||||
if ($rid !== 0) {
|
||||
$record = $DB->get_record('data_records', array(
|
||||
'id' => $rid,
|
||||
'dataid' => $d,
|
||||
), '*', MUST_EXIST);
|
||||
$url->param('rid', $rid);
|
||||
}
|
||||
if ($cancel !== '') {
|
||||
@@ -152,105 +158,121 @@ if ($rid) {
|
||||
$PAGE->set_title($data->name);
|
||||
$PAGE->set_heading($course->fullname);
|
||||
|
||||
/// Process incoming data for adding/updating records
|
||||
// Process incoming data for adding/updating records.
|
||||
|
||||
// Keep track of any notifications.
|
||||
$generalnotifications = array();
|
||||
$fieldnotifications = array();
|
||||
|
||||
// Process the submitted form.
|
||||
if ($datarecord = data_submitted() and confirm_sesskey()) {
|
||||
if ($rid) {
|
||||
// Updating an existing record.
|
||||
|
||||
$ignorenames = array('MAX_FILE_SIZE','sesskey','d','rid','saveandview','cancel'); // strings to be ignored in input data
|
||||
// Retrieve the format for the fields.
|
||||
$fields = $DB->get_records('data_fields', array('dataid' => $datarecord->d));
|
||||
|
||||
if ($rid) { /// Update some records
|
||||
// Validate the form to ensure that enough data was submitted.
|
||||
$processeddata = data_process_submission($data, $fields, $datarecord);
|
||||
|
||||
/// All student edits are marked unapproved by default
|
||||
$record = $DB->get_record('data_records', array('id'=>$rid));
|
||||
// Add the new notification data.
|
||||
$generalnotifications = array_merge($generalnotifications, $processeddata->generalnotifications);
|
||||
$fieldnotifications = array_merge($fieldnotifications, $processeddata->fieldnotifications);
|
||||
|
||||
/// reset approved flag after student edit
|
||||
if (!has_capability('mod/data:approve', $context)) {
|
||||
$record->approved = 0;
|
||||
}
|
||||
if ($processeddata->validated) {
|
||||
// Enough data to update the record.
|
||||
|
||||
$record->timemodified = time();
|
||||
$DB->update_record('data_records', $record);
|
||||
// Obtain the record to be updated.
|
||||
|
||||
/// Update all content
|
||||
$field = NULL;
|
||||
foreach ($datarecord as $name => $value) {
|
||||
if (!in_array($name, $ignorenames)) {
|
||||
$namearr = explode('_',$name); // Second one is the field id
|
||||
if (empty($field->field) || ($namearr[1] != $field->field->id)) { // Try to reuse classes
|
||||
$field = data_get_field_from_id($namearr[1], $data);
|
||||
}
|
||||
if ($field) {
|
||||
$field->update_content($rid, $value, $name);
|
||||
}
|
||||
// Reset the approved flag after edit if the user does not have permission to approve their own entries.
|
||||
if (!has_capability('mod/data:approve', $context)) {
|
||||
$record->approved = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Trigger an event for updating this record.
|
||||
$event = \mod_data\event\record_updated::create(array(
|
||||
'objectid' => $rid,
|
||||
'context' => $context,
|
||||
'courseid' => $course->id,
|
||||
'other' => array(
|
||||
'dataid' => $data->id
|
||||
)
|
||||
));
|
||||
$event->add_record_snapshot('data', $data);
|
||||
$event->trigger();
|
||||
// Update the parent record.
|
||||
$record->timemodified = time();
|
||||
$DB->update_record('data_records', $record);
|
||||
|
||||
redirect($CFG->wwwroot.'/mod/data/view.php?d='.$data->id.'&rid='.$rid);
|
||||
|
||||
} else { /// Add some new records
|
||||
///Empty form checking - you can't submit an empty form!
|
||||
|
||||
$emptyform = true; // assume the worst
|
||||
|
||||
foreach ($datarecord as $name => $value) {
|
||||
if (!in_array($name, $ignorenames)) {
|
||||
$namearr = explode('_', $name); // Second one is the field id
|
||||
if (empty($field->field) || ($namearr[1] != $field->field->id)) { // Try to reuse classes
|
||||
$field = data_get_field_from_id($namearr[1], $data);
|
||||
}
|
||||
if ($field->notemptyfield($value, $name)) {
|
||||
$emptyform = false;
|
||||
break; // if anything has content, this form is not empty, so stop now!
|
||||
}
|
||||
// Update all content.
|
||||
foreach ($processeddata->fields as $fieldname => $field) {
|
||||
$field->update_content($rid, $datarecord->$fieldname, $fieldname);
|
||||
}
|
||||
|
||||
// Trigger an event for updating this record.
|
||||
$event = \mod_data\event\record_updated::create(array(
|
||||
'objectid' => $rid,
|
||||
'context' => $context,
|
||||
'courseid' => $course->id,
|
||||
'other' => array(
|
||||
'dataid' => $data->id
|
||||
)
|
||||
));
|
||||
$event->add_record_snapshot('data', $data);
|
||||
$event->trigger();
|
||||
|
||||
$viewurl = new moodle_url('/mod/data/view.php', array(
|
||||
'd' => $data->id,
|
||||
'rid' => $rid,
|
||||
));
|
||||
redirect($viewurl);
|
||||
}
|
||||
|
||||
if ($emptyform){ //nothing gets written to database
|
||||
echo $OUTPUT->notification(get_string('emptyaddform','data'));
|
||||
}
|
||||
} else {
|
||||
// No recordid was specified - creating a new entry.
|
||||
|
||||
if (!$emptyform && $recordid = data_add_record($data, $currentgroup)) { //add instance to data_record
|
||||
// Retrieve the format for the fields.
|
||||
$fields = $DB->get_records('data_fields', array('dataid' => $datarecord->d));
|
||||
|
||||
/// Insert a whole lot of empty records to make sure we have them
|
||||
$fields = $DB->get_records('data_fields', array('dataid'=>$data->id));
|
||||
// Validate the form to ensure that enough data was submitted.
|
||||
$processeddata = data_process_submission($data, $fields, $datarecord);
|
||||
|
||||
// Add the new notification data.
|
||||
$generalnotifications = array_merge($generalnotifications, $processeddata->generalnotifications);
|
||||
$fieldnotifications = array_merge($fieldnotifications, $processeddata->fieldnotifications);
|
||||
|
||||
// Add instance to data_record.
|
||||
if ($processeddata->validated && $recordid = data_add_record($data, $currentgroup)) {
|
||||
|
||||
// Insert a whole lot of empty records to make sure we have them.
|
||||
$records = array();
|
||||
foreach ($fields as $field) {
|
||||
$content = new stdClass();
|
||||
$content->recordid = $recordid;
|
||||
$content->fieldid = $field->id;
|
||||
$DB->insert_record('data_content',$content);
|
||||
$records[] = $content;
|
||||
}
|
||||
|
||||
/// For each field in the add form, add it to the data_content.
|
||||
foreach ($datarecord as $name => $value){
|
||||
if (!in_array($name, $ignorenames)) {
|
||||
$namearr = explode('_', $name); // Second one is the field id
|
||||
if (empty($field->field) || ($namearr[1] != $field->field->id)) { // Try to reuse classes
|
||||
$field = data_get_field_from_id($namearr[1], $data);
|
||||
}
|
||||
if ($field) {
|
||||
$field->update_content($recordid, $value, $name);
|
||||
}
|
||||
}
|
||||
// Bulk insert the records now. Some records may have no data but all must exist.
|
||||
$DB->insert_records('data_content', $records);
|
||||
|
||||
// Add all provided content.
|
||||
foreach ($processeddata->fields as $fieldname => $field) {
|
||||
$field->update_content($recordid, $datarecord->$fieldname, $fieldname);
|
||||
}
|
||||
|
||||
// Trigger an event for updating this record.
|
||||
$event = \mod_data\event\record_created::create(array(
|
||||
'objectid' => $rid,
|
||||
'context' => $context,
|
||||
'courseid' => $course->id,
|
||||
'other' => array(
|
||||
'dataid' => $data->id
|
||||
)
|
||||
));
|
||||
$event->add_record_snapshot('data', $data);
|
||||
$event->trigger();
|
||||
|
||||
if (!empty($datarecord->saveandview)) {
|
||||
redirect($CFG->wwwroot.'/mod/data/view.php?d='.$data->id.'&rid='.$recordid);
|
||||
$viewurl = new moodle_url('/mod/data/view.php', array(
|
||||
'd' => $data->id,
|
||||
'rid' => $recordid,
|
||||
));
|
||||
redirect($viewurl);
|
||||
}
|
||||
}
|
||||
}
|
||||
} // End of form processing
|
||||
}
|
||||
// End of form processing.
|
||||
|
||||
|
||||
/// Print the page header
|
||||
@@ -300,9 +322,18 @@ if ($data->addtemplate){
|
||||
|
||||
// To skip unnecessary calls to display_add_field().
|
||||
if (strpos($data->addtemplate, "[[".$field->field->name."]]") !== false) {
|
||||
// Replace the field tag.
|
||||
$patterns[] = "[[".$field->field->name."]]";
|
||||
$replacements[] = $field->display_add_field($rid);
|
||||
$errors = '';
|
||||
if (!empty($fieldnotifications[$field->field->name])) {
|
||||
foreach ($fieldnotifications[$field->field->name] as $notification) {
|
||||
$errors .= $OUTPUT->notification($notification);
|
||||
}
|
||||
}
|
||||
$replacements[] = $errors . $field->display_add_field($rid);
|
||||
}
|
||||
|
||||
// Replace the field id tag.
|
||||
$patterns[] = "[[".$field->field->name."#id]]";
|
||||
$replacements[] = 'field_'.$field->field->id;
|
||||
}
|
||||
@@ -313,6 +344,9 @@ if ($data->addtemplate){
|
||||
$newtext = '';
|
||||
}
|
||||
|
||||
foreach ($generalnotifications as $notification) {
|
||||
echo $OUTPUT->notification($notification);
|
||||
}
|
||||
echo $newtext;
|
||||
|
||||
echo '<div class="mdl-align"><input type="submit" name="saveandview" value="'.get_string('saveandview','data').'" />';
|
||||
|
||||
+29
-15
@@ -146,6 +146,7 @@ switch ($mode) {
|
||||
|
||||
$field->field->name = $fieldinput->name;
|
||||
$field->field->description = $fieldinput->description;
|
||||
$field->field->required = !empty($fieldinput->required) ? 1 : 0;
|
||||
|
||||
for ($i=1; $i<=10; $i++) {
|
||||
if (isset($fieldinput->{'param'.$i})) {
|
||||
@@ -264,7 +265,13 @@ if (($mode == 'new') && (!empty($newtype)) && confirm_sesskey()) { ///
|
||||
} 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->head = array(
|
||||
get_string('fieldname','data'),
|
||||
get_string('type', 'data'),
|
||||
get_string('required', 'data'),
|
||||
get_string('fielddescription', 'data'),
|
||||
get_string('action','data'),
|
||||
);
|
||||
$table->align = array('left','left','left', 'center');
|
||||
$table->wrap = array(false,false,false,false);
|
||||
|
||||
@@ -273,21 +280,28 @@ if (($mode == 'new') && (!empty($newtype)) && confirm_sesskey()) { ///
|
||||
|
||||
$field = data_get_field($ff, $data);
|
||||
|
||||
$baseurl = new moodle_url('/mod/data/field.php', array(
|
||||
'd' => $data->id,
|
||||
'fid' => $field->field->id,
|
||||
'sesskey' => sesskey(),
|
||||
));
|
||||
|
||||
$displayurl = new moodle_url($baseurl, array(
|
||||
'mode' => 'display',
|
||||
));
|
||||
|
||||
$deleteurl = new moodle_url($baseurl, array(
|
||||
'mode' => 'delete',
|
||||
));
|
||||
|
||||
$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>'
|
||||
|
||||
html_writer::link($displayurl, $field->field->name),
|
||||
$field->image() . ' ' . get_string($field->type, 'data'),
|
||||
$field->field->required ? get_string('yes') : get_string('no'),
|
||||
shorten_text($field->field->description, 30),
|
||||
html_writer::link($displayurl, $OUTPUT->pix_icon('t/edit', get_string('edit'))) .
|
||||
' ' .
|
||||
html_writer::link($deleteurl, $OUTPUT->pix_icon('t/delete', get_string('delete'))),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,19 +26,27 @@ class data_field_checkbox extends data_field_base {
|
||||
|
||||
var $type = 'checkbox';
|
||||
|
||||
function display_add_field($recordid=0) {
|
||||
function display_add_field($recordid = 0, $formdata = null) {
|
||||
global $CFG, $DB;
|
||||
|
||||
$content = array();
|
||||
|
||||
if ($recordid) {
|
||||
if ($formdata) {
|
||||
$fieldname = 'field_' . $this->field->id;
|
||||
$content = $formdata->$fieldname;
|
||||
} else if ($recordid) {
|
||||
$content = $DB->get_field('data_content', 'content', array('fieldid'=>$this->field->id, 'recordid'=>$recordid));
|
||||
$content = explode('##', $content);
|
||||
} else {
|
||||
$content = array();
|
||||
}
|
||||
|
||||
$str = '<div title="'.s($this->field->description).'">';
|
||||
$str = '';
|
||||
if ($this->field->required) {
|
||||
$str .= '<div title="' . get_string('requiredfieldhint', 'data', s($this->field->description)) . '">';
|
||||
} else {
|
||||
$str .= '<div title="' . s($this->field->description) . '">';
|
||||
}
|
||||
$str .= '<fieldset><legend><span class="accesshide">'.$this->field->name.'</span></legend>';
|
||||
|
||||
$i = 0;
|
||||
@@ -211,5 +219,22 @@ class data_field_checkbox extends data_field_base {
|
||||
return implode('##', $vals);
|
||||
}
|
||||
|
||||
}
|
||||
/**
|
||||
* Check whether any boxes in the checkbox where checked.
|
||||
*
|
||||
* @param mixed $value The submitted values
|
||||
* @param mixed $name
|
||||
* @return bool
|
||||
*/
|
||||
function notemptyfield($value, $name) {
|
||||
$found = false;
|
||||
foreach ($value as $checkboxitem) {
|
||||
if (!empty($checkboxitem)) {
|
||||
$found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return $found;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -7,6 +7,10 @@
|
||||
<td class="c0"><label for="description"><?php echo get_string('fielddescription', 'data'); ?></label></td>
|
||||
<td class="c1"><input class="fielddescription" type="text" name="description" id="description" value="<?php p($this->field->description); ?>" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="c0"><label for="required"><?php echo get_string('requiredfield', 'data'); ?></label></td>
|
||||
<td class="c1"><input class="requiredfield" type="checkbox" name="required" id="required" <?php p($this->field->required ? "checked=\"checked\"" : ""); ?>/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="c0" valign="top"><label for="param1"><?php echo get_string('fieldoptions', 'data'); ?></label></td>
|
||||
<td class="c1"><textarea class="optionstextarea" name="param1" id="param1" cols="80" rows="10"><?php if($this->field->param1) {p($this->field->param1);} ?></textarea></td>
|
||||
|
||||
@@ -34,16 +34,29 @@ class data_field_date extends data_field_base {
|
||||
var $month = 0;
|
||||
var $year = 0;
|
||||
|
||||
function display_add_field($recordid=0) {
|
||||
function display_add_field($recordid = 0, $formdata = null) {
|
||||
global $DB, $OUTPUT;
|
||||
|
||||
if ($recordid) {
|
||||
if ($formdata) {
|
||||
$fieldname = 'field_' . $this->field->id . '_day';
|
||||
$day = $formdata->$fieldname;
|
||||
$fieldname = 'field_' . $this->field->id . '_month';
|
||||
$month = $formdata->$fieldname;
|
||||
$fieldname = 'field_' . $this->field->id . '_year';
|
||||
$year = $formdata->$fieldname;
|
||||
$content = make_timestamp($year, $month, $day, 12, 0, 0, 0, false);
|
||||
} else if ($recordid) {
|
||||
$content = (int)$DB->get_field('data_content', 'content', array('fieldid'=>$this->field->id, 'recordid'=>$recordid));
|
||||
} else {
|
||||
$content = time();
|
||||
}
|
||||
|
||||
$str = '<div title="'.s($this->field->description).'">';
|
||||
$str = '';
|
||||
if ($this->field->required) {
|
||||
$str .= '<div title="' . get_string('requiredfieldhint', 'data', s($this->field->description)) . '">';
|
||||
} else {
|
||||
$str .= '<div title="' . s($this->field->description) . '">';
|
||||
}
|
||||
$dayselector = html_writer::select_time('days', 'field_'.$this->field->id.'_day', $content);
|
||||
$monthselector = html_writer::select_time('months', 'field_'.$this->field->id.'_month', $content);
|
||||
$yearselector = html_writer::select_time('years', 'field_'.$this->field->id.'_year', $content);
|
||||
@@ -128,5 +141,3 @@ class data_field_date extends data_field_base {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
class data_field_file extends data_field_base {
|
||||
var $type = 'file';
|
||||
|
||||
function display_add_field($recordid=0) {
|
||||
function display_add_field($recordid = 0, $formdata = null) {
|
||||
global $CFG, $DB, $OUTPUT, $PAGE, $USER;
|
||||
|
||||
$file = false;
|
||||
@@ -36,7 +36,10 @@ class data_field_file extends data_field_base {
|
||||
$itemid = null;
|
||||
|
||||
// editing an existing database entry
|
||||
if ($recordid){
|
||||
if ($formdata) {
|
||||
$fieldname = 'field_' . $this->field->id . '_file';
|
||||
$itemid = $formdata->$fieldname;
|
||||
} else if ($recordid){
|
||||
if ($content = $DB->get_record('data_content', array('fieldid'=>$this->field->id, 'recordid'=>$recordid))) {
|
||||
|
||||
file_prepare_draft_area($itemid, $this->context->id, 'mod_data', 'content', $content->id);
|
||||
@@ -64,7 +67,11 @@ class data_field_file extends data_field_base {
|
||||
|
||||
$html = '';
|
||||
// database entry label
|
||||
$html .= '<div title="'.s($this->field->description).'">';
|
||||
if ($this->field->required) {
|
||||
$html .= '<div title="' . get_string('requiredfieldhint', 'data', s($this->field->description)) . '">';
|
||||
} else {
|
||||
$html .= '<div title="' . s($this->field->description) . '">';
|
||||
}
|
||||
$html .= '<fieldset><legend><span class="accesshide">'.$this->field->name.'</span></legend>';
|
||||
|
||||
// itemid element
|
||||
@@ -84,6 +91,9 @@ class data_field_file extends data_field_base {
|
||||
$output = $PAGE->get_renderer('core', 'files');
|
||||
$html .= $output->render($fm);
|
||||
|
||||
if ($this->field->required) {
|
||||
$html .= '<span class="requiredfield">' . get_string('requiredfieldshort', 'data') . '</span>';
|
||||
}
|
||||
$html .= '</fieldset>';
|
||||
$html .= '</div>';
|
||||
|
||||
@@ -204,6 +214,24 @@ class data_field_file extends data_field_base {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Custom notempty function
|
||||
*
|
||||
* @param string $value
|
||||
* @param string $name
|
||||
* @return bool
|
||||
*/
|
||||
function notemptyfield($value, $name) {
|
||||
global $USER;
|
||||
|
||||
$names = explode('_', $name);
|
||||
if ($names[2] == 'file') {
|
||||
$usercontext = context_user::instance($USER->id);
|
||||
$fs = get_file_storage();
|
||||
$files = $fs->get_area_files($usercontext->id, 'user', 'draft', $value);
|
||||
return count($files) >= 2;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -7,6 +7,10 @@
|
||||
<td class="c0"><label for="description"><?php echo get_string('fielddescription', 'data'); ?></label></td>
|
||||
<td class="c1"><input class="fielddescription" type="text" name="description" id="description" value="<?php p($this->field->description);?>" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="c0"><label for="required"><?php echo get_string('requiredfield', 'data'); ?></label></td>
|
||||
<td class="c1"><input class="requiredfield" type="checkbox" name="required" id="required" <?php p($this->field->required ? "checked=\"checked\"" : ""); ?>/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="c0"><label for="param3">
|
||||
<?php echo get_string('maxsize', 'data'); ?></label></td>
|
||||
|
||||
@@ -43,24 +43,41 @@ class data_field_latlong extends data_field_base {
|
||||
);
|
||||
// Other map sources listed at http://kvaleberg.com/extensions/mapsources/index.php?params=51_30.4167_N_0_7.65_W_region:earth
|
||||
|
||||
function display_add_field($recordid=0) {
|
||||
function display_add_field($recordid = 0, $formdata = null) {
|
||||
global $CFG, $DB;
|
||||
|
||||
$lat = '';
|
||||
$long = '';
|
||||
if ($recordid) {
|
||||
if ($formdata) {
|
||||
$fieldname = 'field_' . $this->field->id . '_0';
|
||||
$lat = $formdata->$fieldname;
|
||||
$fieldname = 'field_' . $this->field->id . '_1';
|
||||
$long = $formdata->$fieldname;
|
||||
} else if ($recordid) {
|
||||
if ($content = $DB->get_record('data_content', array('fieldid'=>$this->field->id, 'recordid'=>$recordid))) {
|
||||
$lat = $content->content;
|
||||
$long = $content->content1;
|
||||
}
|
||||
}
|
||||
$str = '<div title="'.s($this->field->description).'">';
|
||||
$str = '';
|
||||
if ($this->field->required) {
|
||||
$str .= '<div title="' . get_string('requiredfieldhint', 'data', s($this->field->description)) . '">';
|
||||
} else {
|
||||
$str .= '<div title="' . s($this->field->description) . '">';
|
||||
}
|
||||
$str .= '<fieldset><legend><span class="accesshide">'.$this->field->name.'</span></legend>';
|
||||
$str .= '<table><tr><td align="right">';
|
||||
$str .= '<label for="field_'.$this->field->id.'_0">' . get_string('latitude', 'data') . '</label></td><td><input type="text" name="field_'.$this->field->id.'_0" id="field_'.$this->field->id.'_0" value="'.s($lat).'" size="10" />°N</td></tr>';
|
||||
$str .= '<tr><td align="right"><label for="field_'.$this->field->id.'_1">' . get_string('longitude', 'data') . '</label></td><td><input type="text" name="field_'.$this->field->id.'_1" id="field_'.$this->field->id.'_1" value="'.s($long).'" size="10" />°E</td></tr>';
|
||||
$str .= '<tr><td align="right"><label for="field_'.$this->field->id.'_1">' . get_string('longitude', 'data') . '</label></td><td><input type="text" name="field_'.$this->field->id.'_1" id="field_'.$this->field->id.'_1" value="'.s($long).'" size="10" />°E</td>';
|
||||
if ($this->field->required) {
|
||||
$str .= '<td><span class="requiredfield">' . get_string('requiredfieldshort', 'data') . '</span></td>';
|
||||
}
|
||||
$str .= '</tr>';
|
||||
$str .= '</table>';
|
||||
$str .= '</fieldset>';
|
||||
if ($this->field->required) {
|
||||
$str .= get_string('requiredfieldhint', 'data', s($this->field->description));
|
||||
}
|
||||
$str .= '</div>';
|
||||
return $str;
|
||||
}
|
||||
@@ -224,5 +241,3 @@ class data_field_latlong extends data_field_base {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -7,6 +7,10 @@
|
||||
<td class="c0"><label for="description"><?php echo get_string('fielddescription', 'data'); ?></label></td>
|
||||
<td class="c1"><input class="fielddescription" type="text" name="description" id="description" value="<?php p ($this->field->description);?>" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="c0"><label for="required"><?php echo get_string('requiredfield', 'data'); ?></label></td>
|
||||
<td class="c1"><input class="requiredfield" type="checkbox" name="required" id="required" <?php p($this->field->required?"checked=\"checked\"":""); ?>/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="c0"><label for="param1"><?php echo get_string('latlonglinkservicesdisplayed', 'data'); ?></label></td>
|
||||
<td class="c1">
|
||||
|
||||
@@ -26,17 +26,24 @@ class data_field_menu extends data_field_base {
|
||||
|
||||
var $type = 'menu';
|
||||
|
||||
function display_add_field($recordid=0) {
|
||||
function display_add_field($recordid = 0, $formdata = null) {
|
||||
global $DB, $OUTPUT;
|
||||
|
||||
if ($recordid){
|
||||
if ($formdata) {
|
||||
$fieldname = 'field_' . $this->field->id;
|
||||
$content = $formdata->$fieldname;
|
||||
} else if ($recordid){
|
||||
$content = $DB->get_field('data_content', 'content', array('fieldid'=>$this->field->id, 'recordid'=>$recordid));
|
||||
$content = trim($content);
|
||||
} else {
|
||||
$content = '';
|
||||
}
|
||||
|
||||
$str = '<div title="'.s($this->field->description).'">';
|
||||
$str = '';
|
||||
if ($this->field->required) {
|
||||
$str .= '<div title="' . get_string('requiredfieldhint', 'data', s($this->field->description)) . '">';
|
||||
} else {
|
||||
$str .= '<div title="' . s($this->field->description) . '">';
|
||||
}
|
||||
|
||||
$options = array();
|
||||
$rawoptions = explode("\n",$this->field->param1);
|
||||
@@ -49,6 +56,9 @@ class data_field_menu extends data_field_base {
|
||||
|
||||
$str .= html_writer::label(get_string('menuchoose', 'data'), 'field_'.$this->field->id, false, array('class' => 'accesshide'));
|
||||
$str .= html_writer::select($options, 'field_'.$this->field->id, $content, array(''=>get_string('menuchoose', 'data')), array('id'=>'field_'.$this->field->id));
|
||||
if ($this->field->required) {
|
||||
$str .= '<span class="requiredfield">' . get_string('requiredfieldshort', 'data') . '</span>';
|
||||
}
|
||||
|
||||
$str .= '</div>';
|
||||
|
||||
@@ -108,5 +118,3 @@ class data_field_menu extends data_field_base {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -7,6 +7,11 @@
|
||||
<td class="c0"><label for="description"><?php echo get_string('fielddescription', 'data'); ?></label></td>
|
||||
<td class="c1"><input class="fielddescription" type="text" name="description" id="description" value="<?php p($this->field->description);?>" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<tr>
|
||||
<td class="c0"><label for="required"><?php echo get_string('requiredfield', 'data'); ?></label></td>
|
||||
<td class="c1"><input class="requiredfield" type="checkbox" name="required" id="required" <?php p($this->field->required?"checked=\"checked\"":""); ?>/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="c0" valign="top"><label for="param1"><?php echo get_string('fieldoptions', 'data'); ?></label></td>
|
||||
<td class="c1"><textarea class="optionstextarea" name="param1" id="param1" cols="80" rows="10"><?php if($this->field->param1) {p($this->field->param1);} ?></textarea></td>
|
||||
|
||||
@@ -26,10 +26,13 @@ class data_field_multimenu extends data_field_base {
|
||||
|
||||
var $type = 'multimenu';
|
||||
|
||||
function display_add_field($recordid=0) {
|
||||
function display_add_field($recordid = 0, $formdata = null) {
|
||||
global $DB;
|
||||
|
||||
if ($recordid){
|
||||
if ($formdata) {
|
||||
$fieldname = 'field_' . $this->field->id;
|
||||
$content = $formdata->$fieldname;
|
||||
} else if ($recordid){
|
||||
$content = $DB->get_field('data_content', 'content', array('fieldid'=>$this->field->id, 'recordid'=>$recordid));
|
||||
$content = explode('##', $content);
|
||||
} else {
|
||||
@@ -239,4 +242,3 @@ class data_field_multimenu extends data_field_base {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -7,4 +7,8 @@
|
||||
<td class="c0"><label for="description"><?php echo get_string('fielddescription', 'data'); ?></label></td>
|
||||
<td class="c1"><input class="fielddescription" type="text" name="description" id="description" value="<?php p($this->field->description);?>" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="c0"><label for="required"><?php echo get_string('requiredfield', 'data'); ?></label></td>
|
||||
<td class="c1"><input class="requiredfield" type="checkbox" name="required" id="required" <?php p($this->field->required?"checked=\"checked\"":""); ?>/></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
@@ -27,7 +27,7 @@ class data_field_picture extends data_field_base {
|
||||
var $previewwidth = 50;
|
||||
var $previewheight = 50;
|
||||
|
||||
function display_add_field($recordid=0) {
|
||||
function display_add_field($recordid = 0, $formdata = null) {
|
||||
global $CFG, $DB, $OUTPUT, $USER, $PAGE;
|
||||
|
||||
$file = false;
|
||||
@@ -37,7 +37,10 @@ class data_field_picture extends data_field_base {
|
||||
$itemid = null;
|
||||
$fs = get_file_storage();
|
||||
|
||||
if ($recordid) {
|
||||
if ($formdata) {
|
||||
$fieldname = 'field_' . $this->field->id . '_file';
|
||||
$itemid = $formdata->$fieldname;
|
||||
} else if ($recordid) {
|
||||
if ($content = $DB->get_record('data_content', array('fieldid'=>$this->field->id, 'recordid'=>$recordid))) {
|
||||
file_prepare_draft_area($itemid, $this->context->id, 'mod_data', 'content', $content->id);
|
||||
if (!empty($content->content)) {
|
||||
@@ -64,8 +67,12 @@ class data_field_picture extends data_field_base {
|
||||
} else {
|
||||
$itemid = file_get_unused_draft_itemid();
|
||||
}
|
||||
|
||||
$str = '<div title="'.s($this->field->description).'">';
|
||||
$str = '';
|
||||
if ($this->field->required) {
|
||||
$str .= '<div title="' . get_string('requiredfieldhint', 'data', s($this->field->description)) . '">';
|
||||
} else {
|
||||
$str .= '<div title="' . s($this->field->description) . '">';
|
||||
}
|
||||
$str .= '<fieldset><legend><span class="accesshide">'.$this->field->name.'</span></legend>';
|
||||
$str .= '<noscript>';
|
||||
if ($file) {
|
||||
@@ -96,6 +103,9 @@ class data_field_picture extends data_field_base {
|
||||
$str .= '<input type="hidden" name="field_'.$this->field->id.'_file" value="'.$itemid.'" />';
|
||||
$str .= '<label for="field_'.$this->field->id.'_alttext">'.get_string('alttext','data') .'</label> <input type="text" name="field_'
|
||||
.$this->field->id.'_alttext" id="field_'.$this->field->id.'_alttext" value="'.s($alttext).'" />';
|
||||
if ($this->field->required) {
|
||||
$str .= '<span class="requiredfield">' . get_string('requiredfieldshort', 'data') . '</span>';
|
||||
}
|
||||
$str .= '</div>';
|
||||
|
||||
$str .= '</fieldset>';
|
||||
@@ -290,6 +300,24 @@ class data_field_picture extends data_field_base {
|
||||
function file_ok($path) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Custom notempty function
|
||||
*
|
||||
* @param string $value
|
||||
* @param string $name
|
||||
* @return bool
|
||||
*/
|
||||
function notemptyfield($value, $name) {
|
||||
global $USER;
|
||||
|
||||
$names = explode('_',$name);
|
||||
if ($names[2] == 'file') {
|
||||
$usercontext = context_user::instance($USER->id);
|
||||
$fs = get_file_storage();
|
||||
$files = $fs->get_area_files($usercontext->id, 'user', 'draft', $value);
|
||||
return count($files)>=2;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -12,6 +12,11 @@
|
||||
<input class="fielddescription" type="text" name="description" id="description" value="<?php p($this->field->description);?>" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<tr>
|
||||
<td class="c0"><label for="required"><?php echo get_string('requiredfield', 'data'); ?></label></td>
|
||||
<td class="c1"><input class="requiredfield" type="checkbox" name="required" id="required" <?php p($this->field->required?"checked=\"checked\"":""); ?>/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="c0"><label for="param1">
|
||||
<?php echo get_string('fieldwidthsingleview', 'data');?></label></td>
|
||||
|
||||
@@ -26,20 +26,32 @@ class data_field_radiobutton extends data_field_base {
|
||||
|
||||
var $type = 'radiobutton';
|
||||
|
||||
function display_add_field($recordid=0) {
|
||||
function display_add_field($recordid = 0, $formdata = null) {
|
||||
global $CFG, $DB;
|
||||
|
||||
if ($recordid){
|
||||
if ($formdata) {
|
||||
$fieldname = 'field_' . $this->field->id;
|
||||
$content = $formdata->$fieldname;
|
||||
} else if ($recordid){
|
||||
$content = trim($DB->get_field('data_content', 'content', array('fieldid'=>$this->field->id, 'recordid'=>$recordid)));
|
||||
} else {
|
||||
$content = '';
|
||||
}
|
||||
|
||||
$str = '<div title="'.s($this->field->description).'">';
|
||||
$str = '';
|
||||
if ($this->field->required) {
|
||||
$str .= '<div title="' . get_string('requiredfieldhint', 'data', s($this->field->description)) . '">';
|
||||
} else {
|
||||
$str .= '<div title="' . s($this->field->description) . '">';
|
||||
}
|
||||
$str .= '<fieldset><legend><span class="accesshide">'.$this->field->name.'</span></legend>';
|
||||
|
||||
$i = 0;
|
||||
foreach (explode("\n",$this->field->param1) as $radio) {
|
||||
$requiredstr = '';
|
||||
if ($this->field->required) {
|
||||
$requiredstr = '<span class="requiredfield">' . get_string('requiredfieldshort', 'data') . '</span>';
|
||||
}
|
||||
$options = explode("\n",$this->field->param1);
|
||||
foreach ($options as $radio) {
|
||||
$radio = trim($radio);
|
||||
if ($radio === '') {
|
||||
continue; // skip empty lines
|
||||
@@ -54,7 +66,11 @@ class data_field_radiobutton extends data_field_base {
|
||||
$str .= '/>';
|
||||
}
|
||||
|
||||
$str .= '<label for="field_'.$this->field->id.'_'.$i.'">'.$radio.'</label><br />';
|
||||
$str .= '<label for="field_'.$this->field->id.'_'.$i.'">'.$radio.'</label>';
|
||||
if ($i == count($options) - 1) {
|
||||
$str .= $requiredstr;
|
||||
}
|
||||
$str .= '<br />';
|
||||
$i++;
|
||||
}
|
||||
$str .= '</fieldset>';
|
||||
|
||||
@@ -7,6 +7,11 @@
|
||||
<td class="c0"><label for="description"><?php echo get_string('fielddescription', 'data'); ?></label></td>
|
||||
<td class="c1"><input class="fielddescription" type="text" name="description" id="description" value="<?php p($this->field->description); ?>" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<tr>
|
||||
<td class="c0"><label for="required"><?php echo get_string('requiredfield', 'data'); ?></label></td>
|
||||
<td class="c1"><input class="requiredfield" type="checkbox" name="required" id="required" <?php p($this->field->required?"checked=\"checked\"":""); ?>/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="c0" valign="top"><label for="param1"><?php echo get_string('fieldoptions', 'data'); ?></label></td>
|
||||
<td class="c1"><textarea class="optionstextarea" name="param1" id="param1" cols="80" rows="10"><?php if($this->field->param1) {p($this->field->param1);} ?></textarea></td>
|
||||
|
||||
@@ -7,6 +7,11 @@
|
||||
<td class="c0"><label for="description"><?php echo get_string('fielddescription', 'data'); ?></label></td>
|
||||
<td class="c1"><input class="fielddescription" type="text" name="description" id="description" value="<?php p($this->field->description); ?>" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<tr>
|
||||
<td class="c0"><label for="required"><?php echo get_string('requiredfield', 'data'); ?></label></td>
|
||||
<td class="c1"><input class="requiredfield" type="checkbox" name="required" id="required" <?php p($this->field->required?"checked=\"checked\"":""); ?>/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="c0"><label for="param1"><?php echo get_string('fieldallowautolink', 'data'); ?></label></td>
|
||||
<td class="c1"><input type="checkbox" name="param1" id="param1" <?php if($this->field->param1) {echo 'checked="checked"';} ?> value="1" /></td>
|
||||
|
||||
@@ -49,13 +49,17 @@ class data_field_textarea extends data_field_base {
|
||||
return $options;
|
||||
}
|
||||
|
||||
function display_add_field($recordid=0) {
|
||||
function display_add_field($recordid = 0, $formdata = null) {
|
||||
global $CFG, $DB, $OUTPUT, $PAGE;
|
||||
|
||||
$text = '';
|
||||
$format = 0;
|
||||
|
||||
$str = '<div title="'.$this->field->description.'">';
|
||||
$str = '';
|
||||
if ($this->field->required) {
|
||||
$str .= '<div title="' . get_string('requiredfieldhint', 'data', s($this->field->description)) . '">';
|
||||
} else {
|
||||
$str .= '<div title="' . s($this->field->description) . '">';
|
||||
}
|
||||
|
||||
editors_head_setup();
|
||||
$options = $this->get_options();
|
||||
@@ -63,7 +67,14 @@ class data_field_textarea extends data_field_base {
|
||||
$itemid = $this->field->id;
|
||||
$field = 'field_'.$itemid;
|
||||
|
||||
if ($recordid && $content = $DB->get_record('data_content', array('fieldid'=>$this->field->id, 'recordid'=>$recordid))){
|
||||
if ($formdata) {
|
||||
$fieldname = 'field_' . $this->field->id . '_content1';
|
||||
$format = $formdata->$fieldname;
|
||||
$fieldname = 'field_' . $this->field->id . '_itemid';
|
||||
$draftitemid = $formdata->$fieldname;
|
||||
$fieldname = 'field_' . $this->field->id;
|
||||
$text = $formdata->$fieldname;
|
||||
} else if ($recordid && $content = $DB->get_record('data_content', array('fieldid'=>$this->field->id, 'recordid'=>$recordid))){
|
||||
$format = $content->content1;
|
||||
$text = clean_text($content->content, $format);
|
||||
$text = file_prepare_draft_area($draftitemid, $this->context->id, 'mod_data', 'content', $content->id, $options, $text);
|
||||
@@ -129,8 +140,11 @@ class data_field_textarea extends data_field_base {
|
||||
$str .= '<option value="'.s($key).'" '.$selected.'>'.$desc.'</option>';
|
||||
}
|
||||
$str .= '</select>';
|
||||
$str .= '</div>';
|
||||
|
||||
if ($this->field->required) {
|
||||
$str .= '<span class="requiredfield">' . get_string('requiredfieldshort', 'data') . '</span>';
|
||||
}
|
||||
$str .= '</div>';
|
||||
$str .= '</div>';
|
||||
return $str;
|
||||
}
|
||||
@@ -230,5 +244,20 @@ class data_field_textarea extends data_field_base {
|
||||
function file_ok($relativepath) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Only look at the first item (second is format)
|
||||
*
|
||||
* @param string $value
|
||||
* @param string $name
|
||||
* @return bool
|
||||
*/
|
||||
function notemptyfield($value, $name) {
|
||||
$names = explode('_',$name);
|
||||
//clean first
|
||||
if (count($names) == 2) {
|
||||
return !empty($value);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,6 +10,11 @@
|
||||
value="<?php p($this->field->description); ?>" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<tr>
|
||||
<td class="c0"><label for="required"><?php echo get_string('requiredfield', 'data'); ?></label></td>
|
||||
<td class="c1"><input class="requiredfield" type="checkbox" name="required" id="required" <?php p($this->field->required?"checked=\"checked\"":""); ?>/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="c0"><label for="param2">
|
||||
<?php echo get_string('fieldwidth', 'data'); ?></label></td>
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
class data_field_url extends data_field_base {
|
||||
var $type = 'url';
|
||||
|
||||
function display_add_field($recordid=0) {
|
||||
function display_add_field($recordid = 0, $formdata = null) {
|
||||
global $CFG, $DB, $OUTPUT, $PAGE;
|
||||
|
||||
require_once($CFG->dirroot. '/repository/lib.php'); // necessary for the constants used in args
|
||||
@@ -43,13 +43,25 @@ class data_field_url extends data_field_base {
|
||||
$straddlink = get_string('choosealink', 'repository');
|
||||
$url = '';
|
||||
$text = '';
|
||||
if ($recordid) {
|
||||
if ($formdata) {
|
||||
$fieldname = 'field_' . $this->field->id . '_0';
|
||||
$url = $formdata->$fieldname;
|
||||
$fieldname = 'field_' . $this->field->id . '_1';
|
||||
if (isset($formdata->$fieldname)) {
|
||||
$text = $formdata->$fieldname;
|
||||
}
|
||||
} else if ($recordid) {
|
||||
if ($content = $DB->get_record('data_content', array('fieldid'=>$this->field->id, 'recordid'=>$recordid))) {
|
||||
$url = $content->content;
|
||||
$text = $content->content1;
|
||||
}
|
||||
}
|
||||
$str = '<div title="'.s($this->field->description).'">';
|
||||
$str = '';
|
||||
if ($this->field->required) {
|
||||
$str .= '<div title="' . get_string('requiredfieldhint', 'data', s($this->field->description)) . '">';
|
||||
} else {
|
||||
$str .= '<div title="' . s($this->field->description) . '">';
|
||||
}
|
||||
if (!empty($this->field->param1) and empty($this->field->param2)) {
|
||||
$str .= '<table><tr><td align="right">';
|
||||
$str .= get_string('url','data').':</td><td>';
|
||||
@@ -73,6 +85,9 @@ class data_field_url extends data_field_base {
|
||||
$module = array('name'=>'data_urlpicker', 'fullpath'=>'/mod/data/data.js', 'requires'=>array('core_filepicker'));
|
||||
$PAGE->requires->js_init_call('M.data_urlpicker.init', array($options), true, $module);
|
||||
|
||||
if ($this->field->required) {
|
||||
$str .= '<span class="requiredfield">' . get_string('requiredfieldshort', 'data') . '</span>';
|
||||
}
|
||||
$str .= '</div>';
|
||||
return $str;
|
||||
}
|
||||
@@ -178,5 +193,3 @@ class data_field_url extends data_field_base {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -11,6 +11,10 @@
|
||||
<td class="c0"><label for="param1"><?php echo get_string('autolinkurl', 'data') ?></label></td>
|
||||
<td class="c1"><input type="checkbox" name="param1" id="param1" <?php if($this->field->param1) {echo 'checked="checked"';} ?> value="1" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="c0"><label for="required"><?php echo get_string('requiredfield', 'data'); ?></label></td>
|
||||
<td class="c1"><input class="requiredfield" type="checkbox" name="required" id="required" <?php p($this->field->required?"checked=\"checked\"":""); ?>/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="c0"><label for="param3"><?php echo get_string('openlinkinnewwindow', 'datafield_url') ?></label></td>
|
||||
<td class="c1"><input type="checkbox" name="param3" id="param3" <?php if($this->field->param3) {echo 'checked="checked"';} ?> value="1" /></td>
|
||||
|
||||
@@ -302,12 +302,16 @@ $string['recordsnotsaved'] = 'No entry was saved. Please check the format of the
|
||||
$string['recordssaved'] = 'entries saved';
|
||||
$string['requireapproval'] = 'Approval required';
|
||||
$string['requireapproval_help'] = 'If enabled, entries require approving by a teacher before they are viewable by everyone.';
|
||||
$string['required'] = 'Required';
|
||||
$string['requiredentries'] = 'Entries required for completion';
|
||||
$string['requiredentries_help'] = 'The number of entries a student is required to submit before the activity can be considered complete.';
|
||||
$string['requiredentriestoview'] = 'Entries required before viewing';
|
||||
$string['requiredentriestoview_help'] = 'The number of entries a student is required to submit before they can view entries from other students.
|
||||
|
||||
Note: If entries are required before viewing, the database auto-linking filter should be disabled. This is because the database auto-linking filter can\'t determine whether a user has submitted the required number of entries.';
|
||||
$string['requiredfield'] = 'Required field';
|
||||
$string['requiredfieldhint'] = '{$a} (required field)';
|
||||
$string['requiredfieldshort'] = ' *';
|
||||
$string['resetsettings'] = 'Reset filters';
|
||||
$string['resettemplate'] = 'Reset template';
|
||||
$string['resizingimages'] = 'Resizing image thumbnails...';
|
||||
|
||||
+109
-4
@@ -137,6 +137,7 @@ class data_field_base { // Base class for Database Field Types (see field/*/
|
||||
$this->field->param3 = '';
|
||||
$this->field->name = '';
|
||||
$this->field->description = '';
|
||||
$this->field->required = false;
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -152,6 +153,7 @@ class data_field_base { // Base class for Database Field Types (see field/*/
|
||||
|
||||
$this->field->name = trim($data->name);
|
||||
$this->field->description = trim($data->description);
|
||||
$this->field->required = !empty($data->required)?1:0;
|
||||
|
||||
if (isset($data->param1)) {
|
||||
$this->field->param1 = trim($data->param1);
|
||||
@@ -268,10 +270,13 @@ class data_field_base { // Base class for Database Field Types (see field/*/
|
||||
* @param int $recordid
|
||||
* @return string
|
||||
*/
|
||||
function display_add_field($recordid=0){
|
||||
function display_add_field($recordid=0, $formdata=null){
|
||||
global $DB;
|
||||
|
||||
if ($recordid){
|
||||
if ($formdata) {
|
||||
$fieldname = 'field_' . $this->field->id;
|
||||
$content = $formdata->$fieldname;
|
||||
} else if ($recordid){
|
||||
$content = $DB->get_field('data_content', 'content', array('fieldid'=>$this->field->id, 'recordid'=>$recordid));
|
||||
} else {
|
||||
$content = '';
|
||||
@@ -282,9 +287,17 @@ class data_field_base { // Base class for Database Field Types (see field/*/
|
||||
$content='';
|
||||
}
|
||||
|
||||
$str = '<div title="'.s($this->field->description).'">';
|
||||
$str = '';
|
||||
if ($this->field->required) {
|
||||
$str .= '<div title="' . get_string('requiredfieldhint', 'data', s($this->field->description)) . '">';
|
||||
} else {
|
||||
$str .= '<div title="' . s($this->field->description) . '">';
|
||||
}
|
||||
$str .= '<label class="accesshide" for="field_'.$this->field->id.'">'.$this->field->description.'</label>';
|
||||
$str .= '<input class="basefieldinput" type="text" name="field_'.$this->field->id.'" id="field_'.$this->field->id.'" value="'.s($content).'" />';
|
||||
if ($this->field->required) {
|
||||
$str .= '<span class="requiredfield">' . get_string('requiredfieldshort', 'data') . '</span>';
|
||||
}
|
||||
$str .= '</div>';
|
||||
|
||||
return $str;
|
||||
@@ -548,7 +561,7 @@ function data_generate_default_template(&$data, $template, $recordid=0, $form=fa
|
||||
foreach ($fields as $field) {
|
||||
if ($form) { // Print forms instead of data
|
||||
$fieldobj = data_get_field($field, $data);
|
||||
$token = $fieldobj->display_add_field($recordid);
|
||||
$token = $fieldobj->display_add_field($recordid, null);
|
||||
} else { // Just print the tag
|
||||
$token = '[['.$field->name.']]';
|
||||
}
|
||||
@@ -3751,3 +3764,95 @@ function data_delete_record($recordid, $data, $courseid, $cmid) {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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;
|
||||
|
||||
// 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])) {
|
||||
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('required');
|
||||
$requiredfieldsfilled = false;
|
||||
}
|
||||
|
||||
if ($fieldhascontent) {
|
||||
// The field has content so it should be updatable.
|
||||
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;
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
@@ -68,3 +68,14 @@
|
||||
.dir-rtl .mod-data-default-template .template-field {text-align:left;}
|
||||
.dir-rtl .mod-data-default-template .template-token {text-align:right;}
|
||||
.dir-rtl .mod-data-default-template searchcontrols {text-align:left;}
|
||||
|
||||
#page-mod-data-edit .privatefieldlocked {
|
||||
font-style: italic;
|
||||
color: #888888;
|
||||
}
|
||||
#page-mod-data-view .privatefieldhidden {
|
||||
display: none;
|
||||
}
|
||||
#page-mod-data-edit .requiredfield {
|
||||
color: #ff0000;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,113 @@
|
||||
@mod @mod_data
|
||||
Feature: Users can be required to specify certain fields when adding entries to database activities
|
||||
In order to populate databases
|
||||
As a user
|
||||
I need to specify certain fields when I add entries to databases
|
||||
|
||||
Scenario: Students can add entries to a database
|
||||
Given the following "users" exist:
|
||||
| username | firstname | lastname | email |
|
||||
| student1 | Student | 1 | student1@asd.com |
|
||||
| teacher1 | Teacher | 1 | teacher1@asd.com |
|
||||
And the following "courses" exist:
|
||||
| fullname | shortname | category |
|
||||
| Course 1 | C1 | 0 |
|
||||
And the following "course enrolments" exist:
|
||||
| user | course | role |
|
||||
| teacher1 | C1 | editingteacher |
|
||||
| student1 | C1 | student |
|
||||
And the following "activities" exist:
|
||||
| activity | name | intro | course | idnumber |
|
||||
| data | Test database name | n | C1 | data1 |
|
||||
And I log in as "teacher1"
|
||||
And I follow "Course 1"
|
||||
And I add a "Text input" field to "Test database name" database and I fill the form with:
|
||||
| Field name | Base Text input |
|
||||
| Field description | Base Text input |
|
||||
And I add a "Checkbox" field to "Test database name" database and I fill the form with:
|
||||
| Field name | Required Checkbox |
|
||||
| Field description | Required Checkbox |
|
||||
| Required | yes |
|
||||
| Options | Option 1 |
|
||||
And I add a "Latlong" field to "Test database name" database and I fill the form with:
|
||||
| Field name | Required Latlong |
|
||||
| Field description | Required Latlong |
|
||||
| Required | yes |
|
||||
And I add a "Menu" field to "Test database name" database and I fill the form with:
|
||||
| Field name | Required Menu |
|
||||
| Field description | Required Menu |
|
||||
| Required | yes |
|
||||
| Options | Option 1 |
|
||||
And I add a "Number" field to "Test database name" database and I fill the form with:
|
||||
| Field name | Required Number |
|
||||
| Field description | Required Number |
|
||||
| Required | yes |
|
||||
And I add a "Radio button" field to "Test database name" database and I fill the form with:
|
||||
| Field name | Required Radio |
|
||||
| Field description | Required Radio |
|
||||
| Required | yes |
|
||||
| Options | Option 1 |
|
||||
And I add a "Text input" field to "Test database name" database and I fill the form with:
|
||||
| Field name | Required Text input |
|
||||
| Field description | Required Text input |
|
||||
| Required | yes |
|
||||
And I add a "Text area" field to "Test database name" database and I fill the form with:
|
||||
| Field name | Required Text area |
|
||||
| Field description | Required Text area |
|
||||
| Required | yes |
|
||||
And I add a "URL" field to "Test database name" database and I fill the form with:
|
||||
| Field name | Required URL |
|
||||
| Field description | Required URL |
|
||||
| Required | yes |
|
||||
And I add a "Checkbox" field to "Test database name" database and I fill the form with:
|
||||
| Field name | Not required Checkbox |
|
||||
| Field description | Not required Checkbox |
|
||||
| Options | Option 1 |
|
||||
And I add a "Latlong" field to "Test database name" database and I fill the form with:
|
||||
| Field name | Not required Latlong |
|
||||
| Field description | Not required Latlong |
|
||||
And I add a "Menu" field to "Test database name" database and I fill the form with:
|
||||
| Field name | Not required Menu |
|
||||
| Field description | Not required Menu |
|
||||
| Options | Option 1 |
|
||||
And I add a "Number" field to "Test database name" database and I fill the form with:
|
||||
| Field name | Not required Number |
|
||||
| Field description | Not required Number |
|
||||
And I add a "Radio button" field to "Test database name" database and I fill the form with:
|
||||
| Field name | Not required Radio |
|
||||
| Field description | Not required Radio |
|
||||
| Options | Option 1 |
|
||||
And I add a "Text input" field to "Test database name" database and I fill the form with:
|
||||
| Field name | Not required Text input |
|
||||
| Field description | Not required Text input |
|
||||
And I add a "Text area" field to "Test database name" database and I fill the form with:
|
||||
| Field name | Not required Text area |
|
||||
| Field description | Not required Text area |
|
||||
And I add a "URL" field to "Test database name" database and I fill the form with:
|
||||
| Field name | Not required URL |
|
||||
| Field description | Not required URL |
|
||||
And I follow "Templates"
|
||||
And I log out
|
||||
When I log in as "student1"
|
||||
And I follow "Course 1"
|
||||
And I add an entry to "Test database name" database with:
|
||||
| Base Text input | Some input to allow us to submit the for otherwise empty |
|
||||
And I press "Save and view"
|
||||
Then ".alert.alert-error" "css_element" should exist in the "Required Checkbox" "table_row"
|
||||
Then ".alert.alert-error" "css_element" should exist in the "Required Latlong" "table_row"
|
||||
Then ".alert.alert-error" "css_element" should exist in the "Required Menu" "table_row"
|
||||
Then ".alert.alert-error" "css_element" should exist in the "Required Number" "table_row"
|
||||
Then ".alert.alert-error" "css_element" should exist in the "Required Radio" "table_row"
|
||||
Then ".alert.alert-error" "css_element" should exist in the "Required Text input" "table_row"
|
||||
Then ".alert.alert-error" "css_element" should exist in the "Required Text area" "table_row"
|
||||
Then ".alert.alert-error" "css_element" should exist in the "Required URL" "table_row"
|
||||
Then ".alert.alert-error" "css_element" should not exist in the "Not required Checkbox" "table_row"
|
||||
Then ".alert.alert-error" "css_element" should not exist in the "Not required Latlong" "table_row"
|
||||
Then ".alert.alert-error" "css_element" should not exist in the "Not required Menu" "table_row"
|
||||
Then ".alert.alert-error" "css_element" should not exist in the "Not required Number" "table_row"
|
||||
Then ".alert.alert-error" "css_element" should not exist in the "Not required Radio" "table_row"
|
||||
Then ".alert.alert-error" "css_element" should not exist in the "Not required Text input" "table_row"
|
||||
Then ".alert.alert-error" "css_element" should not exist in the "Not required Text area" "table_row"
|
||||
Then ".alert.alert-error" "css_element" should not exist in the "Not required URL" "table_row"
|
||||
And I follow "View list"
|
||||
And I should see "No entries in database"
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$plugin->version = 2014111000; // The current module version (Date: YYYYMMDDXX)
|
||||
$plugin->version = 2014111001; // The current module version (Date: YYYYMMDDXX)
|
||||
$plugin->requires = 2014110400; // Requires this Moodle version
|
||||
$plugin->component = 'mod_data'; // Full name of the plugin (used for diagnostics)
|
||||
$plugin->cron = 0;
|
||||
|
||||
Reference in New Issue
Block a user