
Asociación Española de la Malformación de Chiari y patologías relacionadas
Asociación Nacional Amigos de Arnold Chiari -ANAC-
El síndrome de Klippel-Feil (SKF) es una afección ósea poco frecuente que se presenta desde el nacimiento (congénita). Su característica principal es la fusión anormal de dos o más vértebras cervicales (las siete vértebras del cuello).
Aquí te presento un resumen claro de lo que implica esta condición:
La Tríada Clásica de Síntomas
Aunque no todos los pacientes presentan los tres signos, la descripción clásica incluye:
- Cuello corto: Lo que puede dar la apariencia de que la cabeza está conectada directamente a los hombros.
- Línea de implantación del cabello baja: En la parte posterior de la cabeza.
- Rango de movimiento limitado: Una marcada dificultad para girar o inclinar el cuello.
Dato importante: Menos del 50% de las personas con SKF presentan los tres signos mencionados simultáneamente.
Clasificación del Síndrome
Los médicos suelen categorizar el síndrome en tres tipos principales, según la extensión de la fusión:
- Tipo I: Fusión masiva de muchas vértebras cervicales y, a veces, de las vértebras torácicas superiores.
- Tipo II: Fusión de solo uno o dos pares de vértebras (es el más común).
- Tipo III: Fusión cervical combinada con anomalías en las vértebras de la parte baja de la espalda (torácicas o lumbares).
Problemas Asociados
Dado que el SKF ocurre durante el desarrollo embrionario temprano, a menudo viene acompañado de otras anomalías en otros sistemas del cuerpo:
- Escoliosis: Curvatura lateral de la columna.
- Deformidad de Sprengel: Un omóplato (escápula) más elevado que el otro.
- Problemas auditivos: Pérdida de audición en aproximadamente el 30% de los casos.
- Anomalías renales: Ausencia de un riñón o malformaciones en el sistema urinario.
- Problemas cardíacos: Defectos en el tabique o válvulas del corazón.
- Siringomielia: Formación de quistes llenos de líquido en la médula espinal.
Diagnóstico y Tratamiento
El diagnóstico suele confirmarse mediante estudios de imagen como radiografías, tomografías computarizadas (TC) o resonancias magnéticas (RM) para evaluar la estabilidad de la columna y el impacto en el sistema nervioso.
¿Cómo se maneja?
No existe una cura para la fusión ósea, por lo que el tratamiento se centra en manejar los síntomas y prevenir complicaciones:
- Fisioterapia: Para fortalecer los músculos del cuello y mejorar el rango de movimiento.
- Manejo del dolor: Mediante analgésicos o terapias físicas.
- Cirugía: Solo se considera si existe una inestabilidad grave en la columna, dolor crónico severo o compresión de la médula espinal que ponga en riesgo la movilidad.
- Precauciones: Se suele recomendar evitar deportes de contacto (como el fútbol americano o el rugby) para prevenir lesiones traumáticas en una columna que ya es vulnerable.
{source}<?php
defined('_JEXEC') or die('Acceso restringido');
function generarThumbnailJoomla($url, $nombreArchivo, $ancho = 800) {
$rutaDestino = JPATH_SITE . '/images/thumbnails/noticias/' . $nombreArchivo;
if (!is_writable(JPATH_SITE . '/images/thumbnails/noticias/')) {
return "Error: La carpeta /images/thumbnails/noticias/ no tiene permisos de escritura.";
}
$urlLimpia = trim($url);
if (!preg_match("~^(?:f|ht)tps?://~i", $urlLimpia)) {
$urlLimpia = "http://" . $urlLimpia;
}
$urlLimpia = str_replace(' ', '%20', $urlLimpia);
$apiUrl = "https://api.apiflash.com/v1/urltoimage?access_key=5073ba864a4640458fc659013ecb2ae3&width=1920&format=webp&height=1920&thumbnail_width=1024&no_cookie_banners=true&no_ads=true&no_tracking=true&user_agent=Mozilla%2F5.0%20(Windows%20NT%2010.0%3B%20Win64%3B%20x64)%20AppleWebKit%2F537.36&fail_on_status=400%2C404%2C500-511&url=" . urlencode($urlLimpia);
$ch = curl_init($apiUrl);
$fp = fopen($rutaDestino, 'wb');
if (!$fp) {
return "Error: No se pudo crear el archivo.";
}
// --- SOLUCIÓN AL DEADLOCK (Autobloqueo) ---
if (session_status() === PHP_SESSION_ACTIVE) {
session_write_close();
}
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// Reducimos el timeout
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36');
curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curlError = curl_error($ch);
curl_close($ch);
fclose($fp);
if ($httpCode == 200 && file_exists($rutaDestino) && filesize($rutaDestino) > 1000) {
if (@getimagesize($rutaDestino) !== false) {
return true;
}
}
@unlink($rutaDestino);
if (strpos($curlError, 'timed out') !== false) {
return "Error: La API tardó demasiado (Timeout).";
}
return "Error API (HTTP " . $httpCode . "). " . $curlError;
}
date_default_timezone_set('UTC');
$db = \Joomla\CMS\Factory::getContainer()->get('DatabaseDriver');
$app = \Joomla\CMS\Factory::getApplication();
// --- CONFIGURACIÓN DE LÍMITES Y PAGINACIÓN ---
$maxRegistrosAbsolutos = 32; // LÍMITE ESTRICTO DE RESULTADOS EN TOTAL
$limitePorPagina = 32; // 32 elementos = 8 filas exactas de 4 columnas
$paginaActual = $app->input->getInt('pagina', 1);
if ($paginaActual < 1) $paginaActual = 1;
// 1. Obtener el total de registros en la base de datos (SIN WHERE)
$queryTotal = $db->getQuery(true);
$queryTotal->select('COUNT(*)')->from($db->quoteName('noticiaseerr'));
$db->setQuery($queryTotal);
$totalRegistrosReales = (int) $db->loadResult();
// CORTAR el total de registros al límite máximo de 48
$totalRegistros = min($totalRegistrosReales, $maxRegistrosAbsolutos);
$totalPaginas = ceil($totalRegistros / $limitePorPagina);
// Seguridad: Si alguien fuerza una página mayor en la URL, ajustarla a la última válida
if ($paginaActual > $totalPaginas && $totalPaginas > 0) {
$paginaActual = $totalPaginas;
}
// Calcular Offset
$offset = ($paginaActual - 1) * $limitePorPagina;
// Calcular cuántos registros pedir exactamente en la página actual para no pasarse de 48
$registrosAPedir = min($limitePorPagina, $totalRegistros - $offset);
// 2. Obtener los registros limitados (SIN WHERE)
$resultados = [];
if ($registrosAPedir > 0) {
$query = $db->getQuery(true);
$query->select($db->quoteName(['fecha', 'titular', 'url', 'enfermedad']))
->from($db->quoteName('noticiaseerr'))
->where($db->quoteName('enfermedad') . ' = ' . $db->quote('Síndrome de Klippel-Feil aislado'))
->order($db->quoteName('fecha') . ' DESC, ' . $db->quoteName('nid') . ' DESC')
->setLimit($registrosAPedir, $offset);
$db->setQuery($query);
$resultados = $db->loadObjectList();
}
echo "<h2>Últimas noticias</h2>";
if ($resultados) {
// --- CONTENEDOR GRID DE 4 COLUMNAS ---
echo "<div style='display: grid; grid-template-columns: repeat(4, 1fr); gap: 20px; margin-bottom: 30px;'>";
$nt = $offset + 1;
foreach ($resultados as $row) {
$urlObjetivo = $row->url;
$nombreImagen = "thumb_" . md5($urlObjetivo) . ".webp";
$rutaDestino = JPATH_SITE . '/images/thumbnails/noticias/' . $nombreImagen;
$urlImagen = \Joomla\CMS\Uri\Uri::root() . "images/thumbnails/noticias/" . $nombreImagen;
// Estilos para cada "celda" de la tabla/grid
echo "<div style='display: flex; flex-direction: column; font-size:14px; padding:15px; border: 1px solid #eaeaea; border-radius: 8px; background-color: #fcfcfc;'>";
echo "<div style='color: #666; font-size: 12px; margin-bottom: 8px;'><strong>#" . $nt . " | " . $row->fecha . "</strong></div>";
echo "<div style='flex-grow: 1; margin-bottom: 15px;'>";
echo "<a href='" . $urlObjetivo . "' target='_blank' style='text-decoration:none; font-weight:bold; color: #0056b3; line-height: 1.3;'>";
echo htmlspecialchars($row->titular) . "</a></div>";
$logError = "";
if (!file_exists($rutaDestino)) {
$status = generarThumbnailJoomla($urlObjetivo, $nombreImagen, 800);
if ($status !== true) {
$logError = $status;
}
}
if (file_exists($rutaDestino)) {
$imgSrc = $urlImagen . "?v=" . filemtime($rutaDestino);
echo "<a href='" . $urlObjetivo . "' target='_blank' style='display:block; text-align:center;'>";
echo "<img src='" . $imgSrc . "' style='width: 100%; height: auto; object-fit: cover; border: 1px solid #ccc; border-radius: 4px; box-shadow: 0 2px 4px rgba(0,0,0,0.1);'>";
echo "</a>";
} else {
echo "<div style='background: #ffe3e3; padding: 10px; border-radius: 4px;'><span style='color:#d9534f; font-size:11px; font-weight:bold;'>[" . $logError . "]</span></div>";
}
echo "</div>";
$nt++;
}
echo "</div>"; // Cierra el Grid
// --- RENDERIZAR NAVEGACIÓN DE PAGINACIÓN ---
if ($totalPaginas > 1) {
$uri = \Joomla\CMS\Uri\Uri::getInstance();
echo "<div style='text-align: center; margin-top: 20px; font-family: sans-serif;'>";
// Botón Anterior
if ($paginaActual > 1) {
$uri->setVar('pagina', $paginaActual - 1);
echo "<a href='" . $uri->toString() . "' style='display: inline-block; padding: 8px 12px; margin: 0 4px; background: #eee; color: #333; text-decoration: none; border-radius: 4px;'>« Anterior</a>";
}
// Números de Página
for ($i = 1; $i <= $totalPaginas; $i++) {
$uri->setVar('pagina', $i);
$estiloActivo = ($i == $paginaActual) ? "background: #0056b3; color: white;" : "background: #eee; color: #333;";
echo "<a href='" . $uri->toString() . "' style='display: inline-block; padding: 8px 12px; margin: 0 4px; text-decoration: none; border-radius: 4px; " . $estiloActivo . "'>" . $i . "</a>";
}
// Botón Siguiente
if ($paginaActual < $totalPaginas) {
$uri->setVar('pagina', $paginaActual + 1);
echo "<a href='" . $uri->toString() . "' style='display: inline-block; padding: 8px 12px; margin: 0 4px; background: #eee; color: #333; text-decoration: none; border-radius: 4px;'>Siguiente »</a>";
}
echo "</div>";
}
} else {
echo "<p>No hay noticias disponibles.</p>";
}
?>{/source}