parent
f2b46bb449
commit
136793be5c
@ -1,22 +1,21 @@ |
|||||||
# see https://github.com/phiamo/MopaBootstrapBundle/blob/master/Resources/doc/misc/configuration-reference.md |
# see https://github.com/phiamo/MopaBootstrapBundle/blob/master/Resources/doc/misc/configuration-reference.md |
||||||
#mopa_bootstrap: |
mopa_bootstrap: |
||||||
# # Adds twig form theme support |
# Adds twig form theme support |
||||||
## horizontal_label_class: 'aa' |
# horizontal_label_class: 'aa' |
||||||
## horizontal_input_wrapper_class: 'dd' |
# horizontal_input_wrapper_class: 'dd' |
||||||
# menu: ~ # enables twig helpers for menu |
menu: ~ # enables twig helpers for menu |
||||||
# form: |
form: |
||||||
# show_legend: true # default is true |
show_legend: true # default is true |
||||||
# show_child_legend: false # default is true |
show_child_legend: false # default is true |
||||||
# error_type: block # or inline which is default |
error_type: block # or inline which is default |
||||||
# render_optional_text: true |
render_optional_text: true |
||||||
# |
|
||||||
# collection: |
collection: |
||||||
# widget_remove_btn: |
widget_remove_btn: |
||||||
# icon: trash |
icon: trash |
||||||
# icon_color: white |
attr: |
||||||
# attr: |
class: btn btn-danger |
||||||
# class: btn btn-danger |
widget_add_btn: |
||||||
# widget_add_btn: |
icon: plus-sign |
||||||
# icon: plus-sign |
attr: |
||||||
# attr: |
class: btn btn-primary |
||||||
# class: btn btn-primary |
|
||||||
|
@ -0,0 +1,6 @@ |
|||||||
|
sonata_translation: |
||||||
|
locales: [en, fr, it, nl, es] |
||||||
|
default_locale: en |
||||||
|
# here enable the types you need |
||||||
|
gedmo: |
||||||
|
enabled: true |
@ -0,0 +1,68 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
namespace Chamilo\FaqBundle\Admin; |
||||||
|
|
||||||
|
use Sonata\AdminBundle\Admin\Admin; |
||||||
|
use Sonata\AdminBundle\Datagrid\ListMapper; |
||||||
|
use Sonata\AdminBundle\Datagrid\DatagridMapper; |
||||||
|
use Sonata\AdminBundle\Form\FormMapper; |
||||||
|
|
||||||
|
/** |
||||||
|
* Class QuestionAdmin |
||||||
|
* |
||||||
|
* @package Genj\FaqAdminBundle\Admin |
||||||
|
*/ |
||||||
|
class CategoryAdmin extends Admin |
||||||
|
{ |
||||||
|
protected $datagridValues = array( |
||||||
|
'_page' => 1, |
||||||
|
'_sort_by' => 'created_at', |
||||||
|
'_sort_order' => 'Desc' |
||||||
|
); |
||||||
|
|
||||||
|
/** |
||||||
|
* @param DatagridMapper $datagridMapper |
||||||
|
*/ |
||||||
|
protected function configureDatagridFilters(DatagridMapper $datagridMapper) |
||||||
|
{ |
||||||
|
$datagridMapper |
||||||
|
->add('headline') |
||||||
|
->add('body') |
||||||
|
->add('rank') |
||||||
|
->add('isActive') |
||||||
|
; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @param ListMapper $listMapper |
||||||
|
*/ |
||||||
|
protected function configureListFields(ListMapper $listMapper) |
||||||
|
{ |
||||||
|
$listMapper |
||||||
|
->add('headline', null, array('identifier' => true)) |
||||||
|
->add('_action', 'actions', |
||||||
|
array( |
||||||
|
'actions' => array( |
||||||
|
'show' => array(), |
||||||
|
'edit' => array(), |
||||||
|
'delete' => array() |
||||||
|
) |
||||||
|
) |
||||||
|
) |
||||||
|
; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @param FormMapper $formMapper |
||||||
|
*/ |
||||||
|
protected function configureFormFields(FormMapper $formMapper) |
||||||
|
{ |
||||||
|
$formMapper |
||||||
|
->add('headline', null, array('attr' => array('class' => 'span12'))) |
||||||
|
->add('body', null, array('required' => false, 'attr' => array('class' => 'span12'))) |
||||||
|
->add('rank', null, array('required' => false, 'attr' => array('class' => 'span12'))) |
||||||
|
->add('slug') |
||||||
|
->add('isActive') |
||||||
|
->end(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,74 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
namespace Chamilo\FaqBundle\Admin; |
||||||
|
|
||||||
|
use Sonata\AdminBundle\Admin\Admin; |
||||||
|
use Sonata\AdminBundle\Datagrid\ListMapper; |
||||||
|
use Sonata\AdminBundle\Datagrid\DatagridMapper; |
||||||
|
use Sonata\AdminBundle\Form\FormMapper; |
||||||
|
|
||||||
|
/** |
||||||
|
* Class QuestionAdmin |
||||||
|
* |
||||||
|
* @package Genj\FaqAdminBundle\Admin |
||||||
|
*/ |
||||||
|
class QuestionAdmin extends Admin |
||||||
|
{ |
||||||
|
protected $datagridValues = array( |
||||||
|
'_page' => 1, |
||||||
|
'_sort_by' => 'issueDate', |
||||||
|
'_sort_order' => 'Desc' |
||||||
|
); |
||||||
|
|
||||||
|
/** |
||||||
|
* @param DatagridMapper $datagridMapper |
||||||
|
*/ |
||||||
|
protected function configureDatagridFilters(DatagridMapper $datagridMapper) |
||||||
|
{ |
||||||
|
$datagridMapper |
||||||
|
->add('headline') |
||||||
|
->add('body') |
||||||
|
->add('category') |
||||||
|
->add('slug'); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @param ListMapper $listMapper |
||||||
|
*/ |
||||||
|
protected function configureListFields(ListMapper $listMapper) |
||||||
|
{ |
||||||
|
$listMapper |
||||||
|
->addIdentifier('id') |
||||||
|
->add('headline', null, array('identifier' => true)) |
||||||
|
->add('Category') |
||||||
|
->add('rank') |
||||||
|
->add('_action', 'actions', |
||||||
|
array( |
||||||
|
'actions' => array( |
||||||
|
'show' => array(), |
||||||
|
'edit' => array(), |
||||||
|
'delete' => array() |
||||||
|
) |
||||||
|
) |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @param FormMapper $formMapper |
||||||
|
*/ |
||||||
|
protected function configureFormFields(FormMapper $formMapper) |
||||||
|
{ |
||||||
|
$formMapper |
||||||
|
->add('headline', null, array('attr' => array('class' => 'span12'))) |
||||||
|
->add('body', null, array('required' => false, 'attr' => array('class' => 'span12'))) |
||||||
|
->add('category', null, array( |
||||||
|
'expanded' => true, |
||||||
|
'required' => true, |
||||||
|
'attr' => array('class' => 'radio-list vertical') |
||||||
|
)) |
||||||
|
->add('rank', null, array('required' => false, 'attr' => array('class' => 'span12'))) |
||||||
|
->add('slug', null, array('required' => false, 'attr' => array('class' => 'span12'))) |
||||||
|
->add('onlyAuthUsers') |
||||||
|
->end(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,18 @@ |
|||||||
|
<?php |
||||||
|
/* For licensing terms, see /license.txt */ |
||||||
|
|
||||||
|
namespace Chamilo\FaqBundle; |
||||||
|
|
||||||
|
use Symfony\Component\HttpKernel\Bundle\Bundle; |
||||||
|
|
||||||
|
/** |
||||||
|
* Class ChamiloFaqBundle |
||||||
|
* |
||||||
|
* Based in GenjFaqBundle |
||||||
|
* |
||||||
|
* @package Chamilo\UserBundle |
||||||
|
*/ |
||||||
|
class ChamiloFaqBundle extends Bundle |
||||||
|
{ |
||||||
|
|
||||||
|
} |
@ -0,0 +1,183 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
namespace Chamilo\FaqBundle\Controller; |
||||||
|
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Controller\Controller; |
||||||
|
use Chamilo\FaqBundle\Entity\Category; |
||||||
|
use Chamilo\FaqBundle\Entity\Question; |
||||||
|
|
||||||
|
/** |
||||||
|
* Class FaqController |
||||||
|
* |
||||||
|
* @package Genj\FaqBundle\Controller |
||||||
|
*/ |
||||||
|
class FaqController extends Controller |
||||||
|
{ |
||||||
|
/** |
||||||
|
* Default index. Shows one category/question at a time. If you want to just show everything at once, use the |
||||||
|
* indexWithoutCollapse action instead. |
||||||
|
* |
||||||
|
* @param string $categorySlug |
||||||
|
* @param string $questionSlug |
||||||
|
* |
||||||
|
* @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException |
||||||
|
* @return \Symfony\Component\HttpFoundation\Response |
||||||
|
*/ |
||||||
|
public function indexAction($categorySlug, $questionSlug) |
||||||
|
{ |
||||||
|
if (!$categorySlug || !$questionSlug) { |
||||||
|
$redirect = $this->generateRedirectToDefaultSelection($categorySlug, $questionSlug); |
||||||
|
if ($redirect) { |
||||||
|
return $redirect; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Otherwise get the selected category and/or question as usual |
||||||
|
$questions = array(); |
||||||
|
$categories = $this->getCategoryRepository()->retrieveActive(); |
||||||
|
$selectedCategory = $this->getSelectedCategory($categorySlug); |
||||||
|
$selectedQuestion = $this->getSelectedQuestion($questionSlug); |
||||||
|
|
||||||
|
if ($selectedCategory) { |
||||||
|
$questions = $selectedCategory->getQuestions(); |
||||||
|
} |
||||||
|
|
||||||
|
// Throw 404 if there is no category in the database |
||||||
|
if (!$categories) { |
||||||
|
throw $this->createNotFoundException('You need at least 1 active faq category in the database'); |
||||||
|
} |
||||||
|
|
||||||
|
return $this->render( |
||||||
|
'@ChamiloFaq/Faq/index.html.twig', |
||||||
|
array( |
||||||
|
'categories' => $categories, |
||||||
|
'questions' => $questions, |
||||||
|
'selectedCategory' => $selectedCategory, |
||||||
|
'selectedQuestion' => $selectedQuestion |
||||||
|
) |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Index without any collapsing. Will just show all categories and questions at once. |
||||||
|
* |
||||||
|
* @param string $categorySlug |
||||||
|
* |
||||||
|
* @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException |
||||||
|
* @return \Symfony\Component\HttpFoundation\Response |
||||||
|
*/ |
||||||
|
public function indexWithoutCollapseAction($categorySlug) |
||||||
|
{ |
||||||
|
if ($categorySlug) { |
||||||
|
$categories = $this->getCategoryRepository()->retrieveActiveBySlug($categorySlug); |
||||||
|
} else { |
||||||
|
$categories = $this->getCategoryRepository()->retrieveActive(); |
||||||
|
} |
||||||
|
|
||||||
|
if (!$categories) { |
||||||
|
throw $this->createNotFoundException('Faq category not found'); |
||||||
|
} |
||||||
|
|
||||||
|
return $this->render( |
||||||
|
'@ChamiloFaq/Faq/index_without_collapse.html.twig', |
||||||
|
array( |
||||||
|
'categories' => $categories, |
||||||
|
'categorySlug' => $categorySlug |
||||||
|
) |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Open first category or question if none was selected so far. |
||||||
|
* |
||||||
|
* @param string $categorySlug |
||||||
|
* @param string $questionSlug |
||||||
|
* |
||||||
|
* @return \Symfony\Component\HttpFoundation\RedirectResponse |
||||||
|
* @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException |
||||||
|
*/ |
||||||
|
protected function generateRedirectToDefaultSelection($categorySlug, $questionSlug) |
||||||
|
{ |
||||||
|
$doRedirect = false; |
||||||
|
//$config = $this->container->getParameter('faq'); |
||||||
|
$config = []; |
||||||
|
$config['select_first_category_by_default'] = true; |
||||||
|
$config['select_first_question_by_default'] = true; |
||||||
|
|
||||||
|
if (!$categorySlug && $config['select_first_category_by_default']) { |
||||||
|
$firstCategory = $this->getCategoryRepository()->retrieveFirst(); |
||||||
|
if ($firstCategory instanceof Category) { |
||||||
|
$categorySlug = $firstCategory->getSlug(); |
||||||
|
$doRedirect = true; |
||||||
|
} else { |
||||||
|
throw $this->createNotFoundException('Tried to open the first faq category by default, but there was none.'); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (!$questionSlug && $config['select_first_question_by_default']) { |
||||||
|
$firstQuestion = $this->getQuestionRepository()->retrieveFirstByCategorySlug($categorySlug); |
||||||
|
if ($firstQuestion instanceof Question) { |
||||||
|
$questionSlug = $firstQuestion->getSlug(); |
||||||
|
$doRedirect = true; |
||||||
|
} else { |
||||||
|
throw $this->createNotFoundException('Tried to open the first faq question by default, but there was none.'); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if ($doRedirect) { |
||||||
|
return $this->redirect( |
||||||
|
$this->generateUrl('faq', array('categorySlug' => $categorySlug, 'questionSlug' => $questionSlug), true) |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @param string $questionSlug |
||||||
|
* |
||||||
|
* @return \Genj\FaqBundle\Entity\Question |
||||||
|
*/ |
||||||
|
protected function getSelectedQuestion($questionSlug = null) |
||||||
|
{ |
||||||
|
$selectedQuestion = null; |
||||||
|
|
||||||
|
if ($questionSlug !== null) { |
||||||
|
$selectedQuestion = $this->getQuestionRepository()->findOneBySlug($questionSlug); |
||||||
|
} |
||||||
|
|
||||||
|
return $selectedQuestion; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @param string $categorySlug |
||||||
|
* |
||||||
|
* @return \Genj\FaqBundle\Entity\Category |
||||||
|
*/ |
||||||
|
protected function getSelectedCategory($categorySlug = null) |
||||||
|
{ |
||||||
|
$selectedCategory = null; |
||||||
|
|
||||||
|
if ($categorySlug !== null) { |
||||||
|
$selectedCategory = $this->getCategoryRepository()->findOneBy(array('isActive' => true, 'slug' => $categorySlug)); |
||||||
|
} |
||||||
|
|
||||||
|
return $selectedCategory; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @return \Genj\FaqBundle\Entity\QuestionRepository |
||||||
|
*/ |
||||||
|
protected function getQuestionRepository() |
||||||
|
{ |
||||||
|
return $this->container->get('genj_faq.entity.question_repository'); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @return \Genj\FaqBundle\Entity\CategoryRepository |
||||||
|
*/ |
||||||
|
protected function getCategoryRepository() |
||||||
|
{ |
||||||
|
return $this->container->get('genj_faq.entity.category_repository'); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,27 @@ |
|||||||
|
<?php |
||||||
|
/* For licensing terms, see /license.txt */ |
||||||
|
|
||||||
|
namespace Chamilo\FaqBundle\DependencyInjection; |
||||||
|
|
||||||
|
use Symfony\Component\DependencyInjection\ContainerBuilder; |
||||||
|
use Symfony\Component\Config\FileLocator; |
||||||
|
use Symfony\Component\HttpKernel\DependencyInjection\Extension; |
||||||
|
use Symfony\Component\DependencyInjection\Loader; |
||||||
|
|
||||||
|
/** |
||||||
|
* This is the class that loads and manages your bundle configuration |
||||||
|
* |
||||||
|
* To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html} |
||||||
|
*/ |
||||||
|
class ChamiloFaqExtension extends Extension |
||||||
|
{ |
||||||
|
/** |
||||||
|
* {@inheritDoc} |
||||||
|
*/ |
||||||
|
public function load(array $configs, ContainerBuilder $container) |
||||||
|
{ |
||||||
|
$loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); |
||||||
|
$loader->load('admin.yml'); |
||||||
|
$loader->load('services.yml'); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,315 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
namespace Chamilo\FaqBundle\Entity; |
||||||
|
|
||||||
|
use Gedmo\Mapping\Annotation as Gedmo; |
||||||
|
use Doctrine\ORM\Mapping as ORM; |
||||||
|
|
||||||
|
/** |
||||||
|
* Class Category |
||||||
|
* |
||||||
|
* @ORM\Entity(repositoryClass="Chamilo\FaqBundle\Entity\CategoryRepository") |
||||||
|
* @ORM\Table( |
||||||
|
* name="faq_category", |
||||||
|
* indexes={@ORM\Index(name="is_active_idx", columns={"is_active"})} |
||||||
|
* ) |
||||||
|
* |
||||||
|
* @package Genj\FaqBundle\Entity |
||||||
|
*/ |
||||||
|
class Category |
||||||
|
{ |
||||||
|
/** |
||||||
|
* @ORM\Column(type="integer") |
||||||
|
* @ORM\Id |
||||||
|
* @ORM\GeneratedValue(strategy="AUTO") |
||||||
|
*/ |
||||||
|
protected $id; |
||||||
|
|
||||||
|
/** |
||||||
|
* @ORM\OneToMany(targetEntity="Question", mappedBy="category") |
||||||
|
*/ |
||||||
|
protected $questions; |
||||||
|
|
||||||
|
/** |
||||||
|
* @ORM\Column(type="string", length=255, nullable=false) |
||||||
|
*/ |
||||||
|
protected $headline; |
||||||
|
|
||||||
|
/** |
||||||
|
* @ORM\Column(type="text", nullable=true) |
||||||
|
*/ |
||||||
|
protected $body; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Gedmo\SortablePosition |
||||||
|
* @ORM\Column(name="rank", type="integer") |
||||||
|
*/ |
||||||
|
protected $rank; |
||||||
|
|
||||||
|
/** |
||||||
|
* @ORM\Column(name="is_active", type="boolean") |
||||||
|
*/ |
||||||
|
protected $isActive; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Gedmo\Timestampable(on="create") |
||||||
|
* @ORM\Column(name="created_at", type="datetime") |
||||||
|
*/ |
||||||
|
protected $createdAt; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Gedmo\Timestampable(on="update") |
||||||
|
* @ORM\Column(name="updated_at", type="datetime") |
||||||
|
*/ |
||||||
|
protected $updatedAt; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Gedmo\Slug(fields={"headline"}, updatable=false) |
||||||
|
* @ORM\Column(type="string", length=50, nullable=false) |
||||||
|
*/ |
||||||
|
protected $slug; |
||||||
|
|
||||||
|
/** |
||||||
|
* Get id |
||||||
|
* |
||||||
|
* @return integer |
||||||
|
*/ |
||||||
|
public function getId() |
||||||
|
{ |
||||||
|
return $this->id; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Set headline |
||||||
|
* |
||||||
|
* @param string $headline |
||||||
|
* |
||||||
|
* @return Category |
||||||
|
*/ |
||||||
|
public function setHeadline($headline) |
||||||
|
{ |
||||||
|
$this->headline = $headline; |
||||||
|
|
||||||
|
return $this; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get headline |
||||||
|
* |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
public function getHeadline() |
||||||
|
{ |
||||||
|
return $this->headline; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get body |
||||||
|
* |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
public function getBody() |
||||||
|
{ |
||||||
|
return $this->body; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Set body |
||||||
|
* |
||||||
|
* @param string $body |
||||||
|
* |
||||||
|
* @return Question |
||||||
|
*/ |
||||||
|
public function setBody($body) |
||||||
|
{ |
||||||
|
$this->body = $body; |
||||||
|
|
||||||
|
return $this; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get rank |
||||||
|
* |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
public function getRank() |
||||||
|
{ |
||||||
|
return $this->rank; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Set rank |
||||||
|
* |
||||||
|
* @param string $rank |
||||||
|
* |
||||||
|
* @return Question |
||||||
|
*/ |
||||||
|
public function setRank($rank) |
||||||
|
{ |
||||||
|
$this->rank = $rank; |
||||||
|
|
||||||
|
return $this; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Set is_active |
||||||
|
* |
||||||
|
* @param boolean $isActive |
||||||
|
* |
||||||
|
* @return Category |
||||||
|
*/ |
||||||
|
public function setIsActive($isActive) |
||||||
|
{ |
||||||
|
$this->isActive = $isActive; |
||||||
|
|
||||||
|
return $this; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get isActive |
||||||
|
* |
||||||
|
* @return boolean |
||||||
|
*/ |
||||||
|
public function getIsActive() |
||||||
|
{ |
||||||
|
return $this->isActive; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Set createdAt |
||||||
|
* |
||||||
|
* @param \DateTime $createdAt |
||||||
|
* |
||||||
|
* @return Category |
||||||
|
*/ |
||||||
|
public function setCreatedAt(\DateTime $createdAt) |
||||||
|
{ |
||||||
|
$this->createdAt = $createdAt; |
||||||
|
|
||||||
|
return $this; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get createdAt |
||||||
|
* |
||||||
|
* @return \DateTime |
||||||
|
*/ |
||||||
|
public function getCreatedAt() |
||||||
|
{ |
||||||
|
return $this->createdAt; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Set updatedAt |
||||||
|
* |
||||||
|
* @param \DateTime $updatedAt |
||||||
|
* |
||||||
|
* @return Category |
||||||
|
*/ |
||||||
|
public function setUpdatedAt(\DateTime $updatedAt) |
||||||
|
{ |
||||||
|
$this->updatedAt = $updatedAt; |
||||||
|
|
||||||
|
return $this; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get updatedAt |
||||||
|
* |
||||||
|
* @return \DateTime |
||||||
|
*/ |
||||||
|
public function getUpdatedAt() |
||||||
|
{ |
||||||
|
return $this->updatedAt; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Set slug |
||||||
|
* |
||||||
|
* @param string $slug |
||||||
|
* |
||||||
|
* @return Category |
||||||
|
*/ |
||||||
|
public function setSlug($slug) |
||||||
|
{ |
||||||
|
$this->slug = $slug; |
||||||
|
|
||||||
|
return $this; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get slug |
||||||
|
* |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
public function getSlug() |
||||||
|
{ |
||||||
|
return $this->slug; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Add question |
||||||
|
* |
||||||
|
* @param Question $question |
||||||
|
* |
||||||
|
* @return Category |
||||||
|
*/ |
||||||
|
public function addQuestion(Question $question) |
||||||
|
{ |
||||||
|
$this->questions[] = $question; |
||||||
|
|
||||||
|
return $this; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Remove question |
||||||
|
* |
||||||
|
* @param Question $question |
||||||
|
*/ |
||||||
|
public function removeQuestion(Question $question) |
||||||
|
{ |
||||||
|
$this->questions->removeElement($question); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get questions |
||||||
|
* |
||||||
|
* @return \Doctrine\Common\Collections\Collection |
||||||
|
*/ |
||||||
|
public function getQuestions() |
||||||
|
{ |
||||||
|
return $this->questions; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns a string representation of this object |
||||||
|
* |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
public function __toString() |
||||||
|
{ |
||||||
|
return $this->getHeadline(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the route name for url generation |
||||||
|
* |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
public function getRouteName() |
||||||
|
{ |
||||||
|
return 'faq'; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the route parameters for url generation |
||||||
|
* |
||||||
|
* @return array |
||||||
|
*/ |
||||||
|
public function getRouteParameters() |
||||||
|
{ |
||||||
|
return array( |
||||||
|
'categorySlug' => $this->getSlug() |
||||||
|
); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,63 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
namespace Chamilo\FaqBundle\Entity; |
||||||
|
|
||||||
|
use Doctrine\ORM\EntityRepository; |
||||||
|
|
||||||
|
/** |
||||||
|
* Class CategoryRepository |
||||||
|
* |
||||||
|
* @package Genj\FaqBundle\Entity |
||||||
|
*/ |
||||||
|
class CategoryRepository extends EntityRepository |
||||||
|
{ |
||||||
|
/** |
||||||
|
* @return mixed |
||||||
|
*/ |
||||||
|
public function retrieveActive() |
||||||
|
{ |
||||||
|
$query = $this->createQueryBuilder('c') |
||||||
|
->where('c.isActive = :isActive') |
||||||
|
->orderBy('c.rank', 'ASC') |
||||||
|
->getQuery(); |
||||||
|
|
||||||
|
$query->setParameter('isActive', true); |
||||||
|
|
||||||
|
return $query->execute(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @param string $slug |
||||||
|
* |
||||||
|
* @return mixed |
||||||
|
*/ |
||||||
|
public function retrieveActiveBySlug($slug) |
||||||
|
{ |
||||||
|
$query = $this->createQueryBuilder('c') |
||||||
|
->where('c.isActive = :isActive') |
||||||
|
->andWhere('c.slug = :slug') |
||||||
|
->orderBy('c.rank', 'ASC') |
||||||
|
->getQuery(); |
||||||
|
|
||||||
|
$query->setParameter('isActive', true); |
||||||
|
$query->setParameter('slug', $slug); |
||||||
|
|
||||||
|
return $query->execute(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @return Category|null |
||||||
|
*/ |
||||||
|
public function retrieveFirst() |
||||||
|
{ |
||||||
|
$query = $this->createQueryBuilder('c') |
||||||
|
->where('c.isActive = :isActive') |
||||||
|
->orderBy('c.rank', 'ASC') |
||||||
|
->setMaxResults(1) |
||||||
|
->getQuery(); |
||||||
|
|
||||||
|
$query->setParameter('isActive', true); |
||||||
|
|
||||||
|
return $query->getOneOrNullResult(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,313 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
namespace Chamilo\FaqBundle\Entity; |
||||||
|
|
||||||
|
use Gedmo\Mapping\Annotation as Gedmo; |
||||||
|
use Doctrine\ORM\Mapping as ORM; |
||||||
|
|
||||||
|
/** |
||||||
|
* Class Question |
||||||
|
* |
||||||
|
* @ORM\MappedSuperclass |
||||||
|
* @ORM\Entity(repositoryClass="Chamilo\FaqBundle\Entity\QuestionRepository") |
||||||
|
* @ORM\Table(name="faq_question") |
||||||
|
* |
||||||
|
* @package Genj\FaqBundle\Entity |
||||||
|
*/ |
||||||
|
class Question |
||||||
|
{ |
||||||
|
/** |
||||||
|
* @ORM\Column(type="integer") |
||||||
|
* @ORM\Id |
||||||
|
* @ORM\GeneratedValue(strategy="AUTO") |
||||||
|
*/ |
||||||
|
protected $id; |
||||||
|
|
||||||
|
/** |
||||||
|
* @ORM\ManyToOne(targetEntity="Category", inversedBy="questions") |
||||||
|
* @ORM\OrderBy({"rank" = "asc"}) |
||||||
|
*/ |
||||||
|
protected $category; |
||||||
|
|
||||||
|
/** |
||||||
|
* @ORM\Column(type="string", length=255, nullable=false) |
||||||
|
*/ |
||||||
|
protected $headline; |
||||||
|
|
||||||
|
/** |
||||||
|
* @ORM\Column(type="text", nullable=true) |
||||||
|
*/ |
||||||
|
protected $body; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Gedmo\SortablePosition |
||||||
|
* @ORM\Column(name="rank", type="integer") |
||||||
|
*/ |
||||||
|
protected $rank; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Gedmo\Timestampable(on="create") |
||||||
|
* @ORM\Column(name="created_at", type="datetime") |
||||||
|
*/ |
||||||
|
protected $createdAt; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Gedmo\Timestampable(on="update") |
||||||
|
* @ORM\Column(name="updated_at", type="datetime") |
||||||
|
*/ |
||||||
|
protected $updatedAt; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Gedmo\Slug(fields={"headline"}, updatable=false) |
||||||
|
* @ORM\Column(type="string", length=50, nullable=false) |
||||||
|
*/ |
||||||
|
protected $slug; |
||||||
|
|
||||||
|
/** |
||||||
|
* @var boolean |
||||||
|
* @ORM\Column(name="only_auth_users", type="boolean", nullable=false) |
||||||
|
*/ |
||||||
|
protected $onlyAuthUsers; |
||||||
|
|
||||||
|
/** |
||||||
|
* Get id |
||||||
|
* |
||||||
|
* @return integer |
||||||
|
*/ |
||||||
|
public function getId() |
||||||
|
{ |
||||||
|
return $this->id; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Set headline |
||||||
|
* |
||||||
|
* @param string $headline |
||||||
|
* |
||||||
|
* @return Question |
||||||
|
*/ |
||||||
|
public function setHeadline($headline) |
||||||
|
{ |
||||||
|
$this->headline = $headline; |
||||||
|
|
||||||
|
return $this; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get headline |
||||||
|
* |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
public function getHeadline() |
||||||
|
{ |
||||||
|
return $this->headline; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Set body |
||||||
|
* |
||||||
|
* @param string $body |
||||||
|
* |
||||||
|
* @return Question |
||||||
|
*/ |
||||||
|
public function setBody($body) |
||||||
|
{ |
||||||
|
$this->body = $body; |
||||||
|
|
||||||
|
return $this; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get rank |
||||||
|
* |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
public function getRank() |
||||||
|
{ |
||||||
|
return $this->rank; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Set rank |
||||||
|
* |
||||||
|
* @param string $rank |
||||||
|
* |
||||||
|
* @return Question |
||||||
|
*/ |
||||||
|
public function setRank($rank) |
||||||
|
{ |
||||||
|
$this->rank = $rank; |
||||||
|
|
||||||
|
return $this; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get body |
||||||
|
* |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
public function getBody() |
||||||
|
{ |
||||||
|
return $this->body; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Set createdAt |
||||||
|
* |
||||||
|
* @param \DateTime $createdAt |
||||||
|
* |
||||||
|
* @return Question |
||||||
|
*/ |
||||||
|
public function setCreatedAt($createdAt) |
||||||
|
{ |
||||||
|
$this->createdAt = $createdAt; |
||||||
|
|
||||||
|
return $this; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get createdAt |
||||||
|
* |
||||||
|
* @return \DateTime |
||||||
|
*/ |
||||||
|
public function getCreatedAt() |
||||||
|
{ |
||||||
|
return $this->createdAt; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Set updatedAt |
||||||
|
* |
||||||
|
* @param \DateTime $updatedAt |
||||||
|
* |
||||||
|
* @return Question |
||||||
|
*/ |
||||||
|
public function setUpdatedAt($updatedAt) |
||||||
|
{ |
||||||
|
$this->updatedAt = $updatedAt; |
||||||
|
|
||||||
|
return $this; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get updatedAt |
||||||
|
* |
||||||
|
* @return \DateTime |
||||||
|
*/ |
||||||
|
public function getUpdatedAt() |
||||||
|
{ |
||||||
|
return $this->updatedAt; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Set slug |
||||||
|
* |
||||||
|
* @param string $slug |
||||||
|
* |
||||||
|
* @return Question |
||||||
|
*/ |
||||||
|
public function setSlug($slug) |
||||||
|
{ |
||||||
|
$this->slug = $slug; |
||||||
|
|
||||||
|
return $this; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get slug |
||||||
|
* |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
public function getSlug() |
||||||
|
{ |
||||||
|
return $this->slug; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Set category |
||||||
|
* |
||||||
|
* @param Category $category |
||||||
|
* |
||||||
|
* @return Question |
||||||
|
*/ |
||||||
|
public function setCategory(Category $category = null) |
||||||
|
{ |
||||||
|
$this->category = $category; |
||||||
|
|
||||||
|
return $this; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get category |
||||||
|
* |
||||||
|
* @return Category |
||||||
|
*/ |
||||||
|
public function getCategory() |
||||||
|
{ |
||||||
|
return $this->category; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns a string representation of this object |
||||||
|
* |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
public function __toString() |
||||||
|
{ |
||||||
|
return $this->getHeadline(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the route name for url generation |
||||||
|
* |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
public function getRouteName() |
||||||
|
{ |
||||||
|
return 'faq'; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the route parameters for url generation |
||||||
|
* |
||||||
|
* @return array |
||||||
|
*/ |
||||||
|
public function getRouteParameters() |
||||||
|
{ |
||||||
|
return array( |
||||||
|
'categorySlug' => $this->getCategory()->getSlug(), |
||||||
|
'questionSlug' => $this->getSlug() |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns a string representation of the entity build out of BundleName + EntityName + EntityId |
||||||
|
* |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
public function getEntityIdentifier() |
||||||
|
{ |
||||||
|
return 'GenjFaqBundle:Question:' . $this->getId(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @return boolean |
||||||
|
*/ |
||||||
|
public function isOnlyAuthUsers() |
||||||
|
{ |
||||||
|
return $this->onlyAuthUsers; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @param boolean $onlyAuthUsers |
||||||
|
* @return Question |
||||||
|
*/ |
||||||
|
public function setOnlyAuthUsers($onlyAuthUsers) |
||||||
|
{ |
||||||
|
$this->onlyAuthUsers = $onlyAuthUsers; |
||||||
|
|
||||||
|
return $this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,32 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
namespace Chamilo\FaqBundle\Entity; |
||||||
|
|
||||||
|
use Doctrine\ORM\EntityRepository; |
||||||
|
|
||||||
|
/** |
||||||
|
* Class QuestionRepository |
||||||
|
* |
||||||
|
* @package Genj\FaqBundle\Entity |
||||||
|
*/ |
||||||
|
class QuestionRepository extends EntityRepository |
||||||
|
{ |
||||||
|
/** |
||||||
|
* @param string $categorySlug |
||||||
|
* |
||||||
|
* @return Question|null |
||||||
|
*/ |
||||||
|
public function retrieveFirstByCategorySlug($categorySlug) |
||||||
|
{ |
||||||
|
$query = $this->createQueryBuilder('q') |
||||||
|
->join('q.category', 'c') |
||||||
|
->where('c.slug = :categorySlug') |
||||||
|
->orderBy('q.rank', 'ASC') |
||||||
|
->setMaxResults(1) |
||||||
|
->getQuery(); |
||||||
|
|
||||||
|
$query->setParameter('categorySlug', $categorySlug); |
||||||
|
|
||||||
|
return $query->getOneOrNullResult(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,19 @@ |
|||||||
|
services: |
||||||
|
|
||||||
|
sonata.admin.faq_question: |
||||||
|
class: Chamilo\FaqBundle\Admin\QuestionAdmin |
||||||
|
tags: |
||||||
|
- { name: sonata.admin, manager_type: orm, group: "Content", label: "FAQ" } |
||||||
|
arguments: |
||||||
|
- ~ |
||||||
|
- Chamilo\FaqBundle\Entity\Question |
||||||
|
- ~ |
||||||
|
|
||||||
|
sonata.admin.faq_category: |
||||||
|
class: Chamilo\FaqBundle\Admin\CategoryAdmin |
||||||
|
tags: |
||||||
|
- { name: sonata.admin, manager_type: orm, group: "Content", label: "FAQ category" } |
||||||
|
arguments: |
||||||
|
- ~ |
||||||
|
- Chamilo\FaqBundle\Entity\Category |
||||||
|
- ~ |
@ -0,0 +1,8 @@ |
|||||||
|
faq: |
||||||
|
pattern: /faq/{categorySlug}/{questionSlug} |
||||||
|
defaults: { _controller: ChamiloFaqBundle:Faq:index, categorySlug: null, questionSlug: null } |
||||||
|
|
||||||
|
# Shows the entire FAQ at once, without collapsing any categories or questions. Useful if your FAQ is not that big. |
||||||
|
faq_without_collapse: |
||||||
|
pattern: /faq-without-collapse/{categorySlug} |
||||||
|
defaults: { _controller: ChamiloFaqBundle:Faq:indexWithoutCollapse, categorySlug: null } |
@ -0,0 +1,18 @@ |
|||||||
|
parameters: |
||||||
|
genj_faq.entity.question.class: Chamilo\FaqBundle\Entity\Question |
||||||
|
genj_faq.entity.category.class: Chamilo\FaqBundle\Entity\Category |
||||||
|
genj_faq.entity.question_repository.class: Genj\FaqBundle\Entity\QuestionRepository |
||||||
|
genj_faq.entity.category_repository.class: Genj\FaqBundle\Entity\CategoryRepository |
||||||
|
|
||||||
|
services: |
||||||
|
genj_faq.entity.question_repository: |
||||||
|
factory_service: doctrine |
||||||
|
factory_method: getRepository |
||||||
|
class: %genj_faq.entity.question_repository.class% |
||||||
|
arguments: [%genj_faq.entity.question.class%] |
||||||
|
|
||||||
|
genj_faq.entity.category_repository: |
||||||
|
factory_service: doctrine |
||||||
|
factory_method: getRepository |
||||||
|
class: %genj_faq.entity.category_repository.class% |
||||||
|
arguments: [%genj_faq.entity.category.class%] |
@ -0,0 +1,34 @@ |
|||||||
|
<h1>FAQ</h1> |
||||||
|
|
||||||
|
<h2>Categories</h2> |
||||||
|
<ul> |
||||||
|
{% for category in categories %} |
||||||
|
{% if selectedCategory.slug is defined and selectedCategory.slug == category.slug%} |
||||||
|
<li class="active" > |
||||||
|
<strong>{{ category.headline|e }}</strong> |
||||||
|
</li> |
||||||
|
{% else %} |
||||||
|
<li> |
||||||
|
<a href="{{ path('faq', { 'categorySlug': category.slug }) }}">{{ category.headline|e }}</a> |
||||||
|
</li> |
||||||
|
{% endif %} |
||||||
|
{% endfor %} |
||||||
|
</ul> |
||||||
|
|
||||||
|
{% if selectedCategory is not null %} |
||||||
|
<h2>Questions</h2> |
||||||
|
<ul> |
||||||
|
{% for question in questions %} |
||||||
|
{% if selectedQuestion.slug is defined and selectedQuestion.slug == question.slug%} |
||||||
|
<li class="active" > |
||||||
|
<strong>{{ question.headline|e }}</strong> |
||||||
|
<div>{{ selectedQuestion.body }}</div> |
||||||
|
</li> |
||||||
|
{% else %} |
||||||
|
<li> |
||||||
|
<a href="{{ path('faq', { 'categorySlug': selectedCategory.slug, 'questionSlug': question.slug }) }}">{{ question.headline|e }}</a> |
||||||
|
</li> |
||||||
|
{% endif %} |
||||||
|
{% endfor %} |
||||||
|
</ul> |
||||||
|
{% endif %} |
@ -0,0 +1,9 @@ |
|||||||
|
<h1>FAQ</h1> |
||||||
|
|
||||||
|
{% for category in categories %} |
||||||
|
<h2>{{ category.headline|e }}</h2> |
||||||
|
{% for question in category.questions %} |
||||||
|
<p><strong>{{ question.headline|e }}</strong></p> |
||||||
|
<p>{{ question.body }}</p> |
||||||
|
{% endfor %} |
||||||
|
{% endfor %} |
Loading…
Reference in new issue