1 | <?php |
||||
2 | |||||
3 | namespace SilverStripe\CKANRegistry\Page; |
||||
4 | |||||
5 | use PageController; |
||||
0 ignored issues
–
show
|
|||||
6 | use SilverStripe\CKANRegistry\Model\Resource; |
||||
7 | use SilverStripe\CKANRegistry\Model\ResourceField; |
||||
8 | use SilverStripe\CKANRegistry\Model\ResourceFilter; |
||||
9 | use SilverStripe\Control\Director; |
||||
10 | use SilverStripe\Control\HTTPRequest; |
||||
11 | use SilverStripe\Control\HTTPResponse; |
||||
12 | use SilverStripe\ORM\DataObject; |
||||
13 | use SilverStripe\View\Requirements; |
||||
14 | |||||
15 | class CKANRegistryPageController extends PageController |
||||
16 | { |
||||
17 | private static $allowed_actions = [ |
||||
0 ignored issues
–
show
|
|||||
18 | 'readSchema', |
||||
19 | ]; |
||||
20 | |||||
21 | private static $url_handlers = [ |
||||
0 ignored issues
–
show
|
|||||
22 | // The "view" action is routed to index. The frontend implementation should take care of the frontend |
||||
23 | // routing for sub URLs. We will route /schema and /view/123/schema to the readSchema method though. |
||||
24 | 'GET view/$Item/schema' => 'readSchema', |
||||
25 | 'view/$Item' => 'index', |
||||
26 | 'GET schema' => 'readSchema', |
||||
27 | ]; |
||||
28 | |||||
29 | protected function init() |
||||
30 | { |
||||
31 | parent::init(); |
||||
32 | |||||
33 | Requirements::javascript('silverstripe/admin: client/dist/js/i18n.js'); |
||||
34 | Requirements::add_i18n_javascript('silverstripe/ckan-registry: client/lang'); |
||||
0 ignored issues
–
show
The function
SilverStripe\View\Requir...::add_i18n_javascript() has been deprecated.
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||
35 | } |
||||
36 | |||||
37 | /** |
||||
38 | * Loads model data encapsulated as JSON in order to power front end technologies used to render that |
||||
39 | * data. Includes critical info such as the CKAN site to query (e.g. which domain, datastore, etc.) |
||||
40 | * but also can be extended to be used for configuring the component used to show this (e.g. React.js |
||||
41 | * or Vue.js component configuration). |
||||
42 | * |
||||
43 | * @param DataObject $holder |
||||
44 | * @return array |
||||
45 | */ |
||||
46 | public function getCKANClientConfig(DataObject $holder = null) |
||||
47 | { |
||||
48 | if (!$holder) { |
||||
49 | $holder = $this->data(); |
||||
50 | } |
||||
51 | |||||
52 | /** @var Resource $resource */ |
||||
53 | $resource = $holder->getComponent('DataResource'); |
||||
54 | |||||
55 | $config = [ |
||||
56 | 'spec' => [ |
||||
57 | 'endpoint' => $resource->Endpoint, |
||||
58 | 'dataset' => $resource->DataSet, |
||||
59 | 'identifier' => $resource->Identifier, |
||||
60 | ], |
||||
61 | 'name' => $resource->Name, |
||||
62 | 'resourceName' => $resource->ResourceName, |
||||
63 | 'basePath' => $this->getBasePath($holder), |
||||
64 | 'fields' => array_map( |
||||
65 | function (ResourceField $field) { |
||||
66 | return [ |
||||
67 | 'OriginalLabel' => $field->OriginalLabel, |
||||
68 | 'ReadableLabel' => $field->ReadableLabel, |
||||
69 | 'ShowInResultsView' => (bool) $field->ShowInResultsView, |
||||
70 | 'ShowInDetailView' => (bool) $field->ShowInDetailView, |
||||
71 | 'DisplayConditions' => json_decode($field->DisplayConditions, true), |
||||
72 | 'RemoveDuplicates' => (bool) $field->RemoveDuplicates, |
||||
73 | 'Type' => $field->Type, |
||||
74 | ]; |
||||
75 | }, |
||||
76 | $resource->Fields()->filterAny([ |
||||
77 | 'ShowInResultsView' => true, |
||||
78 | 'ShowInDetailView' => true, |
||||
79 | 'RemoveDuplicates' => true, |
||||
80 | ])->Sort('Position', 'ASC')->toArray() |
||||
81 | ), |
||||
82 | 'filters' => array_map( |
||||
83 | function (ResourceFilter $filter) { |
||||
84 | $explodedClassName = explode('\\', get_class($filter)); |
||||
85 | return [ |
||||
86 | 'type' => array_pop($explodedClassName), |
||||
87 | ] + $filter->getClientConfig(); |
||||
88 | }, |
||||
89 | $resource->Filters()->sort('Order')->toArray() |
||||
90 | ) |
||||
91 | ]; |
||||
92 | |||||
93 | $this->extend('updateCKANClientConfig', $config); |
||||
94 | |||||
95 | return $config; |
||||
96 | } |
||||
97 | |||||
98 | /** |
||||
99 | * Returns the frontend application client configuration schema |
||||
100 | * |
||||
101 | * @param HTTPRequest $request |
||||
102 | */ |
||||
103 | public function readSchema(HTTPRequest $request) |
||||
104 | { |
||||
105 | $response = HTTPResponse::create() |
||||
106 | ->addHeader('Content-Type', 'application/json') |
||||
107 | ->setBody(json_encode($this->getCKANClientConfig())); |
||||
108 | return $response; |
||||
109 | } |
||||
110 | |||||
111 | /** |
||||
112 | * Returns the base path for the resource's page with a leading slash |
||||
113 | * |
||||
114 | * @param DataObject $holder |
||||
115 | * @return string |
||||
116 | */ |
||||
117 | public function getBasePath(DataObject $holder = null) |
||||
118 | { |
||||
119 | if (!$holder) { |
||||
120 | return '/'; |
||||
121 | } |
||||
122 | |||||
123 | $link = $holder->RelativeLink(); |
||||
124 | return Director::baseURL() . trim($link, '/'); |
||||
125 | } |
||||
126 | } |
||||
127 |
The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g.
excluded_paths: ["lib/*"]
, you can move it to the dependency path list as follows:For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths