Última modificación: 28 de agosto de 2025
Dentro de los módulos y temas, los campos se utilizan para que los creadores de contenido controlen el estilo y la funcionalidad del módulo y el tema en el sitio web. Al desarrollar un módulo o un tema, incluirás campos en un archivo fields.json, los cuales estarán disponibles en los editores de temas y contenido.
theme-settings-fields
A continuación, encontrarás más información sobre cómo crear y gestionar las opciones para los campos de módulos y temas. Para obtener más información sobre los tipos de campos específicos, echa un vistazo a la guía de referencia de los tipos de módulos y campos.

Creación y administración de archivos

Puedes agregar campos al archivo de módulo fields.json localmente a través de la CLI de HubSpot y en el editor de módulos en la aplicación. Para agregar campos a un tema, debes actualizar el archivo fields.json del tema utilizando la CLI.

CLI de HubSpot

Cuando se desarrolla de forma local los campos de los módulos y temas pueden ser editados a través de un archivo fields.json dentro de la carpeta del módulo o tema. Para los módulos, este archivo se creará automáticamente cuando se utilice el comandohs create module. Todas las opciones de campo disponibles en el editor de módulos están disponibles como propiedades que puedes agregar o editar en el archivo fields.json. Esto incluye los campos de repetición, grupos y condiciones. Uno de los beneficios de editar de manera local es que facilita la inclusión de tus módulos en los sistemas de control de versiones como git.

Editor de módulos

El administrador de diseño tiene una interfaz para la edición de módulos integrada que te permite crear, agrupar y editar campos de módulos. El editor de módulos incluye una vista previa que te permite visualizar el diseño del módulo y probar el funcionamiento de sus campos. Dado que los módulos interactúan con el diseño general, siempre es recomendable probarlos en la plantilla donde se utilizarán para identificar posibles estilos que puedan modificarlos. Ten en cuenta que si un módulo está almacenado en una carpeta bloqueada no puede ser editado de esta manera.
Editor de módulos del administrador de diseño
Nota: Si estás principalmente trabajando de forma local, pero quieres utilizar el editor de módulos para configurar los campos, asegúrate de obtener tus cambios. Esto es importante para quienes utilizan sistemas de control de versiones como git.

Campos contiguos

Por opción predeterminada, los campos de los módulos en los editores de contenido se apilan de forma vertical. Sin embargo, puedes colocar los campos del módulo uno al lado del otro agregando una propiedad display_width a los campos en el archivo fields.json con un valor half_width.
side-by-side-modules0
Un solo campo con un display_width de half_width aparecerá como un ancho de la mitad de la página en el editor de contenido. Cuando el campo por encima o por debajo de ese campo en el archivo fields.json se establece en half_width, se colocarán uno al lado del otro.
// Example module fields.json file
[
  {
    "name": "number_field",
    "label": "Number",
    "required": false,
    "locked": false,
    "display": "slider",
    "min": 1,
    "max": 10,
    "step": 1,
    "type": "number",
    "prefix": "",
    "suffix": "",
    "default": null,
    "display_width": "half_width"
  },
  {
    "label": "Description",
    "name": "description",
    "type": "text",
    "required": true,
    "default": "Add a description",
    "display_width": "half_width"
  }
]

Grupos de campos

Cuando los campos están relacionados entre sí, a menudo tiene sentido agruparlos de forma visual. Puedes hacerlo creando grupos de campos, que son compatibles tanto con los módulos como con los temas. Para crear un grupo de campos de forma local, en fields.json crea un objeto con el type de "group". A continuación, incluye una matriz children para obtener los campos que deseas agrupar.
simple-field-group-example
[
  {
    "id": "9c00985f-01db-ac5d-73f5-80ed6c0c7863",
    "name": "my_text",
    "display_width": null,
    "label": "Text",
    "required": true,
    "locked": false,
    "validation_regex": "",
    "allow_new_line": false,
    "show_emoji_picker": false,
    "type": "text",
    "default": "Add text here"
  },
  {
    "type": "group",
    "name": "recipe_summary_group",
    "label": "Recipe summary",
    "expanded": true,
    "inline_help_text": "Summarize the recipe (title and description)",
    "children": [
      {
        "type": "text",
        "label": "Recipe title",
        "name": "recipe_title",
        "placeholder": "Burrata salad"
      },
      {
        "type": "text",
        "label": "Recipe description",
        "name": "recipe_description",
        "placeholder": "fig mostarda, hazelnuts, arugula, vincotto, prosciutto, toasted sourdough"
      }
    ]
  }
]
Puedes crear más agrupaciones de campos dentro de un grupo añadiendo otro objeto de tipo "group" dentro del primer parámetro children . A continuación, crea el grupo de campos del mismo modo que en el caso anterior, utilizando children para contener los campos. Puedes anidar grupos de campos hasta una profundidad de tres.
grupo-de-campo-con-agrupación-secundaria
[
  {
    "type": "group",
    "name": "recipe_summary_group",
    "label": "Recipe summary",
    "inline_help_text": "Summarize the recipe (title and description)",
    "display": "inline",
    "children": [
      {
        "type": "text",
        "label": "Recipe title",
        "name": "recipe_title",
        "placeholder": "Burrata salad"
      },
      {
        "type": "text",
        "label": "Recipe description",
        "name": "recipe_description",
        "placeholder": "fig mostarda, hazelnuts, arugula, vincotto, prosciutto, toasted sourdough"
      },
      {
        "type": "group",
        "name": "secondary_group",
        "label": "Secondary group",
        "expanded": false,
        "children": [
          {
            "name": "bg_color",
            "label": "Background color",
            "sortable": false,
            "required": false,
            "locked": false,
            "type": "color",
            "default": {
              "color": "#ff0000",
              "opacity": 100
            }
          }
        ]
      }
    ]
  }
]

Opciones de visualización de grupos de campos

Puedes personalizar el siguiente comportamiento de visualización de grupos de campos:
  • Expansión: de forma predeterminada, los grupos de campos se mostrarán colapsados en el editor. Los grupos que contengan grupos anidados se mostrarán como botones de desglose que abren el grupo en su propia vista con el grupo más interno mostrando divisores.
default-collapsed-group
  • Tipo de visualización: de forma predeterminada, los grupos que no contengan grupos anidados se mostrarán como secciones plegables con divisores visuales alrededor de los elementos secundarios. Los grupos que contengan grupos anidados se mostrarán como botones de desglose que abren el grupo en su propia vista con el grupo más interno mostrado con divisores.
  • Icono de grupo: si quieres, puedes incluir un icono de Font Awesome que se muestre a la izquierda de la etiqueta.
icon-example
[
  {
    "type": "group",
    "name": "recipe_summary_group",
    "label": "Recipe summary",
    "display": "drilldown",
    "inline_help_text": "Summarize the recipe (title and description)",
    "icon": {
      "name": "star",
      "set": "fontawesome-5.14.0",
      "type": "SOLID"
    },
    "children": [
      {
        "type": "text",
        "label": "Recipe title",
        "name": "recipe_title",
        "placeholder": "Burrata salad"
      },
      {
        "type": "text",
        "label": "Recipe description",
        "name": "recipe_description",
        "placeholder": "fig mostarda, hazelnuts, arugula, vincotto, prosciutto, toasted sourdough"
      }
    ]
  }
]
ParámetroTipoDescripción
displayCadenaEl estilo de visualización del grupo de campos. Puede ser una de las siguientes:
  • drilldown: muestra el grupo colapsado con un botón para abrir los elementos secundarios del grupo en su propio panel. Esta es la visualización predeterminada para los grupos que contienen grupos anidados.
  • accordion: muestra el grupo colapsado con un botón para expandir los elementos secundarios del grupo debajo como una sección expandible. Esta es la visualización predeterminada para grupos sin grupos anidados.
  • inline: muestra el grupo y los elementos secundarios en línea sin opción de contraer el grupo.
iconObjetoAñade un icono a la izquierda de la etiqueta. Contiene los siguientes parámetros:
  • name: el identificador del icono de Font Awesome.
  • set: el conjunto de iconos de Font Awesome.
  • type: el estilo del icono (por ejemplo, SOLID, REGULAR).
expandedBooleanoSi el grupo de campos se expande de forma predeterminada.

Resultados de los valores de los campos dentro de los grupos de campos

Los grupos de campos crean dicc. que contienen los valores de los campos que deseas mostrar. Si anidas grupos de campos, el grupo de campos anidado será un dicc. dentro del dicc. del grupo de campos externo. Para acceder a esos datos, deberás recorrer desde la variable raíz del tema o del módulo, según corresponda.
<div>
{# printing a value from a field group `recipe_summary` is the field group,
`title` is the text field. #} {{module.recipe_summary.title}}
</div>

Elementos destacados en los grupos de campos

En situaciones donde un grupo de campos se repite, puedes especificar una o más de esas ocurrencias como destacadas, lo que te permite aplicar un estilo diferente para hacer que se destaquen. Por ejemplo, esto puede ser útil en una página de productos donde desees resaltar un producto destacado. Puedes definir un número máximo de elementos destacados por grupo de campos. En el editor, los creadores de contenido pueden marcar los elementos como destacados según sea necesario.
cms-field-group-featured-in-app (1)
Para habilitar los elementos destacados en un grupo de campos, incluye las propiedades group_occurrence_meta en la configuración del grupo de campos. Esta propiedad almacena las siguientes propiedades:
  • featured_enabled: se establece como true para habilitar los elementos destacados.
  • featured_limit: el número máximo de elementos destacados permitidos.
El grupo de campos también debe incluir la propiedad occurrence.
// Field group example
{
  "label": "Card",
  "name": "card",
  "type": "group",
  "occurrence": {
    "default": 2,
    "min": 1,
    "sorting_label_field": "card.title"
  },
  "group_occurrence_meta": {
    "featured_enabled": true,
    "featured_limit": 3
  },
  "children": [
    {
      "label": "Image",
      "name": "image",
      "type": "image",
      "responsive": true,
      "resizable": true,
      "show_loading": true,
      "default": {
        "loading": "lazy"
      }
    },
    {
      "label": "Content",
      "name": "text",
      "type": "richtext",
      "enabled_features": [
        "advanced_emphasis",
        "alignment",
        "block",
        "emoji",
        "font_family",
        "font_size",
        "lists",
        "standard_emphasis"
      ],
      "default": "<h3>This is a title</h3><p>Contextual advertising can be profitable. It can either pay for your hosting and maintenance costs for you website or it can pay for a lot more.</p>"
    }
  ],
  "default": [
    {
      "image": {
        "loading": "lazy"
      },
      "text": "<h3>This is a title</h3><p>Contextual advertising can be profitable. It can either pay for your hosting and maintenance costs for you website or it can pay for a lot more.</p>"
    },
    {
      "image": {
        "loading": "lazy"
      },
      "text": "<h3>This is a title</h3><p>Contextual advertising can be profitable. It can either pay for your hosting and maintenance costs for you website or it can pay for a lot more.</p>"
    }
  ]
}
Para validar si un elemento de un grupo repetido está destacado, puedes consultar la propiedad hs_meta. El siguiente código utiliza un bucle “for” para comprobar si hay elementos del grupo de campos establecidos como destacados y luego muestra el título de cada uno como un encabezado h3. {{ repeated_group_item.hs_meta.occurrence.featured }}
<div>
  <h2>Check out this week's featured items:</h2>
  <div>
    {% for item in module.card %}
        {% if item.hs_meta.occurrence.featured %}
            <h3>{{item.title}}</h3>
        {% endif %}
    {% endfor %}
  </div>
</div>

Campos de estilo

Los campos de estilo son un tipo especial de grupo de campos en el archivo fields.json de un módulo o tema que permiten a los creadores de contenido controlar el estilo de un módulo o tema en el editor de páginas y temas. A continuación, aprende como agregar los campos de estilo a un módulo o tema. También, sobre las prácticas recomendadas para utilizar y organizar los campos de estilo.

Campos de estilo del módulo

Los campos de estilo agregados a un módulo aparecerán en la pestaña Estilos del editor de páginas al editar el módulo:
style-field-module-editor0
Cuando se agregan campos de estilo al archivo fields.json de un módulo, se agregan dentro de un grupo de estilos. Ese grupo, sin embargo, puede contener varios grupos dentro de él, como se muestra a continuación:
// Module style fields
[
  {
    "type": "group",
    "name": "styles",
    "tab": "STYLE",
    "children": [
      {
        "name": "img_spacing",
        "label": "Spacing around image",
        "required": false,
        "type": "spacing",
        "default": {
          "padding": {
            "top": {
              "value": 10,
              "units": "px"
            },
            "bottom": {
              "value": 10,
              "units": "px"
            },
            "left": {
              "value": 10,
              "units": "px"
            },
            "right": {
              "value": 10,
              "units": "px"
            }
          },
          "margin": {
            "top": {
              "value": 10,
              "units": "px"
            },
            "bottom": {
              "value": 10,
              "units": "px"
            }
          }
        }
      }
    ]
  }
]
Los siguientes campos pueden utilizarse como campos de estilo en los módulos. Obtén más información sobre cada uno de los tipos de campo en la guía de módulos y tipos de campo. Más información sobre los tipos de campo de módulos y temas. Consulta la biblioteca de recursos del CMS de HubSpot para ver un ejemplo de campos de estilo dentro del archivo fields.json de un módulo.

Campos de estilo del tema

Los campos de estilo agregados a un tema aparecerán en la barra lateral izquierda del editor de temas:
style-field-theme-editor0
Todos los campos de estilo dentro del archivo fields.json de un tema se agregarán a la barra lateral izquierda del editor de temas, sin necesidad de colocarlos dentro de un grupo de estilos, como se muestra a continuación:
// Theme style fields
[
  {
    "label": "Global colors",
    "name": "global_colors",
    "type": "group",
    "children": [
      {
        "label": "Primary",
        "name": "primary",
        "type": "color",
        "visibility": {
          "hidden_subfields": {
            "opacity": true
          }
        },
        "default": {
          "color": "#494A52"
        }
      },
      {
        "label": "Secondary",
        "name": "secondary",
        "type": "color",
        "visibility": {
          "hidden_subfields": {
            "opacity": true
          }
        },
        "default": {
          "color": "#F8FAFC"
        }
      }
    ]
  },
  {
    "label": "Global fonts",
    "name": "global_fonts",
    "type": "group",
    "children": [
      {
        "label": "Primary",
        "name": "primary",
        "type": "font",
        "visibility": {
          "hidden_subfields": {
            "size": true,
            "styles": true
          }
        },
        "inherited_value": {
          "property_value_paths": {
            "color": "theme.global_colors.primary.color"
          }
        },
        "default": {
          "fallback": "sans-serif",
          "font": "Lato",
          "font_set": "GOOGLE"
        }
      },
      {
        "label": "Secondary",
        "name": "secondary",
        "type": "font",
        "visibility": {
          "hidden_subfields": {
            "size": true,
            "styles": true
          }
        },
        "inherited_value": {
          "property_value_paths": {
            "color": "theme.global_colors.primary.color"
          }
        },
        "default": {
          "fallback": "serif",
          "font": "Merriweather",
          "font_set": "GOOGLE"
        }
      }
    ]
  },
  {
    "name": "branding_color",
    "label": "branding_color",
    "type": "color",
    "default": {
      "color": "#3b7bc0", "opacity": 60
    },
    "inherited_value": {
      "property_value_paths": {
        "color": "brand_settings.primaryColor"
       }
    }
  },
  {
    "name": "secondary_branding_color",
    "label": "Secondary Branding color",
    "type": "color",
    "default": {
      "color": "#ff6b6b", "opacity": 60
    },
    "inherited_value": {
      "property_value_paths": {
        "color": "brand_settings.colors[2]"
         }
       }
     }
   ]
  }
]
Los siguientes campos pueden utilizarse como campos de estilo en los módulos. Obtén más información sobre cada uno de los tipos de campo en la guía de módulos y tipos de campo. Más información sobre los tipos de campo de módulos y temas. Consulta la biblioteca de recursos del CMS de HubSpot para un ejemplo de campos de estilo dentro del archivo fields.json de un tema.
Nota: Si eres un proveedor en el mercado de HubSpot, no debes reemplazar los campos de contenido existentes por campos de estilo en módulos ya creados. Cambiar la jerarquía de los campos en un archivo fields.json puede hacer que las instancias de los módulos existentes pierdan sus datos. En cambio, deberías agregar nuevos campos de estilo o crear una nueva versión con los campos agrupados de forma adecuada. Esto evitará que las actualizaciones causen problemas para los clientes que dependen de tus temas. Para proponer rutas de migración de los módulos antiguos, consulta el foro de ideas de HubSpot.

CSS generado

Algunos campos de estilo ofrecen una forma de imprimir CSS directamente en función del valor del campo. Esto es especialmente útil con los campos que pueden controlar un estilo más complejo como los gradientes. Los siguientes campos de estilo tienen una propiedad .css generada:
{% require_css %}
<style>
{% scope_css %}
  .team-member {
  {% if module.style.gradient.css %}
  background: {{ module.style.gradient.css }};
  {% endif %}
  {{ module.style.bg_img.css }}
  {{ module.style.spacing.css }}
  {{ module.style.border.css }}
  }
{% end_scope_css %}
</style>
{% end_require_css %}

Repetidores

Al crear módulos que le dan formato a la información, a menudo hay tipos de información que se repiten. Por ejemplo, un módulo de recetas podría tener un campo para “Ingrediente”. Sin embargo, la mayoría de las recetas tienen más de un ingrediente. Podrías proporcionar un campo de texto enriquecido, pero perderías la capacidad de garantizar un estilo consistente y añadir funcionalidades específicas para cada ingrediente. Aquí es donde entran los repetidores. HubSpot ofrece dos tipos de repetidores: campos repetitivos y grupos repetitivos.

Campos repetitivos

Esto hace que el creador de contenido pueda agregar tantos ingredientes como desee. Desde el punto de vista del desarrollador, obtenemos una matriz que puedes usar para imprimir esa lista de ingredientes, aplicando el formato y la funcionalidad que deseas. Los campos repetitivos son más adecuados para situaciones muy simples. En muchos casos, es más conveniente utilizar los grupos de repetición.
Nota: Actualmente no es posible establecer un orden predeterminado para los campos de repetición.

Campos repetitivos en fields.json

// Repeating field example
{
  "name": "ingredient",
  "label": "Ingredient",
  "required": false,
  "locked": false,
  "occurrence": {
    "min": 1,
    "max": null,
    "sorting_label_field": null,
    "default": 1
  },
  "allow_new_line": false,
  "show_emoji_picker": true,
  "type": "text",
  "default": ["1 cup water"]
}

Revisar los elementos del módulo HTML+HubL

<!--Looping through a repeating field-->
<ul>
  {% for item in module.ingredient %}
  <li>{{ item }}</li>
  {% endfor %}
</ul>

Grupos repetidos

La cantidad de un ingrediente es importante para la lista de compras. Mientras que alguien podría proporcionar eso en el campo de texto, el módulo tendría que analizar el campo de texto y esperar que estemos separando de manera exitosa la cantidad del ingrediente. Aquí es donde los grupos de repetición resultan útiles. La salida de estos campos es un objeto que se puede recorrer en un bucle.

Grupos repetidos en fields.json

// Repeating field group example
{
  "id": "ingredients",
  "name": "ingredients",
  "label": "Ingredients",
  "required": false,
  "locked": false,
  "occurrence": {
    "min": 1,
    "max": null,
    "sorting_label_field": "ingredients.ingredient",
    "default": null
  },
  "children": [
    {
      "id": "ingredients.ingredient",
      "name": "ingredient",
      "label": "Ingredient",
      "required": false,
      "locked": false,
      "validation_regex": "",
      "allow_new_line": false,
      "show_emoji_picker": false,
      "type": "text",
      "default": "Water"
    },
    {
      "id": "ingredients.quantity",
      "name": "quantity",
      "label": "Quantity",
      "required": false,
      "locked": false,
      "display": "text",
      "min": 0,
      "step": 1,
      "type": "number",
      "default": 1
    },
    {
      "id": "ingredients.measurement",
      "name": "measurement",
      "label": "Measurement",
      "help_text": "Unit of measurement (cups, tbsp, etc.)",
      "required": false,
      "locked": false,
      "allow_new_line": false,
      "show_emoji_picker": false,
      "type": "text",
      "default": "cups"
    }
  ],
  "type": "group",
  "default": [
    {
      "ingredient": "Water",
      "quantity": 1,
      "measurement": "cups"
    }
  ]
}

Recorrer los campos repetidos en los módulos

<h2>Ingredients</h2>
<ul>
  {% for ingredient in module.ingredients %}
  <li>
    <button
      data-quantity="{{ ingredient.quantity }}"
      data-unit="{{ ingredient.measurement }}"
      data-ingredient="{{ ingredient.ingredient }}"
    >
      Add to cart
    </button>
    {{ ingredient.quantity }} {{ ingredient.measurement }} {{
    ingredient.ingredient }}
  </li>
  {% endfor %}
</ul>

Opciones del repetidor

"occurrence" : {
    "min" : 1,
    "max" : 4,
    "sorting_label_field" : "ingredients.ingredient",
}
ParámetroTipoDescripciónPredeterminado
maxEnteroNúmero máximo de ocurrencias de este grupo. Evita que el creador de contenido agregue más de este número de elementos en la intefaz de usuario.null
minEnteroNúmero mínimo de apariciones de este grupo de campos. Evita que los usuarios tengan menos de este número de elementos en la interfaz de usuario.null
sorting_label_fieldCadenaEste es el ID del campo, del que se extrae el texto para mostrarlo en la interfaz de usuario en las tarjetas arrastrables. El valor predeterminado es el primer campo del grupo.

Campos heredados

La propiedad inherited_value puede configurarse para hacer que un campo herede su valor predeterminado de otros campos. El valor predeterminado de un campo a partir del valor de otro campo, configura el default_value_path con la ruta del nombre del campo de destino. Cuando se establece default_value_path, se ignorará cualquier default configurado en el campo. Para acceder a los valores de otros campos, las rutas deben incluir module. al principio, de manera similar a cómo se accede al valor en el código HubL del módulo.
// Inherited fields
{
  "name": "body_font",
  "type": "font",
  "default": {
    "font": "Helvetica",
    "color": "#C27BA0"
  }
},
{
  "name": "h1_font",
  "type": "font",
  "default": {},
  "inherited_value": {
    "default_value_path": "module.body_font",
    "property_value_paths" : {
      "font": "module.body_font.font",
      "font_set": "module.body_font.font_set"
    }
  }
}
Como la familia de fuentes se determina por una combinación font y font_set, debes incluir ambos para la heredar los campos de fuente. Aprende más sobre el campo de fuente.
Para los campos complejos (campos cuyos valores son objetos), los usuarios pueden tener una mayor segmentación sobre qué propiedades se heredan mediante property_value_path. Las rutas referenciadas en inherited_value también pueden incluir claves de los valores de un campo para campos complejos. Por ejemplo, los campos de color tienen valores de objeto que contienen el color en sí mismo, así como la opacidad. Para obtener el valor real del color sin la opacidad, la ruta debe terminar en .color. Por ejemplo, un campo de fuente puede heredar solo su color de un campo de color diferente:
// Inherited fields with objects
{
  "name": "secondary_color",
  "type": "color",
  "default": {
    "color": "#C27BA0",
    "opacity": 100
  }
},
{
  "name": "h1_font",
  "type": "font",
  "default": {
    "font": "Helvetica",
    "size": 12,
    "size_unit": "px"
  },
  "inherited_value": {
    "property_value_paths": {
      "color": "module.secondary_color.color"
    }
  }
}
También puedes combinar los efectos de default_value_path y property_value_paths para heredar un valor predeterminado de un campo mientras se hereda un valor de propiedad específico de un campo diferente:
// combining default_value_path and property_value_paths
{
  "name": "body_font",
  "type": "font",
  "default": {
    "font": "Helvetica",
    "color": "#000000"
  }
},
{
  "name": "secondary_color",
  "type": "color",
  "default": {
    "color": "#C27BA0",
    "opacity": 100
  }
},
{
  "name": "h1_font",
  "type": "font",
  "default": {},
  "inherited_value": {
    "default_value_path": "module.body_font",
    "property_value_paths": {
      "color": "module.secondary_color.color"
    }
  }
}
Si un campo hereda de otro campo, pero luego se anula directamente en el nivel de la página o en la configuración del tema, su conexión con el campo que controla se interrumpe. Cualquier otro campo que se adjunte a través de default_value_path o property_value_paths ya no afectará al valor del campo.

Visibilidad del campo

Al definir los campos del módulo y tema personalizados, puedes configurar cuándo aparece un campo agregando el objeto de visibility al campo en el archivo fields.json. Por ejemplo, puedes establecer un módulo de formulario para mostrar en un área de texto enriquecido cuando se selecciona el mensaje de agradecimiento, pero un selector de página cuando se selecciona una de redireccionamiento. Puedes establecer la visibilidad basada en el valor de un controlling_field_path o en una propiedad específica dentro de ese campo usando el parámetro property. También puedes aplicar visibilidad a un campo individual, o a un grupo de campos para controlar la visibilidad de todos los elementos del grupo.
"visibility" : {
 "controlling_field_path" : "field_name",
 "controlling_value_regex" : "regular_expression_in_controlling_field",
 "property": "src",
 "operator" : "EQUAL"
  }
ParámetroTipoDescripción
controlling_field_pathCadenaLa ruta de destino del campo que controla la condición de visualización.
  • Si el campo no está anidado dentro de un grupo de campos, utiliza el nombre del campo (por ejemplo, field_name).
  • Para los campos anidados en grupos, la ruta debe coincidir con su estructura de agrupación, separados por un punto. Por ejemplo:
    • field_group_name.field_name
    • parent_group.child_group.field_name
controlling_value_regexCadenaLa expresión regular en el campo de control que debe estar presente para que el campo se muestre. La expresión regular debe coincidir con toda la cadena (no solo con un subconjunto) y distinguir entre mayúsculas y minúsculas.
operatorCadenaEl operador que define cómo debe validarse el valor controlling_value_regex. Los operadores pueden ser uno de los siguientes:
  • NOT_EQUAL
  • EQUAL
  • EMPTY
  • NOT_EMPTY
  • MATCHES_REGEX
propertyCadenaEstablece la visibilidad en función de una propiedad especifica del campo objetivo. Por ejemplo, puedes habilitar la visibilidad cuando la propiedad src de un campo de imagen es igual a un valor específico. Por opción predeterminada, si no se proporciona ningún valor para este campo, la visibilidad se basa en el valor convertido a cadena de controlling_value_regex.
También puedes incluir un objeto occurrence_options dentro del objeto visibility para guiar el recuento de valores de un campo repetido. Este objeto debe incluir el count con el que comparar y una definición de operator . Por ejemplo, para mostrar un campo de texto solo cuando otro campo repetido tiene al menos dos elementos, podrías definir visibility de la siguiente manera:
[
  {
    "type": "group",
    "name": "ingredients",
    "label": "Recipe ingredients",
    "display": "drilldown",
    "children": [
      {
        "name": "ingredient",
        "label": "Ingredient",
        "occurrence": {
          "min": 1,
          "max": null,
          "default": 1
        },
        "type": "text",
        "default": ["1 cup water"]
      },
      {
        "type": "text",
        "label": "Conditional field",
        "name": "conditional_field",
        "visibility": {
          "controlling_field_path": "ingredients.ingredient",
          "occurrence_options": {
            "count": 2,
            "operator": "GREATER_THAN_OR_EQUAL"
          }
        }
      }
    ]
  }
]
Puedes utilizar cualquiera de los siguientes valores de operater :
  • "NOT_EQUAL"
  • "EQUAL"
  • "EMPTY"
  • "NOT_EMPTY"
  • "GREATER_THAN"
  • "GREATER_THAN_OR_EQUAL"
  • "LESS_THAN"
  • "LESS_THAN_OR_EQUAL"

Visibilidad avanzada

El atributo visibility solo puede admitir un criterio a la vez. Para incluir varios criterios con varios operadores, así como el orden de las operaciones, puedes utilizar advanced_visibility.
"visibility_rules" : "ADVANCED",
"advanced_visibility" : {
   "boolean_operator" : "AND",
   "criteria" : [{
     "controlling_field_path" : "field_name",
     "controlling_value_regex" : "regular_expression_in_controlling_field",
      "operator" : "MATCHES_REGEX"
    },
    {
     "controlling_field_path" : "field_name",
     "controlling_value_regex" : "regular_expression_in_controlling_field",
     "operator" : "EQUAL"
    }]
}
ParámetroTipoDescripción
visibility_rulesCadenaPor opción predeterminada, este valor se establece como SIMPLE. Para utilizar advanced_visibility, establécelo como ADVANCED.
boolean_operatorCadenaEl operador booleano para los criterios condicionales. Puede ser AND, o OR.
criteriaMatrizUna matriz de objetos de visibilidad que define los criterios condicionales que deben cumplirse para que se muestre el campo.
controlling_field_pathCadenaLa ruta de puntos del campo que controlan la condición de visualización.
  • Si el campo no está anidado dentro de un grupo de campos, utiliza el nombre del campo (por ejemplo, field_name).
  • Para los campos anidados en grupos, la ruta debe coincidir con su estructura de agrupación, separados por un punto. Por ejemplo:
    • field_group_name.field_name
    • parent_group.child_group.field_name
controlling_value_regexCadenaEl valor en el campo de control que debe cumplirse para mostrar el campo. Cuando se utiliza el operadorMATCHES_REGEX, el regex debe coincidir con toda la cadena (no con un subconjunto) y se ejecuta con precaución en la distinción entre mayúsculas y minúsculas. Un campo con un controlling_field_path pero controlling_value_regex no es visible si el campo de control tiene algún valor como non-null o non-blank.
operatorCadenaEl operador que define cómo debe validarse el valor controlling_value_regex. Los operadores pueden ser uno de los siguientes:
  • NOT_EQUAL
  • EQUAL
  • EMPTY
  • NOT_EMPTY
  • MATCHES_REGEX
La sintaxis regex es requerida cuando se utiliza MATCHES_REGEX.
Por ejemplo, a continuación se muestra la primera parte del código del módulo de pagos predeterminado. Para revisar el código completo, puedes clonar el módulo en HubSpot y luego descargarlo en tu entorno local para ver el archivo fields.json del módulo.
[
  {
    "id": "payment",
    "name": "payment",
    "display_width": null,
    "label": "Payment",
    "required": true,
    "locked": false,
    "type": "payment",
    "default": {
      "id": null,
      "properties": {}
    }
  },
  {
    "id": "checkout_location",
    "name": "checkout_location",
    "display_width": null,
    "label": "Checkout behavior",
    "required": false,
    "locked": false,
    "visibility": {
      "controlling_field_path": "payment",
      "controlling_value_regex": "id\":\\d+",
      "operator": "MATCHES_REGEX"
    },
    "display": "radio",
    "choices": [
      ["new_tab", "Open in a new tab"],
      ["overlay", "Sliding overlay"]
    ],
    "type": "choice",
    "default": "new_tab"
  },
  {
    "id": "button_text",
    "name": "button_text",
    "display_width": null,
    "label": "Button text",
    "required": true,
    "locked": false,
    "validation_regex": "",
    "visibility": {
      "controlling_field_path": "payment",
      "controlling_value_regex": "id\":\\d+",
      "operator": "MATCHES_REGEX"
    },
    "allow_new_line": false,
    "show_emoji_picker": false,
    "type": "text",
    "default": "Checkout"
  },
  {
    "id": "icon",
    "name": "icon",
    "display_width": null,
    "label": "Icon",
    "required": false,
    "locked": false,
    "visibility_rules": "ADVANCED",
    "advanced_visibility": {
      "boolean_operator": "AND",
      "criteria": [
        {
          "controlling_field_path": "payment",
          "controlling_value_regex": "id\":\\d+",
          "operator": "MATCHES_REGEX"
        },
        {
          "controlling_field_path": "add_icon",
          "controlling_value_regex": "true",
          "operator": "EQUAL"
        }
      ],
      "children": []
    },
    "children": [
      {
        "id": "icon.icon",
        "name": "icon",
        "display_width": null,
        "label": "Icon",
        "required": true,
        "locked": false,
        "icon_set": "fontawesome-5.0.10",
        "type": "icon",
        "default": {
          "name": "hubspot",
          "type": "SOLID",
          "unicode": "f3b2"
        }
      },
      {
        "id": "icon.position",
        "name": "position",
        "display_width": null,
        "label": "Position",
        "required": true,
        "locked": false,
        "display": "select",
        "choices": [
          ["left", "Left"],
          ["right", "Right"]
        ],
        "type": "choice",
        "default": "left"
      }
    ],
    "tab": "CONTENT",
    "expanded": false,
    "type": "group"
  }
  // rest of fields.json code
]
El código anterior da como resultado el siguiente comportamiento:
  • El primer campo (payment) es un campo obligatorio (menú desplegable) que permite al creador de contenido seleccionar un enlace de pago específico. En HubSpot, un creador de contenido verá lo siguiente cuando agregue el módulo a la página por primera vez:
payment-link-selector
  • Una vez que se selecciona un enlace de pago, aparecerán los tres campos que siguen (checkout_location, button_text y icon). Esto se debe a que los campos tienen un atributo visibility que está controlado por el campo payment y requiere un valor ID en el parámetro id en el campo de pago.
El campo icon en sí utiliza advanced_visibility para aparecer solo cuando hay un enlace de pago presente en el campo payment y cuando la casilla de verificación add_icon está seleccionada. Además de establecer la visibilidad dentro de fields.json, también puedes establecer la visibilidad en el administrador de diseño editando las opciones de Condiciones de visualización de un campo.
display-conditions-property
Después de configurar la visibilidad en el administrador de diseño, puedes buscar el módulo utilizando la CLI para ver el atributo visibility en el archivo fields.json del módulo.

Inhabilitar el campo condicional

Puedes agregar condiciones a un campo para evitar la edición cuando se cumplan las condiciones especificadas. También puedes establecer un mensaje para mostrar sobre el campo cuando está inhabilitado y proporcionar detalles en el editor de contenido.
Captura de pantalla 2023-05-23 a las 16.10.28
Las condiciones y el mensaje se establecen en el objeto disabled_controls del campo. Las condiciones para hacer un campo editable se establecen dentro del objeto rules, que sigue el mismo formato que advanced_visibility. El siguiente código muestra una implementación simple y avanzada de los criterios de rules:
  • El campo simple_page incluye la lógica para inhabilitar el campo si el campo text_field se establece en testing.
  • El campo fancy_page incluye la lógica para deshabilitar el campo si cualquiera de los valores text_field o text_field_2 se establece en cualquier valor que no sea igual a testing y testing2 respectivamente.
// example fields.json
[
  {
    "type": "text",
    "name": "text_field",
    "label": "Text field"
  },
  {
    "type": "text",
    "name": "text_field_2",
    "label": "Text field 2"
  },
  {
    "type": "page",
    "label": "Simple Page",
    "name": "simple_page",
    "disabled_controls": {
      "message": "This field is disabled",
      "rules": {
        "criteria": [
          {
            "controlling_field_path": "text_field",
            "operator": "EQUAL",
            "controlling_value_regex": "testing"
          }
        ]
      }
    }
  },
  {
    "type": "page",
    "label": "Fancy Page",
    "name": "fancy_page",
    "disabled_controls": {
      "message": "This field is disabled",
      "rules": {
        "boolean_operator": "OR",
        "criteria": [
          {
            "controlling_field_path": "text_field",
            "operator": "NOT_EQUAL",
            "controlling_value_regex": "testing"
          },
          {
            "controlling_field_path": "text_field_2",
            "operator": "NOT_EQUAL",
            "controlling_value_regex": "testing2"
          }
        ]
      }
    }
  }
]
ParámetroTipoDescripción
messageCadenaEl mensaje que se mostrará en el editor de contenido cuando el campo esté desactivado.
rulesObjetoLas condiciones para activar el campo para la edición.
criteriaMatrizUna matriz de objetos condicionales que define los criterios que deben cumplirse para que se muestre el campo. Esta matriz puede contener múltiples objetos condicionales separados por lógica AND u OR a través del parámetro boolean_operator.
boolean_operatorCadenaEl operador booleano para los criterios condicionales. Puede ser AND u OR. Cuando no se especifica, el valor predeterminado es AND.
controlling_field_pathCadenaLa ruta de puntos del campo que controlan la condición de visualización.
  • Si el campo no está anidado dentro de un grupo de campos, utiliza el nombre del campo (por ejemplo, field_name).
  • Para los campos anidados en grupos, la ruta debe coincidir con su estructura de agrupación, separados por un punto. Por ejemplo:
    • field_group_name.field_name
    • parent_group.child_group.field_name
controlling_value_regexCadenaEl valor en el campo de control que debe cumplirse para mostrar el campo. Cuando se utiliza el operadorMATCHES_REGEX, el regex debe coincidir con toda la cadena (no con un subconjunto) y se ejecuta con precaución en la distinción entre mayúsculas y minúsculas. Un campo con un controlling_field_path pero controlling_value_regex no es visible si el campo de control tiene algún valor como non-null o non-blank.
operatorCadenaEl operador que define cómo debe validarse el valor controlling_value_regex. Los operadores pueden ser uno de los siguientes:
  • NOT_EQUAL
  • EQUAL
  • EMPTY
  • NOT_EMPTY
  • MATCHES_REGEX
La sintaxis regex es requerida cuando se utiliza MATCHES_REGEX.

Resaltador de campos del editor de temas

Cuando están en el editor de temas, el resaltador de vista previa puede ayudar a los creadores de contenido a comprender qué campos controlan qué elementos de página. La vista previa del resaltador funciona asignando los campos del tema a los selectores CSS a los que afectan, agregando un cuadro alrededor de esos elementos al pasar el cursor sobre el campo en el editor del tema. Para configurar el resaltador de vista previa para los campos del tema, debes incluir un archivo editor-preview.json en el directorio raíz del tema para asignar los campos del tema a una lista de selectores CSS. En el archivo, debes incluir una matriz para cada campo de estilo que deseas resaltar que contiene los selectores CSS relevantes, utilizando el siguiente formato:
// editor-preview.json
{
  "selectors": {
    "theme.settings.path.1": [ <CSS selectors> ],
    "theme.settings.path.2": [ <CSS selectors> ],
  }
}
Por ejemplo, el código a continuación resaltará qué elementos de la página están controlados por el campo de fuente principal. Puedes ver el ejemplo completo en el archivo editor-preview.json del tema Growth predeterminado.
// editor-preview.json
{
  "selectors": {
    "fonts.primary": [
      "button, .button, .hs-button",
      "form input[type='submit'], form .hs-button",
      ".error-page:before",
      "p",
      "blockquote > footer",
      "form td.is-today .pika-button",
      "form .is-selected .pika-button",
      "th, td",
      ".blog-listing__post-tag",
      ".blog-listing__post-author-name, .blog-post__author-name",
      ".pagination__link-icon svg",
      ".tabs__tab",
      "a",
      ".button.button--simple",
      ".pagination__link .pagination__link-icon svg",
      ".card--dark",
      ".card--light",
      ".card--light summary, .card--light p, .card--light h1, .card--light h2, .card--light h3, .card--light h4, .card--light h5, .card--light h6, .card--light a:not(.button), .card--light span, .card--light div, .card--light li, .card--light blockquote",
      ".card--light .accordion__summary:before",
      "tfoot th, tfoot td",
      ".header__language-switcher-current-label > span",
      ".header__language-switcher-child-toggle svg",
      ".header__language-switcher .lang_list_class a:not(.button)",
      ".header__menu-link",
      ".header__menu-item--depth-1 > .header__menu-link:not(.button)",
      ".header__menu-item--depth-1 .header__menu-child-toggle svg",
      ".header__menu-toggle svg",
      ".header__language-switcher .header__language-switcher-current-label > span",
      ".header p, .header h1, .header h2, .header h3, .header h4, .header h5, .header h6, .header a:not(.button), .header span, .header li, .header blockquote, .header .tabs__tab, .header .tabs__tab, .header .tabs__tab, .header .tabs__tab",
      ".footer .hs-menu-wrapper a",
      ".footer h1, .footer h2, .footer h3, .footer h4, .footer h5, .footer h6, .footer p, .footer a:not(.button), .footer span, .footer div, .footer li, .footer blockquote, .footer .tabs__tab, .footer .tabs__tab, .footer .tabs__tab, .footer .tabs__tab",
      ".footer hr",
      "form label",
      "#email-prefs-form, #email-prefs-form h1, #email-prefs-form h2",
      "form legend",
      "form input[type='text'], form input[type='email'], form input[type='password'], form input[type='tel'], form input[type='number'], form input[type='search'], form select, form textarea",
      ".backup-unsubscribe input[type='email']",
      "form .legal-consent-container, form .legal-consent-container .hs-richtext, form .legal-consent-container .hs-richtext p",
      "form .hs-richtext, form .hs-richtext *, form .hs-richtext p, form .hs-richtext h1, form .hs-richtext h2, form .hs-richtext h3, form .hs-richtext h4, form .hs-richtext h5, form .hs-richtext h6",
      "button, button, button, .button, .button, .button, .hs-button, .hs-button, .hs-button",
      "button, .button, .hs-button",
      ".button.button--secondary, .button.button--secondary, .button.button--secondary",
      ".button.button--secondary",
      ".header__menu-item--depth-1 > .header__menu-link, .header__menu-item--depth-1 > .header__menu-link",
      ".header__menu-item--depth-1 > .header__menu-link",
      ".header__menu-submenu .header__menu-link, .header__menu-submenu .header__menu-link",
      ".header__language-switcher .lang_list_class a, .header__language-switcher .lang_list_class a",
      ".header__menu-submenu .header__menu-link:not(.button)",
      ".footer .hs-menu-wrapper a, .footer .hs-menu-wrapper a",
      ".footer .hs-menu-wrapper a",
      "form .hs-richtext a",
      ".header__menu-item--depth-1 > .header__menu-link--active-link:not(.button)",
      ".footer .hs-menu-wrapper .active > a"
    ]
  }
}
growth-theme-hover
Para comenzar a generar este archivo, ejecuta el siguiente comando CLI para crear el archivo. Durante la creación del archivo, se ejecutará un script para configurar las asignaciones iniciales de los selectores de campo.
hs theme generate-selectors <theme-directory-path>
ParámetroDescripción
theme-directory-pathLa ruta al directorio de temas.
Después de ejecutar el comando, deberás revisar y ajustar el archivo editor-preview.json para asegurarte de que los campos y los selectores estén asignados correctamente. Mientras el comando generate-selectors valida qué campos afectan a qué selectores, deberás hacer las correcciones basadas en cómo se estructura tu tema. Por ejemplo, este comando no puede detectar cuando los módulos están anulando el estilo o cuando estás usando macros. Para probar estas asignaciones, carga el tema a una cuenta y luego ve el editor de temas en esa cuenta (ConfiguraciónSitio webTemasVer tema).