Julius'Lab

How-to

(Formidable) Limitar mes de un datepicker al mes en curso

Para limitar el mes de un datepicker en Formidable, usar este código en Code Snippets:

add_action('frm_date_field_js', 'limit_date_field_to_current_month');
function limit_date_field_to_current_month($field_id){
  if($field_id == 'field_FIELDKEY'){ // change FIELDKEY to the key of the date field
    $first_day_of_month = date('Y-m-01');
    $last_day_of_month = date('Y-m-t');
    $first_day_js = date('n-j-Y', strtotime($first_day_of_month));
    $last_day_js = date('n-j-Y', strtotime($last_day_of_month));
    
    echo "
      ,minDate: new Date('{$first_day_js}')
      ,maxDate: new Date('{$last_day_js}')
      ,dateFormat: 'dd/mm/yy'
      ,showMonthAfterYear: false
      ,monthNames: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre']
      ,monthNamesShort: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre']
    ";
  }
}

Este código fue escrito por ChatGPT (https://chatgpt.com/c/983f82d5-fc89-466d-95ad-790f116960ab) basado en el código dado por Formidable en https://formidableforms.com/knowledgebase/frm_date_field_js/#kb-custom-dynamic-date-range

Curiosamente, en monthNamesShort estaban los nombres de tres caracteres de los meses (‘ene’,’feb’,’mar’, etc) pero se los tuve que cambiar ya que sólo toma el nombre en ese array, y ChatGPT no lo solucionó.

NOTA: IMPORTANTE que la línea ,dateFormat:’dd/mm/yy’ tenga ese formato para que la fecha elegida sea aceptada por el formulario.

(Formidable) Limitar mes de un datepicker al mes en curso Leer más »

(Formidable) Filtrar por fecha una Vista a través de otra

VISTA PARENT: ENTRADAS-FECHAS

[display-frm-data id=entradas-fechas filter=limited]
<div class="dateBox">
    <div class="dateDisplay">[fecha-field] <span>[fecha-field format="l"]</span></div>
    <div class="entriesDisplay">[display-frm-data id=entradas thedate=[fecha-field format="Y-m-d"]]</div> //IMPORTANTE: format en fecha-field
</div>

Order: Fecha Descending (de la más reciente a la más antigua)

Filter: Fecha IS unique(get newest entries)

VISTA: ENTRADAS (View key: entradas)

<div class="EntryBox">
    <div class="entryTime">[time-field]</div>
    <div class="entryConcept">[concept-field]</div>
    <div class="entryDescription">[description-field]</div>
    <div class="entryAmount">$ [amount-field thousands_sep="," decimal=2]</div>
</div>

Order: (cualquiera)

Filter: Fecha IS EQUAL TO [get param=thedate]

(Formidable) Filtrar por fecha una Vista a través de otra Leer más »

(Formidable/PHP) Colocar una entry meta en un campo (fecha, hora, id de la entrada, etc.)

Agregar este código donde se necesite (create o update entry):

add_action('frm_after_create_entry', 'frm_update_updated_at_meta', 10, 2);
add_action('frm_after_update_entry', 'frm_update_updated_at_meta', 10, 2);
function frm_update_updated_at_meta($entry_id, $form_id) {
    if ($form_id == 41) { //id of the form with the entry and the fields to set
        $updated_at = current_time('Y-m-d H:i:s'); // Get the current date and time

        $updated_date = date('Y-m-d', strtotime($updated_at)); // Extract the date part
        $updated_time = date('H:i:s', strtotime($updated_at)); // Extract the time part

        FrmEntryMeta::add_entry_meta($entry_id, 845, '', $updated_date);
        FrmEntryMeta::add_entry_meta($entry_id, 864, '', $updated_time);
        // Replace 845 and 864 with the IDs of the fields where you want to store the date and time parts respectively
    }
}

En este caso específico, la función extrae el valor meta de $updated_at (fecha de actualización), lo separa en 2 valores ($updated_date y $updated_time), y cada uno lo coloca en los campos 845 (date field) y 864 (time field) con el método: FrmEntryMeta::add_entry_meta, que automáticamente toma el id de la entrada con $entry_id y coloca el valor respectivo de las variables.

Puede usarse con el hook frm_after_create_entry o con frm_after_update_entry.
Pueden usarse otros valores meta, por ejemplo created_at o entry_id.

Ejemplo para colocar el id de la entrada en un campo:

add_action('frm_after_create_entry', 'frm_add_entry_id', 42, 2);
function frm_add_entry_id($entry_id, $form_id){
   if ( $form_id == 2 ) { //change 2 to the ID of your form
     FrmEntryMeta::add_entry_meta( $entry_id, 30, "", $entry_id);//change 30 to the ID of the field in which you want to store the entry ID
   }
}

(Formidable/PHP) Colocar una entry meta en un campo (fecha, hora, id de la entrada, etc.) Leer más »

(Formidable/JavaScript) Hacer que un campo Dinámico dispare otro campo (mientras Lógica Condicional de Formidable no funciona)

En un mundo perfecto, un campo dinámico debería poder «disparar» (trigger) la visualización de otro campo, si la lógica condicional de este campo se pone en:
In a perfect world, a Dynamic field should be able to trigger the displaying of another field, if Conditional Logic of the latter is set like this:

Show this field if any/all of the following match:
Field1 is equal to anything

Pero actualmente no funciona. Formidable alega que está al tanto de este problema, pero aún no tienen fecha de arreglo.
But it currently does not work. Formidable is allegedly aware of this issue, but they don’t have a fix date yet.

Así que, este es mi arreglo (gracias a ChatGPT):
So, this is my fix (thanks to ChatGPT:

<script>
jQuery(document).ready(function($){
// Hide field by default
	$("#frm_field_775_container").css('display','none');

	$(document).on('change', 'select[name="item_meta[773]"]', function(){ //select[name='item_meta[994]']
		var show;

		var val1 = $("select[name='item_meta[773]']").val();
		console.log("Selected value:", val1);
		if (val1 !== '' && val1 !== '0' && val1 !== '-1' && val1 !== ' ')
			{show = true;console.log("showing");}
		else
			{show = false;console.log("hidden");}

		if(show){
			$("#frm_field_775_container").css('display','block');
		}else{
			$("#frm_field_775_container").css('display','none');
		}
	});
});
</script>

Field773 es el campo Dinámico que dispara. Field775 es el campo inicialmente oculto que se muestra al elegir algo en el campo Dinámico.
Field773 is the triggering Dynamic field. Field775 is the field, initially hidden, that shows up when chosing something in the Dynamic field.

(Formidable/JavaScript) Hacer que un campo Dinámico dispare otro campo (mientras Lógica Condicional de Formidable no funciona) Leer más »

(Javascript – Formidable) Accionar un campo Toggle de acuerdo al valor de un campo de selección

Colocar este código en la sección Campos Después (Fields After) en Personalizar HTML del formulario.

<script type="text/javascript">
jQuery(document).ready(function($){
  $('select[name="item_meta[530]"]').change(function(){ //530 es el campo de selección (dropdown)
     var val1 = $("select[name='item_meta[530]']").val();
     if (val1 == 'Pendiente' || val1 == 'Por entregar' || val1 == 'En proceso' || val1 =='Incumplimiento')
     {$("#field_bloqueado").attr("checked", true);} // "bloqueado" es el key del campo toggle a accionar
     else if (val1 == '' || val1 == 'Rechazado' || val1 == 'Cancelado' || val1 =='Concretado')
     {$("#field_bloqueado").attr("checked", false);}
     $("#field_bloqueado").change();
  });
});
</script>
<script type="text/javascript">
jQuery(document).ready(function($){
var oldValue = '';
var dynamic_field = document.getElementById("field_dfe");
var hidden_field = document.getElementById("field_hidden");
var aTimer;
var counter;

$(dynamic_field).change(function(){
oldValue = $("#field_just_show_it").val() ;
if (!(aTimer == undefined) ) clearInterval(aTimer) ;
counter = 0 ;
aTimer = setInterval(function(){
var newValue = $("#field_just_show_it").val() ;
counter ++ ;
if ( (newValue != oldValue) ){
if (newValue != oldValue && newValue != undefined) {
hidden_field.value = newValue;
oldValue = newValue;
$(hidden_field).change();
}
clearInterval(aTimer) ;
}
} , 100) ;
}) ;
}) ;

</script>

(Javascript – Formidable) Accionar un campo Toggle de acuerdo al valor de un campo de selección Leer más »

Motorola G5: Cómo iniciar el dispositivo o hacer el hard reset con el botón de Power (Encendido) defectuoso

El problema es que el botón físico de Power (Encendido) está defectuoso. En algunas ocasiones recibe el comando, pero hay que buscarle. Y es mucho más difícil mantenerlo presionado para reiniciar el celular. Pero funciona a un solo toque, buscándole.

En caso de que la batería se acabe, hay una manera de encender el celular y/o hacerle un hard reset (llevarlo a la pantalla de recovery).

Antes que nada, se destapa por detrás para poder acceder a la batería (realizado).

1) Con la batería puesta, se presiona el botón de Bajar Volumen, y manteniéndolo presionado, se conecta la carga. Esto nos lleva a la pantalla de selección de modo Recovery, Start, etc.

Encender el celular

En la pantalla de selección de fábrica, puesto en modo Start, se quita la batería por menos de un segundo y de inmediato se vuelve a poner. Esto hace que el celular arranque en modo normal.

Hard Reset

Para hacer el hard reset (o seleccionar cualquiera de los otros modos), se repite el paso 1.

En la pantalla, se selecciona Recovery Mode. Se presiona el botón de Power (buscarle hasta que lo reciba).

El celular se reiniciará y aparecerá la imagen del androide abierto con el letrero Sin comandos. Ahí se presiona Subir Volumen y al mismo tiempo el Power (buscarle de nuevo).

Ahí seleccionamos Wipe data / Factory reset. Elegir con Power.

En la siguiente pantalla, donde avisan que se eliminarán todos los datos y que no se puede deshacer, seleccionar User data + personalized content con el botón Power.

Después, repetir el procedimiento y ahora seleccionar Wipe cache partition, y seleccionar Yes.

Una vez que termine, repetir y ahora seleccionar Reboot system now.

Así, accederemos a las funciones normales de configuración del nuevo teléfono.

 

 

 

Motorola G5: Cómo iniciar el dispositivo o hacer el hard reset con el botón de Power (Encendido) defectuoso Leer más »

(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) Convertir un número a formato moneda (currency)

JavaScript tiene un formateador de números (parte de la Internationalization API): Intl.NumberFormat

// Create our number formatter.
var formatter = new Intl.NumberFormat('en-US', {
  style: 'currency',
  currency: 'USD',

  // These options are needed to round to whole numbers if that's what you want.
  //minimumFractionDigits: 0, // (this suffices for whole numbers, but will print 2500.10 as $2,500.1)
  //maximumFractionDigits: 0, // (causes 2500.99 to be printed as $2,501)
});

formatter.format(2500); /* $2,500.00 */

Usar undefined en lugar del primer argumento (‘es-MX’ en el ejemplo) para usar el system locale (el «user locale» en caso de que el código esté corriendo en un navegador).

Aquí hay una lista de los «currency codes«.

Código listo para usar (poner dentro del script antes de cualquier número que vaya a desplegarse):

var formatter = new Intl.NumberFormat('en-US', {
  style: 'currency',
  currency: 'USD',
});

Para formatear lo deseado:

formatter.format(colocar aquí el número o expresión numérica a formatear);
formatter.format(2500); /* $2,500.00 */

Fuente: StackOverflow

(Javascript) Convertir un número a formato moneda (currency) Leer más »