Comment puis-je remplacer la classe ou l'attribut en lecture seule qui est spécifié dans le formulaire xml?

9

Nous avons un champ particulier qui ne peut autoriser la saisie que lors de l'ajout de l'enregistrement pour la première fois, je me demande donc s'il est possible d'ajouter une classe ou de le spécifier readonlyà un moment donné après le chargement du formulaire, mais (bien sûr) avant d'être rendu à l'utilisateur.

Lors du chargement d'un formulaire à partir de models\forms\myform.xml, des attributs tels que classe (s) et lecture seule sont chargés comme prévu. Voici la façon dont le champ est en cours de rendu, qui utilise les bibliothèques \ joomla \ form \ form.php:

echo $this->form->getInput('myReadOnlyCode')
PIB
la source

Réponses:

3

Oui, vous pouvez le faire.

Nous avons un composant qui a un concept de "Plans", il utilise la même vue pour différents niveaux d'accès, mais rend les champs accessibles ou non selon les groupes d'utilisateurs.

Donc, pour les utilisations qui peuvent "exécuter" un plan sans le modifier, nous désactivons un tas de champs. Selon le type de champ, cela peut signifier définir plusieurs attributs de champ, par exemple

$this->form->setFieldAttribute('name', 'class', 'readonly');
$this->form->setFieldAttribute('name', 'readonly', 'true');
$this->form->setFieldAttribute('description', 'class', 'readonly');
$this->form->setFieldAttribute('description', 'disabled', 'true');
$this->form->setFieldAttribute('description', 'type', 'text');
$this->form->setFieldAttribute('published', 'class', 'readonly');
$this->form->setFieldAttribute('published', 'readonly', 'true');
$this->form->setFieldAttribute('publish_up', 'class', 'readonly');
$this->form->setFieldAttribute('publish_up', 'readonly', 'true');
$this->form->setFieldAttribute('publish_up', 'format', '%Y-%m-%d %H:%M:%S');
$this->form->setFieldAttribute('publish_up', 'filter', 'user_utc');
$this->form->setFieldAttribute('publish_down', 'class', 'readonly');
$this->form->setFieldAttribute('publish_down', 'readonly', 'true');
$this->form->setFieldAttribute('publish_down', 'format', '%Y-%m-%d %H:%M:%S');
$this->form->setFieldAttribute('publish_down', 'filter', 'user_utc');

Ainsi, en fonction de votre myReadOnlyCodechamp, vous pouvez le faire en définissant un ou plusieurs des attributs comme indiqué ci-dessus, par exemple s'il ne s'agit que d'une entrée de texte standard:

$this->form->setFieldAttribute('myReadOnlyCode', 'class', 'readonly');
$this->form->setFieldAttribute('myReadOnlyCode', 'readonly', 'true');
Craig
la source
2

Comparez la modification de l'article principal de Joomla. Administrateur - article.php - méthode getForm.

Soyez conscient du filtre pour empêcher la mise à jour "backdoor".

    $user = JFactory::getUser();

    // Check for existing article.
    // Modify the form based on Edit State access controls.
    if ($id != 0 && (!$user->authorise('core.edit.state', 'com_content.article.' . (int) $id))
        || ($id == 0 && !$user->authorise('core.edit.state', 'com_content'))
    )
    {
        // Disable fields for display.
        $form->setFieldAttribute('featured', 'disabled', 'true');
        $form->setFieldAttribute('ordering', 'disabled', 'true');
        $form->setFieldAttribute('publish_up', 'disabled', 'true');
        $form->setFieldAttribute('publish_down', 'disabled', 'true');
        $form->setFieldAttribute('state', 'disabled', 'true');

        // Disable fields while saving.
        // The controller has already verified this is an article you can edit.
         $form->setFieldAttribute('featured', 'filter', 'unset');
        $form->setFieldAttribute('ordering', 'filter', 'unset');
         $form->setFieldAttribute('publish_up', 'filter', 'unset');
         $form->setFieldAttribute('publish_down', 'filter', 'unset');
         $form->setFieldAttribute('state', 'filter', 'unset');
    }
schnuti
la source