Browse Source

Adding "edit question" as an "question manager"see BT#6098

Julio Montoya 12 years ago
parent
commit
1a87e08255

+ 0 - 2
main/inc/Entity/CQuizCategory.php

@@ -11,9 +11,7 @@ use Doctrine\Common\Collections\ArrayCollection;
  *
  * @Gedmo\Tree(type="nested")
  * @ORM\Table(name="c_quiz_category")
- * @ORM\Entity(repositoryClass="Entity\Repository\CQuizCategoryRepository")
  * @ORM\Entity(repositoryClass="Gedmo\Tree\Entity\Repository\NestedTreeRepository")
-
  */
 class CQuizCategory
 {

+ 1 - 3
main/inc/Entity/CQuizQuestion.php

@@ -10,7 +10,7 @@ use Doctrine\Common\Collections\ArrayCollection;
  * CQuizQuestion
  *
  * @ORM\Table(name="c_quiz_question")
- * @ORM\Entity
+ * @ORM\Entity(repositoryClass="Entity\Repository\CQuizQuestionRepository")
  */
 class CQuizQuestion
 {
@@ -116,8 +116,6 @@ class CQuizQuestion
         return $this->quizQuestionRelCategoryList;
     }
 
-
-
     /**
      * Set cId
      *

+ 3 - 3
main/inc/Entity/CQuizQuestionRelCategory.php

@@ -8,7 +8,7 @@ use Doctrine\ORM\Mapping as ORM;
  * CQuizQuestionRelCategory
  *
  * @ORM\Table(name="c_quiz_question_rel_category")
- * @ORM\Entity
+ * @ORM\Entity(repositoryClass="Entity\Repository\CQuizQuestionRelCategoryRepository")
  */
 class CQuizQuestionRelCategory
 {
@@ -49,13 +49,13 @@ class CQuizQuestionRelCategory
     /** Relationships */
 
     /**
-     * @ORM\ManyToOne(targetEntity="CQuizCategory", fetch="EAGER" )
+     * @ORM\ManyToOne(targetEntity="CQuizCategory")
      * @ORM\JoinColumn(name="category_id", referencedColumnName="iid")
      */
     private $category;
 
     /**
-     * @ORM\ManyToOne(targetEntity="CQuizQuestion", fetch="EAGER" )
+     * @ORM\ManyToOne(targetEntity="CQuizQuestion")
      * @ORM\JoinColumn(name="question_id", referencedColumnName="iid")
      */
     private $question;

+ 1 - 29
main/inc/Entity/Repository/CQuizCategoryRepository.php

@@ -6,38 +6,10 @@ use Doctrine\ORM\EntityRepository;
 use Doctrine\Common\Collections\Criteria;
 
 /**
- * CourseRepository
+ * CQuizCategoryRepository
  *
  */
 class CQuizCategoryRepository extends EntityRepository
 {
 
-    public function getQuestions()
-    {
-        $qb = $this->createQueryBuilder('a');
-
-        //Selecting user info
-        $qb->select('DISTINCT u');
-
-        //Loading EntityUser
-        $qb->from('Entity\CQuizCategory', 'u');
-
-        //Selecting courses for users
-        $qb->innerJoin('u.questions', 'c');
-
-        //@todo check app settings
-        //$qb->add('orderBy', 'u.lastname ASC');
-
-        $wherePart = $qb->expr()->andx();
-
-        //Get only users subscribed to this course
-        //$wherePart->add($qb->expr()->eq('c.cId', $course->getId()));
-
-        //$wherePart->add($qb->expr()->eq('c.status', $status));
-
-        $qb->where($wherePart);
-        //$q = $qb->getQuery();
-        //return $q->execute();
-        return $qb;
-    }
 }

+ 23 - 0
main/inc/Entity/Repository/CQuizQuestionRelCategoryRepository.php

@@ -0,0 +1,23 @@
+<?php
+
+namespace Entity\Repository;
+
+use Doctrine\ORM\EntityRepository;
+use Doctrine\Common\Collections\Criteria;
+
+/**
+ * CQuizQuestionRelCategoryRepository
+ *
+ */
+class CQuizQuestionRelCategoryRepository extends EntityRepository
+{
+    public function getCountQuestionByCategory($categoryId)
+    {
+        return $this->createQueryBuilder('a')
+            ->select('COUNT(a)')
+            ->where('a.categoryId = :categoryId')
+            ->setParameters(array('categoryId' => $categoryId))
+            ->getQuery()
+            ->getSingleScalarResult();
+    }
+}

+ 37 - 0
main/inc/Entity/Repository/CQuizQuestionRepository.php

@@ -0,0 +1,37 @@
+<?php
+
+namespace Entity\Repository;
+
+use Doctrine\ORM\EntityRepository;
+use Doctrine\Common\Collections\Criteria;
+
+/**
+ * CQuizQuestion
+ *
+ */
+class CQuizQuestionRepository extends EntityRepository
+{
+    /**
+     * Get all questions per category
+     *
+     * @param int $categoryId
+     * @return \Doctrine\ORM\QueryBuilder
+     */
+    public function getQuestionsByCategory($categoryId)
+    {
+        // Setting alias for this class "q" = CQuizQuestion
+        $qb = $this->createQueryBuilder('q');
+
+        // Select all question information
+        $qb->select('q');
+
+        // Inner join with the table c_quiz_question_rel_category
+        $qb->innerJoin('q.quizQuestionRelCategoryList', 'c');
+
+        $wherePart = $qb->expr()->andx();
+        $wherePart->add($qb->expr()->eq('c.categoryId', $categoryId));
+
+        $qb->where($wherePart);
+        return $qb;
+    }
+}

+ 1 - 1
main/inc/Entity/Repository/CourseRepository.php

@@ -24,7 +24,7 @@ class CourseRepository extends EntityRepository
         //Selecting user info
         $qb->select('DISTINCT u');
 
-        //Loading EntityUser
+        // Loading EntityUser
         $qb->from('Entity\User', 'u');
 
         //Selecting courses for users

+ 20 - 13
main/inc/ajax/model.ajax.php

@@ -201,13 +201,10 @@ if (!$sidx) {
 switch ($action) {
     case 'get_questions':
         $categoryId = isset($_REQUEST['categoryId']) ? $_REQUEST['categoryId'] : null;
-        $repo = $app['orm.em']->getRepository('Entity\CQuizQuestionRelCategory');
-        $count = $repo->createQueryBuilder('a')
-            ->select('COUNT(a)')
-            ->where('a.categoryId = :categoryId')
-            ->setParameters(array('categoryId' => $categoryId))
-            ->getQuery()
-            ->getSingleScalarResult();
+        /** @var \Doctrine\ORM\EntityManager $em */
+        $em = $app['orm.em'];
+        $repo = $em->getRepository('Entity\CQuizQuestionRelCategory');
+        $count = $repo->getCountQuestionByCategory($categoryId);
         break;
     case 'get_user_list_plugin_widescale':
         $count = UserManager::get_user_data(null, null, null, null, true);
@@ -351,12 +348,24 @@ $columns = array();
 switch ($action) {
     case 'get_questions':
         $columns = array('iid', 'question', 'description', 'actions');
-
-        $repo = $app['orm.em']->getRepository('Entity\CQuizCategory');
+        // @todo implement a class that manages jqgrid petitions
+        /** @var \Entity\Repository\CQuizQuestionRepository $repo */
+        $repo = $em->getRepository('Entity\CQuizQuestion');
+        $qb = $repo->getQuestionsByCategory($categoryId);
+        if (!empty($sidx) && strlen($sidx) > 1) {
+            $sidx = 'q.'.$sidx;
+            $sord = strtoupper($sord);
+            $qb->addOrderBy($sidx, $sord);
+        }
+        $qb->getFirstResult($start);
+        $qb->getMaxResults($limit);
+        $query = $qb->getQuery();
+        //echo $qb->getQuery()->getSQL();
+        $questions = $query->getResult();
 
         /** @var \Entity\CQuizCategory $category */
-        $category = $repo->find($categoryId);
-        $questions = $category->getQuestions();
+        /*$category = $repo->find($categoryId);
+        $questions = $category->getQuestions();*/
 
         $result = array();
         foreach ($questions as $question) {
@@ -368,9 +377,7 @@ switch ($action) {
             //$row['iid'] = $question->getIid();
             $result[] = $row;
         }
-
         break;
-
     case 'get_user_list_plugin_widescale':
         $columns = array('username', 'firstname', 'lastname', 'exam_password');
         $column_names = array(get_lang('Username'), get_lang('Firstname'), get_lang('Lastname'), get_lang('Password'));

+ 4 - 0
main/template/default/admin/edit_question.tpl

@@ -0,0 +1,4 @@
+{% extends app.template_style ~ "/layout/layout_1_col.tpl" %}
+{% block content %}
+    {{ form }}
+{% endblock %}

+ 1 - 1
main/template/default/admin/question_categories.tpl

@@ -3,7 +3,7 @@
     <script>
         $(function() {
             $('.load_categories li').on('click', 'a', function() {
-                event.preventDefault();
+                //event.preventDefault();
                 var url = $(this).attr('href');
                 var id = url.replace(/[^\d\.]/g, '');
 

+ 19 - 0
main/template/default/admin/questionmanager.tpl

@@ -0,0 +1,19 @@
+{% extends app.template_style ~ "/layout/layout_1_col.tpl" %}
+{% block content %}
+    <div class="row">
+        <div id="tabs-1" class="span6">
+            <div class="well_border">
+                <h4>{{ 'Admin'  | get_lang }}</h4>
+                <ul>
+                    <li>
+                        <a href="{{ app.url_generator.generate('admin_questions') }}">
+                        {{ 'Questions' | get_lang }}</a>
+                    </li>
+                    <li><a href="user_list.php">{{ 'Exercises' | get_lang }}</a></li>
+                    <li><a href="user_add.php">{{ 'Categories' | get_lang }}</a></li>
+                </ul>
+
+            </div>
+        </div>
+    </div>
+{% endblock %}

+ 0 - 1
main/template/default/admin/questions.tpl

@@ -1,4 +1,3 @@
-
 <script>
     $(function () {
         {{ js }}

+ 42 - 11
src/ChamiloLMS/Controller/AdminController.php

@@ -3,6 +3,7 @@
 namespace ChamiloLMS\Controller;
 
 use Silex\Application;
+use Symfony\Component\Form\Extension\Validator\Constraints\FormValidator;
 use Symfony\Component\HttpFoundation\Response;
 use Pagerfanta\Adapter\DoctrineCollectionAdapter;
 use Pagerfanta\Pagerfanta;
@@ -22,6 +23,38 @@ class AdminController
 
     }
 
+    public function editQuestionAction(Application $app, $id)
+    {
+
+        $extraJS = array();
+        //@todo improve this JS includes should be added using twig
+        $extraJS[] = '<link href="'.api_get_path(WEB_LIBRARY_PATH).'javascript/tag/style.css" rel="stylesheet" type="text/css" />';
+        $extraJS[] = '<script src="'.api_get_path(WEB_LIBRARY_PATH).'javascript/tag/jquery.fcbkcomplete.js" type="text/javascript" language="javascript"></script>';
+        $app['extraJS'] = $extraJS;
+
+        $exercise = new \Exercise();
+        $question = \Question::read($id, null, $exercise);
+        $question->setDefaultValues = true;
+        $form = new \FormValidator('edit_question');
+        $question->createForm($form);
+        // answer form elements
+        $question->createAnswersForm($form);
+
+        $app['template']->assign('form', $form->toHtml());
+
+        $response = $app['template']->render_template('admin/edit_question.tpl');
+        return new Response($response, 200, array());
+
+    }
+
+    public function questionManagerIndexAction(Application $app)
+    {
+        $response = $app['template']->render_template('admin/questionmanager.tpl');
+        return new Response($response, 200, array());
+    }
+
+
+
     /**
      * @param Application $app
      * @param int $id
@@ -39,7 +72,7 @@ class AdminController
             'childOpen' => '<li>',
             'childClose' => '</li>',
             'nodeDecorator' => function ($row) use ($app) {
-                $url = $app['url_generator']->generate('admin_get_categories', array('id' => $row['iid']));
+                $url = $app['url_generator']->generate('admin_questions_get_categories', array('id' => $row['iid']));
                 return \Display::url($row['title'], $url);
             }
             //'representationField' => 'slug',
@@ -88,20 +121,20 @@ class AdminController
             array(
                 'name' => 'question',
                 'index' => 'question',
-                'width' => '150',
+                'width' => '200',
                 'align' => 'left'
             ),
             array(
                 'name'     => 'description',
                 'index'    => 'description',
-                'width'    => '150',
+                'width'    => '100',
                 'align'    => 'left',
                 'sortable' => 'false'
             ),
             array(
                 'name'      => 'actions',
                 'index'     => 'actions',
-                'width'     => '100',
+                'width'     => '30',
                 'align'     => 'left',
                 'formatter' => 'action_formatter',
                 'sortable'  => 'false'
@@ -112,16 +145,14 @@ class AdminController
         // height auto.
         $extraParams['height'] = 'auto';
         $token = null;
+        $editUrl = $app['url_generator']->generate('admin_questions');
 
+        /* '&nbsp;<a onclick="javascript:if(!confirm('."\'".addslashes(api_htmlentities(get_lang("ConfirmYourChoice"), ENT_QUOTES))."\'".')) return false;"  href="?sec_token='.$token.'&action=copy&id=\'+options.rowId+\'">'.
+            \Display::return_icon('copy.png',get_lang('Copy'),'',ICON_SIZE_SMALL).'</a>'. */
         $actionLinks = 'function action_formatter(cellvalue, options, rowObject) {
-                         return \'<a href="?action=edit&id=\'+options.rowId+\'">'.\Display::return_icon('edit.png',get_lang('Edit'),'',ICON_SIZE_SMALL).'</a>'.
-            '&nbsp;<a onclick="javascript:if(!confirm('."\'".addslashes(api_htmlentities(get_lang("ConfirmYourChoice"), ENT_QUOTES))."\'".')) return false;"  href="?sec_token='.$token.'&action=copy&id=\'+options.rowId+\'">'.
-            \Display::return_icon('copy.png',get_lang('Copy'),'',ICON_SIZE_SMALL).'</a>'.
-            '&nbsp;<a onclick="javascript:if(!confirm('."\'".addslashes(api_htmlentities(get_lang("ConfirmYourChoice"), ENT_QUOTES))."\'".')) return false;"  href="?sec_token='.$token.'&action=delete&id=\'+options.rowId+\'">'.
-            \Display::return_icon(          'delete.png',get_lang('Delete'),'',ICON_SIZE_SMALL).'</a>'.'\';
+            return \'<a href="'.$editUrl.'/edit/\'+rowObject[0]+\'">'.\Display::return_icon('edit.png',get_lang('Edit'),'',ICON_SIZE_SMALL).'</a>'.'\';
         }';
 
-
         $js = \Display::grid_js('questions', $url, $columns, $columnModel, $extraParams, array(), $actionLinks, true);
 
 
@@ -171,7 +202,7 @@ class AdminController
             'childOpen' => '<li>',
             'childClose' => '</li>',
             'nodeDecorator' => function ($row) use ($app) {
-                $url = $app['url_generator']->generate('admin_get_categories', array('id' => $row['iid']));
+                $url = $app['url_generator']->generate('admin_questions_get_categories', array('id' => $row['iid']));
                 return \Display::url($row['title'], $url);
             }
             //'representationField' => 'slug',