public static function set_item_template_data(MEOW_FieldSet &$set, $args = array()) { $r = wp_parse_args( $args, array("preview" => false, "readonly" => !$set->is_editable(), "id_base" => "mp_meta_", "name_base" => "mp_meta", "order_base" => "mp_meta_order", "summary_preview_base" => "mp_summary_preview_", "summary_base" => "mp_summary_" ) ); $d = array(); $set_item_classes = array(); $set_fields_classes = array(); $set_summary_classes = array(); $d["allow_remove"] = true; if ($r["preview"]) { $d["preview"] = true; $d["allow_remove"] = false; } if ($r["readonly"]) { $d["readonly"] = true; $d["allow_remove"] = false; } $info = $set->info(); if ($info->expanded) { $d["toggle_class"] = "collapse"; $set_item_classes[] = "expanded"; $set_summary_classes[] = "hidden"; } else { $d["toggle_class"] = "expand"; $set_item_classes[] = "collapsed"; $set_fields_classes[] = "hidden"; } if (isset($args["versions_select"])) { $d["versions_select"] = $args["versions_select"]; } $d["lang_are_you_sure"] = esc_js(__("Are you sure?", MASTERPRESS_DOMAIN)); $d["label_collapse"] = __("Collapse", MASTERPRESS_DOMAIN); $d["set_item_classes"] = implode(" ", $set_item_classes); $d["set_fields_classes"] = implode(" ", $set_fields_classes); $d["description"] = trim( $info->label("description") ); $d["allow_multiple"] = $info->allow_multiple; $d["labels_toggle"] = __("Toggle", MASTERPRESS_DOMAIN); $d["set_labels_remove_plain"] = strip_tags($info->label("remove")); $d["set_labels_remove"] = $info->label("remove"); $d["fields"] = array(); if ( WOOF::is_true_arg($args, "creator") ) { $i = "!!set_index!!"; } else if ($set->creator) { // leave a placeholder for Handlebars to render into $i = "{{set_index}}"; } else { $i = $set->index(); } $d["set_index"] = $i; $set_id = $r["id_base"]."{$info->name}_$i"; $set_name = $r["name_base"]."[{$info->name}][$i]"; if (WOOF::is_true_arg($r, "nested")) { $d["order_name"] = $r["order_base"]."[$i]"; } else { $d["order_name"] = $r["order_base"]."[{$info->name}][$i]"; } $d["fields"] = array(); $fields = $info->fields(); $fi = 0; $fc = 0; foreach ($fields as $field) { if ($type_class = MPFT::type_class($field->type)) { $fc++; } } foreach ($fields as $field) { if ($field->current_user_can_see()) { $field_id = "{$set_id}_{$field->name}"; $field_name = "{$set_name}[{$field->name}]"; if ($r["preview"]) { $field_summary_id = $r["summary_preview_base"]."{$info->name}_{$field->name}"; } else { $field_summary_id = $r["summary_base"]."{$info->name}_{$field->name}"; } $fd = array(); // the field data if ($ftc = MPFT::type_class($field->type)) { $fi++; $fd["model_id"] = $field->id; $fd["readonly"] = false; // reset $fd["label_is_header"] = call_user_func_array( array($ftc, "label_is_header"), array($field->type_options)); $fd["type"] = $field->type; $fd["type_widget"] = "mpft_".str_replace("-", "_", $field->type); $fd["label"] = $field->display_label(); $fd["esc_label"] = esc_attr($field->display_label()); $fd["label_suffix"] = call_user_func( array($ftc, "label_suffix") ); $fd["field_path"] = $info->name."-".$field->name; $fd["prop_list"] = implode(",", MPFT::type_properties($field->type)); $fd["description"] = trim( $field->label("description") ); $fd["pos_class"] = WOOF_HTML::pos_class_1($fi, $fc, " mp-field-"); if ($field->current_user_can_manage()) { $mu = $field->manage_url($info); $mu .= "&mp_redirect=".urlencode($_SERVER["REQUEST_URI"]); if ($mu) { $fd["go"] = '<a href="'.$mu.'" class="mp-go with-mptt" data-tooltip="'.__("Edit Field Definition", MASTERPRESS_DOMAIN).'">'.__("Edit Field Definition").'</a>'; } } $field_classes = array("mpft-".$field->type); if ($fi == $fc) { $field_classes[] = "mp-field-last"; } $field_summary_classes = array(); if ($field->required) { $field_classes[] = "required"; $field_summary_classes[] = "required"; } if (isset($field->summary_options["emphasise"])) { $field_summary_classes[] = "em"; } $fd["name"] = $field->name; $fd["template_id"] = "{$info->name}_{$field->name}"; $fd["summary_id"] = $field_summary_id."_".$i; $fd["field_id"] = $field_id; $fd["id_first"] = $field_id; $opts = call_user_func( array($ftc, "ui_options") ); $ui = array(); if (count($opts) ) { $ui = call_user_func_array( array($ftc, "extract_options"), array($field->type_options, $opts) ); $ui = call_user_func_array( array($ftc, "normalize_options"), array($ui) ); } $ui_parts = array(); if (count($ui)) { foreach( $ui as $key => $value ) { $ui_parts[] = "'$key':'".esc_attr(esc_js($value))."'"; } } // $fd["lang"] = "{".implode(",", $lang_parts)."}"; $fd["ui"] = "{".implode(",", $ui_parts)."}"; if (isset($field->labels["tooltip_help"])) { $tooltip_help = trim($field->label("tooltip_help")); if ($tooltip_help != "") { $fd["label_tooltip"] = "#mptt_".$info->id."_".$field->id; } } if (!$field->current_user_can_edit($set->is_editable()) && !$r["preview"]) { $fd["readonly"] = true; } $strip_whitespace = !call_user_func( array($ftc, "ui_preserve_whitespace") ); $ftd_args = $r; if ($set->creator) { $meow_field = new MEOW_FieldCreator($field->name, null, $field); call_user_func_array( array($ftc, "apply_default"), array($meow_field, $set, $ftc) ); $field_ui_data = self::field_ui_template_data($set, $meow_field, $ftd_args); $field_ui = WOOF::render_template( self::field_ui_template(), $field_ui_data, $strip_whitespace ); } else { // here we regard the actual field value, and build the UI from that $meow_field = $set->field($field->name); $action = ""; if (isset($_GET["action"])) { $action = $_GET["action"]; } if (!$info->allow_multiple && $action != "edit") { call_user_func_array( array($ftc, "apply_default"), array($meow_field, $set, $ftc) ); } $field_ui_data = self::field_ui_template_data($set, $meow_field, $ftd_args); $field_ui = WOOF::render_template( self::field_ui_template(), $field_ui_data, $strip_whitespace ); } if ($fi == $fc) { if ($meow_field->blank()) { $set_summary_classes[] = "last-empty"; } } $fd["field_ui"] = $field_ui; // now build out the summary info $fd["summary_width"] = call_user_func( array($ftc, "summary_width") ); if (isset($field->summary_options["width"])) { $sw = (int) $field->summary_options["width"]; if ($sw >= 1 && $sw <= 5) { $fd["summary_width"] = $sw; } } $max_length = ( $fd["summary_width"] * 138 ) / 10; $fd["label_truncated"] = WOOF::truncate_basic( $fd["label"], $max_length, "<span>…</span>" ); if ($fd["label"] != $fd["label_truncated"]) { $fd["label_title"] = strip_tags($fd["label"]); } $label_classes = array(); if (method_exists($ftc, "summary_label_classes")) { $label_classes = call_user_func_array( array($ftc, "summary_label_classes"), array($meow_field) ); } $fd["label_classes"] = implode(" ", $label_classes); $empty = $meow_field->blank(); $fd["empty_summary"] = call_user_func_array( array($ftc, "empty_summary"), array($meow_field) ); $fd["summary"] = call_user_func_array( array($ftc, "summary"), array($meow_field) ); if ($empty) { $field_summary_classes[] = "empty"; } else { $fd["is_edit"] = "is-edit"; } $fd["classes"] = implode(" ", $field_classes); $fd["summary_classes"] = implode(" ", $field_summary_classes); // add the field data to the main data array $d["fields"][] = $fd; } // endif class_exists($ftc) } // current user can see } // endforeach $d["set_summary_classes"] = implode(" ", $set_summary_classes); return $d; }
function update() { if ($this->dirty && $this->exists()) { $this->dirty = false; // do this now in case of any SQL errors $this->updated = true; global $wpdb; global $wf, $meow_provider; $value_type = null; $object_type = $meow_provider->type_key($this->object); $object_id = $this->object->id(); if ($object_type == "term") { $tax = $this->object->taxonomy->name(); if ($tax && !is_woof_silent($tax)) { $value_type = $tax; } } /* Delete the old post meta */ $this->object->switch_site(); $set_name = $this->name; foreach ( $this->info->fields as $field) { if (!$field->disabled && $field->in_current_site()) { $meta_name = $set_name.".".$field->name; MPC_Meta::delete_object_meta($object_type, $object_id, $meta_name); // now go through the properties too $dont_care = MPFT::type_class($field->type); foreach (MPFT::type_properties($field->type) as $prop) { MPC_Meta::delete_object_meta($object_type, $object_id, $meta_name.":".$prop); } } } $model_id_prop_stored = array(); // Create the new values foreach( $this->_items as $set_index => $set_item ) { foreach ($this->info->fields as $field) { if (!$field->disabled && $field->in_current_site()) { // here the field type should prepare the value, if necessary // grab the type $model_id = $field->id; $model = $field; $field_item = $this->field($field->name, $set_index); if ($field_item->exists()) { $value = $field_item->raw(); $val = MPU::db_encode($value); if ($type_class = MPFT::type_class($model->type)) { $val = MPU::db_encode( call_user_func_array( array($type_class, "value_for_save"), array($value, $model)) ); } // create the post meta $meta_name = MPFT::meta_key($set_name, $field->name); //echo "would add $object_type, $object_id, $meta_name, $val<br>"; if (! (!$this->info->allow_multiple && $val == "") ) { // don't record blank entries for non-multiple field sets, as this is wasteful MPC_Meta::add_object_meta($object_type, $object_id, "{$meta_name}", $val, $value_type); // now store the properties foreach (MPFT::type_properties($model->type) as $prop) { if ($prop == "field_id" && !isset($model_id_prop_stored[$model_id])) { $model_id_prop_stored[$model_id] = true; MPC_Meta::add_object_meta($object_type, $object_id, "{$meta_name}:{$prop}", $model_id, $value_type); } else { $prop_value = $field_item->prop_val($prop); if (!isset($prop_value)) { $prop_value = ""; } if ($prop != "field_id") { MPC_Meta::add_object_meta($object_type, $object_id, "{$meta_name}:{$prop}", $prop_value, $value_type); } } // $prop = field_id } // foreach MPFT::type_properties } // if (!allow_multiple) } // if (field_item->exists) } // if (!field->disabled) } // endforeach $fields } // endforeach ($this->items) $this->object->restore_site(); } // if ($dirty) }
public static function save_meta($object_id, $object_type) { global $wpdb, $meow_provider; global $wf; do_action("mp_pre_save_meta", $object_id, $object_type); if (apply_filters("mp_do_save_meta", $do = true, $object_id, $object_type)) { MPM::incl("field"); $object_type_type = ""; $current_data = array(); if ($object_type == "post") { // check the edit post meta cap for this type $cap = "edit_post"; $post = $wf->post($object_id); if ($post->exists()) { $type = $post->type(); $cap = $type->cap("edit_post", "edit_post"); // update the template meta if ($type->supports("mp-page-attributes")) { if (isset($_POST["page_template"])) { $template = $_POST["page_template"]; if ($template == "") { delete_post_meta($object_id, "_wp_page_template"); } else { update_post_meta($object_id, "_wp_page_template", $template); } } } } if ( !current_user_can( $cap, $object_id ) ) { return $object_id; } } else if ($object_type == "term") { // check the edit terms cap for the taxonomy $cap = "manage_categories"; $taxonomy_name = self::infer_taxonomy_name(); $tax = $wf->taxonomy($taxonomy_name); $object_type_type = $taxonomy_name; if ($tax->exists()) { $cap = $tax->cap("edit_terms", "manage_categories"); } if ( !current_user_can( $cap ) ) { return $object_id; } } else if ($object_type == "user") { if ( !current_user_can( 'edit_users' ) ) { return $object_id; } } else if ($object_type == "site") { if ( !current_user_can( 'edit_posts' ) ) { return $object_id; } } $meta = self::post_val('mp_meta', array()); $meta_order = self::post_val('mp_meta_order', array()); $meta_model = self::post_val('mp_meta_model', array()); $meta_prop = self::post_val('mp_meta_prop', array()); $meta_field_ids = self::post_val('mp_meta_field_ids', array()); $meta_dirty = self::post_val('mp_meta_dirty', array()); $meta_versions = self::post_val('mp_meta_versions', array()); $field_models = array(); if (is_array($meta_field_ids)) { $meta_field_ids = array_unique($meta_field_ids); $results = MPM_Field::find_by_id_in($meta_field_ids); foreach ($results as $field) { $field_models[$field->id] = $field; } } $wpdb->show_errors(); if (isset($_POST["mp_meta_model"])) { if ($object_type == "post") { if ( $the_post = wp_is_post_revision( $object_id ) ) { $object_id = $the_post; } } try { $meow_provider->create_version($object_id, $object_type, $object_type_type, "initial", $meta_versions); } catch( Exception $e) { // silently catch, we REALLY don't want this to prevent a data save if something goes wrong! } /* Delete the old post meta */ foreach ( $meta_model as $set_name => $fields ) { foreach ($fields as $field_name => $model_id) { $field = $field_models[$model_id]; $meta_name = $set_name.".".$field_name; self::delete_object_meta($object_type, $object_id, $meta_name); // now go through the properties too $dont_care = MPFT::type_class($field->type); foreach (MPFT::type_properties($field->type) as $prop) { self::delete_object_meta($object_type, $object_id, $meta_name.":".$prop); } } } $model_id_prop_stored = array(); // Create the new values foreach( $meta as $set_name => $set_items ) { $set_index = 0; if (is_array($set_items)) { foreach ($set_items as $fields) { $set_index++; foreach ($fields as $field_name => $value) { // here the field type should prepare the value, if necessary // grab the type $model_id = $meta_model[$set_name][$field_name]; $model = $field_models[$model_id]; $val = MPU::db_encode($value); if ($model) { if ($type_class = MPFT::type_class($model->type)) { $val = MPU::db_encode(call_user_func_array( array($type_class, "value_for_save"), array($value, $model))); } // create the post meta $meta_name = MPFT::meta_key($set_name, $field_name); self::add_object_meta($object_type, $object_id, "{$meta_name}", $val); // now store the properties foreach (MPFT::type_properties($model->type) as $prop) { if ($prop == "field_id" && !isset($model_id_prop_stored[$model_id])) { $model_id_prop_stored[$model_id] = true; self::add_object_meta($object_type, $object_id, "{$meta_name}:{$prop}", $model_id); } else { $prop_set_index = $meta_order[$set_name][$set_index]; if (isset($meta_prop[$set_name][(int) $prop_set_index][$field_name][$prop])) { $prop_value = $meta_prop[$set_name][(int) $prop_set_index][$field_name][$prop]; } if (isset($prop_value)) { self::add_object_meta($object_type, $object_id, "{$meta_name}:{$prop}", $prop_value); } } } } } // endforeach $fields // fill in blanks for any values that weren't submitted (this happens with checkboxes that are not checked) foreach ($meta_model[$set_name] as $field_name => $model_id) { if (!isset($fields[$field_name])) { $meta_name = MPFT::meta_key($set_name, $field_name); self::add_object_meta($object_type, $object_id, "{$meta_name}", ""); // now store the properties for blanks (if required) foreach (MPFT::type_properties($field->type) as $prop) { if ($prop == "field_id" && !isset($model_id_prop_stored[$model_id])) { $model_id_prop_stored[$model_id] = true; self::add_object_meta($object_type, $object_id, "{$meta_name}:{$prop}", $model_id); } else { if (isset($meta_prop[$set_name][$set_index][$field_name][$prop])) { $prop_value = $meta_prop[$set_name][$set_index][$field_name][$prop]; self::add_object_meta($object_type, $object_id, "{$meta_name}:{$prop}", $prop_value); } } } } } } } // endif is_array(set_items) } // foreach $set_name => $set_items // create the current content version if (!self::$version_saved) { try { $meow_provider->create_version($object_id, $object_type, $object_type_type, $meta_dirty, $meta_versions); } catch( Exception $e) { // silently catch, we REALLY don't want this to prevent a data save if something goes wrong! } self::$version_saved = true; } } // isset $_POST["mp_meta_model"] } do_action("mp_after_save_meta", $object_id, $object_type); }