Aplicación web en PHP 8 + MySQL + JS vanilla + Tailwind CDN, pensada para DreamHost compartido (LAMP).
public/index.php: front controller y router.app/config.php,app/db.php,app/auth.php,app/helpers.php.app/controllers/*: Auth, Teacher, Team, Participant.app/views/*: vistas PHP.public/assets/app.js: UI drag&drop y tree testing.db/schema.sql: esquema completo.db/seed.sql: profesor inicial.
- Crear DB MySQL y usuario desde panel DreamHost.
- Subir repositorio al hosting.
- Configurar variables de entorno (o editar
app/config.php):DB_HOST,DB_NAME,DB_USER,DB_PASS,BASE_URL.
En app/config.php el fallback actual es:
'base_url' => getenv('BASE_URL') ?: '/ux-tools',Guía rápida:
- Local con URL raíz (
http://localhost:8000): usarBASE_URL=(vacío) o'base_url' => ''. - Local en subcarpeta (
http://localhost/ux-tools/public): usarBASE_URL=/ux-tools/public. - Servidor con Document Root apuntando a
/public(recomendado): usarBASE_URL=(vacío). - Servidor sin cambiar Document Root y fallback con
/.htaccess: usarBASE_URL=/ux-tools.
Regla práctica: BASE_URL debe coincidir con el prefijo visible antes de tus rutas (/login, /teacher, /p/{token}) en el navegador.
4. Importar SQL:
mysql -uUSER -p DB_NAME < db/schema.sqlmysql -uUSER -p DB_NAME < db/seed.sql
- Acceder a
/logincon:admin@local.test/Admin123!
Si ya importaste una seed anterior y el login devuelve siempre "Credenciales inválidas", actualiza el hash del admin (la seed inicial previa tenía un hash inválido):
UPDATE users
SET password_hash = "$2y$12$.p32IhkcaGBpX3KV09XTzuX/ldGeT83Nz2dr.jStFoF3fycrpBtWi",
is_active = 1
WHERE email = "admin@local.test";En DreamHost Panel:
- Websites → Manage Websites → Edit tu dominio.
- En Web Directory, apunta al directorio
.../ux_tools/public. - Guarda cambios.
Con eso, Apache servirá directamente public/index.php y los assets de public/assets/*.
Este repo incluye:
/.htaccess(raíz): reescribe todo hacia/public./public/.htaccess: reescribe rutas limpias haciapublic/index.php.
Así puedes dejar el dominio apuntando al directorio raíz del proyecto y aun así enrutar correctamente.
Importante: si puedes elegir, usa la Opción A porque reduce exposición accidental de archivos fuera de
/public.
Si las rutas limpias no funcionan (/login, /teacher, etc.):
- Confirma que
.htaccessestá permitido en tu hosting (DreamHost normalmente sí). - Revisa que no haya un
.htaccessde nivel superior sobrescribiendo reglas. - Prueba temporalmente abrir
/index.phppara confirmar que PHP sí ejecuta.
- Activación de estudiantes por token (
/activate/{token}) y QR fallback. - Profesor: CRUD grupos/equipos, importación CSV, plantillas, asignación masiva por equipo.
- Equipos: configuran y publican instancia, comparten edición, ven resultados y export CSV.
- Participantes externos:
/p/{token}sin login. - Card Sorting: open/closed/hybrid, validación server-side de tarjetas obligatorias.
- Tree Testing: captura selección, path_text y tiempo por tarea.
- Seguridad mínima:
password_hash, CSRF en panel interno, prepared statements, escaping.
- Card Sorting asignaciones:
card_assignments.csv - Card Sorting similitud:
card_similarity.csv - Tree Testing respuestas:
tree_testing.csv