: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
$fieldsetSubmission= $sub->get_field_value( $field_id );
$fieldsetSettings = $field->get_settings();
$fieldsetLabels = Ninja_Forms()->fieldsetRepeater
->getFieldsetLabels($field_id, $fieldsetSettings, true);
foreach($fieldsetLabels as $fieldsetFieldId =>$fieldsetFieldLabel){
$fieldsetFieldIds[]=$fieldsetFieldId;
$field_labels[$fieldsetFieldId]=WPN_Helper::maybe_escape_csv_column( $fieldsetFieldLabel );
$fieldType = Ninja_Forms()->fieldsetRepeater->getFieldtype($fieldsetFieldId, $fieldsetSettings);
$fieldsetFieldSubmissionCollection=Ninja_Forms()->fieldsetRepeater
->extractSubmissionsByFieldsetField($fieldsetFieldId, $fieldsetSubmission);
$submissionCount = count($fieldsetFieldSubmissionCollection);
foreach ($fieldsetFieldSubmissionCollection as &$fieldsetFieldSubmission) {
if(is_array($fieldsetFieldSubmission['value'])){
$fieldsetFieldSubmission['value']= implode(', ',$fieldsetFieldSubmission['value']);
$value[$fieldsetFieldId]= array_column($fieldsetFieldSubmissionCollection,'value');
if (!is_int($field_id)) continue;
if( in_array( $field->get_setting( 'type' ), $hidden_field_types ) ) continue;
if ( $field->get_setting( 'admin_label' ) ) {
$field_labels[ $field->get_id() ] = WPN_Helper::maybe_escape_csv_column( $field->get_setting( 'admin_label' ) );
$field_labels[ $field->get_id() ] = WPN_Helper::maybe_escape_csv_column( $field->get_setting( 'label' ) );
$field_value = maybe_unserialize( $sub->get_field_value( $field_id ) );
$field_value = apply_filters('nf_subs_export_pre_value', $field_value, $field_id);
$field_value = apply_filters('ninja_forms_subs_export_pre_value', $field_value, $field_id, $form_id);
$field_value = apply_filters( 'ninja_forms_subs_export_field_value_' . $field->get_setting( 'type' ), $field_value, $field );
if ( is_array($field_value ) ) {
$field_value = implode( ',', $field_value );
$value[ $field_id ] = $field_value;
// The the submission has repeater fields, create an indexed array first
// iterate each column in the row 'value'
foreach($value as $fieldId=>$columnValue){
// If the column in the row value is not a repeater
// fieldset field, simply copy it into a new row of the
if(!in_array($fieldId,$fieldsetFieldIds)){
$repeatingValueArray[$index][]=$columnValue;
// If the column in the row value is a repeater
// fieldset field, copy the next submission index value
$repeatingValueArray[$index][]=$columnValue[$index];
// at the end of the row value columns, increment the index
// until all the submission index values are added
} while ($index < $submissionCount);
// After iterating the row value once for each submission index,
// add the repeatingValueArray to the value array
$value_array[]=$repeatingValueArray;
$value_array = WPN_Helper::stripslashes( $value_array );
$csv_array[ 0 ][] = $field_labels;
$csv_array[ 1 ][] = $value_array;
// Get any extra data from our other plugins...
$csv_array = apply_filters( 'nf_subs_csv_extra_values', $csv_array, $subs, $form_id );
$today = date( $date_format, current_time( 'timestamp' ) );
$filename = apply_filters( 'nf_subs_csv_filename', 'nf_subs_' . $today );
$filename = $filename . ".csv";
return WPN_Helper::str_putcsv( $csv_array,
apply_filters( 'nf_sub_csv_delimiter', ',' ),
apply_filters( 'nf_sub_csv_enclosure', '"' ),
apply_filters( 'nf_sub_csv_terminator', "\n" )
header( 'Content-type: application/csv');
header( 'Content-Disposition: attachment; filename="'.$filename .'"' );
header( 'Pragma: no-cache');
echo apply_filters( 'nf_sub_csv_bom',"\xEF\xBB\xBF" ) ; // Byte Order Mark
echo WPN_Helper::str_putcsv( $csv_array,
apply_filters( 'nf_sub_csv_delimiter', ',' ),
apply_filters( 'nf_sub_csv_enclosure', '"' ),
apply_filters( 'nf_sub_csv_terminator', "\n" )
protected function _save_field_value( $field_id, $value )
update_post_meta( $this->_id, '_field_' . $field_id, $value );
protected function _save_field_values()
if( ! $this->_field_values ) return FALSE;
foreach( $this->_field_values as $field_id => $value )
$this->_save_field_value( $field_id, $value );
update_post_meta( $this->_id, '_form_id', $this->_form_id );
update_post_meta( $this->_id, '_seq_num', $this->_seq_num );
protected function _save_extra_values()
if( ! $this->_extra_values ) return FALSE;
$maxCount = apply_filters('ninja_forms_max_extra_data_count',200,$this->_form_id);
* if extra data has more than 200 elements, then stop. Add-ons should
* not be adding those many individual pieces of data; rather, they
* should add data keyed on specific functional areas from their usage.
* Over the allowed limit, it is expected to be an attack. Site
* developers can use filter to raise limit either globally or per-form
if($maxCount<count($this->_extra_values)){
foreach( $this->_extra_values as $key => $value )
if( property_exists( $this, $key ) ) continue;
update_post_meta( $this->_id, $key, $value );
protected function format_meta_query( array $where = array() )
'value' => $this->_form_id
if( ! empty( $where ) ) {
foreach ($where as $ref => $value) {
$field_id = ( is_int( $ref ) ) ? $ref : $this->get_field_id_by_key( $ref );
$return[] = ( is_array($value) ) ? $value : array('key' => "_field_$field_id", 'value' => $value);
protected function get_field_id_by_key( $field_key )
$field_id = $wpdb->get_var( $wpdb->prepare(
"SELECT id FROM {$wpdb->prefix}nf3_fields WHERE `key` = %s AND `parent_id` = {$this->_form_id}",
public static function sort_fields( $a, $b )
if ( $a->get_setting( 'order' ) == $b->get_setting( 'order' ) ) {
return ( $a->get_setting( 'order' ) < $b->get_setting( 'order' ) ) ? -1 : 1;
} // End NF_Database_Models_Submission