Skip to content
Snippets Groups Projects
Commit 5557d039 authored by damjan's avatar damjan
Browse files

[FEATURE] Adding categories for the types

- types in side menu are sorted by categories
- a type can be assigned to a category through it's edit form
parent dceb3352
No related branches found
No related tags found
No related merge requests found
......@@ -135,10 +135,14 @@ class TsrefController extends \TYPO3\Flow\Mvc\Controller\ActionController {
$this->decodeTypo3Version($typo3Version), $typoScriptGroup
);
$categories = $this->tsrefRestService->getCategories();
$selectBoxCategories = Conversion::categoriesToAssociativeNameArray($categories);
$this->view->assign('typo3Groups', $this->tsrefRestService->getAllTypo3Groups());
$this->view->assign('theType', $theType);
$this->view->assign('editForm', ($typeId !== NULL));
$this->view->assign('selectMenuTypes', $selectMenuTypes);
$this->view->assign('selectBoxCategories', $selectBoxCategories);
}
/**
......@@ -197,7 +201,7 @@ class TsrefController extends \TYPO3\Flow\Mvc\Controller\ActionController {
$parentType = $this->tsrefRestService->getAttributeById($parentTypeId);
$this->prepareTypeMenu(($parentType ? $parentType->urlName : NULL), $typo3Version);
$selectMenuTypes = Conversion::toAssociativeIdArray(
$selectMenuTypes = Conversion::attributesToAssociativeIdArray(
$this->tsrefRestService->getTypes(TRUE, $this->decodeTypo3Version($typo3Version), NULL)
);
......@@ -279,9 +283,9 @@ class TsrefController extends \TYPO3\Flow\Mvc\Controller\ActionController {
TRUE, $typo3VersionFilter, $this->session->getData('typoScriptGroup')
);
$typo3Versions = $this->tsrefRestService->getTypo3Versions();
$associativeTypes = Conversion::toAssociativeUrlNamesArray($types);
$groupedTypes = Conversion::groupTypesForSidebar($types);
$this->view->assign('menuTypes', $associativeTypes);
$this->view->assign('menuTypes', $groupedTypes);
$this->view->assign('selectedTypeUrlName', $selectedTypeUrlName);
$this->view->assign('typo3Versions', $typo3Versions);
$this->view->assign('selectedTypo3Version', $selectedTypo3Version);
......
......@@ -89,6 +89,11 @@ class Attribute {
*/
private $deleted = FALSE;
/**
* @var string
*/
private $category;
/**
* @param int $id
*/
......@@ -355,6 +360,23 @@ class Attribute {
return $this;
}
/**
* @return string
*/
public function getCategory() {
return $this->category;
}
/**
* @param string $category
* @return Attribute
*/
public function setCategory($category) {
$this->category = $category;
return $this;
}
/**
* Writes object properties to associative array. NULL and not-set properties are ignored.
*
......@@ -399,6 +421,9 @@ class Attribute {
if (isset($this->isType)) {
$attributeArray ['isType'] = $this->isType;
}
if (isset($this->category)) {
$attributeArray ['category'] = $this->category;
}
return $attributeArray;
}
......@@ -468,5 +493,10 @@ class Attribute {
} else {
$this->isType = NULL;
}
if (isset($attribute->category)) {
$this->category = $attribute->category;
} else {
$this->category = NULL;
}
}
}
......@@ -346,6 +346,34 @@ class TsrefRestService {
return $output;
}
/**
* Gets all categories from web resource and returns them as array.
*
* @return mixed
*/
public function getCategoriesJson() {
$curlHandle = $this->initialiseCurl('/categories');
// Download the given URL, and return output
$output = curl_exec($curlHandle);
// Close the cURL resource, and free system resources
curl_close($curlHandle);
return $output;
}
/**
* Gets all categories from web resource and returns them as stdClass.
*
* @return mixed
*/
public function getCategories() {
$categoriesJson = $this->getCategoriesJson();
$categoriesPhp = json_decode($categoriesJson);
return $categoriesPhp;
}
/**
* Returns associative array of all typo3 groups.
*
......@@ -382,7 +410,7 @@ class TsrefRestService {
* @return array
*/
public function getTypesWithNull($typo3Version, $typoScriptGroup = Attribute::NORMAL_GROUP) {
$typesAssociative = Conversion::toAssociativeIdArray($this->getTypes(TRUE, $typo3Version, $typoScriptGroup));
$typesAssociative = Conversion::attributesToAssociativeIdArray($this->getTypes(TRUE, $typo3Version, $typoScriptGroup));
$typesAssociative = [-1 => 'No type (NULL)'] + $typesAssociative;
return $typesAssociative;
}
......
......@@ -9,7 +9,7 @@ class Conversion {
* @param array $attributes
* @return array
*/
public static function toAssociativeIdArray(array $attributes) {
public static function attributesToAssociativeIdArray(array $attributes) {
$idsAndNames = [];
foreach ($attributes as $attribute) {
$idsAndNames[$attribute->id] = $attribute->name;
......@@ -18,16 +18,38 @@ class Conversion {
}
/**
* The function converts array of attributes to associative array with form: [urlName => name]
* The function groups types by categories with form: [category => [{type}, {type}, ...], category => [], ...]
*
* @param array $attributes
* @param array $types
* @return array
*/
public static function toAssociativeUrlNamesArray(array $attributes) {
$names = [];
foreach ($attributes as $attribute) {
$names[$attribute->urlName] = $attribute->name;
public static function groupTypesForSidebar(array $types) {
$categorisedTypes = [];
$unCategorised = [];
foreach ($types as $type) {
if (isset($type->category)) {
$categorisedTypes[$type->category][] = $type;
} else {
$unCategorised[] = $type;
}
}
if (!empty($unCategorised)) {
$categorisedTypes['Other types'] = $unCategorised;
}
return $categorisedTypes;
}
/**
* Converts array of categories to associative array of this format: [category.name => category.name]
*
* @param array $categories
* @return array
*/
public static function categoriesToAssociativeNameArray(array $categories) {
$categoryNames = [];
foreach ($categories as $category) {
$categoryNames[$category->name] = $category->name;
}
return $names;
return $categoryNames;
}
}
\ No newline at end of file
......@@ -30,17 +30,22 @@
</f:link.action>
</div>
</f:security.ifHasRole>
<ul class="nav nav-sidebar">
<f:for each="{menuTypes}" as="typeName" key="typeUrlName">
<li class="{f:if(condition: '{selectedTypeUrlName} == {typeUrlName}', then: 'active')}">
<f:link.action package="SGalinski.TypoScriptReferenceFrontend" controller="tsref" action="index"
arguments="{typeUrlName: typeUrlName, typo3Version: selectedTypo3Version}">
{typeName}
<f:if condition="{selectedTypeUrlName} == {typeUrlName}">
<span class="sr-only">(current)</span>
</f:if>
</f:link.action>
</li>
</f:for>
</ul>
<f:for each="{menuTypes}" as="types" key="category">
<div class="category-caption">
{category}
</div>
<ul class="nav nav-sidebar">
<f:for each="{types}" as="type">
<li class="{f:if(condition: '{selectedTypeUrlName} == {type.urlName}', then: 'active')}">
<f:link.action package="SGalinski.TypoScriptReferenceFrontend" controller="tsref" action="index"
arguments="{typeUrlName: type.urlName, typo3Version: selectedTypo3Version}">
{type.name}
<f:if condition="{selectedTypeUrlName} == {type.urlName}">
<span class="sr-only">(current)</span>
</f:if>
</f:link.action>
</li>
</f:for>
</ul>
</f:for>
</div>
......@@ -37,6 +37,14 @@
</div>
</div>
<div class="form-group">
<label for="category" class="col-sm-2 control-label">Category</label>
<div class="col-sm-10">
<f:form.select property="category" options="{selectBoxCategories}" id="category" class="form-control" />
</div>
</div>
<div class="form-group">
<label for="description" class="col-sm-2 control-label">Description</label>
......
......@@ -27,3 +27,11 @@
textarea#description.min-height100 {
min-height: 100px;
}
.category-caption {
text-align: center;
display: block;
border-bottom: 1px solid #EEE;
padding-bottom: 15px;
margin-bottom: 10px;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment