Passed
Pull Request — master (#284)
by Brian
06:11
created

WPInv_Meta_Box_Payment_Form::output()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 78
Code Lines 33

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 33
c 1
b 0
f 0
nc 2
nop 1
dl 0
loc 78
rs 9.392

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
// MUST have WordPress.
3
if ( !defined( 'WPINC' ) ) {
4
    exit( 'Do NOT access this file directly: ' . basename( __FILE__ ) );
5
}
6
7
class WPInv_Meta_Box_Payment_Form {
8
9
    /**
10
     * Output fields.
11
     *
12
     * @param WP_Post $post
13
     */
14
    public static function output ( $post ) {
15
        $success_page        = get_post_meta( $post->ID, 'wpinv_success_page', true );
16
        $success_page        = empty( $success_page ) ? wpinv_get_success_page_uri() : $success_page
17
        ?>
18
19
        <div id="wpinv-form-builder" style="display: flex; flex-flow: wrap;">
20
21
            <div class="wpinv-form-builder-left bsui" style="flex: 0 0 320px;">
22
                <ul class="wpinv-form-builder-tabs  nav nav-tabs">
23
                    <li class='nav-item' v-if="active_tab!='new_item'">
24
                        <a @click.prevent="active_tab='new_item'" class="nav-link p-3" :class="{ 'active': active_tab=='new_item' }" href="#"><?php _e( 'Add new element', 'invoicing' ); ?></a>
25
                    </li>
26
                    <li class='nav-item' v-if='false'>
27
                        <a @click.prevent="active_tab='edit_item'" class="nav-link p-3" :class="{ 'active': active_tab=='edit_item' }" href="#"><?php _e( 'Edit element', 'invoicing' ); ?></a>
28
                    </li>
29
                    <li class='nav-item' v-if='false'>
30
                        <a @click.prevent="active_tab='settings'" class="nav-link p-3" :class="{ 'active': active_tab=='settings' }" href="#"><?php _e( 'Settings', 'invoicing' ); ?></a>
31
                    </li>
32
                </ul>
33
34
                <div class="wpinv-form-builder-tab-content bsui" style="margin-top: 16px;">
35
                    <div class="wpinv-form-builder-tab-pane" v-if="active_tab=='new_item'">
36
                        <div class="wpinv-form-builder-add-field-types">
37
                            <small class='form-text text-muted'><?php _e( 'Add an element by dragging it to the payment form.', 'invoicing' ); ?></small>
38
                            <draggable class="section mt-2" style="display: flex; flex-flow: wrap; justify-content: space-between;" v-model="elements" :group="{ name: 'fields', pull: 'clone', put: false }" :sort="false" :clone="addDraggedField" tag="ul" filter=".wpinv-undraggable">
39
                                <li v-for="element in elements" style="width: 49%; background-color: #fafafa; margin-bottom: 9px; cursor: move; border: 1px solid #eeeeee;" @click.prevent="addField(element)">
40
                                    <button class="button btn" style="width: 100%; cursor: move;">
41
                                        <span v-if="element.icon" class="dashicons dashicon-" :class="'dashicon-' + element.icon"></span>
42
                                        {{element.name}}
43
                                    </button>
44
                                </li>
45
                            </draggable>
46
47
                        </div>
48
                    </div>
49
50
                    <div class="wpinv-form-builder-tab-pane bsui" v-if="active_tab=='edit_item'" style="font-size: 16px;">
51
                        <div class="wpinv-form-builder-edit-field-wrapper">
52
                            <?php do_action( 'wpinv_payment_form_edit_element_template', 'active_form_element', $post ); ?>
53
                            <div>
54
                                <button type="button" class="button button-link button-link-delete" @click.prevent="removeField(active_form_element)"><?php _e( 'Delete Field', 'invoicing' ); ?></button>
55
                            </div>
56
                        </div>
57
                    </div>
58
59
                    <div class="wpinv-form-builder-tab-pane bsui" v-if="active_tab=='settings'">
60
                        <div class="wpinv-form-builder-settings-wrapper">
61
                        
62
                            <div class='form-group'>
63
                                <label for="wpi-success-page"><?php _e( 'Success Page', 'invoicing' ); ?></label>
64
                                <input  placeholder="https://" id='wpi-success-page' value="<?php echo esc_url( $success_page ); ?>" class='form-control' type='text'>
0 ignored issues
show
Bug introduced by
It seems like $success_page can also be of type false; however, parameter $url of esc_url() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

64
                                <input  placeholder="https://" id='wpi-success-page' value="<?php echo esc_url( /** @scrutinizer ignore-type */ $success_page ); ?>" class='form-control' type='text'>
Loading history...
65
                                <small class='form-text text-muted'><?php _e( 'Where should we redirect users after successfuly completing their payment?', 'invoicing' ); ?></small>
66
                            </div>
67
68
                        </div>
69
                    </div>
70
71
                </div>
72
            </div>
73
74
            <div class="wpinv-form-builder-right" style="flex: 1; padding-top: 40px;border-left: 1px solid #ddd;padding-left: 20px;min-height: 520px;margin-left: 10px;">
75
76
                <small class='form-text text-muted' v-if='form_elements.length'><?php _e( 'Click on any element to edit or delete it.', 'invoicing' ); ?></small>
77
                <p class='form-text text-muted' v-if='! form_elements.length'><?php _e( 'This form is empty. Add new elements by dragging them from the right.', 'invoicing' ); ?></p>
78
79
                <draggable class="section bsui" v-model="form_elements" @add="highlightLastDroppedField" group="fields" tag="div" style="min-height: 100%; font-size: 16px;">
80
                    <div v-for="form_element in form_elements" class="wpinv-form-builder-element-preview" :class="{ active: active_form_element==form_element &&  active_tab=='edit_item' }" @click="active_tab = 'edit_item'; active_form_element = form_element">
81
                        <?php do_action( 'wpinv_payment_form_render_element_template', 'form_element', $post ); ?>
82
                    </div>
83
                </draggable>
84
            </div>
85
86
            <textarea style="display:none;" name="wpinv_form_elements" v-model="elementString"></textarea>
87
            <textarea style="display:none;" name="wpinv_form_items" v-model="itemString"></textarea>
88
        </div>
89
        
90
        <?php wp_nonce_field( 'wpinv_save_payment_form', 'wpinv_save_payment_form' ) ;?>
91
92
        <?php
93
    }
94
95
    /**
96
     * Saves our payment forms.
97
     */
98
    public static function save( $post_id, $post ) {
99
100
        remove_action( 'save_post', 'WPInv_Meta_Box_Payment_Form::save' );
101
102
        // $post_id and $post are required.
103
        if ( empty( $post_id ) || empty( $post ) ) {
104
            return;
105
        }
106
        
107
        // Ensure that this user can edit the post.
108
        if ( ! current_user_can( 'edit_post', $post_id ) ) {
109
            return;
110
        }
111
112
        // Dont' save meta boxes for revisions or autosaves
113
        if ( defined( 'DOING_AUTOSAVE' ) || is_int( wp_is_post_revision( $post ) ) || is_int( wp_is_post_autosave( $post ) ) ) {
114
            return;
115
        }
116
117
        // Do not save for ajax requests.
118
        if ( ( defined( 'DOING_AJAX') && DOING_AJAX ) || isset( $_REQUEST['bulk_edit'] ) ) {
119
            return;
120
        }
121
122
        // Confirm the security nonce.
123
        if ( empty( $_POST['wpinv_save_payment_form'] ) || ! wp_verify_nonce( $_POST['wpinv_save_payment_form'], 'wpinv_save_payment_form' ) ) {
124
            return;
125
        }
126
127
        // Save form items.
128
        $form_items = json_decode( wp_unslash( $_POST['wpinv_form_items'] ), true );
0 ignored issues
show
Bug introduced by
It seems like wp_unslash($_POST['wpinv_form_items']) can also be of type array; however, parameter $json of json_decode() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

128
        $form_items = json_decode( /** @scrutinizer ignore-type */ wp_unslash( $_POST['wpinv_form_items'] ), true );
Loading history...
129
130
        if ( empty( $form_items ) ) {
131
            $form_items = array();
132
        }
133
134
        update_post_meta( $post_id, 'wpinv_form_items', self::maybe_save_items( $form_items ) );
135
136
        // Save form elements.
137
        $wpinv_form_elements = json_decode( wp_unslash( $_POST['wpinv_form_elements'] ), true );
138
        if ( empty( $wpinv_form_elements ) ) {
139
            $wpinv_form_elements = array();
140
        }
141
142
        update_post_meta( $post_id, 'wpinv_form_elements', $wpinv_form_elements );
143
    }
144
145
    /**
146
     * Saves unsaved form items.
147
     */
148
    public static function maybe_save_items( $items ) {
149
150
        $saved = array();
151
152
        foreach( $items as $item ) {
153
154
            if ( is_numeric( $item['id'] ) ) {
155
                $saved[] = $item;
156
                continue;
157
            }
158
159
            $data = array(
160
                'post_title'   => sanitize_text_field( $item['title'] ),
161
                'post_excerpt' => wp_kses_post( $item['description'] ),
162
                'post_status'  => 'publish',
163
                'meta'         => array(
164
                    'type'      => 'custom',
165
                    'price'     => wpinv_sanitize_amount( $item['price'] ),
166
                    'vat_rule'  => 'digital',
167
                    'vat_class' => '_standard',
168
                )
169
            );
170
            
171
            $new_item  = new WPInv_Item();
172
            $new_item->create( $data );
173
    
174
            if ( ! empty( $new_item ) ) {
175
                $item['id'] = $new_item->ID;
176
                $saved[] = $item;
177
            }
178
179
        }
180
181
        return $saved;
182
183
    }
184
185
}
186
187
add_action( 'save_post_wpi_payment_form', 'WPInv_Meta_Box_Payment_Form::save', 10, 2 );
188
189