Je voudrais rendre le même ensemble de champs à plusieurs reprises pour la création et la mise à jour par lots. Est-il possible de faire cela avec JForms?
Actuellement, j'ai un formulaire comme celui-ci:
<?xml version="1.0" encoding="UTF-8"?>
<form name="customer_registration_form" title="COM_CANTEEN_CUSTOMER_REGISTRATION_TITLE" description="COM_CANTEEN_CUSTOMER_REGISTRATION_DESCRIPTION" buttonLabel="COM_CANTEEN_CUSTOMER_REGISTRATION_BUTTON_LABEL" class="customer-registration">
<fields name="customer_registration">
<fieldset name="customer_registration">
<field name="name" type="text" required="true" size="80"
validate="text" minLength="4" maxLength="80" pattern="^\p{L}+(?:[\p{Zs}-]\p{L}+)+$"
label="COM_CANTEEN_CUSTOMER_REGISTRATION_NAME_LABEL" description="COM_CANTEEN_CUSTOMER_REGISTRATION_NAME_DESCRIPTION" message="COM_CANTEEN_CUSTOMER_REGISTRATION_NAME_MESSAGE" />
<field name="age" type="integer" required="true" default="6" first="1" last="150" step="1"
validate="integer" min="1" max="150"
label="COM_CANTEEN_CUSTOMER_REGISTRATION_AGE_LABEL" description="COM_CANTEEN_CUSTOMER_REGISTRATION_AGE_DESCRIPTION" message="COM_CANTEEN_CUSTOMER_REGISTRATION_AGE_MESSAGE" />
<field name="permanent_orderer" type="checkbox" default="1"
label="COM_CANTEEN_CUSTOMER_REGISTRATION_PERMANENT_ORDERER_LABEL" description="COM_CANTEEN_CUSTOMER_REGISTRATION_PERMANENT_ORDERER_DESCRIPTION" message="COM_CANTEEN_CUSTOMER_REGISTRATION_PERMANENT_ORDERER_MESSAGE" />
</fieldset>
</fields>
</form>
Que je rends avec cette mise en page:
<?php
extract($displayData);
JHtml::_('behavior.tooltip');
?>
<form action="<?php echo $action; ?>"
method="post" name="<?php echo $form->getAttribute('name'); ?>" class="<?php echo $form->getAttribute('class'); ?> basic-form-layout">
<legend><?php echo JText::_($form->getAttribute('title')); ?></legend>
<?php
echo JText::_($form->getAttribute('description'));
foreach (array_keys($form->getFieldsets()) as $fieldset)
echo $form->renderFieldset($fieldset);
?>
<?php echo JHtml::_('form.token'); ?>
<div class="control-group">
<div class="control-label"> </div>
<div class="controls">
<button type="submit"><?php echo JText::_($form->getAttribute('buttonLabel')); ?></button>
</div>
</div>
</form>
En envoyant le formulaire, j'ai reçu un customer_registration[field]
tableau. J'aimerais avoir un customer_registration[i][field]
ou customer_registration[field][i]
tableau à la place. Est-ce pris en charge d'une manière ou d'une autre ou devrais-je écrire une solution de contournement?
Le rendu est correct, je suppose que je dois appeler renderFieldset
plusieurs fois, mais comment puis-je remplacer le customer_registration
obtenir customer_registration[i]
? La seule solution que je pourrais trouver est de restituer l’ensemble de champs, de rechercher les noms de champs dans le code HTML résultant et de les remplacer par regex ou simplexml. Une autre idée? Ou est-ce déjà implémenté d'une manière ou d'une autre et j'étais superficiel en vérifiant la fonctionnalité?
Il n'est pas nécessaire de contourner le problème. I vérifié le code , il y a une option de contrôle que vous pouvez donner par l'instanciation de JForm. Si elle est définie, ce sera la racine des noms de champs.
Cela devrait ressembler à ceci avec Vanilla joomla (je l’ai testé avec mes propres classes de wrapper):
JHtml::_('behavior.tooltip');
$fileName = 'myform.xml';
$input = JFactory::getApplication()->input;
$isPost = $input->getMethod() == 'POST';
if ($isPost)
$data= $input->post->getArray();
?><form action="<?php echo JUri::getInstance(); ?>"><?php
for ($i = 0; $i < 13; ++$i) {
$randomName = uniqid($fileName . '.');
$form = JForm::getInstance(
$randomName,
JPATH_COMPONENT . '/my/templates/' . $fileName,
array('control' => $i)
);
if ($isPost) {
$filtered = $form->filter($data[$i]);
foreach ($filtered as $fieldset => $fields)
foreach ($fields as $field => $value)
$form->setValue($field, $fieldset, $value);
}
foreach (array_keys($form->getFieldsets()) as $fieldset)
echo $form->renderFieldset($fieldset);
}
echo JHtml::_('form.token'); ?>
<button type="submit">send</button>
</form>