danielebarchiesi@4
|
1 <?php
|
danielebarchiesi@4
|
2
|
danielebarchiesi@4
|
3 /**
|
danielebarchiesi@4
|
4 * @file
|
danielebarchiesi@4
|
5 * This file contains no working PHP code; it exists to provide additional
|
danielebarchiesi@4
|
6 * documentation for doxygen as well as to document hooks in the standard
|
danielebarchiesi@4
|
7 * Drupal manner.
|
danielebarchiesi@4
|
8 */
|
danielebarchiesi@4
|
9
|
danielebarchiesi@4
|
10
|
danielebarchiesi@4
|
11 /**
|
danielebarchiesi@4
|
12 * @defgroup restws RestWS module integrations.
|
danielebarchiesi@4
|
13 *
|
danielebarchiesi@4
|
14 * Module integrations with the restws module.
|
danielebarchiesi@4
|
15 */
|
danielebarchiesi@4
|
16
|
danielebarchiesi@4
|
17 /**
|
danielebarchiesi@4
|
18 * @defgroup restws_hooks RestWS' hooks
|
danielebarchiesi@4
|
19 * @{
|
danielebarchiesi@4
|
20 * Hooks that can be implemented by other modules in order to extend restws.
|
danielebarchiesi@4
|
21 */
|
danielebarchiesi@4
|
22
|
danielebarchiesi@4
|
23 /**
|
danielebarchiesi@4
|
24 * Define restws compatible resources.
|
danielebarchiesi@4
|
25 *
|
danielebarchiesi@4
|
26 * This hook is required in order to add new restws resources.
|
danielebarchiesi@4
|
27 *
|
danielebarchiesi@4
|
28 * @return array
|
danielebarchiesi@4
|
29 * An array of information about the module's provided resources.
|
danielebarchiesi@4
|
30 * The array contains a sub-array for each resource, with the resource name as
|
danielebarchiesi@4
|
31 * the key. Resource names may only contain lowercase alpha-numeric characters
|
danielebarchiesi@4
|
32 * and underscores and should be prefixed with the providing module name.
|
danielebarchiesi@4
|
33 * Possible attributes for each sub-array are:
|
danielebarchiesi@4
|
34 * - label: The label of the resource. Start capitalized.
|
danielebarchiesi@4
|
35 * - class: The name of the controller class for the resource. The class has
|
danielebarchiesi@4
|
36 * to implement the RestWSResourceControllerInterface. Required.
|
danielebarchiesi@4
|
37 * - menu_path: A relative path were the resource callback should lie. By
|
danielebarchiesi@4
|
38 * default the resource name will be used as menu path. Optional.
|
danielebarchiesi@4
|
39 *
|
danielebarchiesi@4
|
40 * @see MyModuleBookResourceController
|
danielebarchiesi@4
|
41 */
|
danielebarchiesi@4
|
42 function hook_restws_resource_info() {
|
danielebarchiesi@4
|
43 return array(
|
danielebarchiesi@4
|
44 'mymodule_book' => array(
|
danielebarchiesi@4
|
45 'label' => t('Book'),
|
danielebarchiesi@4
|
46 'class' => 'MyModuleBookResourceController',
|
danielebarchiesi@4
|
47 'menu_path' => 'api/mybook',
|
danielebarchiesi@4
|
48 ),
|
danielebarchiesi@4
|
49 'mymodule_status' => array(
|
danielebarchiesi@4
|
50 'label' => t('Status'),
|
danielebarchiesi@4
|
51 'class' => 'MyModuleStatusResourceController',
|
danielebarchiesi@4
|
52 ),
|
danielebarchiesi@4
|
53 );
|
danielebarchiesi@4
|
54 }
|
danielebarchiesi@4
|
55
|
danielebarchiesi@4
|
56 /**
|
danielebarchiesi@4
|
57 * Alter available resource information.
|
danielebarchiesi@4
|
58 *
|
danielebarchiesi@4
|
59 * @param array $resource_info
|
danielebarchiesi@4
|
60 * Resource information as defined in hook_restws_resource_info(). You can
|
danielebarchiesi@4
|
61 * move the path of a resouce by setting menu_info. In this example you'll
|
danielebarchiesi@4
|
62 * have to retrieve nodes from /mypath.json or /mypath/1.json.
|
danielebarchiesi@4
|
63 *
|
danielebarchiesi@4
|
64 * @see hook_restws_resource_info()
|
danielebarchiesi@4
|
65 */
|
danielebarchiesi@4
|
66 function hook_restws_resource_info_alter(&$resource_info) {
|
danielebarchiesi@4
|
67 $resource_info['node']['class'] = 'MySpecialNodeResourceController';
|
danielebarchiesi@4
|
68 $resource_info['node']['menu_path'] = 'mypath';
|
danielebarchiesi@4
|
69 }
|
danielebarchiesi@4
|
70
|
danielebarchiesi@4
|
71 /**
|
danielebarchiesi@4
|
72 * Define restws compatible formats.
|
danielebarchiesi@4
|
73 *
|
danielebarchiesi@4
|
74 * This hook is required in order to add new restws formats.
|
danielebarchiesi@4
|
75 *
|
danielebarchiesi@4
|
76 * @return array
|
danielebarchiesi@4
|
77 * An array of information about the module's provided formats.
|
danielebarchiesi@4
|
78 * The array contains a sub-array for each format, with the format name as
|
danielebarchiesi@4
|
79 * the key. Format names may only contain lowercase alpha-numeric characters
|
danielebarchiesi@4
|
80 * and underscores.
|
danielebarchiesi@4
|
81 * Possible attributes for each sub-array are:
|
danielebarchiesi@4
|
82 * - label: The label of the format. Start capitalized.
|
danielebarchiesi@4
|
83 * - class: The name of the class for the format. The class has to implement
|
danielebarchiesi@4
|
84 * the RestWSFormatInterface. Required.
|
danielebarchiesi@4
|
85 * - mime type: The official internet media type (MIME type) of the format.
|
danielebarchiesi@4
|
86 * Required.
|
danielebarchiesi@4
|
87 */
|
danielebarchiesi@4
|
88 function hook_restws_format_info() {
|
danielebarchiesi@4
|
89 return array(
|
danielebarchiesi@4
|
90 'json' => array(
|
danielebarchiesi@4
|
91 'label' => t('JSON'),
|
danielebarchiesi@4
|
92 'class' => 'RestWSFormatJSON',
|
danielebarchiesi@4
|
93 'mime type' => 'application/json',
|
danielebarchiesi@4
|
94 ),
|
danielebarchiesi@4
|
95 'xml' => array(
|
danielebarchiesi@4
|
96 'label' => t('XML'),
|
danielebarchiesi@4
|
97 'class' => 'RestWSFormatXML',
|
danielebarchiesi@4
|
98 'mime type' => 'application/xml',
|
danielebarchiesi@4
|
99 ),
|
danielebarchiesi@4
|
100 );
|
danielebarchiesi@4
|
101 }
|
danielebarchiesi@4
|
102
|
danielebarchiesi@4
|
103 /**
|
danielebarchiesi@4
|
104 * Alter available format information.
|
danielebarchiesi@4
|
105 *
|
danielebarchiesi@4
|
106 * @param array $format_info
|
danielebarchiesi@4
|
107 * Format information as defined in hook_restws_format_info()
|
danielebarchiesi@4
|
108 *
|
danielebarchiesi@4
|
109 * @see hook_restws_format_info()
|
danielebarchiesi@4
|
110 */
|
danielebarchiesi@4
|
111 function hook_restws_format_info_alter(&$format_info) {
|
danielebarchiesi@4
|
112 $format_info['json']['class'] = 'MyJsonFormatHandler';
|
danielebarchiesi@4
|
113 }
|
danielebarchiesi@4
|
114
|
danielebarchiesi@4
|
115 /**
|
danielebarchiesi@4
|
116 * Alter the incoming request array.
|
danielebarchiesi@4
|
117 *
|
danielebarchiesi@4
|
118 * @param array $request
|
danielebarchiesi@4
|
119 * A request array that contains the following items:
|
danielebarchiesi@4
|
120 * - op: operation string, one of create, read, update or delete.
|
danielebarchiesi@4
|
121 * - format: object implementing RestWSFormatInterface.
|
danielebarchiesi@4
|
122 * - resource: object implementing RestWSResourceControllerInterface.
|
danielebarchiesi@4
|
123 * - id: resource identifier or NULL for the create operation.
|
danielebarchiesi@4
|
124 * - payload: array containing data attached to this request, if any.
|
danielebarchiesi@4
|
125 */
|
danielebarchiesi@4
|
126 function hook_restws_request_alter(array &$request) {
|
danielebarchiesi@4
|
127 if ($request['resource']->resource() == 'node') {
|
danielebarchiesi@4
|
128 $request['format'] = restws_format('json');
|
danielebarchiesi@4
|
129 }
|
danielebarchiesi@4
|
130 }
|
danielebarchiesi@4
|
131
|
danielebarchiesi@4
|
132 /**
|
danielebarchiesi@4
|
133 * Alter the outgoing response.
|
danielebarchiesi@4
|
134 *
|
danielebarchiesi@4
|
135 * @param mixed $response
|
danielebarchiesi@4
|
136 * The response data being returned by the REST service (not yet serialized).
|
danielebarchiesi@4
|
137 *
|
danielebarchiesi@4
|
138 * @param string $function
|
danielebarchiesi@4
|
139 * The function being called on the REST service.
|
danielebarchiesi@4
|
140 *
|
danielebarchiesi@4
|
141 * @param string $format
|
danielebarchiesi@4
|
142 * The name of the format serializing the response.
|
danielebarchiesi@4
|
143 */
|
danielebarchiesi@4
|
144 function hook_restws_response_alter(&$response, $function, $formatName) {
|
danielebarchiesi@4
|
145 if ($function == 'viewResource' && $formatName == 'json') {
|
danielebarchiesi@4
|
146 $response['site_name'] = variable_get('site_name', '');
|
danielebarchiesi@4
|
147 }
|
danielebarchiesi@4
|
148 }
|
danielebarchiesi@4
|
149
|
danielebarchiesi@4
|
150 /**
|
danielebarchiesi@4
|
151 * @}
|
danielebarchiesi@4
|
152 */
|
danielebarchiesi@4
|
153
|
danielebarchiesi@4
|
154 /**
|
danielebarchiesi@4
|
155 * Example controller class for the mymodule_book resource.
|
danielebarchiesi@4
|
156 */
|
danielebarchiesi@4
|
157 class MyModuleBookResourceController implements RestWSResourceControllerInterface {
|
danielebarchiesi@4
|
158
|
danielebarchiesi@4
|
159 /**
|
danielebarchiesi@4
|
160 * @see hook_entity_property_info()
|
danielebarchiesi@4
|
161 * @see RestWSResourceControllerInterface::propertyInfo()
|
danielebarchiesi@4
|
162 */
|
danielebarchiesi@4
|
163 public function propertyInfo() {
|
danielebarchiesi@4
|
164 return array(
|
danielebarchiesi@4
|
165 'properties' => array(
|
danielebarchiesi@4
|
166 'title' => array(
|
danielebarchiesi@4
|
167 'type' => 'text',
|
danielebarchiesi@4
|
168 'label' => t('Book title'),
|
danielebarchiesi@4
|
169 'setter callback' => 'entity_property_verbatim_set',
|
danielebarchiesi@4
|
170 ),
|
danielebarchiesi@4
|
171 'author' => array(
|
danielebarchiesi@4
|
172 'type' => 'text',
|
danielebarchiesi@4
|
173 'label' => t('Author'),
|
danielebarchiesi@4
|
174 'setter callback' => 'entity_property_verbatim_set',
|
danielebarchiesi@4
|
175 ),
|
danielebarchiesi@4
|
176 'pages' => array(
|
danielebarchiesi@4
|
177 'type' => 'integer',
|
danielebarchiesi@4
|
178 'label' => t('Number of pages'),
|
danielebarchiesi@4
|
179 'setter callback' => 'entity_property_verbatim_set',
|
danielebarchiesi@4
|
180 ),
|
danielebarchiesi@4
|
181 'price' => array(
|
danielebarchiesi@4
|
182 'type' => 'decimal',
|
danielebarchiesi@4
|
183 'label' => t('Price'),
|
danielebarchiesi@4
|
184 'setter callback' => 'entity_property_verbatim_set',
|
danielebarchiesi@4
|
185 ),
|
danielebarchiesi@4
|
186 ),
|
danielebarchiesi@4
|
187 );
|
danielebarchiesi@4
|
188 }
|
danielebarchiesi@4
|
189
|
danielebarchiesi@4
|
190 /**
|
danielebarchiesi@4
|
191 * @see RestWSResourceControllerInterface::wrapper()
|
danielebarchiesi@4
|
192 */
|
danielebarchiesi@4
|
193 public function wrapper($id) {
|
danielebarchiesi@4
|
194 $book = mymodule_book_load($id);
|
danielebarchiesi@4
|
195 $info = $this->propertyInfo();
|
danielebarchiesi@4
|
196 return entity_metadata_wrapper('mymodule_book', $book, array('property info' => $info['properties']));
|
danielebarchiesi@4
|
197 }
|
danielebarchiesi@4
|
198
|
danielebarchiesi@4
|
199 /**
|
danielebarchiesi@4
|
200 * @see RestWSResourceControllerInterface::create()
|
danielebarchiesi@4
|
201 */
|
danielebarchiesi@4
|
202 public function create(array $values) {
|
danielebarchiesi@4
|
203 try {
|
danielebarchiesi@4
|
204 $book = mymodule_book_save($values);
|
danielebarchiesi@4
|
205 return $book->id;
|
danielebarchiesi@4
|
206 }
|
danielebarchiesi@4
|
207 catch (Exception $e) {
|
danielebarchiesi@4
|
208 throw new RestWSException('Creation error', 406);
|
danielebarchiesi@4
|
209 }
|
danielebarchiesi@4
|
210 }
|
danielebarchiesi@4
|
211
|
danielebarchiesi@4
|
212 /**
|
danielebarchiesi@4
|
213 * @see RestWSResourceControllerInterface::read()
|
danielebarchiesi@4
|
214 */
|
danielebarchiesi@4
|
215 public function read($id) {
|
danielebarchiesi@4
|
216 return mymodule_book_load($id);
|
danielebarchiesi@4
|
217 }
|
danielebarchiesi@4
|
218
|
danielebarchiesi@4
|
219 /**
|
danielebarchiesi@4
|
220 * @see RestWSResourceControllerInterface::update()
|
danielebarchiesi@4
|
221 */
|
danielebarchiesi@4
|
222 public function update($id, array $values) {
|
danielebarchiesi@4
|
223 throw new RestWSException('Not implemented', 501);
|
danielebarchiesi@4
|
224 }
|
danielebarchiesi@4
|
225
|
danielebarchiesi@4
|
226 /**
|
danielebarchiesi@4
|
227 * @see RestWSResourceControllerInterface::delete()
|
danielebarchiesi@4
|
228 */
|
danielebarchiesi@4
|
229 public function delete($id) {
|
danielebarchiesi@4
|
230 try {
|
danielebarchiesi@4
|
231 mymodule_book_delete($id);
|
danielebarchiesi@4
|
232 }
|
danielebarchiesi@4
|
233 catch (Exception $e) {
|
danielebarchiesi@4
|
234 throw new RestWSException('Book not found', 404);
|
danielebarchiesi@4
|
235 }
|
danielebarchiesi@4
|
236 }
|
danielebarchiesi@4
|
237
|
danielebarchiesi@4
|
238 /**
|
danielebarchiesi@4
|
239 * @see RestWSResourceControllerInterface::access()
|
danielebarchiesi@4
|
240 */
|
danielebarchiesi@4
|
241 public function access($op, $id) {
|
danielebarchiesi@4
|
242 return mymodule_book_access($op, $id);
|
danielebarchiesi@4
|
243 }
|
danielebarchiesi@4
|
244
|
danielebarchiesi@4
|
245 /**
|
danielebarchiesi@4
|
246 * @see RestWSResourceControllerInterface::resource()
|
danielebarchiesi@4
|
247 */
|
danielebarchiesi@4
|
248 public function resource() {
|
danielebarchiesi@4
|
249 return 'mymodule_book';
|
danielebarchiesi@4
|
250 }
|
danielebarchiesi@4
|
251 }
|