web-dev-qa-db-fra.com

Module personnalisé supprimer de la base de données avec AJAX

Cela fait un certain temps que je cherche à comprendre le composant com_ajax de Joomla en vue de l’utiliser dans mon module personnalisé. Le module affiche les données d'un composant. L'un des champs du formulaire est de type sql et autorise plusieurs éléments. Mon module personnalisé utilise une boucle foreach pour afficher ces éléments. Les éléments sont stockés dans la cellule de tableau savedproperties_sales comme valeurs séparées par des virgules.

Mon objectif est d’avoir un bouton de suppression sur chaque élément qui, une fois pressé, supprimerait cet élément de la cellule de la base de données.

Voici ma fonction php dans mon module helper.php

class ModTusimpleprofileHelper
{
    public function deletePropertysales($propertyid)
    {
        $db = JFactory::getDbo();
        $query = $db->getQuery(true);
        $conditions = array(
            $db->quoteName('savedproperties_sales') . ' = ' . $propertyid
        );
        $query->delete($db->quoteName('#__bdjupix_properties_sales'));
        $query->where($conditions);
        $db->setQuery($query);
        $result = $db->execute();
    }
}

Voici le JS dans mon module tmpl> default.php

( function($) {
$(document.body).on('click','.deleteproperty',function(){
    $.ajax({
        type: 'GET',
        url: "index.php?option=com_ajax&module=mod_tusimple_profile&Itemid=148&method=deletePropertysales&propertyid="+$(this).data('propertyid'),
        success:function(data){
            alert('Property Deleted');
        },
        error:function(){
            alert('Property Not Deleted');
        }
    });  
});
} )( jQuery );

Et enfin, ceci est mon php pour afficher l'élément et le bouton supprimer, également dans tmpl> default.php

<?php $savedproperties_sales = explode( ',', $profile->savedproperties_sales ); ?>
<?php foreach ( $savedproperties_sales as $savedproperty_sales ) : ?>
<?php
$db = JFactory::getDbo();
$query = $db->getQuery( true );
$query->select( array( 'a.id', 'a.propertyid', 'a.displayaddress' ) )->from( $db->quoteName( '#__bdjupix_properties_sales', 'sales' ) )->where( $db->quoteName( 'sales.propertyid' ) . ' = '. $db->quote( $savedproperty_sales ) );
$db->setQuery( $query );
$results = $db->loadObject();
?>
<p><?php echo $results->address; ?></p>
<form>
<button type="submit" class="deleteproperty">Delete This Property</button>
</form>
<?php endforeach; ?>

Les articles s’affichent parfaitement, mais comme vous pouvez probablement le dire, l’ajax est tout faux. Cela fait longtemps que je joue avec ça et je n’aboutis à rien, donc si quelqu'un peut m'aider, je vous en serais très reconnaissant.

2
DesignSubway

Sécurité

Avant toute chose, j'aimerais attirer votre attention sur ceci:

Vous envoyez à la base de données une entrée non filtrée des utilisateurs avec le $propertyId. Quelle que soit la sécurité existante, vous devez suivre les meilleures pratiques lors de la rédaction de code et ne jamais faire confiance aux entrées de l'utilisateur.

Découvrez ici comment écrire du code sécurisé avec Joomla et travaillez à l’amélioration de votre code:


Pour l'AJAX:

La méthode par laquelle vous voulez appeler AJAX doit être nommée de manière conventionnelle, par exemple change:

public function deletePropertysales($propertyid)

à

public function deletePropertysalesAjax($propertyid)

Personnellement, je préfère aussi construire l'appel en transmettant l'objet de données de la demande. C'est plus propre de cette façon.

Exemple:

var propertyid = $(this).data('propertyid');
var request = {
    'option'    : 'com_ajax',
    'module'    : 'tusimple_profile',
    'propertyid': propertyid,
    'method'    : 'deletePropertysales',
};

$.ajax({
    type    : 'POST',
    data    : request,
    success : function(response) {
        console.log(response.data);
    }
});

Joomla Ajax dans les références de module:

2
FFrewin