150 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			150 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
/**
 | 
						|
 * Pipe-related classes.
 | 
						|
 *
 | 
						|
 * @link https://contactform7.com/selectable-recipient-with-pipes/
 | 
						|
 */
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * Class representing a pair of pipe.
 | 
						|
 */
 | 
						|
class WPCF7_Pipe {
 | 
						|
 | 
						|
	public $before = '';
 | 
						|
	public $after = '';
 | 
						|
 | 
						|
	public function __construct( $text ) {
 | 
						|
		$text = (string) $text;
 | 
						|
 | 
						|
		$pipe_pos = strpos( $text, '|' );
 | 
						|
 | 
						|
		if ( false === $pipe_pos ) {
 | 
						|
			$this->before = $this->after = trim( $text );
 | 
						|
		} else {
 | 
						|
			$this->before = trim( substr( $text, 0, $pipe_pos ) );
 | 
						|
			$this->after = trim( substr( $text, $pipe_pos + 1 ) );
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * Class representing a list of pipes.
 | 
						|
 */
 | 
						|
class WPCF7_Pipes {
 | 
						|
 | 
						|
	private $pipes = array();
 | 
						|
 | 
						|
	public function __construct( array $texts = null ) {
 | 
						|
		foreach ( (array) $texts as $text ) {
 | 
						|
			$this->add_pipe( $text );
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	private function add_pipe( $text ) {
 | 
						|
		$pipe = new WPCF7_Pipe( $text );
 | 
						|
		$this->pipes[] = $pipe;
 | 
						|
	}
 | 
						|
 | 
						|
	public function merge( self $another ) {
 | 
						|
		$this->pipes = array_merge( $this->pipes, $another->pipes );
 | 
						|
	}
 | 
						|
 | 
						|
	public function do_pipe( $input ) {
 | 
						|
		$input_canonical = wpcf7_canonicalize( $input, array(
 | 
						|
			'strto' => 'as-is',
 | 
						|
		) );
 | 
						|
 | 
						|
		foreach ( $this->pipes as $pipe ) {
 | 
						|
			$before_canonical = wpcf7_canonicalize( $pipe->before, array(
 | 
						|
				'strto' => 'as-is',
 | 
						|
			) );
 | 
						|
 | 
						|
			if ( $input_canonical === $before_canonical ) {
 | 
						|
				return $pipe->after;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		return $input;
 | 
						|
	}
 | 
						|
 | 
						|
	public function collect_befores() {
 | 
						|
		$befores = array();
 | 
						|
 | 
						|
		foreach ( $this->pipes as $pipe ) {
 | 
						|
			$befores[] = $pipe->before;
 | 
						|
		}
 | 
						|
 | 
						|
		return $befores;
 | 
						|
	}
 | 
						|
 | 
						|
	public function collect_afters() {
 | 
						|
		$afters = array();
 | 
						|
 | 
						|
		foreach ( $this->pipes as $pipe ) {
 | 
						|
			$afters[] = $pipe->after;
 | 
						|
		}
 | 
						|
 | 
						|
		return $afters;
 | 
						|
	}
 | 
						|
 | 
						|
	public function zero() {
 | 
						|
		return empty( $this->pipes );
 | 
						|
	}
 | 
						|
 | 
						|
	public function random_pipe() {
 | 
						|
		if ( $this->zero() ) {
 | 
						|
			return null;
 | 
						|
		}
 | 
						|
 | 
						|
		return $this->pipes[array_rand( $this->pipes )];
 | 
						|
	}
 | 
						|
 | 
						|
	public function to_array() {
 | 
						|
		return array_map(
 | 
						|
			static function ( WPCF7_Pipe $pipe ) {
 | 
						|
				return array(
 | 
						|
					$pipe->before,
 | 
						|
					$pipe->after,
 | 
						|
				);
 | 
						|
			},
 | 
						|
			$this->pipes
 | 
						|
		);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * Trait for classes that hold cross-tag WPCF7_Pipes object.
 | 
						|
 */
 | 
						|
trait WPCF7_PipesHolder {
 | 
						|
 | 
						|
	protected $pipes;
 | 
						|
 | 
						|
	public function get_pipes( $field_name ) {
 | 
						|
		if ( isset( $this->pipes[$field_name] ) ) {
 | 
						|
			return $this->pipes[$field_name];
 | 
						|
		}
 | 
						|
 | 
						|
		$result = new WPCF7_Pipes;
 | 
						|
 | 
						|
		$tags = $this->scan_form_tags( array(
 | 
						|
			'name' => $field_name,
 | 
						|
		) );
 | 
						|
 | 
						|
		foreach ( $tags as $tag ) {
 | 
						|
			if ( $tag->pipes instanceof WPCF7_Pipes ) {
 | 
						|
				$result->merge( $tag->pipes );
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		return $this->pipes[$field_name] = $result;
 | 
						|
	}
 | 
						|
 | 
						|
	public function scan_form_tags() {
 | 
						|
		return array();
 | 
						|
	}
 | 
						|
 | 
						|
}
 |