¿Cómo puedo anular la clase o el atributo de solo lectura que se especifica en el formulario xml?

9

Tenemos un campo particular que solo puede permitir la entrada cuando se agrega el registro por primera vez, por lo que me pregunto si es posible agregar una clase o especificar readonlyen algún momento después de que se haya cargado el formulario, pero (por supuesto) , antes de que se presente al usuario.

Al cargar un formulario desde models\forms\myform.xml, los atributos como class (es) y readonly se cargan como se esperaba. Esta es la forma en que el campo se está representando actualmente, que utiliza las bibliotecas \ joomla \ form \ form.php:

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

Respuestas:

3

Sí, usted puede hacer esto.

Tenemos un componente que tiene un concepto de "Planes", utiliza la misma vista para diferentes niveles de acceso, pero hace que los campos sean accesibles o no dependiendo de los grupos de usuarios.

Entonces, para aquellos usos que pueden "Ejecutar" un plan pero no editarlo, desactivamos "un montón de campos". Dependiendo del tipo de campo, esto puede significar establecer varios atributos de campo, p. Ej.

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

Entonces, dependiendo de cuál sea su myReadOnlyCodecampo, puede hacerlo configurando uno o más de los atributos como se muestra arriba, por ejemplo, si es solo una entrada de texto estándar:

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

Compare la edición del artículo principal de Joomla. Administrador - article.php - método getForm.

Tenga en cuenta el filtro para evitar la actualización de "puerta trasera".

    $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
fuente