> Faqs > Cambiar color de celda de una tabla con PHP

Cambiar color de celda de una tabla con PHP

Hola, espero que me puedas ayudar con este tema.

Tengo una tabla que he cargado previamente con un archivo importar.php. EN esta tabla tengo varios campos de fecha, y uno de ellos fechaRecep que es fecha recepción que está vacio hasta que el registro se edita y se introduce una fecha. Lo que me gustaría es que campo estuviese en rojo mientras está vacio y cambiase a verde cuando existe una fecha.

Yo he hecho esto, pero no me ha funcionado:

<p>Resultados <?php echo $datos->num_rows; ?></p>
	</br>
    	<div class="row table-responsive">
	<table class="display" id="mitabla" border="1"  style="width:100%" >

	<thead style='background-color:#292929;'>
	    
		 <tr>   
	    	<th align="left"><font color=#FFFFFF>N&#186; Cliente</th>
		<th align="left"><font color=#FFFFFF>Nombre completo</th>
		<th align="left"><font color=#FFFFFF>Zona de Ventas</th>
		<th align="left"><font color=#FFFFFF>Ramo</th>
		<th align="left"><font color=#FFFFFF>Tipo Contrato</th>
		<th align="left"><font color=#FFFFFF>Fecha Env&#237;o</th>
		<th align="left"><font color=#FFFFFF>Fecha Actual</th>
		<th align="left"><font color=#FFFFFF>Fecha Recepci&#243;n</th>
		<th align="left"><font color=#FFFFFF>Contador &#40;Fechas&#41;</th>
		<th align="left"><font color=#FFFFFF>Comentarios </th>
		<th align="left"><font color=#FFFFFF>Anexo Contrato</th>
		<th align="left"><font color=#FC0A0A>Anexo Distrib. &#40;Escalado&#41;</th>
		<th align="left"><font color=#FC0A0A>Anexo Distrib. &#40;&#37; Bonus&#41;</th>
		<th align="left"><font color=#FFFFFF>Anotaciones Internas</th>
		<th align="left"><font color=#FFFFFF>Anexo Interno</th>
		<th align="center"><font color=#FFFFFF>Editar</th>
		<th align="center"><font color=#FFFFFF>Borrar</th>
		<th align="center"><font color=#FFFFFF>Guardar</th>
	    	</tr>
	</thead>

	<?php while($d= $datos->fetch_object()):?>
    
        	<tr>
		<td align="left"><?php echo $d->noCliente; ?></td>
		<td align="left"><?php echo $d->nombreCliente;?></td>
		<td align="left"><?php echo $d->zv; ?></td>
		<td align="left"><?php echo $d->ramo; ?></td>
		<td align="left"><?php echo $d->tipoContr ; ?></td>
		<td align="right"><?php echo $d->fechaEnvio; ?></td>
		<td align="right"><?php echo $d->fechaActual; ?></td>
		<td align="right"><?php
		if($d->fechaActual == 0) {
  		echo '<span style="color:green">' . $d->fechaActual . '</span>';
		} else {
  		echo '<span style="color:red">' . $d->fechaActual . '</span>';
		}
		?></td>
		<td align="left"><?php echo $d->contador; ?></td>
		<td align="left"><?php echo $d->comentarios; ?></td>
		<td align="left"><?php echo $d->anexo; ?></td>
		<td align="left"><?php echo $d->anexoDistrEscal; ?></td>
		<td align="left"><?php echo $d->anexoDistrBonus; ?></td>
		<td align="left"><?php echo $d->anotaciones; ?></td>
		<td align="left"><?php echo $d->anexoInter; ?></td>
		<td align="center"><a href="modificarContrPend.php?id_contrpen=<?php echo $d-> id_contrpen; ?>"><span class="glyphicon glyphicon-pencil"></span></a></td>
		<td align="center"><a href="#" data-href="eliminarContrPend.php?id_contrpen=<?php echo $d->id_contrpen; ?>" data-toggle="modal" data-target="#confirm-delete"><span class="glyphicon glyphicon-trash"></span></a></td>
		<td align="center"><a href="modificarContrPendBackup.php?id_contrpen=<?php echo $d->id_contrpen; ?>" ><span class="glyphicon glyphicon-floppy-disk"></span></a></td>
		</tr>

		<?php endwhile; ?>
    		</table>
   
        <?php else:?>
	    <h3>No hay Datos</h3>
        <?php endif; ?>
    	</div>

Espero que puedas ayudarme, al menos a ver el error o a entenderlo mejor. Gracias de antemano

Respuestas

El código está aparentemente bien, excepto por la condición del if.

Actualmente tienes esto:

if($d->fechaActual == 0) {
  	echo '<span style="color:green">' . $d->fechaActual . '</span>';
} else {
  	echo '<span style="color:red">' . $d->fechaActual . '</span>';
}

Pero habría que preguntarse ¿Qué es lo que hay en el campo fechaActual de la base de datos?. Porque tú estás dejando entender con este código que en el registro debería haber un cero para que se mostrase en verde. Quizás en tu caso, como en el campo de fechaActual nunca va a haber un cero, siempre te lo pone de color rojo? Porque supongo que el valor cero no debe ser el que tendrás en la columna cuando nadie ha colocado la fecha. Podría ser algo como null, quizás la fecha 0000-00-00, quizás la cadena vacía. Depende mucho de cómo se haya definido la base de datos, pero no has indicado este detalle al formular tu pregunta.

Como digo, aquí depende del valor predeterminado que hay en la columna fechaActual cuando está "vacío". Si hubiera un valor "null", tendrías que poner algo como esto:

if(is_null($d->fechaActual)) {
    echo '<span style="color:red">' . $d->fechaActual . '</span>';
} else {
   echo '<span style="color:green">' . $d->fechaActual . '</span>';
}

Nota: he cambiado el sentido de la condición. Ahora en caso positivo del if se entiende que el campo estaba vacío y por eso se le coloca con color de fondo en verde. Espero que esto no te líe.

En cualquier caso, tendrás que investigar algo para resolverlo, aunque espero haberte orientado.

¿Color de la celda o color del texto?

Hay un detalle importante en esta pregunta. Se hace referencia al color de la celda, pero tal como se ha enfocado el código original, lo que estamos modificando es el color del texto de la celda y no la celda en si.

Si se desea que se cambie el color del fondo de la celda, entonces el código sería otro.

<td align="right"
    <?php
		if($d->fechaActual == 0) {
  		    echo ' style="background-color: green; color: white;"';
		} else {
  		    echo ' style="background-color:red; color: white;"';
		}
	?>
><?= $d->fechaActual ?></td>

Como se puede ver, la diferencia es que estamos indicando el atributo style sobre la etiqueta <td> de la celda, en lugar de sobre el <span> del contenido de la celda.

Consideraciones importantes:

  • El código PHP de estos ejemplos es bastante pobre. Se están cayendo en varios antipatrones. El más importante es que se está mezclando todo el código de las distintas responsabilidades. Sería importantísimo trabajar con algún sistema de templates, para no mezclar el HTML con el PHP. O si es posible aplicar MVC.
  • El CSS no se aconseja aplicar en las mismas etiquetas. Eso es lo que se conoce como un "CSS inline" y es también un antipatrón. Lo ideal sería tener clases (class CSS) que puedes usar para destacar como error o como válido cualquier dato.

Los antipatrones de este estilo de código puede que te funcionen, pero te van a dar serios problemas en el futuro para el mantenimiento de las aplicaciones. Esto es algo que no vemos tanto en DesarrolloWeb.com, pero que sí que tratamos con mucha fuerza en los cursos de EscuelaIT, que te recomiendo seguir, para poder aprender las buenas prácticas y generar aplicaciones mucho más robustas, seguras, escalables, mantenibles. Lo agradecerás.

Miguel Angel
3145 140 209 17

Hola Miguel Ángel. Gracias por tu respuesta. Me equivoqué con el campo, no era fechaActual, sino fechaRecep. La fecha actual siempre lleva datos, pero fechaRecp no. He cambiado mi código al tuyo y corregido el nombre del campo y me cambia a verde el fondo del dato (cuando hay), pero no la celda entera. No se si me entiendes.

        echo '<span style="background-color:red">' . $d->fechaRecep . '</span>';
        } else {
        echo '<span style="background-color:green">' . $d->fechaRecep . '</span>';
        } ;?></td>
Monica
13 1 4
Monica. Las respuestas a las preguntas no están pensadas para re-preguntar o pedir correcciones. Para eso están los comentarios, como este que estoy publicando. Acabo de editar mi respuesta anterior, para incluir los cambios que solicitas, para cambiar el color de la celda y no el color del texto. Gracias Miguel Angel y disculpa el error.

he leído la pregunta y la respuesta, lo he probado, cambiando, lógicamente, los datos y me funciona, pero necesito que los resultados aparezcan no en horizontal sino en vertical, pretendpo presentar los datos de una propiedad y, dado que son muchos, no me cabrían en la página, sin tener en cuenta que, algunos, como podría ser "descripción de la propiedad", contienen mucho texto y n o se vería bien. ¿alguna sugerencia? gracias.

josé
0
Si quieres que aparezcan en vertical debes usar la etiqueta TR que sirve para iniciar una nueva fila. Mira el manual de HTML la sección de tablas.