Bonjour!
J'éprouve un problème très étrange pour le moment. Mon site internet est en ligne depuis 2 ans en cakephp 2.2.3

J'ai une interface d'administration que je gère toutes mes pages. J'ai fait une modification dans mon site voilà 3 mois via cette interface (donc rien modifier du code). Je réessaie aujourd'hui, je peux me brancher à mon interface mais plus rien ne se sauvegarde!

Ce que je fais

Mon controlleur

            //Si c'est un insert ou un edit
            if($this->request->is('put')) || $this->request->is('post'))
                    {
                        if($this->Page->save($this->request->data))
                            {
                            $this->Session->setFlash('La page a été modifié avec succès','notif',array('type'=>'success'));
                            $this->redirect(array('action'=>'index'));
                            }
                    }
            elseif($id)
            {
                $this->Page->id=$id;
                $this->request->data=$this->Page->read();
            }
            else
                {
                $this->request->data=$this->Page->getDraft();   
                }
                debug($this->validationErrors);

        }

Ma view:

<div class="page-header">
<h1>Éditer</h1>
</div>
<?php echo $this->Form->Create('Page',array('class'=>'form-horizontal')); ?>
<?php echo $this->Form->input('id'); ?>
<?php echo $this->Form->input('name_fr',array('label'=>'Titre Français:')); ?>
<?php echo $this->Form->input('name_en',array('label'=>'Titre Anglais:')); ?>
<?php echo $this->Form->input('slug_fr',array('label'=>'Url Français:')); ?>
<?php echo $this->Form->input('slug_en',array('label'=>'Url Anglais:')); ?>
<?php echo $this->Form->input('content_fr',array('label'=>'Contenu Français:')); ?>
<?php echo $this->Form->input('content_en',array('label'=>'Contenu Anglais:')); ?>
<?php echo $this->Form->input('created',array('type'=>'hidden')); ?>
<?php echo $this->Form->input('online',array('label'=>'En Ligne:','type'=>'checkbox')); ?>
<?php echo $this->Form->End('Envoyer'); ?>

<?php $this->Html->script('tiny_mce/tiny_mce',array('inline'=>false)); ?>
<?php $this->Html->scriptStart(array('inline'=>false)); ?>
    tinyMCE.init({
        mode:'textareas',
        theme: 'advanced',
        plugins:'inlinepopups,paste,image',

        theme_advanced_buttons1:'bold,italic,underline,|,bullist,numlist,|,justifyleft,justifycenter,justifyright,justifyfull,|,link,unlink,image,|,formatselect,code',
        theme_advanced_buttons2:'',
        theme_advanced_buttons3:'',
        theme_advanced_buttons4:'',
        theme_advanced_toolbar_location:'top',
        theme_advanced_statusbar_location:'bottom',
        theme_advanced_resizing: true,
        paste_remove_styles:true,
        paste_remove_spans:true,
        paste_strip_class_attributes:'all',
        image_explorer:'<?php echo $this->Html->url(array('controller'=>'medias','action'=>'index',$this->request->data['Page']['id'])); ?>',
        image_edit:'<?php echo $this->Html->url(array('controller'=>'medias','action'=>'show')); ?>',
        relative_urls:false,
        content_css: '<?php echo $this->Html->url('/css/wysiwyg.css'); ?>'

    });

    function send_to_editor(content){
        var ed=tinyMCE.activeEditor;
        ed.execCommand('mceInsertContent',false,content);

    }
<?php $this->Html->scriptEnd(); ?>

<?php
echo $this->element('sql_dump');
?>

Ce que je veux

Arriver à sauvegarder à nouveau:P

Ce que j'obtiens

J'ai fait des tests:
-Je suis capable de faire les modifs via phpmyadmin avec mon utilisateur. J'ai même créer un nouvel utilisateur pour tester.
-Les formulaires au lieu de me retourner une method put ou post me retourne un get donc il ne sauvegarde pas mes données. Mais je en comprends pourquoi j'obtiens une methode GET... si j'inspecte mon formulaire dans chrome je vois bien qu'il me crée: <input type="hidden" name="_method" value="PUT">#shadow-root (user-agent) </input>

Pouvez-vous m,aider svp???

9 réponses


Bonsoir, essayer sans les majuscules (Je doute que ça change quelque chose)

<?= $this->Form->create('Page', ['class' => 'form-horizontal']); ?>

<?= $this->Form->end('Envoyer'); ?>

Yo. if($this->request->is('put')) || $this->request->is('post'))

Parenthèse fermante en trop à la première condition ;-)

Bien vu,
mais c'est trop gros, ça ne devrait pas compiler

J'ai testé avec les minuscules mais ça ne change rien.

Pour l'erreur de parenthèse, j'ai eu une erreur lors du copié/collé, je l'avais corrigé ensuite car effectivement ça n,avait pas compilé.

Là je me demande si je ne teste pas sur un autre hébergeur pour voir.

Bon même problème sur un autre hébergeur. J'ai vidé les logs de debug et error pour voir si ça pouvait changer de quoi (il était hyper volumineux) mais ça ne marche toujours pas... je continu de fouiller pour voir...

J'ai décider de partir à la base, j'ai donc créer une table bidon:

Model

<?php
class Card extends AppModel{
}
?>

Controller

<?php 
class CardsController extends AppController{
    function admin_index()
        {
            $d['cards']=$this->Card->find('all');
            $this->set($d);
        }
    function admin_edit($id=null)
        {
            if($this->request->is('post') || $this->request->is('put'))
                {
                    if($this->Card->save($this->request->data))
                            {
                            $this->Session->setFlash('La carte a été modifié avec succès','notif',array('type'=>'success'));
                            $this->redirect(array('action'=>'index'));
                            }
                }
            elseif($id)
                {
                    $this->Card->id=$id;
                    $this->request->data=$this->Card->read();
                }
        }
    function admin_delete($id)
        {
        if($this->Card->delete($id))
                {
                    $this->Session->setFlash('La carte a été supprimé avec succès.','notif',array('type'=>'success'));
                    $this->redirect($this->referer());
                }
        }
}
?>

View admin_edit

<div class="page-header">
<h1>Éditer</h1>
</div>
<?php echo $this->Form->create('Card',array('class'=>'form-horizontal')); ?>
<?php echo $this->Form->input('id'); ?>
<?php echo $this->Form->input('name_fr',array('label'=>'Titre Français:')); ?>
<?php echo $this->Form->input('name_en',array('label'=>'Titre Anglais:')); ?>
<?php echo $this->Form->input('slug_fr',array('label'=>'Url Français:')); ?>
<?php echo $this->Form->input('slug_en',array('label'=>'Url Anglais:')); ?>
<?php echo $this->Form->end('Envoyer'); ?>

Avec ce code, je suis capable d'ajouter un enregistrement et je suis capable de supprimer un enregistrement. Mais je suis incapable de modifier mon enregistrement à cause qu'il ne rentre pas dans mon if (put or post) car le formulaire renvoie un get?!? Testé en utilisant (

if($this->request->is('get'))
                {
                    debug('Get');
                }

Il y a un truc qui m'échappe selon vous?

Si dans le html généré, ton form a la method="POST" mais que les outils de dev du navigateur te montrent un envoi par GET
c'est un pb de js ?
teste en désactivant js

En faites je crois avoir trouvé que c'est en lien avec le modsecurity de apache:
https://github.com/cakephp/cakephp/issues/5425

quand je debug

debug($this->Auth);

j'obtiens

authError => 'You are not authorized to access that location.'

Si j'inspecte la page je vois bien que c,est une requête POST mais j'ai une erreur 403:

HTTP/1.1 403 Forbidden
Date: Thu, 16 Jun 2016 13:06:23 GMT
Server: Apache
Content-Length: 6891
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8

Donc ma conclusion c'est qu,il y a eu une maj de modsecurity sur mon hébergeur. Sauf que là pour contourner ça, la seule solution en ce moment que j'ai c,est celle du lien plus haut et je ne suis pas sûr qu'ils vont pouvoir le faire:S

Bon je vous confirme que c'était bien la dernière version du mod_security qui bloquait les requêtes. En le désactivant tout est rentré dans l'ordre!