################# Extending the API ################# Registering Your Resource ------------------------- You can extend the API to include custom resources. Most resources are correlated to Omeka records, but you may include non-record resources as well. In your plugin class, register your resource using the :doc:`/Reference/filters/api_resources` filter, following this format: .. code-block:: php 'your-plugin-name', // Controller associated with your resource. 'controller' => 'your-resource-controller', // Type of record associated with your resource. 'record_type' => 'YourResourceRecord', // List of actions available for your resource. 'actions' => array( 'index', // GET request without ID 'get', // GET request with ID 'post', // POST request 'put', // PUT request (ID is required) 'delete', // DELETE request (ID is required) ), // List of GET parameters available for your index action. 'index_params' => array('foo', 'bar'), ); return $apiResources; } If not given, ``module`` and ``controller`` fall back to their defaults, "default" and "api". Resources using the default controller MUST include a ``record_type``. Remove ``actions`` that are not wanted or not implemented. For index actions, all GET parameters must be registered with the ``index_params`` whitelist. Using the Default Controller ---------------------------- If your resource corresponds to an Omeka record, we highly recommend that you use the default controller. Doing so will ensure consistent behavior across resources. These records must extend ``Omeka_Record_AbstractRecord``, implement ``Zend_Acl_Resource_Interface``, and have a corresponding API adapter called ``Api_{YourRecordType}`` that must extend ``Omeka_Record_Api_AbstractRecordAdapter`` and be saved to your plugin's models directory in a subdirectory named Api. This adapter is responsible for building representations of, and setting properties to, your record. For example, an API adapter for ``YourRecordType`` saved to YourPlugin/models/Api/YourRecordType.php: .. code-block:: php addResource('YourPlugin_YourRecords'); } One last thing you may need to do is filter the select object in the record's table class by overriding ``Omeka_Db_Table::getSelect()``. This should protect unauthorized API users from viewing non-public records: .. code-block:: php apply($select, 'your_records', 'owner_column', 'public_column'); return $select; } Extending Existing Resources ---------------------------- You can extend the representations of existing resources by using the :doc:`/Reference/filters/api_extend_\` filter, where is the resource you want to extend. .. code-block:: php _db->getTable('YourResource')->findByItemId($item->id); $extend['your_resources'] = array( 'id' => 1, 'url' => Omeka_Record_Api_AbstractRecordAdapter::getResourceUrl("/your_resources/{$resourceId->id}"), 'resource' => 'your_resources', ); // Or, for multiple resources: $extend['your_resources'] = array( 'count' => 10, 'url' => Omeka_Record_Api_AbstractRecordAdapter::getResourceUrl("/your_resources?item={$item->id}"), 'resource' => 'your_resources', ); return $extend; } Note that the API enforces a pattern when extending a resource: - ``id`` and ``url`` for a one-to-one relationship - ``count`` and ``url`` for a one-to-many relationship - ``resource`` is recommended but not required All other keys pass through as custom data that may be used for the client's convenience.