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();
|
||
|
}
|
||
|
|
||
|
}
|