it-swarm-es.tech

¿Cómo usar un diseño personalizado con campos de subformulario JForm?

Quiero reutilizar algunos formularios en mi componente. El campo de subformulario hace el trabajo. Sin embargo, necesito eliminar algunos campos y/o grupos de campos al mostrar el subformulario.

Intenté usar los métodos JFormremoveGroup() y removeField() pero no los eliminará del subformulario.

Supongo que un nuevo diseño es el camino a seguir. Podría especificar el diseño en el campo en lugar de layout='joomla.form.field.subform.default'.
¿Funcionaría esto?

Si es así, ¿cómo implemento el diseño personalizado?
Los ejemplos serían muy apreciados.

5
nimble

Para colocar un subformulario (Joomla! 3.6+) dentro de otro formulario "maestro" y usar un diseño personalizado:

1) En el archivo XML JForm maestro, use el tipo de campo de subformulario.

<field name= "fieldname"
    description= "Field name description"
    type= "subform"
    label= "Field Label"
    required= "true"
    formsource= "/administrator/components/com_mycomponent/models/forms/myform.xml"
    layout="myfolder.mylayoutfile"
/>

forma fuente es la ruta al subformulario JForm XML que se representará.

diseño es la ruta de notación de puntos al archivo de diseño personalizado. Debe tener una carpeta de "diseños" en la estructura de directorios de su componente. Entonces, sería com_mycomponent/layouts. Debajo de la carpeta de diseños puede crear otras carpetas (si lo desea). En el ejemplo anterior, "myfolder" es una carpeta debajo de "diseños" y "mylayoutfile" es el archivo de diseño personalizado PHP en esa carpeta. No especifique "diseños" en la notación de puntos ruta y no agregue .php al nombre del archivo.

2) Este es un diseño de ejemplo PHP archivo que puede modificarse para sus propósitos.

<?php
defined('_JEXEC') or die;
extract($displayData);

$form = $forms[0];
?>

<div class="subform-wrapper">
    <?php foreach($form->getGroup('') as $field): ?>
        <?php echo $field->renderField(); ?>
    <?php endforeach; ?>
</div>
2
nimble

Editado para agregar una respuesta específica del tipo de campo de subformulario:

Después de verlo correctamente, adjuntar su propio diseño al tipo de campo de subformulario es súper fácil.

Cree una carpeta layouts en la misma carpeta del componente principal (sitio o administrador) que el archivo XML y coloque su diseño en ella:

-com_myComponent 
    - controllers
    - layouts
        - mylayout.php
    - models
        - forms

Añadir layout="mylayout" a su campo de subformulario en su XML y ahí lo tiene.

¡No puede ser mucho más fácil!

También debe tener en cuenta que los nombres de sus archivos de diseño pueden ser los mismos que los predeterminados, el suyo siempre se cargará si hay algún conflicto. Entonces, por ejemplo, aunque hay un diseño de subformulario llamado default.php todavía puedes nombrar el tuyo default.php y funcionará bien.

Respuesta previa a la edición:

Aquí hay un ejemplo de cómo incluir un diseño de uno de los míos:

<?php echo JLayoutHelper::render('layouts.dupebutton', $dupeData, JPATH_COMPONENT_ADMINISTRATOR); ?>
  • El primer argumento es 'layoutFolder.layoutName'.
  • El segundo argumento son los datos que se pasan al diseño (pasará su formulario/campos).
  • El tercero es la ruta base que se debe usar para buscar la carpeta/archivo de diseño (en este caso, la ruta a la instalación administrativa de mi componente).

Debe agregar algo similar a eso cuando desee que se renderice su diseño.

Mi com_myComponent carpeta en la carpeta administrator de Joomla (es decir, JPATH_COMPONENT_ADMINISTRATOR) tiene esta estructura:

-com_myComponent 
    - classes
    - controllers
    - layouts
        - dupebutton.php
        - anotherlayout.php

El asistente de diseño de Joomla pasará los datos que especificó al diseño cuando lo represente. Cuando se representa el diseño, contendrá una variable preasignada llamada $displayData. Puede usar esta variable tal cual, pero parece ser una convención de Joomla agregar esta línea en el <?php etiquetas en la parte superior de sus archivos de diseño:

$data = $displayData;

Ahora solo se trata de construir el diseño utilizando los campos de formulario que desee. Avísame si también quieres ejemplos de eso, pero parece que ya sabes cómo.

Por cierto, estoy bastante seguro de que en realidad es posible seleccionar entre subgrupos de formularios, pero la sintaxis no es muy intuitiva ni está bien documentada; la última vez que intenté hacerlo, me di por vencido como ahora.

También hay varias formas de lograr lo que desea, hay alternativas al uso de un diseño. Aún así, es una solución tan buena como cualquier otra, así que me quedaría con ella.

4
chrBrd