it-swarm-es.tech

Joomla 2.5 diferencias en JFormField de 3.x

He estado usando un complemento para ayudar a agregar parámetros adicionales a los módulos, para hacer eso uso JForm para cargar un archivo xml que se incluye con varios complementos.

Esto es lo que he estado usando y funciona en 3.0 en adelante, se toma como un bucle de conjunto de campos y cada "campo" es una instancia de JFormField.

$field->name = 'plg_form_settings['.$field->name.']';
$content .= '<div class="control-group">';
    $content .= '<div class="control-label">';
        $content .= $field->label;
    $content .= '</div>';
    $content .= '<div class="controls">';
        $content .= $field->input;
    $content .= '</div>';
$content .= '</div>';

Como puede ver, funcionó asumiendo que $field->name Es público, sin embargo, en 2.5 está protegido (también está en 3, lo que me desconcierta, nunca funciona en ninguna versión de 3).

He comprobado las diferencias entre JFormField en 2.5 y 3 y hay diferencias masivas, aunque de una forma u otra necesito acceder a la propiedad $field->name (Veo que puedo hacer $field->__get('name') para acceso de solo lectura), podría ignorar la funcionalidad de JFormField pero eso parece un poco contraproducente para agregar compatibilidad con versiones anteriores.

En Joomla 3 hay una función llamada __set($name,$value) sin embargo, no está en Joomla 2.5

¿Hay alguna forma "simple" de anular un nombre de campo (u otra propiedad) en Joomla 2.5?

5
Jordan Ramstad

He estado trabajando duro en esto y encontré una solución, es la forma "adecuada" de hacerlo que otros módulos hacen pero están ocultos detrás de múltiples capas de objetos (por lo que es un poco difícil de entender).

Primero pensé que el problema estaba en JFormField pero realmente no lo estaba. No tiene necesidad de acceder a esas propiedades ya que solo "analizan" los campos no se hicieron para dar ningún control directo.

Así que aquí hay un poco del otro código que tengo.

if($form->loadFile($path.'/fields.xml')){
        $fieldset = $form->getFieldset();
        //SQL STUFF HERE TO GET $result
        $result = $db->loadObject();
        if(isset($result->params)){
            $moduleParams = json_decode($result->params);
        }else{
            $moduleParams = new stdClass;
        }
        foreach($fieldset as $index=>$field){
            $field->name = 'plg_form_settings['.$field->name.']';
            $content .= '<div class="control-group">';
                $content .= '<div class="control-label">';
                    $content .= $field->label;
                $content .= '</div>';
                $content .= '<div class="controls">';
                    $content .= $field->input;
                $content .= '</div>';
            $content .= '</div>';
        }
    }

Esto repite cada campo en el conjunto de campos y devuelve una instancia de JFormField una clase más o menos de solo lectura. Lo que debe hacerse es que cualquier edición que desee hacer se realice a través de JForm.

if($form->loadFile($path.'/fields.xml')){
    $fieldset = $form->getFieldset();
    //SQL STUFF HERE TO GET $result
    $result = $db->loadObject();
    if(isset($result->params)){
        $moduleParams = json_decode($result->params);
    }else{
        $moduleParams = new stdClass;
    }
    $dataArray = array();
    //split the loop into 2, this way the data can be bound
    foreach($fieldset as $index=>$field){
        if($id!=0&&isset($moduleParams->{$index})){
            $dataArray[$index] = $moduleParams->{$index};
        }
    }
    //bind and reset to ensure it worked
    $form->bind($dataArray);
    $fieldset = $form->getFieldset();
    foreach($fieldset as $index=>$field){
        $output = '<div class="control-group">';
            $output .= '<div class="control-label">';
                $output .= $field->label;
            $output .= '</div>';
            $output .= '<div class="controls">';
                $output .= $field->input;
            $output .= '</div>';
        $output .= '</div>';
        $content .= $output;
    }
}

Como puede ver, uso 2 bucles, uno es solo para hacer coincidir un parámetro con un campo (probablemente podría mejorarlo haciendo un bucle con el objeto $ moduleParams real). Mientras que el otro es el mismo que tenía antes. En el medio, ato los datos para formar y "restablezco" la variable del conjunto de campos (no estoy seguro de si es necesario pero no daña en el proceso de depuración. Sin embargo, esto solo cambiará correctamente el $field->value ya que está vinculando un valor de formularios, las otras variables aún están protegidas.

Así que se me ocurrió una solución para el nombre, sobre el que se trataba principalmente esta pregunta. JForm es bastante estricto con el nombre, ya que lo utiliza como base para su interacción con otros objetos, por lo que es mejor no tocarlo mientras JForm analiza el formulario, sino después.

La función que he mostrado es parte de un "ayudante", así que moví esto fuera de él y dentro del complemento mismo. Como estoy creando una cadena html, puedo usar regex para buscar/reemplazar.

$regex  = '/(?:name=")([^"]*)(?:")/';
//CALL HELPER TO GET $content
$content = '<input type="text" name="cc_field"/>'; //example of part of output from helper
$content = preg_replace($regex,"name=\"cc_settings[$1]\"",$content);

Esto también debería permitirle cambiar el nombre, fuera de los problemas que pueden ser causados ​​al editarlo mientras el objeto JForm está analizando los campos.

1
Jordan Ramstad