Bonjour,
J'ai transfere le developpement de mon site sous cakephp. Certains aspects sont plus simples a realiser du fait des fonctions presentes dans le framework mais egalement grace a des tutoriaux comme grafikart mais aussi siteduzero et bien d'autres.
J'arrive bien a faire fonctionner des fonctions separees, mais je n'arrive pas a faire pointer mon site vers la page "home", C'est a dire que je voudrais que quand le site est appele, il aille directement sur la page home.
L'autre probleme est mon menu. Pour simplifier (je ne parle pas des droits d'acces) mon menu etait ecrit sous forme de <a>...</a>. Cette methode ne marche apparament plus ? Existe-t-il un autre moyen plus coherent avec le developpement sous cakephp ?
J'ai developpe un petit calendrier sous php. J'ai quelques problemes pour le lancer. Je pourrais biensur le coller dans la page html, mais ca viendrait l'alourdir
J'ai egalement des problemes avec mon css, mais la c'est mon cote artistique qui va pas bien!!?
Merci pour votre aide
A bientot
fmm
PS : desole pour les accents mais mon clavier anglais n'en a pas

15 réponses


palmer08
Réponse acceptée

En faites, default.ctp c'est la page où tu mets ton tes éléments qui se répétent dans tout ton site et où il aura le contenu qui change il faut marquer:

<?php
echo $content_for_layout;
?>

Après le contenu de la page d'accueil s'appelle forcèment home.ctp qui est obligatoirement dans le dossier "pages" dans "app". Dans cette page tu codes sans tenir compte du header, footer... juste le contenu qui change. Tu fais la même manoeuvre pour toutes tes pages.

En espèrant que j'ai était assez clair :)

Mon accéder à la page d'accueil, il faut créer un layout nommer "default.ctp" dans "app". C'est le fichier qui se comporte comme le index.php quand on fait un code maison.

Pour créer des liens va voir dans la doc cakephp ici. Pour voir le fichier en français va voir dans le footer il y a lien "fr".

Pour le CSS il faut le mettre dans le dossier "webroot" et mettre un lien dans le fichier "default.ctp".

<?php
echo $Html->css('[nomdufichier]');
?>

Par contre je ne pas d'aider pour ton calendrier en php.

fermomi
Auteur

Merci palmer08,
J'essaye souvent d'aller dans la doc cakephp (cakephp.org), je dois avouer mais du mal a suivre avec les exemples qui y sont donnes. De plus il est un peu difficile d'avoir la liste des methodes/fomctions qui existent pour savoir quoi utiliser et quand.

Pour en revenir a ta reponse, quand on appelle un site par ex www.toto.fr, il va aller sur la page default.ctp directement ? J'ai cree un controller pour la page de garde(home), comment je l'envoie dessus ? Le controller appelant la vue bien sur ?

Je vais sur le lien que tu m'as donne voir si je peux y trouver mon bonheur

Je vais egalement coller sur la page en html le <?php $html ... ?> a la place de mes balises <a>

Merci, j'essaye et si probleme, je reviens

@+fmm

Bounjour et pour calendrier je tu donne code php de clandrier :

page style.css

body{ background:#EEEEEE; letter-spacing:1px; font-family:Helvetica; padding:10px;}
.year{ color:#D90000; font-size:85px;}
.relative{ position:relative;}
.months{}
.month{ margin-top:12px;}
.months ul{ list-style:none; margin:0px; padding:0px;}
.months ul li a{ float:left; margin:-1px; padding:0px 15px 0px 0px; color:#888888; text-decoration:none; font-size:35px; font-weight:bold; text-transform:uppercase;}
.months ul li a:hover, .months ul li a.active{ color:#D90000;}
table{ border-collapse:collapse;}
table td{ border:1px solid #A3A3A3; width:80px; height:80px;}
table td.today{ border:2px solid #D90000; width:80px; height:80px;}
table td.padding{ border:none;}
table td:hover{ background:#DFDFDF; cursor:pointer;}
table th{ font-weight:normal; color:#A8A8A8;}
table td .day{ position:absolute; color:#8C8C8C; bottom:-40px; right:5px; font-weight:bold; font-size:24.3pt;}
table td .events{ position:relative; width:79px; height:0px; margin:-39px 0px 0px; padding:0px;}
table td .events li{ width:10px; height:10px; float:left; background:#F90505; -moz-border-radius:10px; -webkit-border-radius:10px; -khtml-border-radius:10px; border-radius:10px 10px 10px 10px; margin-left:6px; overflow:hidden; text-indent:-3000px;}
table td:hover .events{ position:absolute; left:582px; top:66px; width:442px; list-style:none; margin:0px; padding:11px 0px 0px;}
table td:hover .events li{ height:70px; line-height:40px; font-weight:bold; border-bottom:1px solid #D6D6D6; padding-left:41px; text-indent:0; background:none; width:500px;}
table td:hover .events li:first-child{ border-top:1px solid #D6D6D6;}
table td .daytitle{ display:none;}
table td:hover .daytitle{ position:absolute; left:582px; top:21px; width:442px; list-style:none; margin:0px 0px 0px 16px; padding:0px; color:#D90000; font-size:41px; display:block; font-weight:bold;}
.clear{ clear:both;}

page index.php

<!doctype html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html"; charset="UTF-8">
        <title>calendrier</title>
        <link type="text/css" rel="stylesheet" href="style.css">

       <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
       <script type="text/javascript">
       jQuery(function($) {
                $('.month').hide();
                $('.month:first').show();
                $('.months a:first').addClass('active');
                var current = 1;
                $('.months a').click(function() {
                    var month = $(this).attr('id').replace('linkMonth', '');
            // alert(month);
                   if (month != current) {
                        $('#month' + current).slideUp();
                        $('#month' + month).slideDown();
                        $('.months a').removeClass('active');
                        $('.months a#linkMonth' + month).addClass('active');
                        current = month;
                    }
                    return false;
                });
            });
       </script>
    </head>
    <body>
        <?php
        require ('date.php');
        require ('config.php');
        $date = new Date();
        $year = date('Y');
        $dates = $date->getAll($year);
        $events = $date->getevents($year);
        ?>
        <div class="periods">
            <div class="year"><?php echo $year; ?></div>
            <div class="months">
                <ul>
                    <?php foreach ($date->months as $id => $m): ?>
                        <li><a href="#" id="linkMonth<?php echo $id + 1; ?>"><?php echo utf8_encode(substr(utf8_decode($m), 0, 4)); ?></a></li>
                    <?php endforeach; ?>
                </ul>
            </div>
            <div class="clear"></div>
            <?php $dates = current($dates); ?>
            <?php foreach ($dates as $m => $days): ?>
                <div class="month relative" id="month<?php echo $m; ?>">
                    <table>
                        <thead>
                            <tr>
                                <?php foreach ($date->days as $d): ?>
                                    <th><?php echo substr($d,0,8); ?></th>
                                <?php endforeach; ?>
                            </tr>
                        </thead>
                        <tbody>
                            <tr>
                                <?php $end = end($days); foreach($days as $d => $w): ?>
                                    <?php $time = strtotime("$year-$m-$d"); ?>
                                  <?php if ($d == 1 and $w != 1): ?>
                                        <td colspan="<?php echo $w - 1; ?>" class="padding"></td>
                                    <?php endif; ?>
                                        <td<?php if ($time == strtotime(date('Y-m-d'))): ?> class="today" <?php endif; ?>>
                                        <div class="relative">
                                            <div class="day"><?php echo $d; ?>
                                            </div>
                                            </div>
                                            <div class="daytitle">
                                                <?php echo $date->days$w-1] ?>  <?php echo $d ?> <?php echo $date->months$m-1] ?>

                                                                                        </div>
                                            <ul class="events">

                                                <?php if (isset ($events$time])): foreach($events$time] as $e):?>
                                                                                            <li ><?php echo $e ?> </li>
                                                <?php endforeach; endif; ?>

                                            </ul>

                                    </td>
                                    <?php if ($w == 7): ?>
                                    </tr>
                                    <tr>
                                    <?php endif; ?> 
                                <?php endforeach; ?>
                                <?php if ($end != 7): ?>
                                    <td colspan="<?php echo 7 - $end; ?>" class="padding"></td>

                                    <?php endif; ?> 
                            </tr>
                        </tbody>
                    </table>
                </div>
<?php endforeach; ?>
        </div>

    </body>
</html>

page Date.php

<?php

class Date{

var $days = array('Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi','Dimanche');
var $months = array('Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre');

function getEvents($year){
// Connexion à la bdd, n'oubliez de changer $cnx, c'est ma méthode
global $DB;
// Pour la requete ajoutez heure dans le select
$req = $DB->query('SELECT id,nom,date_fin,date_debut FROM enquete WHERE YEAR(date_fin)='.$year);
$r = array();
while($d = $req->fetch(PDO::FETCH_OBJ))
{
// Ici on veut obtenir $r[TIMESTAMP][id] = titre.''.heure; donc :
$r[strtotime($d->date_fin)]$d->id]=$d->nom .' : ledate début de cette enquete est : ' .$d->date_debut ;
}
return $r;
}

    function getAll($year){
            $r = array();
            /*$date = strtotime($year.'-01-01');
            while(date('Y',$date) <= $year){
            $y=date('Y',$date);
            $m=date('n',$date);
            $d=date('j',$date);
            $w=str_replace('0','7', date('w',$date));
            $r$y]$m]$d]= $w;
            $date = strtotime(date('Y-m-d', $date).'+1 DAY');
            }
            */

            $date = new DateTime($year.'-01-01');
            while($date->format('Y') <= $year){
            $y=$date->format('Y') ;
            $m=$date->format('n') ;
            $d=$date->format('j') ;
            $w=str_replace('0','7', $date->format('w') );
            $r$y]$m]$d]= $w;
            $date->add(new DateInterval('P1D'));
            }

            return $r;

    }

}

et en termine avec page config.php

<?php
try{

    $DB=new PDO('mysql:host=localhost;dbname=symfony', 'root', '', array(PDO::MYSQL_ATTR_INIT_COMMAND=>'set NAMES UTF8'));
} catch (PDOException $e) {
    echo ('base de donnée en vacance');
    exit();
}
?>

En espèrant que j'ai était assez clair ;)

Bonjour

je rencontre un problème mon aussi pour le menu qui n'affiche que la barre l'impression de ne pas pouvoir récupérer les données de ma base
Cela fonctionnait avant de vouloir passer la donnée dans la bar de menu celle ci s'affichait bien en dessous de la bar lors de mes tests de debug.
Je n'ai aucune erreur de retour de mes fichiers mais au cas ou une chose simple serait passé sans que je m'en aperçoit

menu.ctp

<?php $pages = $this->requestAction(array('controller'=>'pages','action'=>'menu')); ?>
<ul class="nav navbar-nav">
  <?php foreach($pages as $k=>$v): $v = current($v); ?>
  <li><?php echo $this->Html->link($v'name'],$v'link']); ?></li>
  <?php endforeach ;?>
  </ul>

PagesController.php

<?php
class PagesController extends AppController {
   public $uses= array('Post');
          function menu(){
           $pages = $this->Post->find('all',array(
                'conditions' => array('type'=>'page','online'=>1)
            ));

           return $pages;

  }
}

default.ctp

<div class="collapse navbar-collapse">
            <?php $this->element('menu'); ?>
          <ul class="nav navbar-nav navbar-right">
            <li><a href="#">Mes Recettes</a></li>
            <li><a href="#about">Mon Blog</a></li>
            <li><a href="#contact">Mes Contacts</a></li>

si quelqu'un à une idée pour ce problème merci d'avance

Si tu utilise ton menu sur toutes tes pages, je te conseille vivement d'utiliser les methodes beforeFilter() et beforeRender() dans l'AppController

en somme dans ton AppController tu peu déclarer un nouvelle attribut que tu appel $pages

public $pages = null;

ensuite tu définie ta fonction beforeFilter()

public function beforeFilter()
    {
        parent::beforeFilter();
$this->loadModel('Page');
$this->pages = $this->Post->find('all',array(
                'conditions' => array('type'=>'page','online'=>1)
            ));
}

Puis pour finir ton beforeRender() pour rendre ta variable a tes vues

public function beforeRender()
    {
        parent::beforeRender();
$pages = $this->pages;
$this->set(compact('pages'));
}

Tu n'a plus qu'à récupérer $pages dans tes vues

Le fait déja de définir un attribut de class et de définir sa valeur dans le beforeFilter te permettra de pouvoir récupérer cette valeur dans tes controllers.
Si tu as pas forcement besoin de récupérer ces infos dans tes controllers tu peu directement passer par le beforeRender()
Je te conseil aussi vivement si tu as un backoffice ou tu rajoute peu de lien dans ton menu, de mettre en cache ta requete (voir le tuto concernant le cache ;) )

J'ai pas testé par contre donc l'idée est la à toi d'adapter en fonction de ;)

Edit: tu as aussi la possibilité de créer un component pour gérer ton menu mais bon niveau intéret ????