/**
  * Adds a resource to the unique gradebook of a given course
  * @param   int
  * @param   string  Course code
  * @param   int     Resource type (use constants defined in linkfactory.class.php)
  * @param   int     Resource ID in the corresponding tool
  * @param   string  Resource name to show in the gradebook
  * @param   int     Resource weight to set in the gradebook
  * @param   int     Resource max
  * @param   string  Resource description
  * @param   int     Visibility (0 hidden, 1 shown)
  * @param   int     Session ID (optional or 0 if not defined)
  * @param   int
  * @return  boolean True on success, false on failure
  */
 public static function add_resource_to_course_gradebook($category_id, $course_code, $resource_type, $resource_id, $resource_name = '', $weight = 0, $max = 0, $resource_description = '', $visible = 0, $session_id = 0, $link_id = null)
 {
     $link = LinkFactory::create($resource_type);
     $link->set_user_id(api_get_user_id());
     $link->set_course_code($course_code);
     if (empty($category_id)) {
         return false;
     }
     $link->set_category_id($category_id);
     if ($link->needs_name_and_description()) {
         $link->set_name($resource_name);
     } else {
         $link->set_ref_id($resource_id);
     }
     $link->set_weight($weight);
     if ($link->needs_max()) {
         $link->set_max($max);
     }
     if ($link->needs_name_and_description()) {
         $link->set_description($resource_description);
     }
     $link->set_visible(empty($visible) ? 0 : 1);
     if (!empty($session_id)) {
         $link->set_session_id($session_id);
     }
     $link->add();
     return true;
 }
 protected function build_create()
 {
     $this->addElement('header', get_lang('MakeLink'));
     $select = $this->addElement('select', 'select_link', get_lang('ChooseLink'), null, array('onchange' => 'document.create_link.submit()'));
     $linktypes = LinkFactory::get_all_types();
     $select->addoption('[' . get_lang('ChooseLink') . ']', 0);
     $cc = $this->category_object->get_course_code();
     foreach ($linktypes as $linktype) {
         $link = LinkFactory::create($linktype);
         if (!empty($cc)) {
             $link->set_course_code($cc);
         } elseif (!empty($_GET['course_code'])) {
             $link->set_course_code(Database::escape_string($_GET['course_code']));
         }
         // disable this element if the link works with a dropdownlist
         // and if there are no links left
         if (!$link->needs_name_and_description() && count($link->get_all_links()) == '0') {
             $select->addoption($link->get_type_name(), $linktype, 'disabled');
         } else {
             $select->addoption($link->get_type_name(), $linktype);
         }
     }
     if (isset($this->extra)) {
         $this->setDefaults(array('select_link' => $this->extra));
     }
 }
 /**
  * Constructor
  * To add link, define category_object and link_type
  * To edit link, define link_object
  */
 function LinkAddEditForm($form_type, $category_object, $link_type, $link_object, $form_name, $action = null)
 {
     parent::__construct($form_name, 'post', $action);
     // set or create link object
     if (isset($link_object)) {
         $link = $link_object;
     } elseif (isset($link_type) && isset($category_object)) {
         $link = LinkFactory::create($link_type);
         $link->set_course_code(api_get_course_id());
     } else {
         die('LinkAddEditForm error: define link_type/category_object or link_object');
     }
     $defaults = array();
     $this->addElement('hidden', 'zero', 0);
     if (!empty($_GET['editlink'])) {
         $this->addElement('header', '', get_lang('EditLink'));
     }
     // ELEMENT: name
     if ($form_type == self::TYPE_ADD || $link->is_allowed_to_change_name()) {
         if ($link->needs_name_and_description()) {
             $this->add_textfield('name', get_lang('Name'), true, array('size' => '40', 'maxlength' => '40'));
         } else {
             $select = $this->addElement('select', 'select_link', get_lang('ChooseItem'));
             foreach ($link->get_all_links() as $newlink) {
                 $select->addoption($newlink[1], $newlink[0]);
             }
         }
     } else {
         $this->addElement('label', get_lang('Name'), '<span class="freeze">' . $link->get_name() . ' [' . $link->get_type_name() . ']</span>');
         $this->addElement('hidden', 'name_link', $link->get_name(), array('id' => 'name_link'));
     }
     if (count($category_object) == 1) {
         $this->addElement('hidden', 'select_gradebook', $category_object[0]->get_id());
     } else {
         $select_gradebook = $this->addElement('select', 'select_gradebook', get_lang('SelectGradebook'), array(), array('id' => 'hide_category_id'));
         $this->addRule('select_gradebook', get_lang('ThisFieldIsRequired'), 'nonzero');
         $default_weight = 0;
         if (!empty($category_object)) {
             foreach ($category_object as $my_cat) {
                 if ($my_cat->get_course_code() == api_get_course_id()) {
                     $grade_model_id = $my_cat->get_grade_model_id();
                     if (empty($grade_model_id)) {
                         if ($my_cat->get_parent_id() == 0) {
                             $default_weight = $my_cat->get_weight();
                             $select_gradebook->addoption(get_lang('Default'), $my_cat->get_id());
                         } else {
                             $select_gradebook->addoption($my_cat->get_name(), $my_cat->get_id());
                         }
                     } else {
                         $select_gradebook->addoption(get_lang('Select'), 0);
                     }
                     if ($link->get_category_id() == $my_cat->get_id()) {
                         $default_weight = $my_cat->get_weight();
                     }
                 }
             }
         }
     }
     $this->add_textfield('weight_mask', array(get_lang('Weight'), null, ' [0 .. ' . $category_object[0]->get_weight() . '] '), true, array('size' => '4', 'maxlength' => '5', 'class' => 'span1'));
     $this->addElement('hidden', 'weight');
     /*
     
     		// ELEMENT: weight
             $this->add_textfield('weight', array(get_lang('Weight'), null, '/ <span id="max_weight">'.$default_weight.'</span>'), true, array (
                 'size' => '4',
                 'maxlength' => '5',
                 'class' => 'span1'
             ));*/
     $this->addRule('weight_mask', get_lang('OnlyNumbers'), 'numeric');
     $this->addRule(array('weight_mask', 'zero'), get_lang('NegativeValue'), 'compare', '>=');
     if ($form_type == self::TYPE_EDIT) {
         $parent_cat = Category::load($link->get_category_id());
         if ($parent_cat[0]->get_parent_id() == 0) {
             $values['weight'] = $link->get_weight();
         } else {
             $cat = Category::load($parent_cat[0]->get_parent_id());
             //$global_weight = $cat[0]->get_weight();
             //$values['weight'] = $link->get_weight()/$parent_cat[0]->get_weight()*$global_weight;
             //$weight = $parent_cat[0]->get_weight()* $link->get_weight() / $global_weight;
             //$values['weight'] = $weight;
             $values['weight'] = $link->get_weight();
         }
         $defaults['weight_mask'] = $values['weight'];
         $defaults['select_gradebook'] = $link->get_category_id();
     }
     // ELEMENT: max
     if ($link->needs_max()) {
         if ($form_type == self::TYPE_EDIT && $link->has_results()) {
             $this->add_textfield('max', get_lang('QualificationNumeric'), false, array('size' => '4', 'maxlength' => '5', 'disabled' => 'disabled'));
         } else {
             $this->add_textfield('max', get_lang('QualificationNumeric'), true, array('size' => '4', 'maxlength' => '5'));
             $this->addRule('max', get_lang('OnlyNumbers'), 'numeric');
             $this->addRule(array('max', 'zero'), get_lang('NegativeValue'), 'compare', '>=');
         }
         if ($form_type == self::TYPE_EDIT) {
             $defaults['max'] = $link->get_max();
         }
     }
     // ELEMENT: date
     //$this->add_datepicker('date',get_lang('Date'));
     //$defaults['date'] = ($form_type == self :: TYPE_EDIT ? $link->get_date() : time());
     // ELEMENT: description
     if ($link->needs_name_and_description()) {
         $this->addElement('textarea', 'description', get_lang('Description'), array('rows' => '3', 'cols' => '34'));
         if ($form_type == self::TYPE_EDIT) {
             $defaults['description'] = $link->get_description();
         }
     }
     // ELEMENT: visible
     $visible = $form_type == self::TYPE_EDIT && $link->is_visible() ? '1' : '0';
     $this->addElement('checkbox', 'visible', null, get_lang('Visible'), $visible);
     if ($form_type == self::TYPE_EDIT) {
         $defaults['visible'] = $link->is_visible();
     }
     // ELEMENT: add results
     if ($form_type == self::TYPE_ADD && $link->needs_results()) {
         $this->addElement('checkbox', 'addresult', get_lang('AddResult'));
     }
     // submit button
     if ($form_type == self::TYPE_ADD) {
         $this->addElement('style_submit_button', 'submit', get_lang('CreateLink'), 'class="save"');
     } else {
         $this->addElement('style_submit_button', 'submit', get_lang('LinkMod'), 'class="save"');
     }
     if ($form_type == self::TYPE_ADD) {
         $setting = api_get_setting('tool_visible_by_default_at_creation');
         $visibility_default = 1;
         if (isset($setting['gradebook']) && $setting['gradebook'] == 'false') {
             $visibility_default = 0;
         }
         $defaults['visible'] = $visibility_default;
     }
     // set default values
     $this->setDefaults($defaults);
 }
 /**
  * @param $result
  * @return array
  */
 private static function create_objects_from_sql_result($result)
 {
     $links = array();
     while ($data = Database::fetch_array($result)) {
         $link = LinkFactory::create($data['type']);
         $link->set_id($data['id']);
         $link->set_type($data['type']);
         $link->set_ref_id($data['ref_id']);
         $link->set_user_id($data['user_id']);
         $link->set_course_code($data['course_code']);
         $link->set_category_id($data['category_id']);
         $link->set_date($data['created_at']);
         $link->set_weight($data['weight']);
         $link->set_visible($data['visible']);
         $link->set_locked($data['locked']);
         //session id should depend of the category --> $data['category_id']
         $session_id = api_get_session_id();
         $link->set_session_id($session_id);
         $links[] = $link;
     }
     return $links;
 }
 /**
  * @param $link
  * @param $courseCode
  * @return AttendanceLink|DropboxLink|ExerciseLink|ForumThreadLink|LearnpathLink|null|StudentPublicationLink|SurveyLink
  */
 private function createLink($link, $courseCode)
 {
     $link = LinkFactory::create($link);
     if (!empty($courseCode)) {
         $link->set_course_code($courseCode);
     } elseif (!empty($_GET['course_code'])) {
         $link->set_course_code(Database::escape_string($_GET['course_code'], null, false));
     }
     return $link;
 }
$category = Category::load($_GET['selectcat']);
$url = api_get_self() . '?selectcat=' . Security::remove_XSS($_GET['selectcat']) . '&newtypeselected=' . $typeSelected . '&course_code=' . api_get_course_id() . '&' . api_get_cidreq();
$typeform = new LinkForm(LinkForm::TYPE_CREATE, $category[0], null, 'create_link', null, $url, $typeSelected);
// if user selected a link type
if ($typeform->validate() && isset($_GET['newtypeselected'])) {
    // reload page, this time with a parameter indicating the selected type
    header('Location: ' . api_get_self() . '?selectcat=' . Security::remove_XSS($_GET['selectcat']) . '&typeselected=' . $typeform->exportValue('select_link') . '&course_code=' . Security::remove_XSS($_GET['course_code']) . '&' . api_get_cidreq());
    exit;
}
// link type selected, show 2nd form to retrieve the link data
if (isset($typeSelected) && $typeSelected != '0') {
    $url = api_get_self() . '?selectcat=' . Security::remove_XSS($_GET['selectcat']) . '&typeselected=' . $typeSelected . '&course_code=' . $courseCode . '&' . api_get_cidreq();
    $addform = new LinkAddEditForm(LinkAddEditForm::TYPE_ADD, $all_categories, $typeSelected, null, 'add_link', $url);
    if ($addform->validate()) {
        $addvalues = $addform->exportValues();
        $link = LinkFactory::create($typeSelected);
        $link->set_user_id(api_get_user_id());
        $link->set_course_code(api_get_course_id());
        $link->set_category_id($addvalues['select_gradebook']);
        if ($link->needs_name_and_description()) {
            $link->set_name($addvalues['name']);
        } else {
            $link->set_ref_id($addvalues['select_link']);
        }
        $parent_cat = Category::load($addvalues['select_gradebook']);
        $global_weight = $category[0]->get_weight();
        $link->set_weight($addvalues['weight_mask']);
        if ($link->needs_max()) {
            $link->set_max($addvalues['max']);
        }
        if ($link->needs_name_and_description()) {
$category = Category::load($_GET['selectcat']);
$url = api_get_self() . '?selectcat=' . Security::remove_XSS($_GET['selectcat']) . '&newtypeselected=' . (isset($_GET['typeselected']) ? Security::remove_XSS($_GET['typeselected']) : '') . '&course_code=' . api_get_course_id();
$typeform = new LinkForm(LinkForm::TYPE_CREATE, $category[0], null, 'create_link', null, $url, $_GET['typeselected']);
// if user selected a link type
if ($typeform->validate() && isset($_GET['newtypeselected'])) {
    // reload page, this time with a parameter indicating the selected type
    header('Location: ' . api_get_self() . '?selectcat=' . Security::remove_XSS($_GET['selectcat']) . '&typeselected=' . $typeform->exportValue('select_link') . '&course_code=' . Security::remove_XSS($_GET['course_code']));
    exit;
}
// link type selected, show 2nd form to retrieve the link data
if (isset($_GET['typeselected']) && $_GET['typeselected'] != '0') {
    $url = api_get_self() . '?selectcat=' . Security::remove_XSS($_GET['selectcat']) . '&typeselected=' . Security::remove_XSS($_GET['typeselected']) . '&course_code=' . Security::remove_XSS($_GET['course_code']);
    $addform = new LinkAddEditForm(LinkAddEditForm::TYPE_ADD, $all_categories, intval($_GET['typeselected']), null, 'add_link', $url);
    if ($addform->validate()) {
        $addvalues = $addform->exportValues();
        $link = LinkFactory::create($_GET['typeselected']);
        $link->set_user_id(api_get_user_id());
        $link->set_course_code(api_get_course_id());
        $link->set_category_id($addvalues['select_gradebook']);
        if ($link->needs_name_and_description()) {
            $link->set_name($addvalues['name']);
        } else {
            $link->set_ref_id($addvalues['select_link']);
        }
        $parent_cat = Category::load($addvalues['select_gradebook']);
        $global_weight = $category[0]->get_weight();
        $link->set_weight($addvalues['weight_mask']);
        if ($link->needs_max()) {
            $link->set_max($addvalues['max']);
        }
        if ($link->needs_name_and_description()) {
 /**
  * Create an AbsctrackLink array from GradebookLink \Doctrine\Common\Collections\ArrayCollection or array
  * @param \Doctrine\Common\Collections\ArrayCollection|array $entities
  * @return array
  */
 private static function createObjectsFromEntities($entities)
 {
     $links = [];
     foreach ($entities as $gradebookLink) {
         $link = LinkFactory::create($gradebookLink->getType());
         $link->set_id($gradebookLink->getId());
         $link->set_type($gradebookLink->getType());
         $link->set_ref_id($gradebookLink->getRefId());
         $link->set_user_id($gradebookLink->getUserId());
         $link->set_course_code($gradebookLink->getCourse()->getCode());
         $link->set_category_id($gradebookLink->getCategoryId());
         $link->set_date($gradebookLink->getCreatedAt()->format('Y-m-d h:m:i'));
         $link->set_weight($gradebookLink->getWeight());
         $link->set_visible($gradebookLink->getVisible());
         $link->set_locked($gradebookLink->getLocked());
         //session id should depend of the category --> $data['category_id']
         $session_id = api_get_session_id();
         $link->set_session_id($session_id);
         $links[] = $link;
     }
     return $links;
 }