opencart - Cómo agregar una función a Reparar - actualizar una celda en la tabla de la base de datos en una identificación espec

CorePress2024-01-25  9

Hice una nueva versión de una extensión así que me quedé en el último trabajo que me quedaba por hacer. Creé una ramita para administrador que muestra una lista que toma datos de una tabla en la base de datos. En cada fila de la lista creé un botón que quiero arreglar en una celda específica de la tabla. Entonces cada línea tiene su propia identificación.

Ver la imagen de la lista de páginas:

Hice el archivo del controlador pero me quedé con el archivo del modelo que debe hacer el resto.

En el siguiente código tengo que cambiar algo para que al presionar el botón de reparación lea la identificación específica.

public function repairSaveCarts($link_id=" ") {
        $this->db->query("SELECT * FROM " . DB_PREFIX . "save_cart WHERE link_id = '" . (int)$link_id . "'");

        $db_id = $this->db->getLastId();
            $end_url = base64_encode(serialize($db_id));
            $url = $this->config->get('config_url').$end_url;
            
            $this->db->query("UPDATE " . DB_PREFIX . "save_cart SET shorturl = '" . $this->db->escape($url) . "' WHERE link_id = '" . (int)$db_id . "'");
    }

Creo que el cambio debe realizarse en $db_id = $this->db->getLastId(); línea pero no estoy seguro. Alguien que pueda ayudar por favor.

Hola Geodas, $this->db->getLastId(); normalmente devolverá el valor de la clave principal de una fila después de insertar una nueva fila. No está realmente claro qué está intentando arreglar aquí, al mirar el código, se consulta la tabla del carrito y luego se actualiza la tabla del carrito después de modificar (lo que debería ser) el resultado. ¿Puedes explicar qué se supone que debe hacer RepairSaveCarts()?

-Daniel

30 de marzo de 2021 a las 8:35

Hasta ahora yotenía 3 valores en la tabla de la base de datos. A estos le agregué 2 más, uno con fecha agregada y el segundo con shorturl. Hice los cambios necesarios para frontend & trabaja bien. Pero para los datos antiguos que existen en la tabla tuve que encontrar una manera de actualizar estas 2 celdas. Lo que quiero que haga el botón de actualización cuando lo presiono es leer la identificación de una línea específica y crear un enlace para actualizar la celda de URL corta en la misma línea con base64_encode(serialize(). En la interfaz termina base64_encode(serialize(db_id) con setOutput(json_encode($json)); y dame un enlace como http://*shopname*/aToyOw==.

Geodas

31 de marzo de 2021 a las 3:07

¿Entonces quieres base64_encode(serialize($link_id)), agregar esa cadena codificada a la URL del sitio web y actualizar la tabla oc_save_cart con esa URL completa? ¿$link_id es el mismo ID que quieres leer? Si no, ¿cuál es el nombre de la columna que contiene el valor de identificación? save_cart_id?

-Daniel

31 de marzo de 2021 a las 13:09

link_id es el valor de Id. en mi tabla. La base64_escode(serialize()) debe leer de la base de datos el valor de identificación existente y darme como ejemplo para el número de identificación (2), tome aToyOw==. Si decodifica esto usando base64decode.org, toma como resultado i:2; el número 2 es el valor de identificación en mi tabla (link_id).

Geodas

31 de marzo de 2021 a las 16:16

Si link_id es el valor de la clave principal y, al llamar a la función, conoce el valor, ¿por qué necesitamos esta línea $db_id = $this->db->getLastId();? ¿Espera que devuelva un valor diferente alenlace_id? ¿Puedes publicar el esquema de la tabla save_cart?

-Daniel

1 de abril de 2021 a las 5:39



------------------------------------

Lo hago funcionar. Tuve un pequeño error de sintaxis en request->get | publicación en el controlador y por esta razón el modelo no obtuvo la identificación correcta del botón.

public function repairSaveCarts($link_id) {
        
        $end_url = base64_encode(serialize((int)$link_id));
        
        $url = $this->config->get('config_url').$end_url;
        
        $this->db->query("UPDATE " . DB_PREFIX . "save_cart SET shorturl = '" . $this->db->escape($url) . "', date_added = NOW() WHERE link_id = '" . (int)$link_id . "'");
        
    
        
        return $query->row;
    }

Una cosa que noto con la serialización es que cuando el modelo obtuvo la identificación del controlador, la recibió como un valor de resorte y no como un valor int. El resultado fue para dar como ejemplo

identificación 10 ---> serializar valor= s:2:"10";

Para solucionar este problema, agrego en el modelo el valor (int) después de serializar y ahora me da los resultados correctos

identificación 10 ---> valor de serialización = i:10;.

El único problema ahora es que cuando el módulo se guarda en la base de datos desde la página frontal, me da la URL completa del sitio:

https://www.ejemplo.com/aToxMDs=

pero cuando estoy en el lado administrador, la funciónReparar guardar en la base de datos solo me da:

aToxMDs=

La línea $url = $this->config->get('config_url').$end_url; Parece que eso no funciona.

¿¿Qué debo editar para agregar la URL de la tienda antes de $end_url???



------------------------------------

Aquí hay una versión revisada de la función para su clase de modelo:

public function repairSaveCarts($link_id, $base) {
    $end_url = base64_encode(serialize($link_id));
    $url = $base.$end_url;
        
    $this->db->query("UPDATE " . DB_PREFIX . "save_cart SET shorturl = '" . $this->db->escape($url) . "' WHERE link_id = '" . (int)$link_id . "'");
}

También debes atender a HTTPS no soloHTTP, así que agregue lo siguiente al controlador para obtener la URL del sitio y pase ese valor a la función 'reparación'. Esto debe hacerse justo antes de la llamada existente a la función modelo:

// check if the request was made over HTTPS or not
if ($this->request->server['HTTPS']) {
    $server = $this->config->get('config_ssl');
} else {
    $server = $this->config->get('config_url');
}

$this->whateveryourmodelnameis->repairSaveCarts($link_id, $server);

2

Hago el cambio para proponer en modelo. Sin realizar ningún cambio en el controlador, tomo ArrayaTo0ODs=. La palabra Array de $base y aTo0ODs= proviene de $end_url. Lo que debo configurar en el controlador para $base. No vi $base en el controlador. Tienes $server en la verificación HTTPS. La línea que se publica en el controlador es esta:$this->model_extension_savecart->repairSaveCarts($this->request->get['link_id'], $this->request->post);. Cómo cambiar la solicitud de publicación para enviar $base al modelo. Dónde debe ir esta línea:$this->model_extension_savecart->repairSaveCarts($link_id, $server);.

Geodas

7 de abril de 2021 a las 17:54

Creo que necesitas dedicar algo de tiempo a aprender cómo funciona el marco MVC de OpenCart. Eso solucionará la mayoría de sus preguntas adicionales. Aquí tienes un tutorial que te ayudará: code.tutsplus.com/tutorials/…

-Daniel

8 de abril de 2021 a las 8:46



------------------------------------

Y finalmente lo logro. Reemplazo esto:

public function repairSaveCarts($link_id, $base) {
    $end_url = base64_encode(serialize($link_id));
    $url = $base.$end_url;
        
    $this->db->query("UPDATE " . DB_PREFIX . "save_cart SET shorturl = '" . $this->db->escape($url) . "' WHERE link_id = '" . (int)$link_id . "'");
}

con esto en el archivo del modelo:

public function repairSaveCarts($link_id) {
    $end_url = base64_encode(serialize((int)$link_id));
    if ($this->request->server['HTTPS']) {
    $url = HTTPS_CATALOG . $end_url;
    } else {
    $url = HTTP_CATALOG . $end_url;
    }
        
    $this->db->query("UPDATE " . DB_PREFIX . "save_cart SET shorturl = '" . $this->db->escape($url) . "', date_added = NOW() WHERE link_id = '" . (int)$link_id . "'");
}

Gracias Daniel por tu ayuda.

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare