You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

122 lines
3.7 KiB

<?php
/**
* WPSEO plugin file.
*
* @package WPSEO\Admin\Menu
*/
/**
* Renders a replacement variable editor.
*/
class WPSEO_Replacevar_Editor {
/**
* Yoast Forms instance.
*
* @var Yoast_Form
*/
private $yform;
/**
* The arguments required for the div to render.
*
* @var array {
* @type string $title The title field id.
* @type string $description The description field id.
* @type string $page_type_recommended The page type for the context of the recommended replace vars.
* @type string $page_type_specific The page type for the context of the editor specific replace vars.
* @type bool $paper_style Optional. Whether the editor has paper style.
* }
*/
private $arguments;
/**
* Constructs the object.
*
* @param Yoast_Form $yform Yoast forms.
* @param array $arguments {
* The arguments that can be given.
*
* @type string $title The title field id.
* @type string $description The description field id.
* @type string $page_type_recommended The page type for the context of the recommended replace vars.
* @type string $page_type_specific The page type for the context of the editor specific replace vars.
* @type bool $paper_style Optional. Whether the editor has paper style.
* }
*/
public function __construct( Yoast_Form $yform, $arguments ) {
$arguments = wp_parse_args(
$arguments,
array(
'paper_style' => true,
)
);
$this->validate_arguments( $arguments );
$this->yform = $yform;
$this->arguments = array(
'title' => (string) $arguments['title'],
'description' => (string) $arguments['description'],
'page_type_recommended' => (string) $arguments['page_type_recommended'],
'page_type_specific' => (string) $arguments['page_type_specific'],
'paper_style' => (bool) $arguments['paper_style'],
);
}
/**
* Renders a div for the react application to mount to, and hidden inputs where
* the app should store it's value so they will be properly saved when the form
* is submitted.
*
* @return void
*/
public function render() {
$this->yform->hidden( $this->arguments['title'], $this->arguments['title'] );
$this->yform->hidden( $this->arguments['description'], $this->arguments['description'] );
printf(
'<div
data-react-replacevar-editor
data-react-replacevar-title-field-id="%1$s"
data-react-replacevar-metadesc-field-id="%2$s"
data-react-replacevar-page-type-recommended="%3$s"
data-react-replacevar-page-type-specific="%4$s"
data-react-replacevar-paper-style="%5$s"></div>',
esc_attr( $this->arguments['title'] ),
esc_attr( $this->arguments['description'] ),
esc_attr( $this->arguments['page_type_recommended'] ),
esc_attr( $this->arguments['page_type_specific'] ),
esc_attr( $this->arguments['paper_style'] )
);
}
/**
* Validates the replacement variable editor arguments.
*
* @param array $arguments The arguments to validate.
*
* @throws InvalidArgumentException Thrown when not all required arguments are present.
*/
protected function validate_arguments( array $arguments ) {
$required_arguments = array(
'title',
'description',
'page_type_recommended',
'page_type_specific',
'paper_style',
);
foreach ( $required_arguments as $field_name ) {
if ( ! array_key_exists( $field_name, $arguments ) ) {
throw new InvalidArgumentException(
sprintf(
/* translators: %1$s expands to the missing field name. */
__( 'Not all required fields are given. Missing field %1$s', 'wordpress-seo' ),
$field_name
)
);
}
}
}
}