init( $arr, $action_hook ); } function init( $arr = '', $action_hook = '' ) { if ( $arr ) { $this->members = $arr; $this->process_added_members($arr); } //if ( $action_hook ) { //do_action_ref_array( $action_hook, array(&$this) ); //} } function &add( $name, $defining_module, $args = array() ) { if ( ! empty($this->locked) ) { $notice = sprintf(__('%1$s attempted to define a configuration item (%2$s) after the collection was locked.'), $defining_module, $name) . '

' . sprintf(__('The calling function probably needs to be registered to a hook. Consult %s developer documentation.', 'scoper'), $defining_module); rs_notice($notice); return; } // Restrict characters in member key / object name. A display_name property is available where applicable. $name = preg_replace( '/[^0-9_a-zA-Z]/', '_', $name ); if ( ! isset($this->members[$name]) ) $this->members[$name] = new AGP_Config_Item($name, $defining_module, $args); return $this->members[$name]; } function remove($name) { if ( isset($this->members[$name]) ) unset ($this->members[$name]); } // accepts array of objects - either an instance the class collected by calling child class, or stdObject objects with matching properties function add_member_objects($arr) { if ( ! is_array($arr) ) return; if ( ! empty($this->locked) ) { rs_notice('Config items cannot not be added at this time. Maybe the calling function must be registered to a hook. Consult developer documentation.'); return; } $this->members = array_merge($this->members, $arr); $this->process_added_members($arr); } function process( &$src ) { return; } function process_added_members(&$arr) { $will_process = method_exists($this, 'process'); foreach ( array_keys($arr) as $name ) { // copy key into name property if ( empty($this->members[$name]->name) ) $this->members[$name]->name = $name; if ( $will_process ) $this->process( $this->members[$name] ); } } // accepts object or name as argument, returns valid object or null function get($obj_or_name) { if ( is_object($obj_or_name) ) return $obj_or_name; //if ( ! is_string($obj_or_name) ) // agp_bt_die(); // $obj_or_name must actually be the object name if ( isset($this->members[$obj_or_name]) ) return $this->members[$obj_or_name]; } // accepts object or name as argument, returns valid object or null function &get_ref($obj_or_name) { if ( is_object($obj_or_name) ) return $obj_or_name; // $obj_or_name must actually be the object name if ( isset($this->members[$obj_or_name]) ) return $this->members[$obj_or_name]; } function get_all() { return $this->members; } function get_all_keys() { return array_keys($this->members); } // $subset_keys: array of keys corresponding to member objects function filter_keys( $subset_keys = '', $args = array(), $output = 'keys', $operator = 'and' ) { if ( -1 === $subset_keys ) $subset_keys = array_keys($this->members); $filtered = array(); $count = count($args); if ( ! $subset_keys ) $subset_keys = array_keys($this->members); foreach ( $subset_keys as $key ) { $matched = 0; foreach( $args as $check_property => $check_val ) { if ( isset($this->members[$key]->$check_property) && ( $this->members[$key]->$check_property == $check_val ) ) $matched++; } if ( ( ( 'and' == $operator ) && ( $matched == $count ) ) || ( ( 'or' == $operator ) && $matched ) ) { if ( ( 'keys' == $output ) || ( 'names' == $output ) ) $filtered[] = $key; elseif ( 'names_as_key' == $output ) $filtered[$key] = 1; elseif ( $output && ( 'objects' != $output ) ) $filtered[] = $this->members[$key]->$output; else $filtered[$key] = $this->members[$key]; } } return $filtered; } // $subset: array of objects which are a subset of members array function filter( $subset = '', $args = array(), $output = 'objects', $operator = 'and' ) { $subset_keys = ( ! empty( $subset ) ) ? array_keys( $subset ) : array(); return $this->filter_keys( $subset_keys, $args, $output, $operator ); } function is_member($name) { return isset($this->members[$name]); } // Potential use of alias property in RS Data Source definition to indicate where // a 3rd party plugin uses a taxonomy->object_type property different from the src_name we define function is_member_alias($alias) { foreach ( array_keys($this->members) as $name ) if ( isset($this->members[$name]->alias) && ( $alias == $this->members[$name]->alias ) ) return $name; } function member_property() { // $name, $property, $key1 = '', $key2 = '', $key3 = '' ... $args = func_get_args(); if ( ! is_string($args[0]) ) { // todo: confirm this isn't needed anymore return; } if ( ! isset( $this->members[$args[0]] ) ) return; if ( ! isset( $this->members[$args[0]]->$args[1] ) ) return; $val = $this->members[$args[0]]->$args[1]; // if additional args were passed in, treat them as array or object keys for ( $i = 2; $i < count($args); $i++ ) { if ( is_array($val) ) { if ( isset($val[ $args[$i] ]) ) $val = $val[ $args[$i] ]; else return; } elseif ( is_object($val) ) { if ( isset($val->$args[$i]) ) $val = $val->$args[$i]; else return; } } return $val; } function remove_members_by_key($disabled, $require_value = false) { if ( ! is_array($disabled) ) return; if ( $require_value ) { foreach ( array_keys($disabled) as $key ) if ( ! $disabled[$key] ) unset($disabled[$key]); if ( ! $disabled ) return; } $this->members = array_diff_key($this->members, $disabled); } function remove_members($disabled) { $this->members = array_diff_key($this->members, array_flip($disabled) ); } function lock() { $this->locked = true; } } class AGP_Config_Item { var $name; var $defining_module; var $labels; function AGP_Config_Item ( $name, $defining_module, $args = array() ) { $this->name = $name; $this->defining_module = $defining_module; $this->labels = (object) array( 'name' => '', 'singular_name' => '' ); if ( is_array($args) ) foreach($args as $key => $val) $this->$key = $val; } } ?>