|
@@ -18,6 +18,12 @@ abstract class TripalFieldDownloader {
|
|
|
*/
|
|
|
protected $bundle_name = '';
|
|
|
|
|
|
+ /**
|
|
|
+ * The collection ID
|
|
|
+ */
|
|
|
+ protected $collection_id = NULL;
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* A set of entity IDs.
|
|
|
*/
|
|
@@ -49,7 +55,7 @@ abstract class TripalFieldDownloader {
|
|
|
* a path.
|
|
|
*/
|
|
|
public function __construct($bundle_name, $ids, $fields = array(),
|
|
|
- $outfile_name, $uid) {
|
|
|
+ $outfile_name, $uid, $collection_id) {
|
|
|
|
|
|
$user = user_load($uid);
|
|
|
if (!$user) {
|
|
@@ -62,7 +68,8 @@ abstract class TripalFieldDownloader {
|
|
|
$this->bundle_name = $bundle_name;
|
|
|
$this->entity_ids = $ids;
|
|
|
$this->fields = $fields;
|
|
|
-
|
|
|
+ $this->collection_id = $collection_id;
|
|
|
+
|
|
|
// Make sure the user directory exists
|
|
|
$user_dir = 'public://tripal/users/' . $user->uid;
|
|
|
if (!file_prepare_directory($user_dir, FILE_CREATE_DIRECTORY)) {
|
|
@@ -76,7 +83,7 @@ abstract class TripalFieldDownloader {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- $this->outfile = $user_dir. '/' . $outfile_name;
|
|
|
+ $this->outfile = $user_dir . '/' . $outfile_name;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -106,6 +113,7 @@ abstract class TripalFieldDownloader {
|
|
|
* Creates the downloadable file.
|
|
|
*/
|
|
|
public function write() {
|
|
|
+ // print_r("public function write \n \n ");
|
|
|
global $user;
|
|
|
$fh = fopen(drupal_realpath($this->outfile), "w");
|
|
|
|
|
@@ -119,29 +127,176 @@ abstract class TripalFieldDownloader {
|
|
|
foreach ($this->bundle_name as $bundle) {
|
|
|
// Set the single bundle name for getting the Header.
|
|
|
$this->bundle_name = $bundle->bundle_name;
|
|
|
- $headers = $this->getHeader();
|
|
|
+ /*$headers = $this->getHeader();
|
|
|
if ($headers) {
|
|
|
foreach ($headers as $line) {
|
|
|
fwrite($fh, $line . "\r\n");
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
+ }*/
|
|
|
+ print_r($this->bundle_name);
|
|
|
// Determine if the entity is remote or local.
|
|
|
if (strpos($this->bundle_name, 'bio_data_') !== 0) {
|
|
|
- // Because this is a remote field we need to construct a fake entity.
|
|
|
- /*
|
|
|
+ // Get all fields for that remote site/bundle name pairing, put them all in a fake entity
|
|
|
+ // Need Field_id, have bundle_name, need collection_id
|
|
|
+ // Return the bundles from the collection_bundle table.
|
|
|
+ // Get the site id to build the web services call
|
|
|
+ $remote_site_data = db_select('tripal_collection_bundle')
|
|
|
+ ->fields('tripal_collection_bundle', array('site_id', 'fields', 'ids'))
|
|
|
+ ->condition('collection_id', $this->collection_id, '=')
|
|
|
+ ->condition('bundle_name', $this->bundle_name, '=')
|
|
|
+ ->execute()
|
|
|
+ ->fetchAssoc();
|
|
|
+
|
|
|
+ $site_id = $remote_site_data['site_id'];
|
|
|
+ $remote_fields = unserialize($remote_site_data['fields']);
|
|
|
+ $remote_ids = unserialize($remote_site_data['ids']);
|
|
|
+ $remote_entities = [];
|
|
|
|
|
|
- $lines = $this->formatEntity($entity_info);
|
|
|
- foreach ($lines as $line) {
|
|
|
- fwrite($fh, $line . "\r\n");
|
|
|
- }*/
|
|
|
+ //Now we have the remote site info we need to check against the passed field and entity ids.
|
|
|
+ foreach ($remote_ids as $remote_id) {
|
|
|
+ // print_r("remote_id \n");
|
|
|
+ // print_r($remote_id);
|
|
|
+ foreach ($this->entity_ids as $entity_id) {
|
|
|
+ if (is_array($entity_id)) {
|
|
|
+ foreach ($entity_id as $entity) {
|
|
|
+ if (is_array($entity)) {
|
|
|
+ foreach ($entity as $single_id) {
|
|
|
+ if ($remote_id == $single_id) {
|
|
|
+ // Before a request can be made we need to get the entity type
|
|
|
+ // '@id' contains the bundle_name, so look for that.
|
|
|
+ if (!empty($remote_id)) {
|
|
|
+ $cache_name = 'tripal_web_services_vocab_' . $site_id;
|
|
|
+ if ($cache = cache_get($cache_name)) {
|
|
|
+ $site_vocab = $cache->data;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ $site_vocab = tripal_web_services_vocab_request($site_id);
|
|
|
+ if (!empty($site_vocab)) {
|
|
|
+ cache_set('tripal_web_services_vocab', $site_vocab);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // Now we have the vocab we can look for the bundle_name in the @id field
|
|
|
+ foreach ($site_vocab as $item) {
|
|
|
+ if (is_array($item)) {
|
|
|
+ foreach ($item as $vocab_term) {
|
|
|
+ if (!empty($vocab_term['@id'])) {
|
|
|
+ if (strpos($vocab_term['@id'], $this->bundle_name) !== FALSE) {
|
|
|
+ $entity_type = $vocab_term['hydra:title'];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //print_r($entity_info);
|
|
|
+ //print_r("\n \n");
|
|
|
+ // This entity needs to be pulled down and data grabbed.
|
|
|
+ $query = $entity_type . '/' . $single_id;
|
|
|
+ $remote_entity = tripal_web_services_remote_request($site_id, $query);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ if ($remote_id == $entity_id) {
|
|
|
+ // Before a request can be made we need to get the entity type
|
|
|
+ // '@id' contains the bundle_name, so look for that.
|
|
|
+ if (!empty($remote_id)) {
|
|
|
+ $cache_name = 'tripal_web_services_vocab_' . $site_id;
|
|
|
+ if ($cache = cache_get($cache_name)) {
|
|
|
+ $site_vocab = $cache->data;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ $site_vocab = tripal_web_services_vocab_request($site_id);
|
|
|
+ if (!empty($site_vocab)) {
|
|
|
+ cache_set('tripal_web_services_vocab', $site_vocab);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //print_r($site_vocab);
|
|
|
+ // Now we have the vocab we can look for the bundle_name in the @id field
|
|
|
+ foreach ($site_vocab as $item) {
|
|
|
+ if (is_array($item)) {
|
|
|
+ foreach ($item as $vocab_term) {
|
|
|
+ if (!empty($vocab_term['@id'])) {
|
|
|
+ if (strpos($vocab_term['@id'], $this->bundle_name) !== FALSE) {
|
|
|
+ $entity_type = $vocab_term['hydra:title'];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //print_r($entity_info);
|
|
|
+ // This entity needs to be pulled down and data grabbed.
|
|
|
+ $query = $entity_type . '/' . $entity_id;
|
|
|
+ $remote_entity = tripal_web_services_remote_request($site_id, $query);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
+ // Build the fields for the fake entity.
|
|
|
+ // Need the label of the field so we can pull the data from the json.
|
|
|
+ $fields = [];
|
|
|
+ $fields = $this->fields;
|
|
|
+ foreach ($fields as $field) {
|
|
|
+ foreach ($site_vocab as $item) {
|
|
|
+ if (is_array($item)) {
|
|
|
+ foreach ($item as $vocab_term) {
|
|
|
+ if (!empty($vocab_term) && is_array($vocab_term)) {
|
|
|
+ foreach ($vocab_term as $key => $term) {
|
|
|
+ if (is_array($$key)) {
|
|
|
+ print_r($key);
|
|
|
+ if ($key['property'] === $field) {
|
|
|
+ if (in_array('hydra:title', $key)) {
|
|
|
+ $fields[] = $key['hydra:title'];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else {
|
|
|
+
|
|
|
+ if ($term['property'] === $field) {
|
|
|
+ if (in_array('hydra:title', $term)) {
|
|
|
+ $fields[] = $$term['hydra:title'];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // Because this is a remote field we need to construct a fake entity.
|
|
|
+ $fake_tripal_entity = new stdClass();
|
|
|
+ $fake_tripal_entity->entityType = 'TripalEntity';
|
|
|
+ $fake_tripal_entity->entityInfo = [];
|
|
|
+ $fake_tripal_entity->id = $entity_id;
|
|
|
+ $fake_tripal_entity->type = 'TripalEntity';
|
|
|
+ $fake_tripal_entity->bundle = $this->bundle_name;
|
|
|
+ foreach ($fields as $name => $field) {
|
|
|
+ $fake_tripal_entity->$name = [
|
|
|
+ 'und' => [
|
|
|
+ '0' => [
|
|
|
+ 'value' => $field,
|
|
|
+ ],
|
|
|
+ ],
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ //print_r($fake_tripal_entity);
|
|
|
+ $lines = $this->formatEntity($fake_tripal_entity);
|
|
|
+ foreach ($lines as $line) {
|
|
|
+ fwrite($fh, $line . "\r\n");
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
else {
|
|
|
foreach ($this->entity_ids[$bundle_id] as $entity_id) {
|
|
|
if (is_array($entity_id)) {
|
|
|
foreach ($entity_id as $single_entity) {
|
|
|
-
|
|
|
if (is_array($single_entity)) {
|
|
|
foreach ($single_entity as $entity) {
|
|
|
// If the field is from a remote entity then we need to load the info through web services.
|