diff --git a/modules/exif_gps/helpers/exif_gps.php b/modules/exif_gps/helpers/exif_gps.php new file mode 100644 index 00000000..cd6d12f8 --- /dev/null +++ b/modules/exif_gps/helpers/exif_gps.php @@ -0,0 +1,67 @@ +is_photo() && $item->mime_type == "image/jpeg") { + $data = array(); + require_once(MODPATH . "exif/lib/exif.php"); + $exif_raw = read_exif_data_raw($item->file_path(), false); + if (isset($exif_raw['ValidEXIFData'])) { + foreach(self::_keys() as $field => $exifvar) { + if (isset($exif_raw[$exifvar[0]][$exifvar[1]])) { + $value = $exif_raw[$exifvar[0]][$exifvar[1]]; + if (function_exists("mb_detect_encoding") && mb_detect_encoding($value) != "UTF-8") { + $value = utf8_encode($value); + } + $keys[$field] = Input::clean($value); + } + } + } + } + + // If coordinates were extracted, save them to the database. + if (isset($keys["Latitude"]) && isset($keys["Longitude"])) { + $record = ORM::factory("exif_coordinate"); + $record->item_id = $item->id; + $record->latitude = $keys["Latitude"]; + $record->longitude = $keys["Longitude"]; + $record->save(); + } + } + + private static function _keys() { + if (!isset(self::$exif_keys)) { + self::$exif_keys = array( + "Latitude" => array("GPS", "Latitude", t("GPS: Latitude"), ), + "Longitude" => array("GPS", "Longitude", t("GPS: Longitude"), ) + ); + } + return self::$exif_keys; + } +} \ No newline at end of file diff --git a/modules/exif_gps/helpers/exif_gps_event.php b/modules/exif_gps/helpers/exif_gps_event.php new file mode 100644 index 00000000..963374a7 --- /dev/null +++ b/modules/exif_gps/helpers/exif_gps_event.php @@ -0,0 +1,90 @@ +module == "exif") { + $data->messages["warn"][] = t("The EXIF_GPS module requires the EXIF module."); + } + } + + static function module_change($changes) { + // If EXIF is deactivated, display a warning that it is required for this module to function properly. + if (!module::is_active("exif") || in_array("exif", $changes->deactivate)) { + site_status::warning( + t("The EXIF_GPS module requires the EXIF module. " . + "Activate the EXIF module now", + array("url" => html::mark_clean(url::site("admin/modules")))), + "exif_gps_needs_exif"); + } else { + site_status::clear("exif_gps_needs_exif"); + } + } + + static function item_created($item) { + // Whenever a new non-album item is created, check it for GPS coordinates. + if (!$item->is_album()) { + exif_gps::extract($item); + } + } + + static function item_deleted($item) { + // Whenever an item is deleted, delete any corresponding GPS coordinates. + db::build() + ->delete("exif_coordinates") + ->where("item_id", "=", $item->id) + ->execute(); + } + + static function item_edit_form($item, $form) { + // Allow users to set / edit the GPS coordinates associated with the current item. + $record = ORM::factory("exif_coordinate")->where("item_id", "=", $item->id)->find(); + if ($record->loaded()) { + $form->edit_item->input("latitude")->label(t("Latitude")) + ->value($record->latitude); + $form->edit_item->input("longitude")->label(t("Longitude")) + ->value($record->longitude); + } else { + $form->edit_item->input("latitude")->label(t("Latitude")); + $form->edit_item->input("longitude")->label(t("Longitude")); + } + } + + static function item_edit_form_completed($item, $form) { + // Update the db records with the user-specified coordinates. + + // Require a set of coordinates (both latitude and longitude). + // If one or both fields are blank, completely delete any coordinates associated with this item. + if (($form->edit_item->latitude->value == "") || ($form->edit_item->longitude->value == "")) { + db::build() + ->delete("exif_coordinates") + ->where("item_id", "=", $item->id) + ->execute(); + } else { + $record = ORM::factory("exif_coordinate")->where("item_id", "=", $item->id)->find(); + if (!$record->loaded()) { + $record->item_id = $item->id; + } + $record->latitude = $form->edit_item->latitude->value; + $record->longitude = $form->edit_item->longitude->value; + $record->save(); + } + } +} diff --git a/modules/exif_gps/helpers/exif_gps_installer.php b/modules/exif_gps/helpers/exif_gps_installer.php new file mode 100644 index 00000000..c8f913d0 --- /dev/null +++ b/modules/exif_gps/helpers/exif_gps_installer.php @@ -0,0 +1,46 @@ +query("CREATE TABLE IF NOT EXISTS {exif_coordinates} ( + `id` int(9) NOT NULL auto_increment, + `item_id` int(9) NOT NULL, + `latitude` varchar(128) NOT NULL, + `longitude` varchar(128) NOT NULL, + PRIMARY KEY (`id`), + KEY(`item_id`, `id`)) + DEFAULT CHARSET=utf8;"); + + module::set_version("exif_gps", 1); + } + + static function deactivate() { + site_status::clear("exif_gps_needs_exif"); + } + + static function uninstall() { + // Delete the GPS table before uninstalling. + $db = Database::instance(); + $db->query("DROP TABLE IF EXISTS {exif_coordinates};"); + module::delete("exif_gps"); + } +} diff --git a/modules/exif_gps/models/exif_coordinate.php b/modules/exif_gps/models/exif_coordinate.php new file mode 100644 index 00000000..43ab0b25 --- /dev/null +++ b/modules/exif_gps/models/exif_coordinate.php @@ -0,0 +1,21 @@ +