Agregar atributo de estilo para ver campos

12

Me gustaría agregar un atributo de estilo a cada campo de título en mi vista. He creado un campo para un color. Traté de reescribir el resultado así:

<h2 style="color: [field_color];">[title_1]</h2>

Pero el atributo de estilo será eliminado. Estoy usando Drupal 7.

Cualquier ayuda apreciada.

Ksn
fuente
¿Por qué se elimina? ¿Has intentado usar un campo de texto global en su lugar?
Alex Gill
¡Gracias por su respuesta! ¿Qué quieres decir con un campo de texto global? La configuración en mi vista: Formato: Lista sin formato Mostrar: Campos
Ksn
Tiene la opción de agregar un campo 'texto global'. Este campo debe ir después de cualquier otro campo que ya haya agregado. Luego puede usar tokens en este campo personalizado para crear algo similar a lo que ha hecho anteriormente. Luego puede ocultar los campos que se muestran en el campo personalizado.
Alex Gill
1
Su mejor opción es probablemente crear un archivo de plantilla personalizado para este campo o usar una clase basada en el token mencionado a continuación.
Alex Gill
1
Si mira debajo de 'Avanzado' en el lado derecho hay una opción para 'Información del tema', aquí le dará algunas sugerencias para las plantillas.
Alex Gill

Respuestas:

4

Puede establecer una clase en el campo de título usando Configuración de estilo como se muestra a continuación en la pantalla. Puede reemplazar los tokens de usuario en la configuración de estilo para establecer la clase en el campo de título.

ingrese la descripción de la imagen aquí

Usando javascript pequeño o jquery, lea la clase del campo de título y establezca el color igual que el nombre de la clase usando la propiedad CSS .

Anil Sagar
fuente
2
Tal vez su solución funcione, pero sé qué resolver sin javascript. ¿Es posible?
Ksn
2
No puede inyectar directamente el valor del campo a la propiedad de estilo debido a problemas de seguridad. Vea el problema aquí drupal.org/node/853880
Anil Sagar
Luego debe escribir una clase css separada para cada color, sin embargo, este es el peor de los casos, ya que necesita escribir 16 millones de clases :(. Javascript o jquery sería mejor.
Mathankumar
2
Anil, probé tu solución pero Drupal eliminó # del color, así que encontré otra solución con jQuery. Agregué los datos del atributo al campo: <h2 data-color = "[field_color]"> [title_1] </h2> He investigado otras soluciones con plantillas, pero no pude encontrar la manera correcta de resolverlo.
Ksn
1

Puede crear un tpl para este campo (ejemplo: views-view-field-MY-VIEW-NAME-page.tpl.php), en este tpl puede agregar el token escribiendo esto:

<h2 style="color: <?php print $field->last_tokens['[field_color]'] ?>;"><?php print $field->last_tokens['[title_1]'] ?></h2>
David Motilla
fuente
1

También tuve que incluir el valor de un campo como un color en línea para un campo en particular. Después de navegar por la web para encontrar una solución fácil de personalizar, terminé haciendo esto:

  1. Agregue el valor del color como un token de clase CSS, al igual que la imagen en la publicación anterior.
  2. Reescribe la función hook_preprocess_views_view_field () de esta manera:

     function hook_preprocess_views_view_fields(&$vars) {
      $view = $vars['view'];
    
      // Loop through the fields for this view.
      $previous_inline = FALSE;
      $vars['fields'] = array(); // ensure it's at least an empty array.
      foreach ($view->field as $id => $field) {
    
        // render this even if set to exclude so it can be used elsewhere.
        $field_output = $view->style_plugin->get_field($view->row_index, $id);
        $empty = $field->is_value_empty($field_output, $field->options['empty_zero']);
        if (empty($field->options['exclude']) && (!$empty || (empty($field->options['hide_empty']) && empty($vars['options']['hide_empty'])))) {
          $object = new stdClass();
          $object->handler = & $view->field[$id];
          $object->inline = !empty($vars['options']['inline'][$id]);
    
          $object->element_type = $object->handler->element_type(TRUE, !$vars['options']['default_field_elements'], $object->inline);
          if ($object->element_type) {
            $class = '';
            if ($object->handler->options['element_default_classes']) {
              $class = 'field-content';
            }
    
            if ($classes = $object->handler->element_classes($view->row_index)) {
              if ($class) {
                $class .= ' ';
              }
              $class .= $classes;
            }
    
            $class_array = explode(' ', $class);
            foreach ($class_array as $cid => $candidate) {
              // Find the color hex code.
              if (preg_match('/([a-f]|[A-F]|[0-9]){3}(([a-f]|[A-F]|[0-9]){3})?\b/', $candidate)) {
                $style = 'color:#' . $candidate . ';';
                unset($class_array[$cid]);
              }
            }
    
            $pre = '<' . $object->element_type;
            if ($class) {
              $pre .= ' class="' . implode(' ', $class_array) . '"';
            }
            if ($style) {
              $pre .= ' style="' . $style . '"';
            }
            $field_output = $pre . '>' . $field_output . '</' . $object->element_type . '>';
          }
    
          // Protect ourself somewhat for backward compatibility. This will prevent
          // old templates from producing invalid HTML when no element type is selected.
          if (empty($object->element_type)) {
            $object->element_type = 'span';
          }
    
          $object->content = $field_output;
          if (isset($view->field[$id]->field_alias) && isset($vars['row']->{$view->field[$id]->field_alias})) {
            $object->raw = $vars['row']->{$view->field[$id]->field_alias};
          }
          else {
            $object->raw = NULL; // make sure it exists to reduce NOTICE
          }
    
          if (!empty($vars['options']['separator']) && $previous_inline && $object->inline && $object->content) {
            $object->separator = filter_xss_admin($vars['options']['separator']);
          }
    
          $object->class = drupal_clean_css_identifier($id);
    
          $previous_inline = $object->inline;
          $object->inline_html = $object->handler->element_wrapper_type(TRUE, TRUE);
          if ($object->inline_html === '' && $vars['options']['default_field_elements']) {
            $object->inline_html = $object->inline ? 'span' : 'div';
          }
    
          // Set up the wrapper HTML.
          $object->wrapper_prefix = '';
          $object->wrapper_suffix = '';
    
          if ($object->inline_html) {
            $class = '';
            if ($object->handler->options['element_default_classes']) {
              $class = "views-field views-field-" . $object->class;
            }
    
            if ($classes = $object->handler->element_wrapper_classes($view->row_index)) {
              if ($class) {
                $class .= ' ';
              }
              $class .= $classes;
            }
    
            $object->wrapper_prefix = '<' . $object->inline_html;
            if ($class) {
              $object->wrapper_prefix .= ' class="' . $class . '"';
            }
            $object->wrapper_prefix .= '>';
            $object->wrapper_suffix = '</' . $object->inline_html . '>';
          }
    
          // Set up the label for the value and the HTML to make it easier
          // on the template.
          $object->label = check_plain($view->field[$id]->label());
          $object->label_html = '';
          if ($object->label) {
            $object->label_html .= $object->label;
            if ($object->handler->options['element_label_colon']) {
              $object->label_html .= ': ';
            }
    
            $object->element_label_type = $object->handler->element_label_type(TRUE, !$vars['options']['default_field_elements']);
            if ($object->element_label_type) {
              $class = '';
              if ($object->handler->options['element_default_classes']) {
                $class = 'views-label views-label-' . $object->class;
              }
    
              $element_label_class = $object->handler->element_label_classes($view->row_index);
              if ($element_label_class) {
                if ($class) {
                  $class .= ' ';
                }
    
                $class .= $element_label_class;
              }
    
              $pre = '<' . $object->element_label_type;
              if ($class) {
                $pre .= ' class="' . $class . '"';
              }
              $pre .= '>';
    
              $object->label_html = $pre . $object->label_html . '</' . $object->element_label_type . '>';
            }
          }
    
          $vars['fields'][$id] = $object;
        }
      }
    
    }
    

Como puede ver, he agregado estas líneas:

$style = '';
$class_array = explode(' ', $class);
foreach ($class_array as $cid => $candidate) {
  // Find the color hex code.
  if (preg_match('/([a-f]|[A-F]|[0-9]){3}(([a-f]|[A-F]|[0-9]){3})?\b/', $candidate)) {
    $style = 'color:#' . $candidate . ';';
    unset($class_array[$cid]);
  }
}

Y cambie la línea debajo de:

$pre = '<' . $object->element_type;
if ($class) {
  $pre .= ' class="' . implode(' ', $class_array) . '"';
}
if ($style) {
  $pre .= ' style="' . $style . '"';
}
Pol Dellaiera
fuente
0

agregue un nombre en el campo anil sugerido, luego abra style.css en su carpeta de temas y escriba ".my-css-name" seguido de los resultados deseados de css como:

.my-css-name {color: rojo; fondo: verde; }

aaronStarK
fuente
0

Solo estoy haciendo algo similar y esto es lo que hice:

1- Crea una vista con campos de color y título.

2- Cree un "views-view-fields.tpl" personalizado para esa vista. (Una plantilla personalizada solo para el campo de color me mostró un error)

3- En la field->contentlínea agrega / reemplaza lo que necesitas ...<h2 style="color: #<?php print $field->content; ?>">

/ / / / De ahora en adelante, no lo probé, pero debería funcionar bien / / / /

4- Excluir el campo del título y mostrarlo en el encabezado / grupo

5- Cree un "views-view-unformatted.tpl" personalizado para esa vista.

6- En esta vista agregamos <?php print $title; ?></h2>después <?php print $row; ?>. (agregamos el título y cerramos la etiqueta H abierta en la primera plantilla)


ÚLTIMA EDICIÓN:

Simplemente puede usar las vistas PHP para imprimir todo lo que necesita y el estilo no se filtrará.

Arena Federico
fuente
0

Tuve este mismo problema y lo resolví creando una plantilla llamada

views-view-field--field_name_here.tpl.php

En mi caso, el código que usé para crear el HTML que necesitaba era:

<?php

$bg_color = $variables["row"]->field_field_button_background_color[0]["raw"]["rgb"];
$link_title = $variables["row"]->field_field_slideshow_item_cta_link[0]["raw"]["title"];
$link_url = $variables["row"]->field_field_slideshow_item_cta_link[0]["raw"]["url"];

echo '<a style="background-color:'.$bg_color.'" href="'.$link_url.'">'.$link_title.'</a>';

Habilitar el módulo Devel y usar

dpm($row);

en el archivo de plantilla fue MUY útil. No podría haber descubierto esto sin él.

evanmcd
fuente
0

La solución más fácil que pude encontrar fue insertar el valor como un atributo de datos. Luego, en mi JavaScript, tomo el valor del campo de datos y actualizo el CSS para reflejar el cambio.

Hawkee
fuente