/** * Makes sure that a custom field (identified by $field->shortname) exists * for the given context level. If not, it will create a field, putting it * in the given category (identified by $category->name), creating it if * necessary. * * @param object a field object, specifying the field configuration if a * new field is created * @param mixed the context level * @param object a field_category object, specifying the category * configuration if a new category is created * @return object a field object */ static function ensure_field_exists_for_context_level($field, $ctx_lvl, $category) { if (!is_numeric($ctx_lvl)) { $ctx_lvl = context_level_base::get_custom_context_level($ctx_lvl, 'block_curr_admin'); } // see if we need to create a new field $fields = field::get_for_context_level($ctx_lvl); if (!empty($fields)) { foreach ($fields as $f) { if ($f->shortname === $field->shortname) { return new field($f); } } } // No existing field found. See if we need to create a category for it $categories = field_category::get_for_context_level($ctx_lvl); $found = false; if (!empty($categories)) { foreach ($categories as $c) { if ($c->name === $category->name) { $category = $found = $c; break; } } } if (!$found) { // create the category $category->add(); $categorycontext = new field_category_contextlevel(); $categorycontext->categoryid = $category->id; $categorycontext->contextlevel = $ctx_lvl; $categorycontext->add(); } // create the field $field->categoryid = $category->id; $field->add(); $fieldcontext = new field_contextlevel(); $fieldcontext->fieldid = $field->id; $fieldcontext->contextlevel = $ctx_lvl; $fieldcontext->add(); return $field; }
function action_editfield() { global $CURMAN; $level = $this->required_param('level', PARAM_ACTION); $ctxlvl = context_level_base::get_custom_context_level($level, 'block_curr_admin'); if (!$ctxlvl) { print_error('invalid_context_level', 'block_curr_admin'); } $id = $this->optional_param('id', NULL, PARAM_INT); require_once CURMAN_DIRLOCATION . '/form/customfieldform.class.php'; $tmppage = new customfieldpage(array('level' => $level, 'action' => 'editfield'), $this); $form = new customfieldform($tmppage->get_moodle_url(), $this); if ($form->is_cancelled()) { $tmppage = new customfieldpage(array('level' => $level)); redirect($tmppage->get_url(), get_string('edit_cancelled', 'block_curr_admin')); } else { if ($data = $form->get_data()) { $field = new field($data); if ($id) { $field->id = $id; $field->update(); } else { $field->add(); // assume each field only belongs to one context level (for now) $fieldcontext = new field_contextlevel(); $fieldcontext->fieldid = $field->id; $fieldcontext->contextlevel = $ctxlvl; $fieldcontext->add(); } //don't use !empty here because we might be storing a 0 or similar value if ($data->defaultdata != '') { // save the default value $defaultdata = $data->defaultdata; if ($field->multivalued) { // parse as a CSV string // until we can use str_getcsv from PHP 5.3... $temp = fopen("php://memory", "rw"); fwrite($temp, $defaultdata); rewind($temp); $defaultdata = fgetcsv($temp); fclose($temp); } field_data::set_for_context_and_field(NULL, $field, $defaultdata); } else { if ($field->multivalued) { field_data::set_for_context_and_field(NULL, $field, array()); } else { field_data::set_for_context_and_field(NULL, $field, NULL); } } $plugins = get_list_of_plugins('curriculum/plugins'); foreach ($plugins as $plugin) { if (is_readable(CURMAN_DIRLOCATION . '/plugins/' . $plugin . '/custom_fields.php')) { include_once CURMAN_DIRLOCATION . '/plugins/' . $plugin . '/custom_fields.php'; if (function_exists("{$plugin}_field_save_form_data")) { call_user_func("{$plugin}_field_save_form_data", $form, $field, $data); } } } $tmppage = new customfieldpage(array('level' => $level)); redirect($tmppage->get_url(), get_string('field_saved', 'block_curr_admin', $field)); } else { if (!empty($id)) { if ($this->optional_param('from', NULL, PARAM_CLEAN) == 'moodle' && $level == 'user') { $moodlefield = $CURMAN->db->get_record('user_info_field', 'id', $id); if (!$moodlefield) { print_error('invalidfieldid', 'block_curr_admin'); } unset($moodlefield->id); $data_array = (array) $moodlefield; $data_array['datatype'] = 'text'; $data_array['manual_field_control'] = $moodlefield->datatype; switch ($moodlefield->datatype) { case field::checkbox: $data_array['datatype'] = 'bool'; break; case field::menu: $data_array['datatype'] = 'char'; $data_array['manual_field_options'] = $moodlefield->param1; break; case field::textarea: $data_array['manual_field_columns'] = $moodlefield->param1; $data_array['manual_field_rows'] = $moodlefield->param2; break; case field::text: if ($moodlefield->param3) { $data_array['manual_field_control'] = 'password'; } $data_array['manual_field_columns'] = $moodlefield->param1; $data_array['manual_field_maxlength'] = $moodlefield->param2; break; } } else { $data = new field($id); $data_array = $data->to_array(); $defaultdata = field_data::get_for_context_and_field(NULL, $data); if (!empty($defaultdata)) { if ($data->multivalued) { $values = array(); // extract the data foreach ($defaultdata as $data) { $values[] = $data->data; } // represent as a CSV string $fh = fopen("php://memory", "rw"); fputcsv($fh, $values); rewind($fh); $defaultdata = fgets($fh); fclose($fh); } else { $defaultdata = current($defaultdata); $defaultdata = $defaultdata->data; } } $data_array['defaultdata'] = $defaultdata; $plugins = get_list_of_plugins('curriculum/plugins'); foreach ($plugins as $plugin) { if (is_readable(CURMAN_DIRLOCATION . '/plugins/' . $plugin . '/custom_fields.php')) { include_once CURMAN_DIRLOCATION . '/plugins/' . $plugin . '/custom_fields.php'; if (function_exists("{$plugin}_field_get_form_data")) { $data_array += call_user_func("{$plugin}_field_get_form_data", $form, $data); } } } } $form->set_data($data_array); } $form->display(); } } }