Compare commits
18 Commits
ef936da4bb
...
33da93a1dd
Author | SHA1 | Date |
---|---|---|
Jurij Podgoršek | 33da93a1dd | |
Jurij Podgoršek | fca9f5b7ee | |
Jurij Podgoršek | 333560ff41 | |
Jurij Podgoršek | 8621c8f6f3 | |
Jurij Podgoršek | 905b8e8b04 | |
Jurij Podgoršek | ec23f7fff6 | |
Jurij Podgoršek | 1ef66a3d75 | |
Jurij Podgoršek | affae91fd9 | |
Jurij Podgoršek | d5345edb8d | |
Lio Novelli | 93fa35caec | |
Lio Novelli | 44fba60a76 | |
Lio Novelli | 7749fbaf20 | |
Lio Novelli | aa8f762816 | |
Lio Novelli | 6559793714 | |
Lio Novelli | 0827d59955 | |
Lio Novelli | 7c4a51e8eb | |
Lio Novelli | 163f6c5d43 | |
Lio Novelli | da9ac824c9 |
|
@ -49,3 +49,12 @@ Nato poženemo izgrajevalnik / strežnik:
|
|||
Dodatne testne vsebine lahko definiramo v modulu `yufu_data`, v poddirektoriju `content`. Pazit moramo na ime - vsak fajl se mora končati s `.content.yml`.
|
||||
|
||||
Navodila za konstruiranje fajlov pa so tukaj: https://www.drupal.org/docs/contributed-modules/yaml-content/examples
|
||||
|
||||
|
||||
# Dokumentacija
|
||||
|
||||
## Backend
|
||||
|
||||
### Endpoint za dodajanje pojmov
|
||||
|
||||
V modulu [yufu_concept](web/modules/custom/yufu_concept/yufu_concept.info.yml "yufu_concept").
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
],
|
||||
"require": {
|
||||
"composer/installers": "^2.0",
|
||||
"cweagans/composer-patches": "^1.7",
|
||||
"drupal/cer": "^5.0@beta",
|
||||
"drupal/config_ignore": "^3.1",
|
||||
"drupal/content_as_config": "^1.0",
|
||||
|
@ -25,7 +26,9 @@
|
|||
"drupal/gin": "^3.0@RC",
|
||||
"drupal/gin_toolbar": "^1.0@RC",
|
||||
"drupal/jsonapi_menu_items": "^1.2",
|
||||
"drupal/restui": "^1.21",
|
||||
"drupal/single_content_sync": "^1.3",
|
||||
"drupal/token": "^1.12",
|
||||
"drupal/yaml_content": "^1.0@dev",
|
||||
"drush/drush": "^11.4"
|
||||
},
|
||||
|
@ -40,11 +43,17 @@
|
|||
"drupal/core-composer-scaffold": true,
|
||||
"drupal/core-project-message": true,
|
||||
"phpstan/extension-installer": true,
|
||||
"dealerdirect/phpcodesniffer-composer-installer": true
|
||||
"dealerdirect/phpcodesniffer-composer-installer": true,
|
||||
"cweagans/composer-patches": true
|
||||
},
|
||||
"sort-packages": true
|
||||
},
|
||||
"extra": {
|
||||
"patches": {
|
||||
"drupal/restui": {
|
||||
"#3337894: Get class methods wrong argument.": "https://www.drupal.org/files/issues/2023-06-23/type-error-class-3337894-10.patch"
|
||||
}
|
||||
},
|
||||
"drupal-scaffold": {
|
||||
"locations": {
|
||||
"web-root": "web/"
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "da5e84f03db426188f0654126079d7ea",
|
||||
"content-hash": "185dc0d2be2be9514fc2dad73c4205d1",
|
||||
"packages": [
|
||||
{
|
||||
"name": "asm89/stack-cors",
|
||||
|
@ -865,6 +865,54 @@
|
|||
},
|
||||
"time": "2022-12-06T17:57:16+00:00"
|
||||
},
|
||||
{
|
||||
"name": "cweagans/composer-patches",
|
||||
"version": "1.7.3",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/cweagans/composer-patches.git",
|
||||
"reference": "e190d4466fe2b103a55467dfa83fc2fecfcaf2db"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/cweagans/composer-patches/zipball/e190d4466fe2b103a55467dfa83fc2fecfcaf2db",
|
||||
"reference": "e190d4466fe2b103a55467dfa83fc2fecfcaf2db",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"composer-plugin-api": "^1.0 || ^2.0",
|
||||
"php": ">=5.3.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"composer/composer": "~1.0 || ~2.0",
|
||||
"phpunit/phpunit": "~4.6"
|
||||
},
|
||||
"type": "composer-plugin",
|
||||
"extra": {
|
||||
"class": "cweagans\\Composer\\Patches"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"cweagans\\Composer\\": "src"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Cameron Eagans",
|
||||
"email": "me@cweagans.net"
|
||||
}
|
||||
],
|
||||
"description": "Provides a way to patch Composer packages.",
|
||||
"support": {
|
||||
"issues": "https://github.com/cweagans/composer-patches/issues",
|
||||
"source": "https://github.com/cweagans/composer-patches/tree/1.7.3"
|
||||
},
|
||||
"time": "2022-12-20T22:53:13+00:00"
|
||||
},
|
||||
{
|
||||
"name": "dflydev/dot-access-data",
|
||||
"version": "v3.0.2",
|
||||
|
@ -1911,6 +1959,62 @@
|
|||
"source": "https://git.drupalcode.org/project/jsonapi_resources"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "drupal/restui",
|
||||
"version": "1.21.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://git.drupalcode.org/project/restui.git",
|
||||
"reference": "8.x-1.21"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://ftp.drupal.org/files/projects/restui-8.x-1.21.zip",
|
||||
"reference": "8.x-1.21",
|
||||
"shasum": "2a67dc2c1953dced0bddaff25e5c60784ee0178c"
|
||||
},
|
||||
"require": {
|
||||
"drupal/core": "^8.7.7 || ^9 || ^10"
|
||||
},
|
||||
"type": "drupal-module",
|
||||
"extra": {
|
||||
"drupal": {
|
||||
"version": "8.x-1.21",
|
||||
"datestamp": "1659086914",
|
||||
"security-coverage": {
|
||||
"status": "covered",
|
||||
"message": "Covered by Drupal's security advisory policy"
|
||||
}
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packages.drupal.org/8/downloads",
|
||||
"license": [
|
||||
"GPL-2.0-or-later"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "-enzo-",
|
||||
"homepage": "https://www.drupal.org/user/294937"
|
||||
},
|
||||
{
|
||||
"name": "clemens.tolboom",
|
||||
"homepage": "https://www.drupal.org/user/125814"
|
||||
},
|
||||
{
|
||||
"name": "juampynr",
|
||||
"homepage": "https://www.drupal.org/user/682736"
|
||||
},
|
||||
{
|
||||
"name": "klausi",
|
||||
"homepage": "https://www.drupal.org/user/262198"
|
||||
}
|
||||
],
|
||||
"description": "Provides a user interface to manage REST resources.",
|
||||
"homepage": "https://www.drupal.org/project/restui",
|
||||
"support": {
|
||||
"source": "https://git.drupalcode.org/project/restui"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "drupal/single_content_sync",
|
||||
"version": "1.3.9",
|
||||
|
@ -1965,6 +2069,75 @@
|
|||
"issues": "https://drupal.org/project/issues/single_content_sync"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "drupal/token",
|
||||
"version": "1.13.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://git.drupalcode.org/project/token.git",
|
||||
"reference": "8.x-1.13"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://ftp.drupal.org/files/projects/token-8.x-1.13.zip",
|
||||
"reference": "8.x-1.13",
|
||||
"shasum": "f2a074b51726de3727c1d900237d6d471806a4d2"
|
||||
},
|
||||
"require": {
|
||||
"drupal/core": "^9.2 || ^10"
|
||||
},
|
||||
"type": "drupal-module",
|
||||
"extra": {
|
||||
"drupal": {
|
||||
"version": "8.x-1.13",
|
||||
"datestamp": "1697885927",
|
||||
"security-coverage": {
|
||||
"status": "covered",
|
||||
"message": "Covered by Drupal's security advisory policy"
|
||||
}
|
||||
},
|
||||
"drush": {
|
||||
"services": {
|
||||
"drush.services.yml": ">=9"
|
||||
}
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packages.drupal.org/8/downloads",
|
||||
"license": [
|
||||
"GPL-2.0-or-later"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Berdir",
|
||||
"homepage": "https://www.drupal.org/user/214652"
|
||||
},
|
||||
{
|
||||
"name": "Dave Reid",
|
||||
"homepage": "https://www.drupal.org/user/53892"
|
||||
},
|
||||
{
|
||||
"name": "eaton",
|
||||
"homepage": "https://www.drupal.org/user/16496"
|
||||
},
|
||||
{
|
||||
"name": "fago",
|
||||
"homepage": "https://www.drupal.org/user/16747"
|
||||
},
|
||||
{
|
||||
"name": "greggles",
|
||||
"homepage": "https://www.drupal.org/user/36762"
|
||||
},
|
||||
{
|
||||
"name": "mikeryan",
|
||||
"homepage": "https://www.drupal.org/user/4420"
|
||||
}
|
||||
],
|
||||
"description": "Provides a user interface for the Token API, some missing core tokens.",
|
||||
"homepage": "https://www.drupal.org/project/token",
|
||||
"support": {
|
||||
"source": "https://git.drupalcode.org/project/token"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "drupal/yaml_content",
|
||||
"version": "1.0.0-alpha9",
|
||||
|
|
|
@ -7,7 +7,9 @@ dependencies:
|
|||
- field.field.node.concept.field_media
|
||||
- field.field.node.concept.field_related_concept
|
||||
- node.type.concept
|
||||
- workflows.workflow.concept_workflow
|
||||
module:
|
||||
- content_moderation
|
||||
- media_library
|
||||
- path
|
||||
- text
|
||||
|
@ -18,7 +20,7 @@ mode: default
|
|||
content:
|
||||
body:
|
||||
type: text_textarea_with_summary
|
||||
weight: 121
|
||||
weight: 1
|
||||
region: content
|
||||
settings:
|
||||
rows: 9
|
||||
|
@ -28,20 +30,20 @@ content:
|
|||
third_party_settings: { }
|
||||
created:
|
||||
type: datetime_timestamp
|
||||
weight: 10
|
||||
weight: 9
|
||||
region: content
|
||||
settings: { }
|
||||
third_party_settings: { }
|
||||
field_media:
|
||||
type: media_library_widget
|
||||
weight: 122
|
||||
weight: 5
|
||||
region: content
|
||||
settings:
|
||||
media_types: { }
|
||||
third_party_settings: { }
|
||||
field_related_concept:
|
||||
type: entity_reference_autocomplete
|
||||
weight: 123
|
||||
weight: 2
|
||||
region: content
|
||||
settings:
|
||||
match_operator: CONTAINS
|
||||
|
@ -51,41 +53,47 @@ content:
|
|||
third_party_settings: { }
|
||||
langcode:
|
||||
type: language_select
|
||||
weight: 2
|
||||
weight: 3
|
||||
region: content
|
||||
settings:
|
||||
include_locked: true
|
||||
third_party_settings: { }
|
||||
moderation_state:
|
||||
type: moderation_state_default
|
||||
weight: 6
|
||||
region: content
|
||||
settings: { }
|
||||
third_party_settings: { }
|
||||
path:
|
||||
type: path
|
||||
weight: 30
|
||||
weight: 13
|
||||
region: content
|
||||
settings: { }
|
||||
third_party_settings: { }
|
||||
promote:
|
||||
type: boolean_checkbox
|
||||
weight: 15
|
||||
weight: 11
|
||||
region: content
|
||||
settings:
|
||||
display_label: true
|
||||
third_party_settings: { }
|
||||
status:
|
||||
type: boolean_checkbox
|
||||
weight: 120
|
||||
weight: 7
|
||||
region: content
|
||||
settings:
|
||||
display_label: true
|
||||
third_party_settings: { }
|
||||
sticky:
|
||||
type: boolean_checkbox
|
||||
weight: 16
|
||||
weight: 12
|
||||
region: content
|
||||
settings:
|
||||
display_label: true
|
||||
third_party_settings: { }
|
||||
title:
|
||||
type: string_textfield
|
||||
weight: -5
|
||||
weight: 0
|
||||
region: content
|
||||
settings:
|
||||
size: 60
|
||||
|
@ -98,7 +106,7 @@ content:
|
|||
third_party_settings: { }
|
||||
uid:
|
||||
type: entity_reference_autocomplete
|
||||
weight: 5
|
||||
weight: 8
|
||||
region: content
|
||||
settings:
|
||||
match_operator: CONTAINS
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
uuid: be4c3be6-4cc3-4c4a-9c5e-d58e55903e85
|
||||
langcode: en
|
||||
status: true
|
||||
dependencies:
|
||||
module:
|
||||
- block
|
||||
id: block.token
|
||||
label: Token
|
||||
targetEntityType: block
|
||||
cache: true
|
|
@ -0,0 +1,10 @@
|
|||
uuid: b57556dc-3181-40a4-83b6-ee55e3c2f942
|
||||
langcode: en
|
||||
status: true
|
||||
dependencies:
|
||||
module:
|
||||
- block_content
|
||||
id: block_content.token
|
||||
label: Token
|
||||
targetEntityType: block_content
|
||||
cache: true
|
|
@ -0,0 +1,10 @@
|
|||
uuid: 45f19d69-ef2b-4758-a9f8-e31279d31317
|
||||
langcode: en
|
||||
status: true
|
||||
dependencies:
|
||||
module:
|
||||
- comment
|
||||
id: comment.token
|
||||
label: Token
|
||||
targetEntityType: comment
|
||||
cache: true
|
|
@ -0,0 +1,10 @@
|
|||
uuid: 655d18e2-71f8-49bf-ac6c-e0526bdd049e
|
||||
langcode: en
|
||||
status: true
|
||||
dependencies:
|
||||
module:
|
||||
- content_moderation
|
||||
id: content_moderation_state.token
|
||||
label: Token
|
||||
targetEntityType: content_moderation_state
|
||||
cache: true
|
|
@ -0,0 +1,10 @@
|
|||
uuid: 6f5ca935-a97f-41ba-ad0e-3f284cf5e536
|
||||
langcode: en
|
||||
status: true
|
||||
dependencies:
|
||||
module:
|
||||
- file
|
||||
id: file.token
|
||||
label: Token
|
||||
targetEntityType: file
|
||||
cache: true
|
|
@ -0,0 +1,10 @@
|
|||
uuid: 194fc976-a674-4d3f-b70f-087e97ab7e25
|
||||
langcode: en
|
||||
status: true
|
||||
dependencies:
|
||||
module:
|
||||
- media
|
||||
id: media.token
|
||||
label: Token
|
||||
targetEntityType: media
|
||||
cache: true
|
|
@ -0,0 +1,10 @@
|
|||
uuid: 984fe3ef-e532-4bd9-8937-af7001e7a3bd
|
||||
langcode: en
|
||||
status: true
|
||||
dependencies:
|
||||
module:
|
||||
- menu_link_content
|
||||
id: menu_link_content.token
|
||||
label: Token
|
||||
targetEntityType: menu_link_content
|
||||
cache: true
|
|
@ -0,0 +1,10 @@
|
|||
uuid: f9b3366d-d376-41b1-8c3f-06edb76a96fb
|
||||
langcode: en
|
||||
status: true
|
||||
dependencies:
|
||||
module:
|
||||
- node
|
||||
id: node.token
|
||||
label: Token
|
||||
targetEntityType: node
|
||||
cache: true
|
|
@ -0,0 +1,10 @@
|
|||
uuid: 600d4fed-e248-4be2-818a-4442c5f9e07a
|
||||
langcode: en
|
||||
status: true
|
||||
dependencies:
|
||||
module:
|
||||
- path_alias
|
||||
id: path_alias.token
|
||||
label: Token
|
||||
targetEntityType: path_alias
|
||||
cache: true
|
|
@ -0,0 +1,10 @@
|
|||
uuid: 5e3cc117-bf76-406a-ba35-cf9b5cfbe4b9
|
||||
langcode: en
|
||||
status: true
|
||||
dependencies:
|
||||
module:
|
||||
- taxonomy
|
||||
id: taxonomy_term.token
|
||||
label: Token
|
||||
targetEntityType: taxonomy_term
|
||||
cache: true
|
|
@ -0,0 +1,10 @@
|
|||
uuid: d8e3dde9-87a9-4209-ac1d-8961ff0a3ceb
|
||||
langcode: en
|
||||
status: true
|
||||
dependencies:
|
||||
module:
|
||||
- user
|
||||
id: user.token
|
||||
label: Token
|
||||
targetEntityType: user
|
||||
cache: true
|
|
@ -44,12 +44,15 @@ module:
|
|||
page_cache: 0
|
||||
path: 0
|
||||
path_alias: 0
|
||||
rest: 0
|
||||
restui: 0
|
||||
search: 0
|
||||
serialization: 0
|
||||
single_content_sync: 0
|
||||
system: 0
|
||||
taxonomy: 0
|
||||
text: 0
|
||||
token: 0
|
||||
toolbar: 0
|
||||
update: 0
|
||||
user: 0
|
||||
|
@ -57,6 +60,7 @@ module:
|
|||
workflows: 0
|
||||
yaml_content: 0
|
||||
yufu_admin: 0
|
||||
yufu_concept: 0
|
||||
yufu_data: 0
|
||||
content_translation: 10
|
||||
views: 10
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
_core:
|
||||
default_config_hash: e883aGsrt1wFrsydlYU584PZONCSfRy0DtkZ9KzHb58
|
||||
row_limit: 1000
|
||||
row_limit: 100000
|
||||
|
|
|
@ -1,42 +1,42 @@
|
|||
label: 'Moderirani sadržaj'
|
||||
label: 'Moderirane vsebine'
|
||||
display:
|
||||
default:
|
||||
display_title: Zadano
|
||||
display_options:
|
||||
title: 'Moderirani sadržaj'
|
||||
title: 'Moderirane vsebine'
|
||||
fields:
|
||||
title:
|
||||
label: Naziv
|
||||
label: Naslov
|
||||
separator: ', '
|
||||
type:
|
||||
label: 'Vrsta sadržaja'
|
||||
label: 'Tip vsebin'
|
||||
separator: ', '
|
||||
name:
|
||||
label: Autor
|
||||
label: Avtor
|
||||
separator: ', '
|
||||
moderation_state:
|
||||
separator: ', '
|
||||
changed:
|
||||
label: Osvježeno
|
||||
label: Posodobljeno
|
||||
separator: ', '
|
||||
operations:
|
||||
label: Operacije
|
||||
exposed_form:
|
||||
options:
|
||||
submit_button: Pročisti
|
||||
reset_button_label: Poništi
|
||||
submit_button: Počisti
|
||||
reset_button_label: Ponastavi
|
||||
exposed_sorts_label: 'Rasporedi po'
|
||||
sort_asc_label: Uzlazno
|
||||
sort_desc_label: Silazno
|
||||
sort_asc_label: Naraščajoče
|
||||
sort_desc_label: Padajoče
|
||||
filters:
|
||||
title:
|
||||
expose:
|
||||
label: Naziv
|
||||
label: Naslov
|
||||
type:
|
||||
expose:
|
||||
label: 'Vrsta sadržaja'
|
||||
label: ''
|
||||
langcode:
|
||||
expose:
|
||||
label: Jezik
|
||||
moderated_content:
|
||||
display_title: 'Moderirani sadržaj'
|
||||
display_title: 'Moderirane vsebine'
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
uuid: 589ee957-7efd-45d3-979b-93b5b1018761
|
||||
langcode: en
|
||||
status: true
|
||||
dependencies:
|
||||
module:
|
||||
- serialization
|
||||
- user
|
||||
- yufu_concept
|
||||
id: add_concept_rest_resource
|
||||
plugin_id: add_concept_rest_resource
|
||||
granularity: resource
|
||||
configuration:
|
||||
methods:
|
||||
- POST
|
||||
formats:
|
||||
- json
|
||||
authentication:
|
||||
- cookie
|
|
@ -0,0 +1,18 @@
|
|||
uuid: 96dd83b8-5a29-43d5-a87e-a3be17c8b96c
|
||||
langcode: en
|
||||
status: true
|
||||
dependencies:
|
||||
module:
|
||||
- serialization
|
||||
- user
|
||||
- yufu_concept
|
||||
id: concept_autocomplete_rest_resource
|
||||
plugin_id: concept_autocomplete_rest_resource
|
||||
granularity: resource
|
||||
configuration:
|
||||
methods:
|
||||
- GET
|
||||
formats:
|
||||
- json
|
||||
authentication:
|
||||
- cookie
|
|
@ -1,3 +1,3 @@
|
|||
_core:
|
||||
default_config_hash: u3-njszl92FaxjrCMiq0yDcjAfcdx72w1zT1O9dx6aA
|
||||
error_level: hide
|
||||
error_level: some
|
||||
|
|
|
@ -4,11 +4,14 @@ status: true
|
|||
dependencies:
|
||||
config:
|
||||
- node.type.concept
|
||||
- rest.resource.add_concept_rest_resource
|
||||
- rest.resource.concept_autocomplete_rest_resource
|
||||
- workflows.workflow.concept_workflow
|
||||
module:
|
||||
- content_moderation
|
||||
- media
|
||||
- node
|
||||
- rest
|
||||
- system
|
||||
_core:
|
||||
default_config_hash: j5zLMOdJBqC0bMvSdth5UebkprJB8g_2FXHqhfpJzow
|
||||
|
@ -19,5 +22,8 @@ is_admin: false
|
|||
permissions:
|
||||
- 'access content'
|
||||
- 'create concept content'
|
||||
- 'edit any concept content'
|
||||
- 'restful get concept_autocomplete_rest_resource'
|
||||
- 'restful post add_concept_rest_resource'
|
||||
- 'use concept_workflow transition create_new_draft'
|
||||
- 'view media'
|
||||
|
|
|
@ -5,12 +5,16 @@ dependencies:
|
|||
config:
|
||||
- node.type.article
|
||||
- node.type.concept
|
||||
- rest.resource.add_concept_rest_resource
|
||||
- rest.resource.concept_autocomplete_rest_resource
|
||||
- taxonomy.vocabulary.tags
|
||||
- workflows.workflow.concept_workflow
|
||||
module:
|
||||
- content_moderation
|
||||
- file
|
||||
- media
|
||||
- node
|
||||
- rest
|
||||
- system
|
||||
- taxonomy
|
||||
- yufu_admin
|
||||
|
@ -26,6 +30,10 @@ permissions:
|
|||
- 'create concept content'
|
||||
- 'create media'
|
||||
- 'create terms in tags'
|
||||
- 'delete own files'
|
||||
- 'edit any concept content'
|
||||
- 'restful get concept_autocomplete_rest_resource'
|
||||
- 'restful post add_concept_rest_resource'
|
||||
- 'use concept_workflow transition create_new_draft'
|
||||
- 'use jsonapi operation link'
|
||||
- 'view any unpublished content'
|
||||
|
|
|
@ -11,6 +11,7 @@ dependencies:
|
|||
- node.type.article
|
||||
- node.type.concept
|
||||
- node.type.page
|
||||
- rest.resource.add_concept_rest_resource
|
||||
- taxonomy.vocabulary.tags
|
||||
- workflows.workflow.concept_workflow
|
||||
module:
|
||||
|
@ -23,6 +24,7 @@ dependencies:
|
|||
- media
|
||||
- node
|
||||
- path
|
||||
- rest
|
||||
- taxonomy
|
||||
- toolbar
|
||||
id: editor
|
||||
|
@ -85,6 +87,7 @@ permissions:
|
|||
- 'edit terms in tags'
|
||||
- 'export configuration'
|
||||
- 'import configuration'
|
||||
- 'restful post add_concept_rest_resource'
|
||||
- 'revert article revisions'
|
||||
- 'revert concept revisions'
|
||||
- 'revert page revisions'
|
||||
|
|
|
@ -2,7 +2,10 @@ uuid: 8347c43e-4379-4de8-9577-a481a608a372
|
|||
langcode: en
|
||||
status: true
|
||||
dependencies:
|
||||
config:
|
||||
- workflows.workflow.concept_workflow
|
||||
module:
|
||||
- content_moderation
|
||||
- node
|
||||
- user
|
||||
enforced:
|
||||
|
@ -677,18 +680,18 @@ display:
|
|||
plugin_id: moderation_state_filter
|
||||
operator: 'not in'
|
||||
value:
|
||||
editorial-published: editorial-published
|
||||
concept_workflow-published: concept_workflow-published
|
||||
group: 1
|
||||
exposed: false
|
||||
expose:
|
||||
operator_id: ''
|
||||
label: ''
|
||||
description: ''
|
||||
operator_id: moderation_state_1_op
|
||||
label: 'Moderation state'
|
||||
description: null
|
||||
use_operator: false
|
||||
operator: ''
|
||||
operator: moderation_state_1_op
|
||||
operator_limit_selection: false
|
||||
operator_list: { }
|
||||
identifier: ''
|
||||
identifier: moderation_state_1
|
||||
required: false
|
||||
remember: false
|
||||
multiple: false
|
||||
|
@ -811,7 +814,8 @@ display:
|
|||
- url.query_args
|
||||
- 'user.node_grants:view'
|
||||
- user.permissions
|
||||
tags: { }
|
||||
tags:
|
||||
- 'config:workflow_list'
|
||||
moderated_content:
|
||||
id: moderated_content
|
||||
display_title: 'Moderated content'
|
||||
|
@ -830,4 +834,5 @@ display:
|
|||
- url.query_args
|
||||
- 'user.node_grants:view'
|
||||
- user.permissions
|
||||
tags: { }
|
||||
tags:
|
||||
- 'config:workflow_list'
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
# Yufu Concept
|
||||
|
||||
Vsebuje funkcionalnosti povezane s pojmi - osnovnimi gradniki manifesta.
|
||||
|
||||
## Endpoint /api/pojem/dodaj
|
||||
|
||||
Post request endpoint za dodajanje pojmov.
|
||||
|
||||
## Autocomplete za (povezane) pojme
|
||||
|
||||
@TODO: To be implemented.
|
||||
|
||||
## Posiljanje emailov
|
||||
|
||||
https://drupal.stackexchange.com/questions/235157/message-not-being-sent-in-the-body-of-the-mail
|
|
@ -0,0 +1,17 @@
|
|||
langcode: en
|
||||
status: true
|
||||
dependencies:
|
||||
module:
|
||||
- serialization
|
||||
- user
|
||||
- yufu_concept
|
||||
id: add_concept_rest_resource
|
||||
plugin_id: add_concept_rest_resource
|
||||
granularity: resource
|
||||
configuration:
|
||||
methods:
|
||||
- POST
|
||||
formats:
|
||||
- json
|
||||
authentication:
|
||||
- cookie
|
|
@ -0,0 +1,17 @@
|
|||
langcode: en
|
||||
status: true
|
||||
dependencies:
|
||||
module:
|
||||
- serialization
|
||||
- user
|
||||
- yufu_concept
|
||||
id: concept_autocomplete_rest_resource
|
||||
plugin_id: concept_autocomplete_rest_resource
|
||||
granularity: resource
|
||||
configuration:
|
||||
methods:
|
||||
- GET
|
||||
formats:
|
||||
- json
|
||||
authentication:
|
||||
- cookie
|
|
@ -0,0 +1,221 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\yufu_concept\Plugin\rest\resource;
|
||||
|
||||
use Drupal\Core\Config\ConfigFactoryInterface;
|
||||
use Drupal\Core\Entity\EntityTypeManagerInterface;
|
||||
use Drupal\Core\Session\AccountProxyInterface;
|
||||
use Drupal\Core\StringTranslation\StringTranslationTrait;
|
||||
use Drupal\Core\TypedData\Exception\MissingDataException;
|
||||
use Drupal\node\NodeInterface;
|
||||
use Drupal\rest\Plugin\ResourceBase;
|
||||
use Drupal\rest\ResourceResponse;
|
||||
use Psr\Log\LogLevel;
|
||||
use Psr\Log\LoggerInterface;
|
||||
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
|
||||
|
||||
/**
|
||||
* Creates post endpoint to create new concept.
|
||||
*
|
||||
* @RestResource(
|
||||
* id = "add_concept_rest_resource",
|
||||
* label = @Translation("Create or edit a concept"),
|
||||
* uri_paths = {
|
||||
* "canonical" = "/api/pojem/dodaj",
|
||||
* "create" = "/api/pojem/dodaj",
|
||||
* }
|
||||
* )
|
||||
*/
|
||||
class AddConcept extends ResourceBase {
|
||||
|
||||
use StringTranslationTrait;
|
||||
|
||||
/**
|
||||
* A current user instance.
|
||||
*
|
||||
* @var \Drupal\Core\Session\AccountProxyInterface
|
||||
*/
|
||||
protected $currentUser;
|
||||
|
||||
/**
|
||||
* Entity type manager service.
|
||||
*
|
||||
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
|
||||
*/
|
||||
protected $entityTypeManager;
|
||||
|
||||
/**
|
||||
* Constructs a Drupal\rest\Plugin\ResourceBase object.
|
||||
*
|
||||
* @param array $configuration
|
||||
* A configuration array containing information about the plugin instance.
|
||||
* @param string $plugin_id
|
||||
* The plugin_id for the plugin instance.
|
||||
* @param mixed $plugin_definition
|
||||
* The plugin implementation definition.
|
||||
* @param array $serializer_formats
|
||||
* The available serialization formats.
|
||||
* @param \Psr\Log\LoggerInterface $logger
|
||||
* A logger instance.
|
||||
* @param \Drupal\Core\Session\AccountProxyInterface $current_user
|
||||
* A current user instance.
|
||||
*/
|
||||
public function __construct(
|
||||
array $configuration,
|
||||
string $plugin_id,
|
||||
array $plugin_definition,
|
||||
array $serializer_formats,
|
||||
LoggerInterface $logger,
|
||||
AccountProxyInterface $current_user,
|
||||
EntityTypeManagerInterface $entity_type_manager) {
|
||||
parent::__construct($configuration, $plugin_id, $plugin_definition, $serializer_formats, $logger);
|
||||
$this->currentUser = $current_user;
|
||||
$this->entityTypeManager = $entity_type_manager;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
|
||||
return new static(
|
||||
$configuration,
|
||||
$plugin_id,
|
||||
$plugin_definition,
|
||||
$container->getParameter('serializer.formats'),
|
||||
$container->get('logger.channel.yufu_concept'),
|
||||
$container->get('current_user'),
|
||||
$container->get('entity_type.manager')
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Ustvari nov koncept.
|
||||
*
|
||||
* Logika:
|
||||
* 1. Zloadamo uporabnika preko emaila, ce ne obstaja, ga ustvarimo.
|
||||
* 2. Zloadamo koncept prek uuid, ce ne obstaja, da ustvarimo.
|
||||
* - avtor je zloadan prek maila
|
||||
*
|
||||
* @param \Symfony\Component\HttpFoundation\Request;
|
||||
* Post request.
|
||||
*
|
||||
* @return \Drupal\rest\ResourceResponse
|
||||
* Returns rest resource.
|
||||
*/
|
||||
public function post(Request $request) {
|
||||
$response_status['status'] = FALSE;
|
||||
$data = json_decode($request->getContent(), TRUE);
|
||||
// You must to implement the logic of your REST Resource here.
|
||||
// Use current user after pass authentication to validate access.
|
||||
if (!$this->currentUser->hasPermission('access content')) {
|
||||
throw new AccessDeniedHttpException();
|
||||
}
|
||||
// Fields: naslov, text, povezani pojmi, email
|
||||
// Optional fields: language, related concept.
|
||||
if (empty($data['title']) || empty($data['text']) || empty($data['uuid'])) {
|
||||
throw new MissingDataException('Title, uuid or text missing.');
|
||||
}
|
||||
$uid = $this->getUserIdByEmail($data['email'] ?? null);
|
||||
if ($concept = $this->getConceptFromUuid($data['uuid'])) {
|
||||
// Concept exists - create a new revision.
|
||||
$concept->setNewRevision(TRUE);
|
||||
$concept->setRevisionUserId($uid);
|
||||
$concept->set('title', $data['title']);
|
||||
$concept->set('body', $data['text'] ?? $concept->body->value);
|
||||
$concept->isDefaultRevision(FALSE);
|
||||
$concept->setRevisionLogMessage('New revision by concept endpoint.');
|
||||
$concept->moderation_state->target_id = 'draft';
|
||||
$concept->save();
|
||||
$this->logger->notice('New concept @title revision @revid created by uid @uid.', [
|
||||
'@title' => $concept->getTitle(),
|
||||
'@revid' => $concept->getRevisionId(),
|
||||
'@uid' => $uid,
|
||||
]);
|
||||
}
|
||||
else {
|
||||
// Concept does not exist - create a new node.
|
||||
$concept = [
|
||||
'type' => 'concept',
|
||||
'title' => $data['title'],
|
||||
'body' => $data['text'],
|
||||
'uuid' => $data['uuid'],
|
||||
'uid' => $uid,
|
||||
'moderation_state' => 'draft',
|
||||
];
|
||||
// @TODO Check if related concepts are set and add them to the concept.
|
||||
// @TODO Check language and add set it on concept if exists.
|
||||
/** @var \Drupal\node\Entity\NodeInterface $concept */
|
||||
$concept = $this->entityTypeManager->getStorage('node')->create($concept);
|
||||
$concept->save();
|
||||
$this->logger->log(LogLevel::NOTICE, $this->t('Creating concept: @title', [
|
||||
'@title' => $concept->getTitle(),
|
||||
]));
|
||||
}
|
||||
$response_status['concept'] = [
|
||||
'title' => $concept->label(),
|
||||
'id' => $concept->id(),
|
||||
'uuid' => $concept->uuid(),
|
||||
'revision_id' => $concept->getRevisionId(),
|
||||
'revision_create_time' => $concept->getRevisionCreationTime(),
|
||||
'revision_uid' => $concept->getRevisionUserId(),
|
||||
'uid' => $concept->uid->target_id,
|
||||
];
|
||||
$response = new ResourceResponse($response_status);
|
||||
return $response;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get concept from uuid.
|
||||
*
|
||||
* If concept is new, return null.
|
||||
*
|
||||
* @param string|null $uuid
|
||||
* Uuid of the node.
|
||||
*
|
||||
* @return \Drupal\node\NodeInterface|null
|
||||
*/
|
||||
protected function getConceptFromUuid(?string $uuid): ?NodeInterface {
|
||||
if (!$uuid) {
|
||||
return NULL;
|
||||
}
|
||||
$node_storage = $this->entityTypeManager->getStorage('node');
|
||||
if ($concept = end($node_storage->loadByProperties(['uuid' => $uuid]))) {
|
||||
return $concept;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads user from email or creates a new blocked user.
|
||||
*
|
||||
* Side effect is to create a new user.
|
||||
*
|
||||
* @param string|null $email
|
||||
* Email provided by the fe call to endpoint.
|
||||
*
|
||||
* @return int
|
||||
* Id of the user.
|
||||
*
|
||||
*/
|
||||
protected function getUserIdByEmail(?string $email): int {
|
||||
if (!$email) {
|
||||
return 0;
|
||||
}
|
||||
// Load user by email. If it doesn't exist, create one.
|
||||
$user_storage = $this->entityTypeManager->getStorage('user');
|
||||
if ($user = end($user_storage->loadByProperties(['mail' => $email]))) {
|
||||
return $user->id();
|
||||
}
|
||||
$user = [
|
||||
'mail' => $email,
|
||||
'name' => $email,
|
||||
'status' => 0,
|
||||
];
|
||||
$new_user = $user_storage->create($user);
|
||||
$new_user->save();
|
||||
return $new_user->id();
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,116 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\yufu_concept\Plugin\rest\resource;
|
||||
|
||||
use Drupal\Core\Config\ConfigFactoryInterface;
|
||||
use Drupal\Core\Entity\EntityTypeManagerInterface;
|
||||
use Drupal\Core\Session\AccountProxyInterface;
|
||||
use Drupal\Core\StringTranslation\StringTranslationTrait;
|
||||
use Drupal\Core\TypedData\Exception\MissingDataException;
|
||||
use Drupal\node\NodeInterface;
|
||||
use Drupal\rest\Plugin\ResourceBase;
|
||||
use Drupal\rest\ResourceResponse;
|
||||
use Psr\Log\LogLevel;
|
||||
use Psr\Log\LoggerInterface;
|
||||
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
|
||||
use Drupal\Component\Utility\Xss;
|
||||
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||
|
||||
/**
|
||||
* Creates post endpoint to create new concept.
|
||||
*
|
||||
* @RestResource(
|
||||
* id = "concept_autocomplete_rest_resource",
|
||||
* label = @Translation("Concept autocomplete endpoint"),
|
||||
* uri_paths = {
|
||||
* "canonical" = "/api/pojem/autocomplete",
|
||||
* "create" = "/api/pojem/autocomplete",
|
||||
* }
|
||||
* )
|
||||
*/
|
||||
class ConceptAutocomplete extends ResourceBase {
|
||||
|
||||
/**
|
||||
* Entity type manager service.
|
||||
*
|
||||
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
|
||||
*/
|
||||
protected $entityTypeManager;
|
||||
|
||||
/**
|
||||
* Constructs a Drupal\rest\Plugin\ResourceBase object.
|
||||
*
|
||||
* @param array $configuration
|
||||
* A configuration array containing information about the plugin instance.
|
||||
* @param string $plugin_id
|
||||
* The plugin_id for the plugin instance.
|
||||
* @param mixed $plugin_definition
|
||||
* The plugin implementation definition.
|
||||
* @param array $serializer_formats
|
||||
* The available serialization formats.
|
||||
* @param \Psr\Log\LoggerInterface $logger
|
||||
* A logger instance.
|
||||
* @param \Drupal\Core\Session\AccountProxyInterface $current_user
|
||||
* A current user instance.
|
||||
*/
|
||||
public function __construct(
|
||||
array $configuration,
|
||||
string $plugin_id,
|
||||
array $plugin_definition,
|
||||
array $serializer_formats,
|
||||
LoggerInterface $logger,
|
||||
EntityTypeManagerInterface $entity_type_manager) {
|
||||
parent::__construct($configuration, $plugin_id, $plugin_definition, $serializer_formats, $logger);
|
||||
$this->entityTypeManager = $entity_type_manager;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
|
||||
return new static(
|
||||
$configuration,
|
||||
$plugin_id,
|
||||
$plugin_definition,
|
||||
$container->getParameter('serializer.formats'),
|
||||
$container->get('logger.channel.yufu_concept'),
|
||||
$container->get('entity_type.manager')
|
||||
);
|
||||
}
|
||||
|
||||
public function get(Request $request) {
|
||||
$results = [];
|
||||
$input = $request->query->get('q');// Get the typed string from the URL, if
|
||||
// it exists.
|
||||
$num = $request->query->get('num') ?? 10;
|
||||
$start = $request->query->get('start') ?? 0;
|
||||
if (!$input) {
|
||||
return new JsonResponse($results);
|
||||
}
|
||||
$input = Xss::filter($input);
|
||||
$node_storage = $this->entityTypeManager->getStorage('node');
|
||||
$query = $node_storage->getQuery()
|
||||
->condition('type', 'concept')
|
||||
->condition('title', $input, 'CONTAINS')
|
||||
->groupBy('nid')
|
||||
->sort('created', 'DESC')
|
||||
->accessCheck(TRUE)
|
||||
->range($start, $num);
|
||||
$ids = $query->execute();
|
||||
$nodes = $ids ? $node_storage->loadMultiple($ids) : [];
|
||||
foreach ($nodes as $id => $node) {
|
||||
$results[$id] = [
|
||||
'title' => $node->getTitle(),
|
||||
'id' => $node->id(),
|
||||
'revision_id' => $node->getRevisionId(),
|
||||
'revision_uid' => $node->getRevisionUserId(),
|
||||
'uuid' => $node->uuid(),
|
||||
'uid' => $node->uid->target_id,
|
||||
];
|
||||
}
|
||||
return new JsonResponse($results);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
# _*_ restclient _*_
|
||||
|
||||
# Makes post http request to a resource from yufu_concept module.
|
||||
# Make sure uuid is uniq or it will create new revision.
|
||||
|
||||
POST https://yufu-manifest.ddev.site/api/pojem/dodaj
|
||||
User-Agent: Emacs Restclient
|
||||
Content-Type: application/json
|
||||
Cookies: "SSESSb6f5da6ef565138b872e3e58509d8150=0z6Zk4tRwTF4WAR%2CSO6rH0K5F7hqKpbe28XRRHwvTxo%2CUnpC"
|
||||
|
||||
{
|
||||
"title": "888 Emacs restclient test 888",
|
||||
"text": "O wau. Emacs restclient. How nice. Dodam text. Spet.",
|
||||
"email": "lio.novelli@radiostudent.si",
|
||||
"uuid": "70c1ace2-aaaa-4dc5-84ed-3f21b83cb23a"
|
||||
}
|
||||
|
||||
# Testiramo autocomplete
|
||||
|
||||
GET https://yufu-manifest.ddev.site/api/pojem/autocomplete?q=jadr
|
||||
User-Agent: Emacs Restclient
|
||||
Content-Type: application/json
|
||||
Cookies: "SSESSb6f5da6ef565138b872e3e58509d8150=0z6Zk4tRwTF4WAR%2CSO6rH0K5F7hqKpbe28XRRHwvTxo%2CUnpC"
|
|
@ -0,0 +1,7 @@
|
|||
name: Yufu Concept
|
||||
type: module
|
||||
description: Provides concept content type related functionality.
|
||||
package: Yufu
|
||||
core_version_requirement: ^9 || ^10
|
||||
dependencies:
|
||||
- drupal:rest
|
|
@ -0,0 +1,6 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Primary module hooks for Yufu Concept module.
|
||||
*/
|
|
@ -0,0 +1,5 @@
|
|||
services:
|
||||
logger.channel.yufu_concept:
|
||||
class: Drupal\Core\Logger\LoggerChannel
|
||||
factory: logger.factory:get
|
||||
arguments: [ 'yufu_concept' ]
|
Loading…
Reference in New Issue