Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   PHP (https://www.clubdelphi.com/foros/forumdisplay.php?f=15)
-   -   Función en JavaScript no admite código php (https://www.clubdelphi.com/foros/showthread.php?t=92838)

jhonalone 18-02-2018 19:27:28

Función en JavaScript no admite código php
 
Hola a todos.
Partimos de la base de que no soy experto en HTML/JS/PHP.
Puede que veáis barbaridades en mi código.

Mi idea es comprobar un número de licencia que tengo en un fichero de texto, con una colección de ellas, con el texto introducido en un TextArea de un formulario.

Tengo un par de formularios que superpongo según interese.

En varias ocasiones, ya he hecho algo similar, combinando HTML/JS/PHP (Podéis ver un ejemplo en mi hilo anterior en este foro)

Sin embargo, en esta ocasión, intentando hacer algo parecido, NO ADMITE CÓDIGO PHP en una función de JS. No puedo entender ¿por qué?

Os dejo el código que estoy probando bastante comentado, para que entendáis el problema. Agradecería que alguien me sacara de dudas.

Código PHP:


</head>
<body leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" >


<script type="text/javascript">

function Si_Desc_y_Licen(){
    var siono=true;
    var frm1=document.una;
    var frm2=document.dos;
    var frm3=document.tres;
    
    
// Si está visible el formulario frm1
if (frm1.style.display.valueOf()=="block")
    {  
    var indice = (document.getElementById('sele1')).selectedIndex;
    if (indice > 2) // sele1 es un select con varias opciones
        {    
                // Comprobamos si existe la licencia en el fichero .usd
                if (frm3.Old_Licencia.value.length !=16) // Longitud incorrecta
                    {
                    alert("Debe completar la clave de la licencia con 16 números y/o letras");
                    frm3.Old_Licencia.focus();
                    siono = false; // Esta condición funciona perfectamente
                    }
                else
                    {
                        if (indice == 3)
                        {siono = false; 
                        // AQUI ESTÁ EL PROBLEMA (de aquí para abajo no está comprobado
                        return  Bonificar_W(frm3.Old_Licencia.value); // texto del TextArea
                        }
                        else
                        {siono = false; 
                            //siono = Bonificar_M(frm3.Old_Licencia.value);
                        }
                    if (!siono) // La licemcia no está o ya está usada
                        {
                            alert("El número de licencia tecleado, no se ha instalado todavía o es erróneo.");
                            siono = false;
                            frm3.Old_Licencia.focus();
                        }
                    
                    }
         }    
    };
    
// Si  está visible el formulario frm2
if (frm2.style.display.valueOf()=="block")
    { 
    siono = false; // Para probar
    };
    
if (!siono){
           alert("No se pueden confirmar los datos."); // Para pruebas, luego lo quitaré       
           return false;
           }
if (siono) return true;    
};


function HazArrayM_usd(licencia)
{
datos = new Array ();// Creamos el array de JS     

<?php
// Aquí leemos un fihero de texto en php y rellenaríamos el array datos de javascript y comprobamos
// licencia de una forma parecida a la solución (que funciona) propuesta en mi hilo anterior en este foro
// FALLA solamente con poner los corchetes de PHP, sin escribir ningún código
?>

    //Comprobaremos la licencia en el array de JS pero no llega el código hasta aquí
    // el código <?php ?> no lo admite     
    
return false;            

};
function Bonificar_W(licencia) 
                       
{
var siono = false;
HazArrayM_usd(licencia);
// Da error en HazArrayM_usd y ya no muestra el alert que está a continuación de esta línea código php en la función (aunque esté vacío)
 HazArrayM_usd(licencia);
    alert( "La longitud de datos es: "+datos.length);
    
    //Comprobamos la licenciia en el array de JS    
    
return false;                    
};
</script>

Gracias anticipadas, sólo por leer mi texto.
Saludos.

dec 18-02-2018 19:56:29

Hola a todos,

El problema es sencillo: PHP es un lenguaje que se ejecuta en el servidor, y, Javascript (en este caso) es un lenguaje que se ejecuta en el cliente. Por tanto, no puedes, simplemente, mezclar código PHP y Javascript, porque, estos se ejecutan en ámbitos diferentes.

Por "combinar" PHP y Javascript tal vez entiendes algo así como que un script PHP produzca código Javascript. Ciertamente, esto es posible, pero, el código Javascript que prepares en un script PHP siempre se ejecutará en el cliente.

Eso, por decirlo así, no deberíamos llamarlo "combinar", pues, como digo, no puedes usar funciones de Javascript en PHP ni tampoco hacer lo propio a la viceversa.

Entonces, ¿qué puede hacerse? Lo que puede hacerse hacer "llamadas HTTP" al servidor desde Javascript. O sea, lo que se ha dado en llamar "AJAX". Desde Javascript, puedes hacer una "llamada HTTP" a cierto script PHP, pudiendo enviar argumentos a dicho script PHP, y, reaccionando adecuadamente a su respuesta.

Pero, eso es una cosa, y, mezclar (mejor que combinar) código Javascript y PHP es otra muy diferente, como he dicho, imposible, pues ambos lenguajes se ejecutan en diferentes ámbitos: uno en el cliente y el otro en el servidor.

jhonalone 18-02-2018 20:24:22

Muchas gracias, Dec por responder y...¡tan pronto! y...¡en domingo!

Nunca he usado Ajax. (Aunque he oído hablar mucho de él) A lo mejor es más sencillo de lo que me imagino. ¿Tengo entendido que hay que subir algunos scripts a la web? ¿o me confundo con otra cosa?

Bueno, que php se ejecuta en el servidor y JS en el lado del cliente, ya lo sé. Y "combinarlos" no es tarea fácil (y en algunas circunstancias, IMPOSIBLE)

No obstante, hay algunas combinaciones posibles, quizá no recomendables, pero posibles.

Te copio una función, que estoy usando y que funciona correctamente. Y que lo que pretendo hacer es prácticamente lo mismo. Es la función a la que me refería en mi hilo anterior en este foro. Quizá no sea muy elegante, pero funciona.

Código PHP:

<script> 

// creamos la matriz 
function HazArray() 

 datos = new Array ();  

<?php         
php 
  define 
('ARCHIVO_DATOS''fichero.txt'); 

  if (!
file_exists(ARCHIVO_DATOS)) // Aviso si no encuentra el fichero 
    
die ('<pre>no encuentro el fichero "'.ARCHIVO_DATOS.'".</pre>'); 
  
$fa2 file(ARCHIVO_DATOS); // leemos todo el fichero en un array php 
  
if ($fa2 === FALSE// Aviso si no recibió los datos del fichero 
    
die ('<pre>No pude leer el fichero "'.ARCHIVO_DATOS.'".</pre>'); 

    
$size count($fa2);     
     
for(
$i=0$i<$size$i++)  
    {         
    
$fa2[$i] = utf8_encode($fa2[$i]); 
    
$text explode("|",rtrim($fa2[$i]));     
    
?> 
     
    datos.push(<?php echo json_encode($text);?>); 
     
    <?php     
    

?>                         


//El select queda así 
 <select name="Nombres" size="50" id="Nombres" onChange="Rellenar()" > </select> 

// Actualizamos los datos del formulario 
function Rellenar() 
{     
indice = (document.getElementById('Nombres')).selectedIndex; 

document.encuesta.item01.value = datos[indice][0]; 
document.encuesta.item02.value = datos[indice][1]; 
document.encuesta.item03.value = datos[indice][2]; 
document.encuesta.item04.value = datos[indice][3]; 
document.encuesta.item05.value = datos[indice][4]; 
document.encuesta.item06.value = datos[indice][5]; 
document.encuesta.item07.value = datos[indice][6]; 
document.encuesta.item08.value = datos[indice][7]; 
document.encuesta.item09.value = datos[indice][8]; 
document.encuesta.MultiText1.value = datos[indice][9]; 
document.encuesta.MultiText2.value = datos[indice][10]; 
document.encuesta.MultiText3.value = datos[indice][11]; 
document.encuesta.email.value = datos[indice][13]; 
     


</script>

La función a que me refiero es "HazArray()"

Lo que pretendo hacer es usarla con otro nombre de archivo. El problema está en que, no sé por qué no me permite usarla en esta parte del código, para rellenar un array parecido.

Gracias, por tu interés.
Un saludo.

jhonalone 18-02-2018 20:59:41

Hola a todos.
Dec, no te quiebres la cabeza, soy un cazurro. Llevo con esto 2 días completos. Pero probando en casa, ahora acabo de probarlo en el servidor, y parece que SI QUE FUNCIONA. Nunca lo hubiera imaginado. Ya lo se.
Mis disculpas. Saludos.

dec 18-02-2018 21:02:57

Hola a todos,

Lo que tú haces en el código PHP que muestras es preparar, por decirlo así, cierto código Javascript. Eso es perfectamente posible, ahora bien, dicho Javascript se ejecutará ya en el cliente, y, ahí PHP no tiene nada que hacer (no hay intérprete de PHP en el cliente). Es decir, resumiendo, no puedes usar una función de PHP en código Javascript, ni tampoco lo contrario. Digamos que lo que muestras podemos llamarlo "combinar", y, eso, es posible, pero, lo que no podrás hacer es "mezclar" código PHP y Javascript.

Tendrás que investigar sobre "AJAX", puesto que no hay otra forma de, desde Javascript, ejecutar un script de PHP y conocer su resultado. Esto sería parecido a "llamar a una función de PHP en Javascript", pero, no es exactamente así: en realidad se hace una llamada HTTP al servidor, donde se ejecuta un script PHP, que, retorna un resultado, que, puede aprovecharse en Javascript. Pero hay que pasar por todo esto, no puedes, simplemente, ejecutar una función de PHP desde Javascript.


La franja horaria es GMT +2. Ahora son las 13:53:25.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi