En Javascript pasar una variable de la ventana principal a una ventana secundaria

2,460 views
Skip to first unread message

Joseanros

unread,
Jan 31, 2013, 9:20:35 AM1/31/13
to cakep...@googlegroups.com
Hola amigos,
 
Os presento uno de mis conflictos de programacion.
Dentro de una aplicacion cakephp, pongo el siguiente link:
 
<a href="#" onClick="abrir_ventana()">Descripcion</a> a href="#" onClick="abrir_ventana()">Descripcion</a>
 
He definido previamente la funcion:
 
  <script type="text/javascript">;
     
     function abrir_ventana()
     {
      var ventanades = null;
      ventanades=window.open("","ventanajs","width=300,height=500,scrollbars=yes")
     } 
        </script>
 
 
Hasta aqui, todo bien. Me abre la ventana vacia al clickar en el enlace Descripcion.
En esta ventana, quiero que aparezca el valor de una variable que contiene el campo de una tabla.
Intento pasarlo de esta forma. Esta linea la coloco inmediatamente despues de la instruccion onclick:
 
ventanades.document.write(<?php echo $descri ?>)
 
Y nada, me sale la pantalla mujy chunga, pero vacia de contenido.
 
Curiosamente, si sustituyo esta instruccion por sentencias  alert, me funciona perfectamente, pero no es lo que yo quiero.
Al ser un campo descripcion, quiero usar una pantalla auxiliar.
 
Lo siento, amigos, no doy con ello.
De antemano muchas gracias.
Jose Antonio
 
 

Aland Laines

unread,
Jan 31, 2013, 9:51:40 AM1/31/13
to cakep...@googlegroups.com
Hola Jose yo lo que hago es

<button id="calificar" class="btn btn-warning" type="button" onClick="window.open('/postulantes/postulantes/calificar/<?php echo h($postulante['Postulante']['id']); ?>','Calificar','menubar = no, toolbar = no, scrollbars = yes, width = 600, height = 800')">Calificar</button>

Lo que hago es abrir una ventana que llama a accion calificar del controlador postulantes y le paso el valor de h($postulante['Postulante']['id']), obviamente tengo la vista de la ventana en /view/postulantes/calificar.ctp.

Espero te sirva.

Aland

Aland Laines Calonge
Twitter: @lainessolutions


 
 

--
Has recibido este mensaje porque estás suscrito al grupo "CakePHP en Español" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a cakephp-esp...@googlegroups.com.
Para publicar una entrada en este grupo, envía un correo electrónico a cakep...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/cakephp-esp?hl=es.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.
 
 

Joseanros

unread,
Jan 31, 2013, 1:34:32 PM1/31/13
to cakep...@googlegroups.com
Muchas gracias Aland por tu rapida respuesta.
 
Sin embargo, te dire que no he dado con ello.
 
Yo estoy trabajando en una vista.
 
Concretamente, Es una aplicacion de arboles (un hobbie que tengo), y  voy presentando los distintos registros de arboles, con su foto y sus datos.
 El primer dato de esa linea es el titulo del arbol (p.ej. roble). Y aqui es donde hago un linkage (Descripcion) para ir a una pagina auxiliar y enseñar toda la explicacion del arbol en cuestion. (Una leyenda sobre el roble que he fotografiado. Esta leyenda la tengo metida en un campo del registro de arbol, como text)
 
Pero como te digo estoy trabajando en la vista y tengo toda la informacion traida ya desde el controlador.
 
Solo quiero, que dentro de la propia vista, me lleve esa leyenda a la ventana auxiliar.
 
Claro he probado con lo que me has dicho, pero me sale la propia vista, el texto de la leyenda arriba en la URL, etc. No no doy con ello
 
Gracias Aland

Oscar Hernandez

unread,
Jan 31, 2013, 5:23:17 PM1/31/13
to cakep...@googlegroups.com
Hola que tal, hace poco me paso un problema algo similar, aunque lo que yo intentaba era pasar una variable trabajando en ajax jquery y me pasaba que simplemente era que faltaban unas comillas para que me pasara el valor por el evento. 

En tu caso lo tienes asi:

ventanades.document.write(<?php echo $descri ?>)

Prueba simplemente agregar comillas después entre los paréntesis de la siguiente manera:

ventanades.document.write('<?php echo $descri ?>')

Ojala funcione así. Saludos!!!


--

Joseanros

unread,
Feb 1, 2013, 7:16:30 PM2/1/13
to cakep...@googlegroups.com

Joseanros

unread,
Feb 2, 2013, 6:57:26 AM2/2/13
to cakep...@googlegroups.com

Gracias Oscar por tu interes.
 
He probado casi todo y nada, no consigo nada.
 
En la linea ventanades.document.write(<?php echo $descri ?>), he puesto las comillas y nada.
 
Cuando pongo algo de php no me aparece ni siquiera la ventana auxiliar
 
Igualo (<?php echo $descri ?>) a una variable global de javascript  var descri = <?php echo $descri ?> y pongo
 
ventanades.document.write(descri) y  me aparece la ventana sin ningun contenido
 
Si pongo literales me funciona bien
 
Si sustituyo la funcion:
 
por alert, me saca bien el contenido. Claro pero el campo $descri de la base de datos contiene un texto y es muy grande para el alert.
 
Estoy trabajando en una vista dashboard.ctp con el codigo dentro de un div donde no hay  ni head ni body.
 
Esto es:  header.ctp contiene toda la estructura html y linka a dashboard.ctp que es esta vista con la que trabajo
 
En esta vista dashboard.ctp es donde defino la funcion y donde tengo el foreach() para trabajar con los registros de la base de datos. Aqui obtengo el campo $descri que quiero pasar a la funcion.
 Asi que esto me parece de magia. Veo el contenido del campo por todas partes menos en la ventana auxiliar.
 
Algun rayo de luz...............
 
Muchas gracias

romel javier gomez herrera

unread,
Feb 2, 2013, 10:06:54 AM2/2/13
to CakePHP en Español
hola, 

Esta mal escribir php y javascript de esa forma. 

voy a plantear dos posibles soluciones:

1) La url debe indicar lo que se pretende mostrar.   ".com/arboles/ver/1" 

window.open(URL,name,specs,replace)

Debes crear una vista nueva así como también un método. Antes debes crear una ruta nueva en /config/routes.php , la cual va interpretar la acción que pretendes hacer. 



2) Solo si sabes trabajar con jQuery , Implementar un modal, administrar los datos json del registro con una función que detecte la intención de leer mas datos, a la vez actualice el modal, seguidamente lo muestra.  


Como hacerlo: 
para cada registro esconde en un div oculto los datos en formato json, al div le colocas una clase css genérica "json_data", a si como también a el botón "boton_data", todo eso dentro de un div con una clase css genérica ".parent_class". El usuario al hacer click en el botón toma los datos json y procesas la solicitud. 



Funciones útiles:

parents(".parent_class") encuentra el parent element en cualquier nivel que se requiera

.children(".json_data")   


saludos. 

Aland Laines

unread,
Feb 2, 2013, 12:03:17 PM2/2/13
to cakep...@googlegroups.com
Lo mas simple es implementar un nuevo método para la descripción con su nueva vista que se mostrará en la ventana.

Lo del modal que mencionan también es una buena opción y es lo que estila en estos tiempos, si usas el bootstrap de twitter te seria mas fácil.

Un abrazo,

Aland Laines Calonge
Twitter: @lainessolutions


Joseanros

unread,
Feb 2, 2013, 3:39:27 PM2/2/13
to cakep...@googlegroups.com

Joseanros

unread,
Feb 2, 2013, 3:47:14 PM2/2/13
to cakep...@googlegroups.com
Muchas gracias Romel.
 
He conseguido pasar la vista a una ventana emergente con tu opcion 1.
 
Va perfectamente.
 
El unico pero, es que me pasa la vista con el layout que tiene en la aplicacion.
 
Como en el layout, va una barra de menu, pues molesta porque al ver la ventana, tiene opcion de ejecutar otras opciones de ese menu.
 
Yo ahora mismo, no se como quitar el layout de esa ventana emergente.
 
Igual es mucho lio.
 
Si tienes una solucion, te lo agradeceria.
 
Como la aplicacion es un hobbie para mi familia, pues si se puede bien y si no lo mantendria como esta.
 
Se trata de un hobbie de plantas y arboles.
 
De todas formas, Romel, ademas de darme la solucion me has dado la logica y esto es de agradecerte muy mucho.
 
Un saludo
 
Jose Antonio
 

El sábado, 2 de febrero de 2013 16:06:54 UTC+1, Romel Javier escribió:

romel javier gomez herrera

unread,
Feb 2, 2013, 6:08:31 PM2/2/13
to CakePHP en Español
hola

Jose, excelente avance! 
 
Dos posible soluciones al problema del menu en el layout:  

- Definir otro layout al final del método. Y crear otro layout sin el menu. 

$this->render('nombre_de_la_vista','nombre_del_otro_layout_sin_el_menu');

- Otra posible solución es definir una variable en el método la cual al ser detectada en el layout no mostrara el menu.    

public function metodo(){ $this->set('menu',false); } // en el layout if(!isset($menu)){ // significa: ¿si no esta definida la variable menu? observa el signo de negación: ! // no esta definida // muestra el menu }else{ // esta definida // no muestra el menu }


saludos.







   

Joseanros

unread,
Feb 3, 2013, 8:42:36 AM2/3/13
to cakep...@googlegroups.com
Hola Romel,
 
Increible tu aportacion. Muchisimas gracias.
 
Aqui, me falta un punto para entenderte. Y lo explicas de sobra, pero no lo pillo.
 
Me hablas en las dos soluciones del metodo. Esta es la palabra que no se interpretar.
 
Yo tengo el layout default.ctp con:
:
echo $this->element('header',array('title_for_layout' => $title_for_layout,
       'scripts_for_layout' => $scripts_for_layout));
<?php echo $content_for_layout; ?>
 
Lo mando a header.ctp y tengo:
<head>
  <title>Galeria de Fotos
     <?php echo $title_for_layout; ?>
  </title>
</head>
 
<body>
     <?php echo $scripts_for_layout; ?>

     <div class="bar">
           <ul>               
                <li class="browse_category">Seleccionar seccion:</li> 
                
                  <li <?php echo $this->Html->isActiveTab('pages',array('display')); ?>>
                       <?php echo $this->Html->link('Inicio', '/'); ?>
                  </li>
               
                <li <?php echo $this->Html->isActiveTab('fotos',array('view')); ?>>
                    <?php echo $this->Html->link('Galeria Publica', '/dashboard'); ?>
                </li>
                    
                <li><?php echo $this->Html->link('Cerrar Sesion', '/users/logout'); ?></li>
           </ul>
     </div><!-- class=bar -->
 </body>
 
Y de aqui lo mando a la vista dashboard.ctp
 
En el controlador Foto tengo:
 
 function dashboard() {
  $especies = $this->Foto->find('all');     
  $this->set('especies', $this->paginate());
 }

 function view($id = null) {
  $this->idEmpty($id,'index');
  $this->set('foto', $this->Foto->read(null, $id));
 }
 
Y en la vista dashboard.ctp:
 
<div id="main">
<?php  foreach ($especies as $foto):  ?>
   // El codigo de tratamiento del registro
   // y abrir ventana emergente
   <a href="fotos/view/<?php echo $imagen_a;?>" target="_blank" onClick="window.open(this.href, this.target,'width=800,height=500,top=100,left=200,scrollbars=yes'); return false;">Descripcion</a>
                                      
<?php endforeach; ?>
</div>   <!-- end main --
 
Y en la vista view.ctp,  que muestra los campos de registro debajo del layout de la aplicacion
 
Este layout que muestra tambien el menu de la aplicacion, y que es el quiero evitar.
 
Entonces, si voy por tu primera opcion, crearia un layout nuevo header_ventana (p.ej), identico al header.ctp pero sin menu, de acuerdo,  pero donde defino este layout. Dices al final del metodo, pero no se donde.
 
En tu segunda opcion, definir una variable en el metodo (public function metodo(), pero no se donde tampoco definirlo, y detectarla en el layout (tampoco veo donde es).
 
Perdona mi ignorancia, y sobre todo darte tanto la tabarra, pero estoy a un punto de dejar bien la aplicacion.
 
Muchas gracias, Romel
 
Jose Antonio

Joseanros

unread,
Feb 3, 2013, 9:46:39 AM2/3/13
to cakep...@googlegroups.com

El jueves, 31 de enero de 2013 15:20:35 UTC+1, Joseanros escribió:

Aland Laines

unread,
Feb 3, 2013, 10:45:50 AM2/3/13
to cakep...@googlegroups.com
Doc, en la nueva funcion de tu controller despues del 

$this->set('descripcion', $descripcion);

usa esto:

$this->layout = 'ventanas';

donde 'ventanas' es un nuevo archivo dentro de view/layouts llamado ventanas.ctp:

que contendrá:

<?php echo $this->Session->flash(); ?>
<?php echo $this->fetch('content'); ?>

puede personalizar esta nueva plantilla, pero siempre que contenga estas dos linea dentro del body.

Saludos,


Aland Laines Calonge
Twitter: @lainessolutions


--

Joseanros

unread,
Feb 3, 2013, 3:44:05 PM2/3/13
to cakep...@googlegroups.com
Perdona Alain,
 
No entiendo lo de la nueva funcion en mi controller despues de
$this->set('descripcion', $descripcion);
 
Yo lo he colocado en el controller Fotos:
 function view($id = null) {
  $this->idEmpty($id,'index');
  $this->set('foto', $this->Foto->read(null, $id));
$this->layout = 'header_ventana'// Asi le llamo al archivo layout  fotos/views/layouts/headr_ventana.ctp
 }
Y en el archivo header_ventana.ctp, justo antes del </body>
 
<?php echo $this->Session->flash(); ?>
 
 <?php echo $this->fetch('content'); ?>
 
Y me da un fatal error : Call to undefined method View::fetch() en este archivo
 
Creo que lo del controlador no te lo he pillado bien.
 
Muchas gracias, Alain
 
Jose Antonio

Joseanros

unread,
Feb 3, 2013, 7:00:08 PM2/3/13
to cakep...@googlegroups.com
Por fin,
 
Muchas gracias a todos, muy en particular a Romel y Alain, que me habeis ayudado a tope
 
Siguiendo los consejos de Romel he hecho:
 
 
En el controlador, el metodo view he añadido:
 
$this->render('view','header_ventana');   //header_ventana.ctp es el nuevo layut
 
Y en header_ventana.ctp he añadido (porque no estaban)
 
<?php echo $this->Session->flash(); ?>
 
<?php echo $content_for_layout; ?>
 
Y me funciona correctamente.
 
Muchas gracias, insisto
 
Jose Antonio
 

El jueves, 31 de enero de 2013 15:20:35 UTC+1, Joseanros escribió:
Reply all
Reply to author
Forward
0 new messages