Julius'Lab

Web programming

(Javascript) Función para convertir cifras a texto (probar y pulir)

<script>
document.getElementById("numero").addEventListener("keyup",function(e){
    document.getElementById("texto").innerHTML=NumeroALetras(this.value);
});
 
 
function Unidades(num){
 
  switch(num)
  {
    case 1: return "UN";
    case 2: return "DOS";
    case 3: return "TRES";
    case 4: return "CUATRO";
    case 5: return "CINCO";
    case 6: return "SEIS";
    case 7: return "SIETE";
    case 8: return "OCHO";
    case 9: return "NUEVE";
  }
 
  return "";
}
 
function Decenas(num){
 
  decena = Math.floor(num/10);
  unidad = num - (decena * 10);
 
  switch(decena)
  {
    case 1:
      switch(unidad)
      {
        case 0: return "DIEZ";
        case 1: return "ONCE";
        case 2: return "DOCE";
        case 3: return "TRECE";
        case 4: return "CATORCE";
        case 5: return "QUINCE";
        default: return "DIECI" + Unidades(unidad);
      }
    case 2:
      switch(unidad)
      {
        case 0: return "VEINTE";
        default: return "VEINTI" + Unidades(unidad);
      }
    case 3: return DecenasY("TREINTA", unidad);
    case 4: return DecenasY("CUARENTA", unidad);
    case 5: return DecenasY("CINCUENTA", unidad);
    case 6: return DecenasY("SESENTA", unidad);
    case 7: return DecenasY("SETENTA", unidad);
    case 8: return DecenasY("OCHENTA", unidad);
    case 9: return DecenasY("NOVENTA", unidad);
    case 0: return Unidades(unidad);
  }
}//Unidades()
 
function DecenasY(strSin, numUnidades){
  if (numUnidades > 0)
    return strSin + " Y " + Unidades(numUnidades)
 
  return strSin;
}//DecenasY()
 
function Centenas(num){
 
  centenas = Math.floor(num / 100);
  decenas = num - (centenas * 100);
 
  switch(centenas)
  {
    case 1:
      if (decenas > 0)
        return "CIENTO " + Decenas(decenas);
      return "CIEN";
    case 2: return "DOSCIENTOS " + Decenas(decenas);
    case 3: return "TRESCIENTOS " + Decenas(decenas);
    case 4: return "CUATROCIENTOS " + Decenas(decenas);
    case 5: return "QUINIENTOS " + Decenas(decenas);
    case 6: return "SEISCIENTOS " + Decenas(decenas);
    case 7: return "SETECIENTOS " + Decenas(decenas);
    case 8: return "OCHOCIENTOS " + Decenas(decenas);
    case 9: return "NOVECIENTOS " + Decenas(decenas);
  }
 
  return Decenas(decenas);
}//Centenas()
 
function Seccion(num, divisor, strSingular, strPlural){
  cientos = Math.floor(num / divisor)
  resto = num - (cientos * divisor)
 
  letras = "";
 
  if (cientos > 0)
    if (cientos > 1)
      letras = Centenas(cientos) + " " + strPlural;
    else
      letras = strSingular;
 
  if (resto > 0)
    letras += "";
 
  return letras;
}//Seccion()
 
function Miles(num){
  divisor = 1000;
  cientos = Math.floor(num / divisor)
  resto = num - (cientos * divisor)
 
  strMiles = Seccion(num, divisor, "MIL", "MIL");
  strCentenas = Centenas(resto);
 
  if(strMiles == "")
    return strCentenas;
 
  return strMiles + " " + strCentenas;
 
  //return Seccion(num, divisor, "UN MIL", "MIL") + " " + Centenas(resto);
}//Miles()
 
function Millones(num){
  divisor = 1000000;
  cientos = Math.floor(num / divisor)
  resto = num - (cientos * divisor)
 
  strMillones = Seccion(num, divisor, "UN MILLÓN", "MILLONES");
  strMiles = Miles(resto);
 
  if(strMillones == "")
    return strMiles;
 
  return strMillones + " " + strMiles;
 
  //return Seccion(num, divisor, "UN MILLON", "MILLONES") + " " + Miles(resto);
}//Millones()
 
function NumeroALetras(num,centavos){
  var data = {
    numero: num,
    enteros: Math.floor(num),
    centavos: (((Math.round(num * 100)) - (Math.floor(num) * 100))),
    letrasCentavos: "",
  };
  if(centavos == undefined || centavos==false) {
    data.letrasMonedaPlural="PESOS";
    data.letrasMonedaSingular="PESO";
  }else{
    data.letrasMonedaPlural="CENTAVOS";
    data.letrasMonedaSingular="CENTAVO";
  }
 
  if (data.centavos > 0)
    data.letrasCentavos = "CON " + NumeroALetras(data.centavos,true);
 
  if(data.enteros == 0)
    return "CERO " + data.letrasMonedaPlural + " " + data.letrasCentavos;
  if (data.enteros == 1)
    return Millones(data.enteros) + " " + data.letrasMonedaSingular + " " + data.letrasCentavos;
  else
    return Millones(data.enteros) + " " + data.letrasMonedaPlural + " " + data.letrasCentavos;
}//NumeroALetras()
</script>

(Javascript) Función para convertir cifras a texto (probar y pulir) 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 »

(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 »

(Javascript) Crear un string alfanumérico random

<script type="text/javascript">
jQuery(document).ready(function($){ //set a random 9-char key
    var lenght = 9; // lenght of key
    var randomChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz0123456789'; //any string
    var result = '';
    for ( var i = 0; i < lenght; i++ ) { //fills result with 9 random characters from randomChars
            result += randomChars.charAt(Math.floor(Math.random() * randomChars.length));
        }
    return result; // do anything with "result" string
});
</script>

(Javascript) Crear un string alfanumérico random 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 »