You are here

function openlayers_geofield_widget_element_validate in Geofield 7.2

1 string reference to 'openlayers_geofield_widget_element_validate'
openlayers_field_widget_form in ./geofield.widgets.openlayers.inc
Implements hook_field_widget_form().

File

./geofield.widgets.openlayers.inc, line 361
Provides widget hooks on behalf of Openlayers.

Code

function openlayers_geofield_widget_element_validate($element, &$form_state) {
  $container_delta = $element[0];
  if (!empty($container_delta['geom']['#value'])) {
    geophp_load();
    $combined_geom = geoPHP::load($container_delta['geom']['#value']);
    $combined_geom = geoPHP::geometryReduce($combined_geom);

    // Check to make sure they only saved the allowed types
    $geom_type = $combined_geom
      ->geometryType();
    if ($geom_type == 'GeometryCollection' || $geom_type == 'MultiPoint' || $geom_type == 'MultiLineString' || $geom_type == 'MultiPolygon') {
      $geoms = $combined_geom
        ->getComponents();
    }
    else {
      $geoms = array(
        $combined_geom,
      );
    }
    foreach ($geoms as $item) {
      $allowed = FALSE;
      foreach ($container_delta['#widget_settings']['feature_types'] as $type) {
        $geometry_type = strtolower($item
          ->geometryType());
        if ($geometry_type == 'linestring') {
          $geometry_type = 'path';
        }
        if (strpos(strtolower($geometry_type), $type) !== FALSE) {
          $allowed = TRUE;
          break;
        }
      }
      if (!$allowed) {
        form_set_error($container_delta['#field_name'], 'Not allowed to submit a geometry of type ' . $item
          ->geometryType());
        return;
      }
    }

    //Check the number deltas
    $cardinality = $container_delta['#widget_settings']['cardinality'];
    if ($cardinality > 0 && $container_delta['#widget_settings']['data_storage'] == 'single') {
      if (count($geoms) > $cardinality) {
        form_set_error($container_delta['#field_name'], 'Too many geometries submitted. Max allowed is ' . $cardinality);
        return;
      }
    }

    // Checks pass, lets load this up into deltas
    if ($container_delta['#widget_settings']['data_storage'] == 'collection') {

      //Assign values to the form state
      form_set_value($element[0]['geom'], $combined_geom
        ->out('wkt'), $form_state);
    }
    if ($container_delta['#widget_settings']['data_storage'] == 'single') {
      foreach ($geoms as $delta => $geom) {

        // Clone delta-0
        $element = $container_delta;

        // Override the delta
        openlayers_geofield_override_element_delta($element, 0, $delta);

        // Assign the value in the form_state
        form_set_value($element['geom'], $geom
          ->out('wkt'), $form_state);
      }
    }
  }
}