Como substituir a classe ou o atributo somente leitura especificado no formato xml?

9

Temos um campo específico que só pode permitir entrada ao adicionar o registro pela primeira vez, por isso estou pensando se é possível adicionar uma classe ou especificar readonlyem algum momento após o carregamento do formulário, mas (é claro) , antes de ser renderizado para o usuário.

Ao carregar um formulário models\forms\myform.xml, atributos como classe (s) e somente leitura estão sendo carregados conforme o esperado. Aqui está a maneira como o campo está sendo renderizado atualmente, que usa as bibliotecas \ joomla \ form \ form.php:

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

Respostas:

3

Sim, você pode fazer isso.

Temos um componente que possui o conceito de "Planos", que usa a mesma visualização para diferentes níveis de acesso, mas torna os campos acessíveis ou não, dependendo dos grupos de usuários.

Portanto, para aqueles usos que podem "Executar" um plano, mas não editá-lo, desativamos "vários" campos. Dependendo do tipo de campo, isso pode significar definir vários atributos de campo, por exemplo,

$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');

Portanto, dependendo do seu myReadOnlyCodecampo, você pode fazer isso definindo um ou mais dos atributos, como mostrado acima, por exemplo, se for apenas uma entrada de texto padrão:

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

Compare o artigo principal do Joomla. Administrador - article.php - método getForm.

Esteja ciente do filtro para impedir a atualização "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
fonte