Edit File by line
/home/zeestwma/ceyloniy.../wp-conte.../plugins/wpforms-.../src/Admin/Tools/Views
File: Export.php
<?php
[0] Fix | Delete
[1] Fix | Delete
namespace WPForms\Admin\Tools\Views;
[2] Fix | Delete
[3] Fix | Delete
/**
[4] Fix | Delete
* Class Export.
[5] Fix | Delete
*
[6] Fix | Delete
* @since 1.6.6
[7] Fix | Delete
*/
[8] Fix | Delete
class Export extends View {
[9] Fix | Delete
[10] Fix | Delete
/**
[11] Fix | Delete
* View slug.
[12] Fix | Delete
*
[13] Fix | Delete
* @since 1.6.6
[14] Fix | Delete
*
[15] Fix | Delete
* @var string
[16] Fix | Delete
*/
[17] Fix | Delete
protected $slug = 'export';
[18] Fix | Delete
[19] Fix | Delete
/**
[20] Fix | Delete
* Template code if generated.
[21] Fix | Delete
*
[22] Fix | Delete
* @since 1.6.6
[23] Fix | Delete
*
[24] Fix | Delete
* @var string
[25] Fix | Delete
*/
[26] Fix | Delete
private $template = '';
[27] Fix | Delete
[28] Fix | Delete
/**
[29] Fix | Delete
* Existed forms.
[30] Fix | Delete
*
[31] Fix | Delete
* @since 1.6.6
[32] Fix | Delete
*
[33] Fix | Delete
* @var []
[34] Fix | Delete
*/
[35] Fix | Delete
private $forms = [];
[36] Fix | Delete
[37] Fix | Delete
/**
[38] Fix | Delete
* Init view.
[39] Fix | Delete
*
[40] Fix | Delete
* @since 1.6.6
[41] Fix | Delete
*/
[42] Fix | Delete
public function init() {
[43] Fix | Delete
[44] Fix | Delete
add_action( 'wpforms_tools_init', [ $this, 'process' ] );
[45] Fix | Delete
}
[46] Fix | Delete
[47] Fix | Delete
/**
[48] Fix | Delete
* Get view label.
[49] Fix | Delete
*
[50] Fix | Delete
* @since 1.6.6
[51] Fix | Delete
*
[52] Fix | Delete
* @return string
[53] Fix | Delete
*/
[54] Fix | Delete
public function get_label() {
[55] Fix | Delete
[56] Fix | Delete
return esc_html__( 'Export', 'wpforms-lite' );
[57] Fix | Delete
}
[58] Fix | Delete
[59] Fix | Delete
/**
[60] Fix | Delete
* Export process.
[61] Fix | Delete
*
[62] Fix | Delete
* @since 1.6.6
[63] Fix | Delete
*/
[64] Fix | Delete
public function process() {
[65] Fix | Delete
[66] Fix | Delete
if (
[67] Fix | Delete
empty( $_POST['action'] ) || //phpcs:ignore WordPress.Security.NonceVerification
[68] Fix | Delete
! isset( $_POST['submit-export'] ) || //phpcs:ignore WordPress.Security.NonceVerification
[69] Fix | Delete
! $this->verify_nonce()
[70] Fix | Delete
) {
[71] Fix | Delete
return;
[72] Fix | Delete
}
[73] Fix | Delete
[74] Fix | Delete
if ( $_POST['action'] === 'export_form' && ! empty( $_POST['forms'] ) ) { //phpcs:ignore WordPress.Security.NonceVerification
[75] Fix | Delete
$this->process_form();
[76] Fix | Delete
}
[77] Fix | Delete
[78] Fix | Delete
if ( $_POST['action'] === 'export_template' && ! empty( $_POST['form'] ) ) { //phpcs:ignore WordPress.Security.NonceVerification
[79] Fix | Delete
$this->process_template();
[80] Fix | Delete
}
[81] Fix | Delete
}
[82] Fix | Delete
[83] Fix | Delete
/**
[84] Fix | Delete
* Checking user capability to view.
[85] Fix | Delete
*
[86] Fix | Delete
* @since 1.6.6
[87] Fix | Delete
*
[88] Fix | Delete
* @return bool
[89] Fix | Delete
*/
[90] Fix | Delete
public function check_capability() {
[91] Fix | Delete
[92] Fix | Delete
return wpforms_current_user_can( [ 'edit_forms', 'view_entries' ] );
[93] Fix | Delete
}
[94] Fix | Delete
[95] Fix | Delete
/**
[96] Fix | Delete
* Get available forms.
[97] Fix | Delete
*
[98] Fix | Delete
* @since 1.6.6
[99] Fix | Delete
*
[100] Fix | Delete
* @return array
[101] Fix | Delete
*/
[102] Fix | Delete
public function get_forms() {
[103] Fix | Delete
[104] Fix | Delete
$forms = wpforms()->obj( 'form' )->get( '', [ 'orderby' => 'title' ] );
[105] Fix | Delete
[106] Fix | Delete
return ! empty( $forms ) ? $forms : [];
[107] Fix | Delete
}
[108] Fix | Delete
[109] Fix | Delete
/**
[110] Fix | Delete
* Export view content.
[111] Fix | Delete
*
[112] Fix | Delete
* @since 1.6.6
[113] Fix | Delete
*/
[114] Fix | Delete
public function display() {
[115] Fix | Delete
[116] Fix | Delete
$this->forms = $this->get_forms();
[117] Fix | Delete
[118] Fix | Delete
if ( empty( $this->forms ) ) {
[119] Fix | Delete
[120] Fix | Delete
echo wpforms_render( 'admin/empty-states/no-forms' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
[121] Fix | Delete
[122] Fix | Delete
return;
[123] Fix | Delete
}
[124] Fix | Delete
[125] Fix | Delete
do_action( 'wpforms_admin_tools_export_top' );
[126] Fix | Delete
[127] Fix | Delete
$this->forms_export_block();
[128] Fix | Delete
[129] Fix | Delete
$this->form_template_export_block();
[130] Fix | Delete
[131] Fix | Delete
do_action( 'wpforms_admin_tools_export_bottom' );
[132] Fix | Delete
}
[133] Fix | Delete
[134] Fix | Delete
/**
[135] Fix | Delete
* Forms export block.
[136] Fix | Delete
*
[137] Fix | Delete
* @since 1.6.6
[138] Fix | Delete
*/
[139] Fix | Delete
private function forms_export_block() {
[140] Fix | Delete
?>
[141] Fix | Delete
[142] Fix | Delete
<div class="wpforms-setting-row tools wpforms-settings-row-divider">
[143] Fix | Delete
[144] Fix | Delete
<h4 id="form-export"><?php esc_html_e( 'Export Forms', 'wpforms-lite' ); ?></h4>
[145] Fix | Delete
[146] Fix | Delete
<p><?php esc_html_e( 'Use form export files to create a backup of your forms or to import forms to another site.', 'wpforms-lite' ); ?></p>
[147] Fix | Delete
[148] Fix | Delete
<?php if ( ! empty( $this->forms ) ) { ?>
[149] Fix | Delete
[150] Fix | Delete
<form method="post" action="<?php echo esc_attr( $this->get_link() ); ?>">
[151] Fix | Delete
<?php $this->forms_select_html( 'wpforms-tools-form-export', 'forms[]', esc_html__( 'Select Form(s)', 'wpforms-lite' ) ); ?>
[152] Fix | Delete
<input type="hidden" name="action" value="export_form">
[153] Fix | Delete
<?php $this->nonce_field(); ?>
[154] Fix | Delete
<button name="submit-export" class="wpforms-btn wpforms-btn-md wpforms-btn-orange" id="wpforms-export-form" aria-disabled="true">
[155] Fix | Delete
<?php esc_html_e( 'Export', 'wpforms-lite' ); ?>
[156] Fix | Delete
</button>
[157] Fix | Delete
</form>
[158] Fix | Delete
<?php } else { ?>
[159] Fix | Delete
<p><?php esc_html_e( 'You need to create a form before you can use form export.', 'wpforms-lite' ); ?></p>
[160] Fix | Delete
<?php } ?>
[161] Fix | Delete
</div>
[162] Fix | Delete
<?php
[163] Fix | Delete
}
[164] Fix | Delete
[165] Fix | Delete
/**
[166] Fix | Delete
* Forms export block.
[167] Fix | Delete
*
[168] Fix | Delete
* @since 1.6.6
[169] Fix | Delete
*/
[170] Fix | Delete
private function form_template_export_block() {
[171] Fix | Delete
?>
[172] Fix | Delete
[173] Fix | Delete
<div class="wpforms-setting-row tools">
[174] Fix | Delete
[175] Fix | Delete
<h4 id="template-export"><?php esc_html_e( 'Export a Form Template', 'wpforms-lite' ); ?></h4>
[176] Fix | Delete
[177] Fix | Delete
<?php
[178] Fix | Delete
if ( $this->template ) {
[179] Fix | Delete
[180] Fix | Delete
$doc_link = sprintf(
[181] Fix | Delete
wp_kses( /* translators: %s - WPForms.com docs URL. */
[182] Fix | Delete
__( 'For more information <a href="%s" target="_blank" rel="noopener noreferrer">see our documentation</a>.', 'wpforms-lite' ),
[183] Fix | Delete
[
[184] Fix | Delete
'a' => [
[185] Fix | Delete
'href' => [],
[186] Fix | Delete
'target' => [],
[187] Fix | Delete
'rel' => [],
[188] Fix | Delete
],
[189] Fix | Delete
]
[190] Fix | Delete
),
[191] Fix | Delete
'https://wpforms.com/docs/how-to-create-a-custom-form-template/'
[192] Fix | Delete
);
[193] Fix | Delete
?>
[194] Fix | Delete
<p><?php esc_html_e( 'The following code can be used to register your custom form template. Copy and paste the following code to your theme\'s functions.php file or include it within an external file.', 'wpforms-lite' ); ?><p>
[195] Fix | Delete
<p><?php echo $doc_link; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?><p>
[196] Fix | Delete
<textarea class="info-area" readonly><?php echo esc_textarea( $this->template ); ?></textarea>
[197] Fix | Delete
<?php
[198] Fix | Delete
}
[199] Fix | Delete
?>
[200] Fix | Delete
[201] Fix | Delete
<p><?php esc_html_e( 'Select a form to generate PHP code that can be used to register a custom form template.', 'wpforms-lite' ); ?></p>
[202] Fix | Delete
[203] Fix | Delete
<?php if ( ! empty( $this->forms ) ) { ?>
[204] Fix | Delete
<form method="post" action="<?php echo esc_attr( $this->get_link() ); ?>">
[205] Fix | Delete
<?php $this->forms_select_html( 'wpforms-tools-form-template', 'form', esc_html__( 'Select a Template', 'wpforms-lite' ), false ); ?>
[206] Fix | Delete
<input type="hidden" name="action" value="export_template">
[207] Fix | Delete
<?php $this->nonce_field(); ?>
[208] Fix | Delete
<button name="submit-export" class="wpforms-btn wpforms-btn-md wpforms-btn-orange" id="wpforms-export-template" aria-disabled="true">
[209] Fix | Delete
<?php esc_html_e( 'Export Template', 'wpforms-lite' ); ?>
[210] Fix | Delete
</button>
[211] Fix | Delete
</form>
[212] Fix | Delete
<?php } else { ?>
[213] Fix | Delete
<p><?php esc_html_e( 'You need to create a form before you can generate a template.', 'wpforms-lite' ); ?></p>
[214] Fix | Delete
<?php } ?>
[215] Fix | Delete
</div>
[216] Fix | Delete
<?php
[217] Fix | Delete
}
[218] Fix | Delete
[219] Fix | Delete
/**
[220] Fix | Delete
* Forms selector.
[221] Fix | Delete
*
[222] Fix | Delete
* @since 1.6.6
[223] Fix | Delete
*
[224] Fix | Delete
* @param string $select_id Select id.
[225] Fix | Delete
* @param string $select_name Select name.
[226] Fix | Delete
* @param string $placeholder Placeholder.
[227] Fix | Delete
* @param bool $multiple Is multiple select.
[228] Fix | Delete
*/
[229] Fix | Delete
private function forms_select_html( $select_id, $select_name, $placeholder, $multiple = true ) {
[230] Fix | Delete
?>
[231] Fix | Delete
[232] Fix | Delete
<span class="choicesjs-select-wrap">
[233] Fix | Delete
<select id="<?php echo esc_attr( $select_id ); ?>" class="choicesjs-select" name="<?php echo esc_attr( $select_name ); ?>" <?php if ( $multiple ) { //phpcs:ignore ?> multiple size="1" <?php } ?> data-search="<?php echo esc_attr( wpforms_choices_js_is_search_enabled( $this->forms ) ); ?>">
[234] Fix | Delete
<option value=""><?php echo esc_attr( $placeholder ); ?></option>
[235] Fix | Delete
<?php foreach ( $this->forms as $form ) { ?>
[236] Fix | Delete
<option value="<?php echo absint( $form->ID ); ?>"><?php echo esc_html( $form->post_title ); ?></option>
[237] Fix | Delete
<?php } ?>
[238] Fix | Delete
</select>
[239] Fix | Delete
</span>
[240] Fix | Delete
<?php
[241] Fix | Delete
}
[242] Fix | Delete
[243] Fix | Delete
/**
[244] Fix | Delete
* Export processing.
[245] Fix | Delete
*
[246] Fix | Delete
* @since 1.6.6
[247] Fix | Delete
*/
[248] Fix | Delete
private function process_form() {
[249] Fix | Delete
[250] Fix | Delete
$export = [];
[251] Fix | Delete
$forms = get_posts(
[252] Fix | Delete
[
[253] Fix | Delete
'post_type' => 'wpforms',
[254] Fix | Delete
'nopaging' => true,
[255] Fix | Delete
'post__in' => isset( $_POST['forms'] ) ? array_map( 'intval', $_POST['forms'] ) : [], //phpcs:ignore WordPress.Security.NonceVerification
[256] Fix | Delete
]
[257] Fix | Delete
);
[258] Fix | Delete
[259] Fix | Delete
foreach ( $forms as $form ) {
[260] Fix | Delete
$export[] = wpforms_decode( $form->post_content );
[261] Fix | Delete
}
[262] Fix | Delete
[263] Fix | Delete
ignore_user_abort( true );
[264] Fix | Delete
[265] Fix | Delete
wpforms_set_time_limit();
[266] Fix | Delete
[267] Fix | Delete
nocache_headers();
[268] Fix | Delete
header( 'Content-Type: application/json; charset=utf-8' );
[269] Fix | Delete
header( 'Content-Disposition: attachment; filename=wpforms-form-export-' . current_time( 'm-d-Y' ) . '.json' );
[270] Fix | Delete
header( 'Expires: 0' );
[271] Fix | Delete
[272] Fix | Delete
echo wp_json_encode( $export );
[273] Fix | Delete
exit;
[274] Fix | Delete
}
[275] Fix | Delete
[276] Fix | Delete
/**
[277] Fix | Delete
* Export template processing.
[278] Fix | Delete
*
[279] Fix | Delete
* @since 1.6.6
[280] Fix | Delete
*/
[281] Fix | Delete
private function process_template(): void {
[282] Fix | Delete
[283] Fix | Delete
// Nonce is checked in the caller: process() method.
[284] Fix | Delete
//phpcs:ignore WordPress.Security.NonceVerification.Missing
[285] Fix | Delete
$form_id = isset( $_POST['form'] ) ? absint( $_POST['form'] ) : 0;
[286] Fix | Delete
$form_obj = wpforms()->obj( 'form' );
[287] Fix | Delete
[288] Fix | Delete
if ( ! $form_obj || ! $form_id ) {
[289] Fix | Delete
return;
[290] Fix | Delete
}
[291] Fix | Delete
[292] Fix | Delete
$form_data = $form_obj->get( $form_id, [ 'content_only' => true ] );
[293] Fix | Delete
[294] Fix | Delete
// Define basic data with strict validation.
[295] Fix | Delete
$name = sanitize_text_field( $form_data['settings']['form_title'] ?? '' );
[296] Fix | Delete
$desc = sanitize_text_field( $form_data['settings']['form_desc'] ?? '' );
[297] Fix | Delete
$slug = sanitize_key( str_replace( [ ' ', '-' ], '_', trim( $name ) ) );
[298] Fix | Delete
[299] Fix | Delete
if ( ! $slug ) {
[300] Fix | Delete
// Slug is always empty when the $form_data is not valid.
[301] Fix | Delete
return;
[302] Fix | Delete
}
[303] Fix | Delete
[304] Fix | Delete
$class = 'WPForms_Template_' . $slug;
[305] Fix | Delete
$data = $this->get_template_data( $slug, $form_data );
[306] Fix | Delete
[307] Fix | Delete
// Build the final template string.
[308] Fix | Delete
$this->template = <<<EOT
[309] Fix | Delete
if ( class_exists( 'WPForms_Template', false ) ) :
[310] Fix | Delete
/**
[311] Fix | Delete
* {$name}
[312] Fix | Delete
* Template for WPForms.
[313] Fix | Delete
*/
[314] Fix | Delete
class {$class} extends WPForms_Template {
[315] Fix | Delete
[316] Fix | Delete
/**
[317] Fix | Delete
* Primary class constructor.
[318] Fix | Delete
*
[319] Fix | Delete
* @since 1.0.0
[320] Fix | Delete
*/
[321] Fix | Delete
public function init() {
[322] Fix | Delete
[323] Fix | Delete
// Template name
[324] Fix | Delete
\$this->name = '{$name}';
[325] Fix | Delete
[326] Fix | Delete
// Template slug
[327] Fix | Delete
\$this->slug = '{$slug}';
[328] Fix | Delete
[329] Fix | Delete
// Template description
[330] Fix | Delete
\$this->description = '{$desc}';
[331] Fix | Delete
[332] Fix | Delete
// Template field and settings
[333] Fix | Delete
\$this->data = {$data};
[334] Fix | Delete
}
[335] Fix | Delete
}
[336] Fix | Delete
new {$class}();
[337] Fix | Delete
endif;
[338] Fix | Delete
EOT;
[339] Fix | Delete
}
[340] Fix | Delete
[341] Fix | Delete
/**
[342] Fix | Delete
* Get template data.
[343] Fix | Delete
*
[344] Fix | Delete
* @since 1.9.5
[345] Fix | Delete
*
[346] Fix | Delete
* @param string $slug Template slug.
[347] Fix | Delete
* @param array|mixed $form_data Form data.
[348] Fix | Delete
*
[349] Fix | Delete
* @return string
[350] Fix | Delete
*/
[351] Fix | Delete
private function get_template_data( string $slug, $form_data ): string {
[352] Fix | Delete
[353] Fix | Delete
// Format template field and settings data.
[354] Fix | Delete
$data = [];
[355] Fix | Delete
$data['meta']['template'] = $slug;
[356] Fix | Delete
$data['fields'] = isset( $form_data['fields'] ) && is_array( $form_data['fields'] )
[357] Fix | Delete
? wpforms_array_remove_empty_strings( $form_data['fields'] )
[358] Fix | Delete
: [];
[359] Fix | Delete
$data['settings'] = isset( $form_data['settings'] ) && is_array( $form_data['settings'] )
[360] Fix | Delete
? wpforms_array_remove_empty_strings( $form_data['settings'] )
[361] Fix | Delete
: [];
[362] Fix | Delete
[363] Fix | Delete
$template_data = (string) var_export( $data, true ); //phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_var_export
[364] Fix | Delete
$template_data = str_replace( ' ', "\t", $template_data );
[365] Fix | Delete
[366] Fix | Delete
return preg_replace( '/([\t\r\n]+?)array/', 'array', $template_data );
[367] Fix | Delete
}
[368] Fix | Delete
}
[369] Fix | Delete
[370] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function