Julius'Lab

Formidable

(Formidable) Establecer orden específico para una Vista con un enlace

Agregar el siguiente código PHP:
(tomado de Change View order based on URL parameter)

add_filter( 'frm_filter_view', 'change_my_view_object', 10, 1);
function change_my_view_object( $view ) {
	if ( $view->ID === 8477 ) { // 8477 is the View id
		if ( isset( $_GET['my_param'] ) && $_GET['my_param'] == 'descent' ) {
			$view->frm_order_by = array( created_at );
			$view->frm_order = array( 'DESC' );
		}
	}

	return $view;
}

En el ejemplo, 8477 es el id de la Vista.

En my_param puede ponerse el nombre del parámetro al gusto, e igualmente en descent, cualquier valor.

En la línea $view->frm_order_by = array( created_at );, dentro de los paréntesis, puede haber un ID de un campo (p.e. 150), campo por el cual se ordenará la Vista. En este ejemplo, se usa created_at como campo a ordenar, lo cual sirve para ordenar por creación de la entrada de forma ascendente o descendente.

En la línea $view->frm_order = array( ‘DESC’ );, se pone ASC o DESC, lo que se desee.

Para implementar, el enlace es como:

https://url.com/?my_param=descent

(Formidable) Establecer orden específico para una Vista con un enlace Leer más »

(Javascript) Sumar columnas (o celdas cualquiera, o cualquier elemento) en tablas, grids, etc.

<script type="text/javascript">
        var myIVAtotal = 0;
        document.querySelectorAll(".cotRepIVAsum").forEach(
          function(acell){
             var cellvalue= parseFloat(acell.innerHTML);
             if (!isNaN(cellvalue)) {myIVAtotal += cellvalue;}
         }
        );
    document.getElementById('SumaIVA').innerHTML = myIVAtotal.toFixed(2);
</script>

En el caso en que se aplicó, la necesidad era sumar todas las celdas de una tabla producida por base de datos en Formidable, en una Single Entry View. Finalmente, pueden sumarse cualquier cantidad de elementos una vez rendereados en la página.

En el ejemplo, .cotRepIVAsum es el identificador de class de las celdas de la tabla o elementos que se quieran sumar (funciona con div, span, p, etc. cualquier html tag).
document.querySelectorAll(«.cotRepIVAsum»).forEach revisa cada elemento con la clase definida, parseFloat convierte los valores de las celdas (que vienen como texto en el html) a número con decimales. Luego el if(!isNan(cellvalue)) comprueba si es número, si es así, lo suma a myIVAtotal con myIVAtotal += cellvalue y finalmente lo sustituye en cualquier html con tag, en este casi en div id=»SumaIVA».

EJEMPLO CON ANOTACIONES:

<script type="text/javascript">
        var myIVAtotal = 0; //variable para obtener el valor final
        document.querySelectorAll(".cotRepIVAsum").forEach( //revisa todos los elementos con la clase deseada
          function(acell){
             var cellvalue= parseFloat(acell.innerHTML); //obtiene el valor de la celda revisada (parseFloat obtiene número con decimales, parseInt obtiene sólo enteros
             if (!isNaN(cellvalue)) {myIVAtotal += cellvalue;} //checa si no es número, si lo es, procede a agregar el valor a la sumatoria total
         }
        );
    document.getElementById('SumaIVA').innerHTML = myIVAtotal.toFixed(2); //despliega la sumatoria total en cualquier div con ese tag, toFixed(2) redondea a 2 decimales
</script>

(Javascript) Sumar columnas (o celdas cualquiera, o cualquier elemento) en tablas, grids, etc. Leer más »

(Formidable) Cómo mostrar u ocultar contenido a partir de user_meta keys

1) Agregar este code snippet: https://formidableforms.com/knowledgebase/php-examples/#kb-check-parameter-value

add_shortcode('if_get_param', 'check_get_param_value');
function check_get_param_value( $atts, $content="" ) {
    if ( ! isset( $atts['name'] ) || ! isset( $atts['value'] ) || ! isset( $atts['type'] ) ) {
        return $content;
    }
    
    $type = $atts['type'];
    if ( $type == 'greater_than' ) {
        $type = '>';
    } else if ( $type == 'less_than' ) {
        $type = '<';
    } else if ( $type == 'equals' ) {
        $type = '==';
    } else if ( $type == 'not_equal' ) {
        $type = '!=';
    }

    $get_value = isset( $_GET[ $atts['name'] ] ) ? $_GET[ $atts['name'] ] : '';

    if ( ! FrmFieldsHelper::value_meets_condition( $get_value, $type, $atts['value'] ) ) {
        $content = '';
    }

    return do_shortcode( $content );
}

2) Agregar este code snippet:

add_shortcode('user_meta', 'user_meta_shortcode_handler');
function user_meta_shortcode_handler($atts,$content=null){
 
	if ( !isset( $atts['user_id'] ) ){
		$user = wp_get_current_user();
		$atts['user_id'] = $user->ID;
	}
	if ( !isset( $atts['size'] ) ){
		$atts['size'] = '50';
	}
	if ( !isset( $atts['post'] ) ) {
		$atts['post'] = '';
	}
	if ( !isset( $atts['wpautop'] ) ) {
		$atts['wpautop'] = '';
	}

	$user = new WP_User($atts['user_id']);
 
	if ( !$user->exists() ) return;
 
	if( $atts['key'] == 'avatar'){
		return $atts['pre'] . get_avatar( $user->ID, $atts['size']) . $atts['post'] ;
	}
	if ( $user->has_prop( $atts['key'] ) ){
		if ($atts['wpautop'] == 'on'){
			$value = wpautop( $user->get( $atts['key'] ) );
		} else {
			$value = $user->get( $atts['key'] );
		}
	}
 
	if (!empty( $value )){
		return $atts['pre'] . $value . $atts['post'] ;
	}
 
	return;
}

Esto creará un nuevo shortcode: [user_meta key=»loquesea»]
Reemplaar «loquesea» con el nombre del user meta y encontrará el valor almacenado ahí.

También tiene unos cuantos parámetros que acepta si se quieren usar:

user_id – id del usuario del cual se quiere obtener el meta. Debe dejarse vacía si se quiere que sea igual al usuario actual.
key – meta key del campo que se quiere obtener.
wpautop = «on» – este se usa para áreas de texto o campos wysiwyg.
size = «100» – este se usa para especificar el tamaño del campo de avatar.

Probablemente la mayoría no se necesiten estas extra opciones pero pueden usarse.

3) Usaremos el shortcode frm-set-get (nativo de FormidableForms) para obtener el valor de la meta data (usando nuestro nuevo shortcode user_meta (implementado en el paso 2)) y guardarlo temporalmente, para decirle al shortcode if_get_param (implementado en el paso 1) que use el valor guardado, de la forma siguiente:

[ frm-set-get param=my_user_meta ][user_meta key="loquesea"][ /frm-set-get ]
[if_get_param name="my_user_meta" type="equals" value="VALOR A COMPROBAR"]Contenido si es VERDADERO[/if_get_param]

[if_get_param name="my_user_meta" type="not_equal" value="VALOR A COMPROBAR"]Contenido si es FALSO[/if_get_param]

Solución orientada por Chris de FDM Digitaly adaptada por Julius, desde Slack.

(Formidable) Cómo mostrar u ocultar contenido a partir de user_meta keys Leer más »

Asignar un valor de una función Javascript a un campo en Formidable

<script type="text/javascript">
jQuery(document).ready(function($){ //set a random 9-char key
    var currentValue = '';
    var lenght = 9;
    var randomChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz0123456789';
    var result = '';
    currentValue = $(field_mediakey).val();
    if ($(field_mediakey).val() == '') {
    for ( var i = 0; i < lenght; i++ ) {
            result += randomChars.charAt(Math.floor(Math.random() * randomChars.length));
        }
        $(field_mediakey).val(result);
    }
    $(field_yzjna).val($(field_mediakey).val());
});
</script>

Asignar un valor de una función Javascript a un campo en Formidable Leer más »

Filtrar una Vista por el valor de uno o dos campos con un operador OR

Es posible filtrar una Vista si UNO o DOS campos de las entradas contienen un valor, esto es:
Si Campo A tiene un valor X, o el Campo B tiene un valor Y.

En la Vista, en Ajustes Avanzados, hay que poner un filtro con el nombre del primer campo:

CampoA es Igual a custom
(hay que ponerla así, sólo la palabra custom)

Alterado por mí, del siguiente enlace: https://formidableforms.com/knowledgebase/frm_where_filter/#kb-add-two-filters-combined-with-or

Código:

add_filter('frm_where_filter', 'filtro_campoa_or_campob', 10, 2);
function filtro_campoa_or_campob($where, $args){
	$view_id = 257; // ID de la Vista a filtrar
	$field_1 = 269;// ID del campo A ESTE ES EL PRIMER CAMPO A CHECAR
	$field_2 = 268;// ID del campor B ESTE ES EL SEGUNDO CAMPO A CHECAR
    $user = wp_get_current_user(); // Asigna a la variable $user el Usuario Actual
	$search_term_1 = $user->usr_assign_num_name; // Primer término a comparar: sustituir por algún valor o valor de un campo (o meta-key del usuario, en este caso)
	$search_term_2 = $user->usr_assign_clave; // Segundo término a comparar: 1011000001 (clave usuario)
	if ( $args['display']->ID == $view_id && $args['where_opt'] == $field_1 ) {
		$search_val_1 = $search_term_1; //tal vez estas dos líneas (esta y la siguiente) son superfluas, se podría llegar directamente a $search_val_1
		$search_val_2 = $search_term_2; // y $search_val_2 sin necesidad de pasar por $search_term_1 y $search_term_2

		if ( $search_val_1 && $search_val_2 ) {
			$where = "( (meta_value = '". $search_val_1 ."' and fi.id = " . $field_1 . ")";
			$where .= " OR (meta_value = '" . $search_val_2 . "' and fi.id = " . $field_2 . ") )";
                } else if ( $search_val_1 ) {
			$where = "(meta_value = '". $search_val_1 ."' and fi.id = " . $field_1 . ")";
                } else if ( $search_val_2 ) {
			$where = "(meta_value = '". $search_val_2 ."' and fi.id = " . $field_2 . ")";
		} else {
			$where = "fi.form_id = " . $args['display']->frm_form_id;
		}
	}
	return $where;
}

Filtrar una Vista por el valor de uno o dos campos con un operador OR Leer más »

Incrementar el valor campo en una entrada específica de acuerdo a una elección (Radio, dropdown o check)

Este código permite incrementar (o decrementar) el valor de uno o varios campos específicos de acuerdo a la opción elegida en un campo de opciones de otro formulario.

El ejemplo asume la creación de dos formularios FormularioA (origen/captura) y FormularioB (destino).

El FormularioA, el origen, recibirá la elección del usuario. Puede ajustarse, si se desea, para no guardar las entradas recibidad. En este formulario deberá crearse los siguientes campos:

  • Campo de opción (llamado YourChoice en este ejemplo), y asignar un valor diferente para cada opción (1, 2, 3 o lo que sea necesario). Deben ser diferentes para determinar la elección del usuario. En este caso ejemplo, contendrá tres opciones con los valores guardados 1, 2 y 3.
  • Campo de número (llamado TheEntry en este ejemplo). Este número contendrá el id de la entrada del Formulario B a la cual irán los cambios.

El FormularioB es el formulario destino. Cualquier entrada de este formulario podrá ser referenciada en el campo TheEntry, del FormularioA. En este caso ejemplo, este FormularioB contendrá tres campos numéricos con nombre: Total1, Total2 y Total3, correspondientes a cada una de las opciones del campo YourChoice en el FormularioA. Cada campo podrá ser incrementado por 1
(en este ejemplo) de acuerdo a la opción elegida por el usuario, en la entrada correspondiente FormularioA/TheEntry.

Una vez designado esto, deberá agregarse el siguiente código a Functions.php (o utilizar el plugin Code Snippets (recomendado))

add_action('frm_after_create_entry', 'after_entry_created', 30, 2);
function after_entry_created($entry_id, $form_id){
  if($form_id == 2){ //FormularioA (id:2)
    global $wpdb;
    $counter_ids = $_POST['item_meta'][7]; // [7] es el campo número en FormularioA (origen/captura) (id:2)
    if($_POST['item_meta'][16] == 1){ // [16] es el campo YourChoice, 1 es el valor seleccionado.
        $count_field = 12; //count_field=12 es el field_key del total1 (FormularioB id:3)
        foreach ( (array) $counter_ids as $counter_id ) {
            $total_get = FrmEntryMeta::get_entry_meta_by_field( $counter_id, $count_field, true );
            $wpdb->update( $wpdb->prefix .'frm_item_metas', array( 'meta_value' => ( (int) $total_get+1 ) ), array( 'item_id' => $counter_id, 'field_id' => $count_field ) );
        }//end of foreach
    }//end of if post1
    if($_POST['item_meta'][16] == 2){
        $count_field = 13; //count_field=13 es el field_key del total2 (FormularioB id:3)
        foreach ( (array) $counter_ids as $counter_id ) {
            $total_get = FrmEntryMeta::get_entry_meta_by_field( $counter_id, $count_field, true );
            $wpdb->update( $wpdb->prefix .'frm_item_metas', array( 'meta_value' => ( (int) $total_get+1 ) ), array( 'item_id' => $counter_id, 'field_id' => $count_field ) );
         }//end of foreach
    }//end of if post2
    if($_POST['item_meta'][16] == 3){
        $count_field = 14; //count_field=14 es el field_key del total3 (FormularioB id:3)
          foreach ( (array) $counter_ids as $counter_id ) {
          $total_get = FrmEntryMeta::get_entry_meta_by_field( $counter_id, $count_field, true );
          $wpdb->update( $wpdb->prefix .'frm_item_metas', array( 'meta_value' => ( (int) $total_get+1 ) ), array( 'item_id' => $counter_id, 'field_id' => $count_field ) );
          }//end of foreach
	}//end of if post3
  }//end of if($form_id == 2)
}//end of function

Las líneas 6 al 12 contienen un código que puede ser repetido para cada número de opciones.

Incrementar el valor campo en una entrada específica de acuerdo a una elección (Radio, dropdown o check) Leer más »

(Unfinished) Cómo crear un «Constructor de Código» (Code Builder)

Con Formidable Forms podemos crear un «Constructor de Código» en caso de tener la necesidad de escribir un código complejo y recurrente sin tener que copiarlo y editarlo de la última instancia.

En este caso de ejemplo, se construirá un código para un shortcode frm-set-get que incluirá varios parámetros en secuencia.

Paso #1
Crear el formulario

With Formidable Forms we can create a «Code Builder» in case we need to write a complex and recurring code without having to copy and editing from the last instance.

In this example, we’ll build a code for a frm-set-get shortcode that will include several parameters in a sequence. This shortcode is suitable to feed a «Dynamic poll system» (ANOTHER ARTICLE). The resulting code will be something like:

Step #1
Create a form by the usual procedure and name it Codebuilder form (or as you like). In Settings>Form permissions activate the options «Limit form visibility to ADMINISTRATOR» (or any role you like to use the code builder) and «Allow front-end editing» with the correspondent permissions.

Step #2
In our new form, we start by inserting a Text field, and in its Key Field we’ll name it codebuilder-code. This will be the field which will hold the main resulting code. The field label can be something like «Code».

Step #3
Add a Hidden Field. In Default Value of the codebuilder-code field, insert this code:

(Unfinished) Cómo crear un «Constructor de Código» (Code Builder) Leer más »

(Formidable) Cómo filtrar entradas por un campo tipo Toggle (Alternar)

Para filtrar un campo tipo Toggle, el campo debe estar configurado en el formulario con «Mostrar etiquetas» activado, y colocar, por ejemplo, las etiquetas 1 (activo) y 0 (inactivo).

En la Vista, en la sección Advanced Settings, debe ponerse como
(en este ejemplo, el campo Toogle es «Privado»)

Para mostrar (o incluir en el cálculo) todas las entradas en las que «Privado» esté inactivo:

Privado not_equal 1

Y en los shortcodes de frm-stats:

Privado=»»

Para mostrar (o incluir en el cálculo) todas las entradas en las que «Privado» esté activo:

Privado equals 1

Y en los shortcodes de frm-stats:

Privado=1

(Formidable) Cómo filtrar entradas por un campo tipo Toggle (Alternar) Leer más »