parent
							
								
									a4640efab3
								
							
						
					
					
						commit
						f61a34f705
					
				@ -0,0 +1,31 @@ | 
				
			||||
<?php | 
				
			||||
/* For licensing terms, see /chamilo_license.txt */ | 
				
			||||
 | 
				
			||||
$cidReset = true; | 
				
			||||
 | 
				
			||||
require_once '../inc/global.inc.php'; | 
				
			||||
 | 
				
			||||
$tpl = new Template(get_lang('ResourceSequencing')); | 
				
			||||
$layout = $tpl->get_template('admin/resource_sequence.tpl'); | 
				
			||||
$form = new FormValidator(''); | 
				
			||||
$sessionList = SessionManager::get_sessions_list(); | 
				
			||||
 | 
				
			||||
if (!empty($sessionList)) { | 
				
			||||
    //$sessionList[] = ['name' => get_lang('PleaseSelect'), 'id' => 0]; | 
				
			||||
    $sessionList = array_column($sessionList, 'name', 'id'); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
$form->addHidden('sequence_type', 'session'); | 
				
			||||
$form->addSelect( | 
				
			||||
    'sessions', | 
				
			||||
    get_lang('Sessions'), | 
				
			||||
    $sessionList, | 
				
			||||
    ['id' => 'item', 'multiple' => 'multiple'] | 
				
			||||
); | 
				
			||||
$form->addButtonNext(get_lang('UseAsReference'), 'use_as_reference'); | 
				
			||||
$form->addButtonCreate(get_lang('SetAsRequirementForSelected'), 'set_requirement'); | 
				
			||||
$form->addButtonSave(get_lang('Save'), 'save_resource'); | 
				
			||||
 | 
				
			||||
$tpl->assign('left_block', $form->returnForm()); | 
				
			||||
$tpl->display($layout); | 
				
			||||
 | 
				
			||||
@ -0,0 +1,188 @@ | 
				
			||||
<?php | 
				
			||||
/* For licensing terms, see /license.txt */ | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * Responses to AJAX calls | 
				
			||||
 */ | 
				
			||||
 | 
				
			||||
use Chamilo\CoreBundle\Entity\SequenceResource; | 
				
			||||
use Fhaculty\Graph\Graph; | 
				
			||||
use Fhaculty\Graph\Vertex; | 
				
			||||
use Graphp\GraphViz\GraphViz; | 
				
			||||
 | 
				
			||||
require_once '../global.inc.php'; | 
				
			||||
 | 
				
			||||
api_protect_admin_script(); | 
				
			||||
 | 
				
			||||
$action = isset($_REQUEST['a']) ? $_REQUEST['a'] : null; | 
				
			||||
$id = isset($_REQUEST['id']) ? $_REQUEST['id'] : null; | 
				
			||||
$type = isset($_REQUEST['type']) ? $_REQUEST['type'] : null; | 
				
			||||
$manager = Database::getManager(); | 
				
			||||
$repository = $manager->getRepository('ChamiloCoreBundle:SequenceResource'); | 
				
			||||
switch ($action) { | 
				
			||||
    case 'get_icon': | 
				
			||||
        $link = ''; | 
				
			||||
        switch ($type) { | 
				
			||||
            case 'session': | 
				
			||||
                $showDelete = isset($_REQUEST['show_delete']) ? $_REQUEST['show_delete'] : false; | 
				
			||||
                $image = Display::return_icon('window_list.png'); | 
				
			||||
                $sessionInfo = api_get_session_info($id); | 
				
			||||
                if (!empty($sessionInfo)) { | 
				
			||||
 | 
				
			||||
 | 
				
			||||
                $linkDelete = ''; | 
				
			||||
                if ($showDelete) { | 
				
			||||
                    $linkDelete = Display::url( | 
				
			||||
                        get_lang('Delete'), | 
				
			||||
                        '#', | 
				
			||||
                        ['class' => 'delete_vertex', 'data-id' => $id] | 
				
			||||
                    ); | 
				
			||||
                } | 
				
			||||
 | 
				
			||||
                $link = '<div class="parent" data-id="'.$id.'">'. | 
				
			||||
                    $image.' '.$sessionInfo['name'].$linkDelete. | 
				
			||||
                    '</div>'; | 
				
			||||
                } | 
				
			||||
                break; | 
				
			||||
        } | 
				
			||||
        echo $link; | 
				
			||||
        break; | 
				
			||||
    case 'delete_vertex': | 
				
			||||
        $vertexId = isset($_REQUEST['vertex_id']) ? $_REQUEST['vertex_id'] : null; | 
				
			||||
        /** @var SequenceResource $resource */ | 
				
			||||
        $resource = $repository->findOneByResourceId($id); | 
				
			||||
 | 
				
			||||
        if (empty($resource)) { | 
				
			||||
            exit; | 
				
			||||
        } | 
				
			||||
 | 
				
			||||
        $graph = $resource->getGraph(); | 
				
			||||
 | 
				
			||||
        if (!empty($graph)) { | 
				
			||||
            /** @var Graph $graph */ | 
				
			||||
            $graph = unserialize($graph); | 
				
			||||
            if ($graph->hasVertex($vertexId)) { | 
				
			||||
                $vertex = $graph->getVertex($vertexId); | 
				
			||||
                $vertex->destroy(); | 
				
			||||
 | 
				
			||||
                $resource->setGraph(serialize($graph)); | 
				
			||||
 | 
				
			||||
                $manager->persist($resource); | 
				
			||||
                $manager->flush(); | 
				
			||||
            } | 
				
			||||
        } | 
				
			||||
 | 
				
			||||
        break; | 
				
			||||
    case 'load_resource': | 
				
			||||
        // children or parent | 
				
			||||
        $loadResourceType = isset($_REQUEST['load_resource_type']) ? $_REQUEST['load_resource_type'] : null; | 
				
			||||
        /** @var SequenceResource $resource */ | 
				
			||||
        $resource = $repository->findOneByResourceId($id); | 
				
			||||
 | 
				
			||||
        if (empty($resource)) { | 
				
			||||
            exit; | 
				
			||||
        } | 
				
			||||
 | 
				
			||||
        $graph = $resource->getGraph(); | 
				
			||||
 | 
				
			||||
        if (!empty($graph)) { | 
				
			||||
            /** @var Graph $graph */ | 
				
			||||
            $graph = unserialize($graph); | 
				
			||||
 | 
				
			||||
            $graphviz = new GraphViz(); | 
				
			||||
            //echo $graphviz->createImageHtml($graph); | 
				
			||||
 | 
				
			||||
            /** @var Vertex $mainVertice */ | 
				
			||||
            if ($graph->hasVertex($id)) { | 
				
			||||
                $mainVertice = $graph->getVertex($id); | 
				
			||||
 | 
				
			||||
                if (!empty($mainVertice)) { | 
				
			||||
                    $list = []; | 
				
			||||
                    switch ($loadResourceType) { | 
				
			||||
                        case 'parent': | 
				
			||||
                            $verticeList = $mainVertice->getVerticesEdgeFrom(); | 
				
			||||
 | 
				
			||||
                            break; | 
				
			||||
                        case 'children': | 
				
			||||
                            $verticeList = $mainVertice->getVerticesEdgeTo(); | 
				
			||||
                            break; | 
				
			||||
                    } | 
				
			||||
                    foreach ($verticeList as $vertice) { | 
				
			||||
                        $list[] = $vertice->getId(); | 
				
			||||
                    } | 
				
			||||
 | 
				
			||||
                    if (!empty($list)) { | 
				
			||||
                        echo implode(',', $list); | 
				
			||||
                    } | 
				
			||||
                } | 
				
			||||
            } | 
				
			||||
        } | 
				
			||||
        break; | 
				
			||||
    case 'save_resource': | 
				
			||||
        $parents = isset($_REQUEST['parents']) ? $_REQUEST['parents'] : null; | 
				
			||||
        $parents = str_replace($id, '', $parents); | 
				
			||||
        $parents = explode(',', $parents); | 
				
			||||
        $parents = array_filter($parents); | 
				
			||||
 | 
				
			||||
        $graph = new Graph(); | 
				
			||||
 | 
				
			||||
        switch ($type) { | 
				
			||||
            case 'session': | 
				
			||||
                $sessionInfo = api_get_session_info($id); | 
				
			||||
                $name = $sessionInfo['name']; | 
				
			||||
 | 
				
			||||
                $main = $graph->createVertex($id); | 
				
			||||
 | 
				
			||||
                foreach ($parents as $parentId) { | 
				
			||||
                    $parent = $graph->createVertex($parentId); | 
				
			||||
                    // Check if parent Id exists in the DB | 
				
			||||
                    /** @var SequenceResource $resource */ | 
				
			||||
                    $resource = $repository->findOneByResourceId($parentId); | 
				
			||||
                    if ($resource) { | 
				
			||||
                        $parentGraph = $resource->getGraph(); | 
				
			||||
 | 
				
			||||
                        if (!empty($parentGraph)) { | 
				
			||||
                            /** @var Graph $parentGraph */ | 
				
			||||
                            $parentGraph = unserialize($parentGraph); | 
				
			||||
                            try { | 
				
			||||
                                $vertex = $parentGraph->getVertex($parentId); | 
				
			||||
                                $parentMain = $parentGraph->createVertex($id); | 
				
			||||
                                $vertex->createEdgeTo($parentMain); | 
				
			||||
                                $resource->setGraph(serialize($parentGraph)); | 
				
			||||
 | 
				
			||||
                                $manager->persist($resource); | 
				
			||||
                                $manager->flush(); | 
				
			||||
/* | 
				
			||||
                                $graphviz = new GraphViz(); | 
				
			||||
                                echo $graphviz->createImageHtml($parentGraph);*/ | 
				
			||||
                            } catch (Exception $e) { | 
				
			||||
 | 
				
			||||
                            } | 
				
			||||
                        } | 
				
			||||
                    } | 
				
			||||
 | 
				
			||||
                    $parent->createEdgeTo($main); | 
				
			||||
                } | 
				
			||||
 | 
				
			||||
                $graphviz = new GraphViz(); | 
				
			||||
                //echo $graphviz->createImageHtml($graph); | 
				
			||||
 | 
				
			||||
                /** @var SequenceResource $sequence */ | 
				
			||||
                $sequence = $repository->findOneByResourceId($id); | 
				
			||||
                if (empty($sequence)) { | 
				
			||||
                    $sequence = new SequenceResource(); | 
				
			||||
                    $sequence | 
				
			||||
                        ->setGraph(serialize($graph)) | 
				
			||||
                        ->setType(SequenceResource::SESSION_TYPE) | 
				
			||||
                        ->setResourceId($id); | 
				
			||||
                } else { | 
				
			||||
                    $sequence->setGraph(serialize($graph)); | 
				
			||||
                } | 
				
			||||
                $manager->persist($sequence); | 
				
			||||
                $manager->flush(); | 
				
			||||
                break; | 
				
			||||
        } | 
				
			||||
 | 
				
			||||
 | 
				
			||||
        break; | 
				
			||||
} | 
				
			||||
@ -0,0 +1,139 @@ | 
				
			||||
{% extends template ~ "/layout/layout_1_col.tpl" %} | 
				
			||||
 | 
				
			||||
{% block content %} | 
				
			||||
    <script> | 
				
			||||
        var url = '{{ _p.web_ajax }}sequence.ajax.php'; | 
				
			||||
        var parentList = []; | 
				
			||||
        var resourceId = 0; | 
				
			||||
 | 
				
			||||
        $(document).ready(function() { | 
				
			||||
            var type = $('input[name="sequence_type"]').val(); | 
				
			||||
 | 
				
			||||
            $('button[name="set_requirement"]').prop('disabled', true); | 
				
			||||
 | 
				
			||||
            $('#parents').on('click', 'a', function() { | 
				
			||||
                var vertexId = $(this).attr('data-id'); | 
				
			||||
                var parent = $(this).parent(); | 
				
			||||
 | 
				
			||||
                if (vertexId) { | 
				
			||||
                    $.ajax({ | 
				
			||||
                        url: url + '?a=delete_vertex&id='+resourceId+'&vertex_id=' + vertexId + '&type=' + type, | 
				
			||||
                        success: function (data) { | 
				
			||||
                            parent.remove(); | 
				
			||||
                        } | 
				
			||||
                    }); | 
				
			||||
                } | 
				
			||||
            }); | 
				
			||||
 | 
				
			||||
            $('button[name="use_as_reference"]').click(function() { | 
				
			||||
                $('button[name="set_requirement"]').prop('disabled', false); | 
				
			||||
 | 
				
			||||
                var id = $("#item option:selected" ).val(); | 
				
			||||
 | 
				
			||||
                // Cleaning parent list. | 
				
			||||
                parentList = []; | 
				
			||||
 | 
				
			||||
                // Check if data exists and load parents | 
				
			||||
                $.ajax({ | 
				
			||||
                    url: url + '?a=load_resource&load_resource_type=parent&id=' + id + '&type='+type, | 
				
			||||
                    success: function (data) { | 
				
			||||
                        if (data) { | 
				
			||||
                            var listLoaded = data.split(','); | 
				
			||||
                            listLoaded.forEach(function(value) { | 
				
			||||
                                $.ajax({ | 
				
			||||
                                    url: url + '?a=get_icon&id='+ value+'&type='+type+'&show_delete=1', | 
				
			||||
                                    success:function(data){ | 
				
			||||
                                        $('#parents').append(data); | 
				
			||||
                                        parentList.push(id); | 
				
			||||
                                    } | 
				
			||||
                                }); | 
				
			||||
                            }); | 
				
			||||
                        } | 
				
			||||
                    } | 
				
			||||
                }); | 
				
			||||
 | 
				
			||||
                // Check if data exists and load children | 
				
			||||
                $.ajax({ | 
				
			||||
                    url: url + '?a=load_resource&load_resource_type=children&id=' + id + '&type='+type, | 
				
			||||
                    success: function (data) { | 
				
			||||
                        if (data) { | 
				
			||||
                            var listLoaded = data.split(','); | 
				
			||||
                            listLoaded.forEach(function(value) { | 
				
			||||
                                $.ajax({ | 
				
			||||
                                    url: url + '?a=get_icon&id='+ value+'&type='+type, | 
				
			||||
                                    success:function(data){ | 
				
			||||
                                        $('#children').append(data); | 
				
			||||
                                    } | 
				
			||||
                                }); | 
				
			||||
                            }); | 
				
			||||
                        } | 
				
			||||
                    } | 
				
			||||
                }); | 
				
			||||
 | 
				
			||||
                // Cleaning | 
				
			||||
                $('#parents').html(''); | 
				
			||||
                $('#children').html(''); | 
				
			||||
 | 
				
			||||
                $.ajax({ | 
				
			||||
                    url: url + '?a=get_icon&id='+ id+'&type='+type, | 
				
			||||
                    success:function(data){ | 
				
			||||
                        $('#resource').html(data); | 
				
			||||
                        parentList.push(id); | 
				
			||||
                        resourceId = id; | 
				
			||||
                    } | 
				
			||||
                }); | 
				
			||||
 | 
				
			||||
                return false; | 
				
			||||
            }); | 
				
			||||
 | 
				
			||||
            $('button[name="set_requirement"]').click(function() { | 
				
			||||
                $("#item option:selected" ).each(function() { | 
				
			||||
                    var id = $(this).val(); | 
				
			||||
                    if ($.inArray(id, parentList) == -1) { | 
				
			||||
                        $.ajax({ | 
				
			||||
                            url: url + '?a=get_icon&id=' + id + '&type=' + type, | 
				
			||||
                            success: function (data) { | 
				
			||||
                                $('#parents').append(data); | 
				
			||||
                                parentList.push(id); | 
				
			||||
                            } | 
				
			||||
                        }); | 
				
			||||
                    } | 
				
			||||
                }); | 
				
			||||
                return false; | 
				
			||||
            }); | 
				
			||||
 | 
				
			||||
            $('button[name="save_resource"]').click(function() { | 
				
			||||
                if (resourceId != 0) { | 
				
			||||
                    var params = decodeURIComponent(parentList); | 
				
			||||
                    $.ajax({ | 
				
			||||
                        url: url + '?a=save_resource&id=' + resourceId + '&parents=' + params+'&type='+type, | 
				
			||||
                        success: function (data) { | 
				
			||||
                            alert('saved'); | 
				
			||||
                        } | 
				
			||||
                    }); | 
				
			||||
                } | 
				
			||||
                return false; | 
				
			||||
            }); | 
				
			||||
        }); | 
				
			||||
    </script> | 
				
			||||
 | 
				
			||||
    <div class="row"> | 
				
			||||
        <div class="col-md-3"> | 
				
			||||
            {{ left_block }} | 
				
			||||
        </div> | 
				
			||||
        <div class="col-md-9"> | 
				
			||||
            <h3> | 
				
			||||
                {{ 'ItemsTheReferenceDependsOn' | get_lang }} | 
				
			||||
            </h3> | 
				
			||||
            <div id="parents"> | 
				
			||||
            </div> | 
				
			||||
            <h3>{{ 'Item' | get_lang }}</h3> | 
				
			||||
            <div id="resource"> | 
				
			||||
            </div> | 
				
			||||
            <h3>{{ 'Dependencies' | get_lang }}</h3> | 
				
			||||
            <div id="children"> | 
				
			||||
            </div> | 
				
			||||
            {{ right_block }} | 
				
			||||
        </div> | 
				
			||||
    </div> | 
				
			||||
{% endblock %} | 
				
			||||
@ -0,0 +1,17 @@ | 
				
			||||
<?php | 
				
			||||
/* For licensing terms, see /license.txt */ | 
				
			||||
 | 
				
			||||
namespace Chamilo\CoreBundle\Entity\Manager; | 
				
			||||
 | 
				
			||||
use Sonata\CoreBundle\Model\BaseEntityManager; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * Class SequenceManager | 
				
			||||
 * CRUD for the course | 
				
			||||
 * | 
				
			||||
 * @package Chamilo\CoreBundle\Entity\Repository | 
				
			||||
 */ | 
				
			||||
class SequenceManager extends BaseEntityManager | 
				
			||||
{ | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -0,0 +1,18 @@ | 
				
			||||
<?php | 
				
			||||
/* For licensing terms, see /license.txt */ | 
				
			||||
 | 
				
			||||
namespace Chamilo\CoreBundle\Entity\Repository; | 
				
			||||
 | 
				
			||||
use Doctrine\ORM\EntityRepository; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * Class SequenceRepository | 
				
			||||
 * The functions inside this class must return an instance of QueryBuilder | 
				
			||||
 * | 
				
			||||
 * @package Chamilo\CoreBundle\Entity\Repository | 
				
			||||
 */ | 
				
			||||
class SequenceRepository extends EntityRepository | 
				
			||||
{ | 
				
			||||
 | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -0,0 +1,114 @@ | 
				
			||||
<?php | 
				
			||||
/* For licensing terms, see /license.txt */ | 
				
			||||
 | 
				
			||||
namespace Chamilo\CoreBundle\Entity; | 
				
			||||
 | 
				
			||||
use Doctrine\ORM\Mapping as ORM; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * Class SequenceResource | 
				
			||||
 * @ORM\Entity(repositoryClass="Chamilo\CoreBundle\Entity\Repository\SequenceRepository") | 
				
			||||
 * @ORM\Table(name="sequence_resource") | 
				
			||||
 * @ORM\Entity | 
				
			||||
 */ | 
				
			||||
class SequenceResource | 
				
			||||
{ | 
				
			||||
    const COURSE_TYPE = 1; | 
				
			||||
    const SESSION_TYPE = 2; | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * @var integer | 
				
			||||
     * | 
				
			||||
     * @ORM\Column(name="id", type="integer") | 
				
			||||
     * @ORM\Id | 
				
			||||
     * @ORM\GeneratedValue() | 
				
			||||
     */ | 
				
			||||
    private $id; | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * @var integer | 
				
			||||
     * | 
				
			||||
     * @ORM\Column(name="type", type="integer") | 
				
			||||
     */ | 
				
			||||
    private $type; | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * @var integer | 
				
			||||
     * | 
				
			||||
     * @ORM\Column(name="resource_id", type="integer") | 
				
			||||
     */ | 
				
			||||
    private $resourceId; | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * @var string | 
				
			||||
     * | 
				
			||||
     * @ORM\Column(name="graph", type="text") | 
				
			||||
     */ | 
				
			||||
    private $graph; | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * Get id | 
				
			||||
     * | 
				
			||||
     * @return integer | 
				
			||||
     */ | 
				
			||||
    public function getId() | 
				
			||||
    { | 
				
			||||
        return $this->id; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * @return string | 
				
			||||
     */ | 
				
			||||
    public function getType() | 
				
			||||
    { | 
				
			||||
        return $this->type; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * @param string $type | 
				
			||||
     * @return SequenceResource | 
				
			||||
     */ | 
				
			||||
    public function setType($type) | 
				
			||||
    { | 
				
			||||
        $this->type = $type; | 
				
			||||
 | 
				
			||||
        return $this; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * @return string | 
				
			||||
     */ | 
				
			||||
    public function getGraph() | 
				
			||||
    { | 
				
			||||
        return $this->graph; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * @param string $graph | 
				
			||||
     * @return SequenceResource | 
				
			||||
     */ | 
				
			||||
    public function setGraph($graph) | 
				
			||||
    { | 
				
			||||
        $this->graph = $graph; | 
				
			||||
 | 
				
			||||
        return $this; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * @return int | 
				
			||||
     */ | 
				
			||||
    public function getResourceId() | 
				
			||||
    { | 
				
			||||
        return $this->resourceId; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * @param int $resourceId | 
				
			||||
     */ | 
				
			||||
    public function setResourceId($resourceId) | 
				
			||||
    { | 
				
			||||
        $this->resourceId = $resourceId; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
 | 
				
			||||
} | 
				
			||||
					Loading…
					
					
				
		Reference in new issue