Пример #1
0
  public function post_type_field_sets($post_type_name, $template_name = "", $orderby = "position ASC") {

    global $wf;
    
    if (is_null($template_name)) {
      $template_name = "";
    }
    
    $args = array($post_type_name, $template_name, $orderby);
    
    if (is_null($ret = $this->property_cache_args("post_type_field_sets", $args ))) {
    
      $this->field_types = array();
      
      global $wpdb;
  
      $field_sets_table = MPM::table("field-sets");
      $fields_table = MPM::table("fields");
  
      $select_list = $this->assigned_select_list();
  
      $sql = "
        SELECT 
        $select_list
        FROM $field_sets_table s
        INNER JOIN $fields_table f ON s.id = f.`field_set_id`
        WHERE  (s.type = 'p' OR s.type = 's') 
        AND ".MPM::visibility_rlike("post_types", $post_type_name, "s.")."  
        AND ".MPM::visibility_rlike("post_types", $post_type_name, "f.");
        
      if ($template_name != "") {
        // filter by template too
        $sql .= "
          AND ".MPM::visibility_rlike("templates", $template_name, "s.")."  
          AND ".MPM::visibility_rlike("templates", $template_name, "f.");
      }  
      
      $sql .= " 
        AND f.disabled = 0 AND s.disabled = 0
        ORDER BY set_type, set_position, field_position;
      ";
      
      $field_sets = array();
      $fields_by_set = array();
  
      $results = $wpdb->get_results($sql);
    
      if ($template_name != "") {
        
        $template_results = $this->template_field_sets($template_name);

        if ($template_results && count($template_results)) {
          $results = array_merge($results, $template_results);
        }
        
      }
      
      foreach ($results as $result) {
    
        $set_name = $result->set_name;
        $set_type = $result->set_type;
        $use_set = true;
        $use_field = true;
    
        if (isset($field_sets[$set_name])) {
      
          if ($set_type == $field_sets[$set_name]["type"]) {
            $use_set = false; // we already have this set recorded
          }
      
          if ($set_type == 't' && in_array($field_sets[$set_name]["type"], array('s','p'))) {
            // clear any existing fields already set
            $fields_by_set[$set_name] = null;
          }
          
          if ($set_type == 's' && $field_sets[$set_name]["type"] == 'p') {
            // the existing set is a post type field set, which holds greater specificity than this shared set, so don't use this set or field
            $use_set = false;
            $use_field = false;
          }
          
          if (in_array($set_type, array('p','s')) && $field_sets[$set_name]["type"] == 't') {
            // the existing set is a template field set, which holds greater specificity than this shared or post type set, so don't use this set's info
            $use_set = false;
            $use_field = false;
          }
          
          
          
        }
    
        if ($use_set) {
          
          $field_sets[$set_name] = $this->set_data_from_result($result);
        } 
    
        // now record the field too
    
        if ($use_field) {
          
          if (!in_array($result->field_type, $this->field_types)) {
            $this->field_types[] = $result->field_type; 
          }
          
          $fields_by_set[$set_name][$result->field_name] = $this->field_data_from_result($result);
        }
      
      } // endforeach
    
      
        
      $field_set_models = array();
      
      foreach ($field_sets as $field_set) {

        if ($field_set["type"] == "s") {
          $field_set_model = new MPM_SharedFieldSet();
        } else {
          $field_set_model = new MPM_FieldSet();
        }

        $field_set_model->set_from_row($field_set);
        
        $field_models = array();
        
        $fields = $fields_by_set[$field_set["name"]];
        
        if (is_array($fields) && count($fields)) {

          foreach ($fields as $field) {
            $field_model = new MPM_Field();
            $field_model->set_from_row($field);
            
            if ($field_model->in_current_site()) {
              $field_models[$field["name"]] = $field_model;
            }
          
          } 
        
          $field_set_model->set_fields($field_models);

        }
      
        if ($field_set_model->in_current_site()) {
          $field_set_models[$field_set_model->name] = $field_set_model;
        } 
        
      }
     
      
      $ret = $this->property_cache_args("post_type_field_sets", $args, $field_set_models );
      
    } 
    

    return $ret;
  }