protected function _get_models_metadata_entity() { $response = array(); foreach ($this->get_model_version_info()->models_for_requested_version() as $model_name => $model_classname) { $model = $this->get_model_version_info()->load_model($model_name); $fields_json = array(); foreach ($this->get_model_version_info()->fields_on_model_in_this_version($model) as $field_name => $field_obj) { if ($this->get_model_version_info()->field_is_ignored($field_obj)) { continue; } if ($field_obj instanceof \EE_Boolean_Field) { $datatype = 'Boolean'; } elseif ($field_obj->get_wpdb_data_type() == '%d') { $datatype = 'Number'; } elseif ($field_name instanceof \EE_Serialized_Text_Field) { $datatype = 'Object'; } else { $datatype = 'String'; } $default_value = Model_Data_Translator::prepare_field_value_for_json($field_obj, $field_obj->get_default_value(), $this->get_model_version_info()->requested_version()); $field_json = array('name' => $field_name, 'nicename' => $field_obj->get_nicename(), 'has_rendered_format' => $this->get_model_version_info()->field_has_rendered_format($field_obj), 'has_pretty_format' => $this->get_model_version_info()->field_has_pretty_format($field_obj), 'type' => str_replace('EE_', '', get_class($field_obj)), 'datatype' => $datatype, 'nullable' => $field_obj->is_nullable(), 'default' => $default_value, 'table_alias' => $field_obj->get_table_alias(), 'table_column' => $field_obj->get_table_column()); $fields_json[$field_json['name']] = $field_json; } $fields_json = array_merge($fields_json, $this->get_model_version_info()->extra_resource_properties_for_model($model)); $response[$model_name]['fields'] = apply_filters('FHEE__Meta__handle_request_models_meta__fields', $fields_json, $model); $relations_json = array(); foreach ($model->relation_settings() as $relation_name => $relation_obj) { $relation_json = array('name' => $relation_name, 'type' => str_replace('EE_', '', get_class($relation_obj)), 'single' => $relation_obj instanceof \EE_Belongs_To_Relation ? true : false); $relations_json[$relation_name] = $relation_json; } $response[$model_name]['relations'] = apply_filters('FHEE__Meta__handle_request_models_meta__relations', $relations_json, $model); } return $response; }
/** * @param array $input_settings { * @type string $model_name the name of model to be used for searching, both via the REST API and server-side model queries * @type array $query_params default query parameters which will apply to both REST API queries and server-side queries. This should be * in the exact format that will be used for server-side model usage (eg use index 0 for where conditions, not * the string "where") * @type string $value_field_name the name of the model field on this model to * be used for the HTML select's option's values * @type string $display_field_name the name of the model field on this model * to be used for the HTML select's option's display text * @type array $select2_args arguments to be passed directly into the select2's JS constructor * } * And the arguments accepted by EE_Form_Input_With_Options_Base * @throws \EE_Error */ public function __construct($input_settings = array()) { //needed input settings: //select2_args $this->_model_name = EEH_Array::is_set($input_settings, 'model_name', null); $model = $this->_get_model(); $query_params = EEH_Array::is_set($input_settings, 'query_params', array('limit' => 10, 'caps' => EEM_Base::caps_read_admin)); $this->_value_field_name = EEH_Array::is_set($input_settings, 'value_field_name', $model->primary_key_name()); $this->_display_field_name = EEH_Array::is_set($input_settings, 'display_field_name', $model->get_a_field_of_type('EE_Text_Field_Base')->get_name()); $this->_add_validation_strategy(new EE_Model_Matching_Query_Validation_Strategy('', $this->_model_name, $query_params, $this->_value_field_name)); //get resource endpoint $rest_controller = new EventEspresso\core\libraries\rest_api\controllers\model\Read(); $rest_controller->set_requested_version(EED_Core_Rest_Api::latest_rest_api_version()); $url = $rest_controller->get_versioned_link_to(EEH_Inflector::pluralize_and_lower($this->_model_name)); $default_select2_args = array('ajax' => array('url' => $url, 'dataType' => 'json', 'delay' => '250', 'data_interface' => 'EE_Select2_REST_API_Interface', 'data_interface_args' => array('default_query_params' => (object) Model_Data_Translator::prepare_query_params_for_rest_api($query_params, $model), 'display_field' => $this->_display_field_name, 'value_field' => $this->_value_field_name, 'nonce' => wp_create_nonce('wp_rest'))), 'cache' => true, 'width' => '100'); $select2_args = array_replace_recursive($default_select2_args, (array) EEH_Array::is_set($input_settings, 'select2_args', array())); $this->set_display_strategy(new EE_Select2_Display_Strategy($select2_args)); parent::__construct(array(), $input_settings); }
/** * Translates API filter get parameter into $query_params array used by EEM_Base::get_all(). * Note: right now the query parameter keys for fields (and related fields) * can be left as-is, but it's quite possible this will change someday. * Also, this method's contents might be candidate for moving to Model_Data_Translator * * @param \EEM_Base $model * @param array $query_parameters from $_GET parameter @see Read:handle_request_get_all * @return array like what EEM_Base::get_all() expects or FALSE to indicate * that absolutely no results should be returned * @throws \EE_Error */ public function create_model_query_params($model, $query_parameters) { $model_query_params = array(); if (isset($query_parameters['where'])) { $model_query_params[0] = Model_Data_Translator::prepare_conditions_query_params_for_models($query_parameters['where'], $model, $this->get_model_version_info()->requested_version()); } if (isset($query_parameters['order_by'])) { $order_by = $query_parameters['order_by']; } elseif (isset($query_parameters['orderby'])) { $order_by = $query_parameters['orderby']; } else { $order_by = null; } if ($order_by !== null) { $model_query_params['order_by'] = $order_by; } if (isset($query_parameters['group_by'])) { $group_by = $query_parameters['group_by']; } elseif (isset($query_parameters['groupby'])) { $group_by = $query_parameters['groupby']; } else { $group_by = array_keys($model->get_combined_primary_key_fields()); } if ($group_by !== null) { $model_query_params['group_by'] = $group_by; } if (isset($query_parameters['having'])) { $model_query_params['having'] = Model_Data_Translator::prepare_conditions_query_params_for_models($query_parameters['having'], $model, $this->get_model_version_info()->requested_version()); } if (isset($query_parameters['order'])) { $model_query_params['order'] = $query_parameters['order']; } if (isset($query_parameters['mine'])) { $model_query_params = $model->alter_query_params_to_only_include_mine($model_query_params); } if (isset($query_parameters['limit'])) { //limit should be either a string like '23' or '23,43', or an array with two items in it if (!is_array($query_parameters['limit'])) { $limit_array = explode(',', (string) $query_parameters['limit']); } else { $limit_array = $query_parameters['limit']; } $sanitized_limit = array(); foreach ($limit_array as $key => $limit_part) { if ($this->_debug_mode && (!is_numeric($limit_part) || count($sanitized_limit) > 2)) { throw new \EE_Error(sprintf(__('An invalid limit filter was provided. It was: %s. If the EE4 JSON REST API weren\'t in debug mode, this message would not appear.', 'event_espresso'), json_encode($query_parameters['limit']))); } $sanitized_limit[] = (int) $limit_part; } $model_query_params['limit'] = implode(',', $sanitized_limit); } else { $model_query_params['limit'] = \EED_Core_Rest_Api::get_default_query_limit(); } if (isset($query_parameters['caps'])) { $model_query_params['caps'] = $this->validate_context($query_parameters['caps']); } else { $model_query_params['caps'] = \EEM_Base::caps_read; } return apply_filters('FHEE__Read__create_model_query_params', $model_query_params, $query_parameters, $model); }