lunes, 14 de julio de 2025

Como hacer un login de google en Shopify

📄 Paso 2: Editar el tema Dawn (login.liquid)

Ve a tu panel Shopify:

  1. Online StoreThemes → “Dawn” → Actions → Edit Code

  2. Abre el archivo: sections/main-login.liquid o templates/customers/login.liquid

  3. Agrega este código justo debajo del formulario o donde prefieras mostrar el botón:


<div id="g_id_onload" data-client_id="TU_CLIENT_ID_DE_GOOGLE" data-callback="handleCredentialResponse" data-auto_prompt="false"> </div> <div style="width: 100%; display: flex; justify-content: center; align-items: center; "> <div class="g_id_signin" data-type="standard" data-size="large" data-theme="outline" data-text="sign_in_with" data-shape="rectangular" data-logo_alignment="left" > </div> </div> <script src="https://accounts.google.com/gsi/client" async defer></script> <script> function handleCredentialResponse(response) { // Decodificamos el token JWT const token = response.credential; const payload = JSON.parse(atob(token.split('.')[1])); const email = payload.email; const name = payload.name; // Guardar temporalmente en localStorage localStorage.setItem("google_email", email); localStorage.setItem("google_name", name); // Redirigir al registro window.location.href = "/account/register"; } </script>

🧩 Paso 3: Prefill en /account/register (opcional)

  1. Edita el archivo customers/register.liquid

  2. Agrega este script al final del archivo:


<script> document.addEventListener("DOMContentLoaded", function() { const email = localStorage.getItem("google_email"); const name = localStorage.getItem("google_name"); if (email) { const emailField = document.querySelector('input[name="customer[email]"]'); if (emailField) emailField.value = email; } if (name) { const firstNameField = document.querySelector('input[name="customer[first_name]"]'); if (firstNameField) firstNameField.value = name.split(" ")[0]; const lastNameField = document.querySelector('input[name="customer[last_name]"]'); if (lastNameField) lastNameField.value = name.split(" ").slice(1).join(" "); } }); </script>

Esto rellena automáticamente el formulario de registro con el nombre y correo que el usuario usó en su cuenta de Google.


✅ Resultado final

  • El usuario ve el botón “Sign in with Google”

  • Al hacer clic:

    • Se captura su nombre y correo electrónico

    • Se le redirige a /account/register

    • Se rellena el formulario automáticamente

  • El usuario solo necesita poner una contraseña y hacer clic en "Crear cuenta"

lunes, 30 de junio de 2025

Optimizar BD en phpmyadmin en siteground

 Paso 1: Ir al phpmyadmin a la BD


SELECT * FROM ela_posts

WHERE post_type = 'revision';


DELETE FROM ela_posts

WHERE post_type = 'revision';


Paso 2: 

limpia el postmeta huérfano, de cualquier plugin o metakey

select * FROM ela_postmeta

WHERE post_id NOT IN (SELECT ID FROM ela_posts);


DELETE FROM ela_postmeta

WHERE post_id NOT IN (SELECT ID FROM ela_posts);


Paso 3 (opcional): Optimizar


OPTIMIZE TABLE ela_postmeta;

OPTIMIZE TABLE ela_posts;


lunes, 19 de mayo de 2025

Como resolver el error de puerto de moodle en local

 

Cierra completamente XAMPP

  • Cierra el Panel de Control.

  • Mata cualquier proceso de Apache que haya quedado en segundo plano:

    En CMD (como administrador):

    taskkill /F /IM httpd.exe

sábado, 17 de mayo de 2025

lunes, 5 de mayo de 2025

Herramientas fundamentales para aprender para CI/CD

 Herramientas fundamentales para aprender para CI/CD

1. Git (Primero)

  • Qué es: Sistema de control de versiones.

  • Para qué sirve: Te permite llevar el control de los cambios en tu código fuente localmente y en equipo.

  • Aprendizaje clave: git init, git add, git commit, git push, git pull, branch, merge, etc.

  • Es la base. Todo lo demás depende de saber Git.

2. GitLab (Segundo)

  • Qué es: Plataforma de alojamiento de repositorios Git (como GitHub), con herramientas de integración continua y gestión de proyectos.

  • Para qué sirve: Subes tus repositorios, colaboras con otros y automatizas procesos.

  • Aprendizaje clave: cómo subir proyectos, usar issues, pipelines, merge requests, etc.

 Puedes aprender GitHub o GitLab indistintamente, ya que cumplen funciones similares. Si tu empresa usa GitLab, aprende GitLab. Si usas GitHub, sigue con GitHub.

3. GitHub Actions o GitLab CI/CD (Tercero)

  • Qué es: Herramientas de integración y entrega continua (CI/CD).

  • Para qué sirve: Automatizar tareas como pruebas, despliegue de código, compilación, etc.

  • Aprendizaje clave:

    • YAML básico

    • Definir workflows

    • Automatizar builds, tests, deploys


  1. Git → base fundamental.

  2. GitHub o GitLab → elegir una plataforma para alojar repositorios.

  3. GitHub Actions o GitLab CI/CD → automatización avanzada con pipelines.

viernes, 25 de abril de 2025

Cómo crear un plugin básico de actividad en Moodle (paso a paso)

Crear tu propio plugin en Moodle puede sonar complicado al principio, pero con este tutorial te mostraré cómo desarrollar un plugin básico de tipo “actividad” para que puedas entender la estructura y empezar a construir tus propias funcionalidades.

Cómo crear un plugin básico de actividad en Moodle (paso a paso)


 ¿Qué vamos a crear?

Un plugin de actividad llamado Mi Módulo, que aparecerá en el listado de actividades cuando edites un curso y te permitirá crear nuevas instancias con un solo campo: nombre.

 Estructura del plugin

Primero, crea una carpeta en:


moodle/mod/mimodulo

Dentro de esa carpeta, necesitas tener al menos estos archivos:


mimodulo/ ├── db/ │ └── install.xml
         acces.php ├── lang/ │ └── en/ │ └── mimodulo.php ├── lib.php ├── mod_form.php ├── version.php ├── view.php

 1. version.php

Archivo obligatorio que define la versión del plugin.


<?php defined('MOODLE_INTERNAL') || die(); $plugin->component = 'mod_mimodulo'; $plugin->version = 2025042500; $plugin->requires = 2022041900; $plugin->maturity = MATURITY_STABLE; $plugin->release = 'v1.0';

 2. install.xml (estructura de base de datos)

Ubicado en db/install.xml. Define la tabla del plugin.


<?xml version="1.0" encoding="UTF-8" ?> <XMLDB PATH="mod/mimodulo/db" VERSION="2025042500" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../lib/xmldb/xmldb.xsd"> <TABLES> <TABLE NAME="mimodulo" COMMENT="Tabla del módulo mimodulo"> <FIELDS> <FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true"/> <FIELD NAME="name" TYPE="char" LENGTH="255" NOTNULL="true"/> <FIELD NAME="timecreated" TYPE="int" LENGTH="10" NOTNULL="true"/> <FIELD NAME="timemodified" TYPE="int" LENGTH="10" NOTNULL="false"/> </FIELDS> <KEYS> <KEY NAME="primary" TYPE="primary" FIELDS="id"/> </KEYS> </TABLE> </TABLES> </XMLDB>

2.5 access.php

<?php defined('MOODLE_INTERNAL') || die(); $capabilities = [ 'mod/mimodulo:addinstance' => [ 'captype' => 'write', 'contextlevel' => CONTEXT_COURSE, 'archetypes' => ['editingteacher' => CAP_ALLOW, 'manager' => CAP_ALLOW], ], ];

3. lang/en/mimodulo.php

Define los textos visibles.

<?php $string['pluginname'] = 'Mi Módulo'; $string['modulename'] = 'Mi Módulo'; $string['modulenameplural'] = 'Mis Módulos'; $string['mimodulo:addinstance'] = 'Agregar una nueva instancia de Mi Módulo'; $string['name'] = 'Nombre del módulo';

 4. mod_form.php

Formulario que se muestra al crear o editar la actividad.


<?php require_once($CFG->dirroot . '/course/moodleform_mod.php'); class mod_mimodulo_mod_form extends moodleform_mod { function definition() { $mform = $this->_form; $mform->addElement('text', 'name', get_string('name', 'mimodulo'), ['size' => '64']); $mform->setType('name', PARAM_TEXT); $mform->addRule('name', null, 'required', null, 'client'); $this->standard_coursemodule_elements(); $this->add_action_buttons(); } }

5. lib.php

Contiene funciones principales del módulo.


<?php function mimodulo_add_instance($data, $mform) { global $DB; $data->timecreated = time(); return $DB->insert_record('mimodulo', $data); } function mimodulo_update_instance($data, $mform) { global $DB; $data->timemodified = time(); $data->id = $data->instance; return $DB->update_record('mimodulo', $data); } function mimodulo_delete_instance($id) { global $DB; return $DB->delete_records('mimodulo', ['id' => $id]); }

 6. view.php

Lo que el estudiante verá al ingresar a la actividad.


<?php require_once('../../config.php'); $id = required_param('id', PARAM_INT); $cm = get_coursemodule_from_id('mimodulo', $id, 0, false, MUST_EXIST); $context = context_module::instance($cm->id); require_login($cm->course, true, $cm); $PAGE->set_url('/mod/mimodulo/view.php', ['id' => $id]); $PAGE->set_context($context); $PAGE->set_title('Mi Módulo'); $PAGE->set_heading('Mi Módulo'); echo $OUTPUT->header(); echo $OUTPUT->heading('Hola, este es tu nuevo módulo en Moodle 🚀'); echo $OUTPUT->footer();

 Instalación del plugin

  1. Copia la carpeta mimodulo en moodle/mod/.

  2. Ve a tu Moodle como administrador.

  3. Moodle detectará automáticamente el nuevo plugin.

  4. Sigue el asistente de instalación.

  5. ¡Listo! Ya puedes usar tu módulo en cualquier curso.

 Prueba tu plugin

  1. Entra a un curso como administrador o profesor.

  2. Activa edición.

  3. Haz clic en “Agregar una actividad o recurso”.

  4. Verás "Mi Módulo" en la lista.

  5. Agrega una instancia y prueba su vista.


Este tutorial te brinda una base sólida para crear tu propio plugin de tipo actividad en Moodle  con php. A partir de aquí, puedes expandir la funcionalidad, agregar configuraciones, vistas personalizadas, lógica de calificación y mucho más.

Si te gustó este artículo y te fue útil, ¡compártelo!.

Este tutorial fue creado pensando en los desarrolladores que usan Moodle en Colombia, especialmente en Manizales, donde la tecnología educativa sigue creciendo y conectando comunidades de aprendizaje, el objetivo es de aprendizaje para que puedan aprender a crear un plugin y a partir de esto desarrollar el que requieran a medida.

lunes, 14 de abril de 2025

Lista de los comandos más comunes de Eloquent en Laravel

 Creación y guardado de datos


// Crear y guardar $user = new User; $user->name = 'Juan'; $user->email = 'juan@example.com'; $user->save(); // Crear directamente User::create([ 'name' => 'Juan', 'email' => 'juan@example.com' ]);

Lectura de datos


User::all(); // Obtener todos User::find(1); // Buscar por ID User::where('email', 'juan@example.com')->first(); // Primer coincidencia User::where('active', 1)->get(); // Coincidencias múltiples User::findOrFail(1); // Lanza 404 si no existe User::firstOrFail(); // Similar a findOrFail pero sin ID

Actualización de datos


$user = User::find(1); $user->name = 'Pedro'; $user->save(); // O directamente User::where('id', 1)->update(['name' => 'Pedro']);

Eliminación de datos


User::destroy(1); // Por ID User::where('active', 0)->delete(); // Varios $user = User::find(1); $user->delete(); // Individual

Consultas avanzadas


User::where('age', '>', 18)->get(); User::orderBy('created_at', 'desc')->get(); User::limit(10)->get(); User::select('id', 'name')->get(); User::whereBetween('age', [18, 30])->get(); User::whereIn('id', [1,2,3])->get();

Relaciones Eloquent


// Uno a muchos $user->posts; // Relación definida en el modelo // Muchos a muchos $user->roles()->attach($roleId); $user->roles()->sync([1, 2]); $user->roles()->detach($roleId); // Cargar relaciones User::with('posts')->get();

Paginar resultados


User::paginate(10); // Paginación simple User::simplePaginate(10); // Más ligera

Soft deletes


use Illuminate\Database\Eloquent\SoftDeletes; User::withTrashed()->get(); // Incluye eliminados User::onlyTrashed()->get(); // Solo eliminados $user->restore(); // Restaurar $user->forceDelete(); // Eliminar permanentemente

Scopes (Alcances personalizados)


// Modelo User public function scopeActive($query) { return $query->where('active', 1); } // Uso User::active()->get();

Blogs Colombia