Foros del Web » Creando para Internet » Sistemas de gestión de contenidos » Drupal »

Drupal 8 - Problema con caché

Estas en el tema de Drupal 8 - Problema con caché en el foro de Drupal en Foros del Web. Hola a todos. Tengo el siguiente problema. Tengo una entidad en mi Drupal (oficinas) En dichas oficinas he hecho un sistema en el que sobre ...
  #1 (permalink)  
Antiguo 23/07/2017, 03:59
Avatar de el_javi  
Fecha de Ingreso: marzo-2005
Ubicación: MAdrid
Mensajes: 844
Antigüedad: 19 años
Puntos: 10
Drupal 8 - Problema con caché

Hola a todos.

Tengo el siguiente problema.

Tengo una entidad en mi Drupal (oficinas)

En dichas oficinas he hecho un sistema en el que sobre un mapa, seleccionas dónde está esa oficina (guardado de coordenadas X e Y en 2 campos de la entidad).

Todo funciona perfectamente.

Mi problema es que:
- Entro en el Front y veo el mapa con portugal (u otra oficina) colocada en su lugar.
- Entro en el Admin, y cambio Portugal (u otra 0ficina) a otro punto del mundo
- Recargo el Front y portugal sigue en su sitio.
---- Limpio la caché de drupal, y recargo el front, y Portugal (u otra oficina) pasa a colocarse en el nuevo lugar que he establecido.

Los datos para pintar estos puntos los preproceso en mi archivo THEME.module
He probado a preprocesarlo en varios lugares, con el mismo resultado, el mismo cacheo de la información:
En THEME_preprocess, en THEME_preprocess_node

Esta es la forma en la que obtengo los datos y los guardo en una variable:
THEME.module

Código PHP:
function gap_preprocess(array &$variables) {
    
$node Drupal::routeMatch()->getParameter('node');
    
$variables['gap_node'] = $node;

    
$variables['gap_node_type'] = $variables['gap_node']->getType();

    switch(
$variables['gap_node_type']) {
        case 
"encuentranos_home":
            
$variables["gap_findUs"]["continents"] = GAP_findUs_getContinents();
            
$variables["gap_findUs"]["countries"] = GAP_findUs_getCountries();
        break;
    }
}


function 
GAP_findUs_getContinents () {
    
$ids Drupal::entityQuery('node')
      ->
condition('type''oficinas_continentes')
      ->
sort('title')
      ->
execute();
    
    
$allElements entity_load_multiple('node'$ids);
    
    
$allElements_array = array();
    
    foreach (
$allElements as $element_key=>$element_value) {
        
$alias Drupal::service('path.alias_manager')->getAliasByPath('/node/'.$element_value->nid->value);
        
$alias explode("/"$alias);
        
$alias array_pop($alias);
        
        
$tempElement = array (
            
"id" =>  $element_value->nid->value,
            
"name" => $element_value->title->value,
            
"alias" => $alias,
            
"mapPosition_X" => $element_value->field__officecontinent_point_x->value,
            
"mapPosition_Y" => $element_value->field__officecontinent_point_y->value,
        );
        
        
array_push($allElements_array$tempElement);
    }
    
    return 
$allElements_array;
}

function 
GAP_findUs_getCountries () {
    
$ids Drupal::entityQuery('node')
      ->
condition('type''oficinas_paises')
      ->
sort('title')
      ->
execute();
    
    
$allElements entity_load_multiple('node'$ids);
    
    
$allElements_array = array();
    
    foreach (
$allElements as $element_key=>$element_value) {
        
$alias Drupal::service('path.alias_manager')->getAliasByPath('/node/'.$element_value->nid->value);
        
$alias explode("/"$alias);
        
$alias array_pop($alias);
        
        
$tempElement = array (
            
"id" =>  $element_value->nid->value,
            
"name" => $element_value->title->value,
            
"alias" => $alias,
            
"type" => $element_value->field_officecountry_type->value,
            
"mapPosition_X" => $element_value->field__officecontinent_point_x->value,
            
"mapPosition_Y" => $element_value->field__officecontinent_point_y->value,
        );
        
        
array_push($allElements_array$tempElement);
    }
    
    return 
$allElements_array;

Así lo pinto en mi tema:
Código HTML:
<div class="findUs_map_container">

    {% for continent in gap_findUs.continents %}
        <a href="javascript:void(null)" title="{{ continent.name }}" class="findUs_map_poi findUs_map_poi_continent" style="left:{{ continent.mapPosition_X }}%; top:{{ continent.mapPosition_Y }}%;">
            <span>{{ continent.name }}</span>
        </a>
    {% endfor %}


    {% for country in gap_findUs.countries %}
        {% if country.type != "" %}
            <a href="javascript:void(null)" title="{{ country.name }}" class="findUs_map_poi findUs_map_poi_{{ country.type }}" style="left:{{ country.mapPosition_X }}%; top:{{ country.mapPosition_Y }}%;">
                <span>{{ country.name }}</span>
            </a>
        {% endif %}
    {% endfor %}
</div> 

Espero que podáis ayudarme.

Gracias y un saludo.
  #2 (permalink)  
Antiguo 25/07/2017, 09:19
(Desactivado)
 
Fecha de Ingreso: septiembre-2008
Mensajes: 269
Antigüedad: 15 años, 7 meses
Puntos: 22
Respuesta: Drupal 8 - Problema con caché

Hola y disculpa que no he podido entrar al foro como antes, pero aquí estamos.

Vámonos por parte, cuando dices:

Cita:
Iniciado por el_javi Ver Mensaje
Entro en el Admin, y cambio Portugal (u otra 0ficina) a otro punto del mundo.
¿Podrías ser mas claro?.

Adicionalmente, indicanos como tienes configurado el front, porque aparentemente, cuando haces el cambio de la oficina, no estás cambiando el valor de las coordenadas, y por eso aunque cambies la oficina siguen las mismas coordenadas.

Por eso quiero que nos comentes mas, porque lo apropiado es, crear una entidad oficinas como dices, luego crear los campos (x,y) que en mi caso lo puse así y luego creo todos los contenidos con sus respectivas oficinas y coordenadas.

Luego crear otra entidad llamada por ejemplo, oficinaprincipal y crear un solo campo llamado oficinaFront, pero que este campo será referenciado al tipo de contenido oficinas por ejemplo. Crear luego un solo contenido para esta entidad, porque solo se usará para poder cambiar la info de las coordenadas del front.

Luego, ya lo tienes.
Instala devel, te lo recomiendo,
y luego instalas de este módulo el submodulo Devel Kint:

Ejemplo si el nid del contenido del tipo de contenido oficinaprincipal es 6, como es mi caso, en tu módulo puedes usar algo como esto:

Código PHP:

//buscas el nodo del tipo de contenido oficinaprincipal 
$node DrupalnodeEntityNode::load(6);

//buscamos lo que está en el campo field_oficinafront en la sección target_id. Nota: si fuera un campo normal, los valores lo obtienes con "value", pero como esta haciendo referencia a otra entidad entonces es a traves de target_id

kint($node->field_oficinafront->target_id);

//creamos una variable llamada node2 y le pasamos en la funcion node::load el nid que está en el campo oficinafornt del nodo 6 .
$node2 DrupalnodeEntityNode::load($node->field_oficinafront->target_id);
kint($node2);
//el campo titulo
kint($node2->title->value);
//el campo y
kint($node2->field_y->value);
//el campo x
kint($node2->field_x->value);
//el campo nid
kint($node2->nid->value); 
De esta manera si en su momento quieres modificar la oficina principal, vas al contenido de la oficinaprincipal y cambias la oficina en el campo correspondiente y al guardar, ya tendrás en los campos x y las coordenadas de la oficina principal
Código PHP:
//el campo y
kint($node2->field_y->value);
//el campo x
kint($node2->field_x->value); 
y solo debes modificar tus modulo para que reciba estos valores.

Nota: en tu caso no usarás field_x sino field__officecontinent_point_x.

Saludos y Dios te bendiga.
  #3 (permalink)  
Antiguo 26/07/2017, 01:27
Avatar de el_javi  
Fecha de Ingreso: marzo-2005
Ubicación: MAdrid
Mensajes: 844
Antigüedad: 19 años
Puntos: 10
Respuesta: Drupal 8 - Problema con caché

Hola jeremiselxi

Te voy a comentar mejor cómo tengo montada la estructura.

Tengo un Conten-type llamado oficinas que tiene lo sisguientes campos:
- Title (como todos los conten-types)
- Descripcion
- Coordenada X en eel mapa
- Coordenada Y en el mapa
- y más campos.

Entonces, tengo creados CONTENIDOS del tipo oficinas
- Madrid
---- Con sus descripción (Castellana, 210 28046 Madrid))
---- Con su posición X relativa al mapa (49,26)
---- Con su posición Y relativa al mapa (44,10)

Así con todas y funciona perfectamente todo el grabado, guardado, muestreo, etc.
Todo creado y programado mediante el ADMIN, no he creado ningún contenido por programación, ni ninguna entidad por programación.

Mi problema viene cuando de pronto, muevo en el ADMIN, en la Oficina de Madrid, muevo el punto del mapa y las coordenadas cambian a otros valores.

- En el ADMIN se ve que han cambiado
- En el ADMIN se ve los inputs con números diferentes
- El ADMIN me representa bien sobre el mapa el punto en su nueva ubicación
- En el ADMIN, cada vez que entre a editar esa oficina, están bien grabados los nuevos datos.

Pero en la Web, al recargar la página de /oficinas/ me está manteniendo los valores de las coordenadas X e Y ANTERIORES

Pero si limpio la caché de Drupal, me carga el punto con las nuevas coordenadas.

Ese es el tema :)
  #4 (permalink)  
Antiguo 26/07/2017, 07:01
(Desactivado)
 
Fecha de Ingreso: septiembre-2008
Mensajes: 269
Antigüedad: 15 años, 7 meses
Puntos: 22
Respuesta: Drupal 8 - Problema con caché

Pues yo podría hacer dos cosas:

1) ejecutar este script antes de ejecutar el sql que trae toda la info en el front.
Código PHP:
Ver original
  1. <?php
  2. db_query("DELETE FROM {cache};");
  3. ?>

2) crearia un modulo llamado borrarcache y pondría en el archivo.module esto:

Código PHP:
Ver original
  1. <?php
  2. function prueba_node_update(Drupal Core Entity EntityInterface $node) {
  3. db_query("DELETE FROM {cache};");
  4.  
  5. }
  6.  
  7. function prueba_node_insert(Drupal Core Entity EntityInterface $node) {
  8. db_query("DELETE FROM {cache};");
  9.  
  10. }
  11. ?>

Etiquetas: campo, punto, variables
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:36.