it-swarm-es.com

Escribir un método personalizado para guardar datos del formulario

Estoy tratando de encontrar la forma preferida de guardar datos de formulario utilizando los métodos de API de joomla. Estoy tratando de guardar datos con una llamada ajax. Primero intenté llamar al método de guardado estándar de componentes, llamando:

index.php?option=com_whatever&view=wdata&task=save // ...etc

Esto funciona, más o menos, pero no puedo encontrar una manera de verificar que la llamada realmente funcionó.

Ahora estoy tratando de usar las funciones del modelo del nuevo y muy agradable plugin ajax en joomla 3.3, pero no estoy seguro de cuál es el enfoque correcto. Puedo hacer algo como esto:

function onAjaxSaveWData(){
    if(!JSession::checkToken()) return 0; // checking the token
    $in=JFactory::getApplication->input; 
    $data=$in->get('jform',array(),'ARRAY'); //this is unfiltered input?!
    JLoader::register('WhateverModelWData', $whatevermodelpath);
    $model = new WhateverModelWData();
    $model->save($data);
}

El único problema con este enfoque es que no está funcionando. La función de guardar falla con un error:

Llame a una función miembro getKeyName () en un no objeto en las bibliotecas/legacy/model/admin.php en la línea 1064

Además de que esto no funciona, no habría filtrado los datos antes de la inserción.

Creo que $model->validate($model->getForm(), $data) haría el truco, pero también $model->getForm() falla miserablemente, así que estoy atascado. ¿Puede alguien ayudarme?

4
jonasfh

Inicialmente pensé que lo mejor sería usar el método controlador save (), que finalmente conseguí trabajar así:

$path = JPATH_ADMINISTRATOR . '/components/com_anycomponent;
JLoader::register('AnycomponentControllerAnyController', $path . '/controllers/anycontroller.php');
$controller = AnycomponentControllerAnyController::getInstance('Anycomponent'); 
$controller->addModelPath($path . '/models', 'Anycomponent');  
JTable::addIncludePath($path . '/tables'); 
JForm::addFormPath($path . '/models/forms');
$ret = $controller->save();

Entonces, al llamar a un controlador desde fuera del componente, debe especificar todas las rutas que se necesitan. Esto se aplica cuando el controlador extiende JControllerForm, que ahora está en la carpeta heredada en joomla, pero se usa en todo el núcleo de joomla. Para los controladores frontend, puede que no funcione tan bien, a menos que estos también extiendan JControllerForm.

Al llamar a guardar de esta manera, parece que se realizan todas las verificaciones necesarias: validación de datos, verificaciones de acceso, etc.

Todavía no veo la mejor manera de obtener la identificación insertada del controlador, la función save () simplemente devuelve verdadero o falso dependiendo del éxito de la llamada a la función.

Es posible usar el mismo método que el anterior para llamar al modelo -save () (mi sugerencia en la pregunta anterior), agregando primero las rutas necesarias. Esto puede ser más flexible, sin embargo, debe realizar comprobaciones de validación de datos y comprobaciones de acceso usted mismo. Llamar a controller-save () se ocupa de estos problemas.

No dude en corregir/ampliar esta respuesta si tiene más información sobre el tema.

Editar: si está utilizando este método para guardar datos existentes, debe agregar el parámetro id a la url, como:

index.php?option=com_whatever&view=wdata&task=save&id=20 
// where 20 is the id you are editing

Si la identificación solo está en un campo en el formulario, esto se ignorará y el registro se agregará como un nuevo registro.

4
jonasfh