Bien le coucou,

J'ai une petite question, un petit problème. J'ai une liste de box, que j'arrive à afficher etc. Sur chaque icone, j'ai un lien, et quand je clique dessus ça dirige vers la fiche de la box en question.

Sauf que j'ai un soucis avec le lien. Il est écrit en brut, parce-que je ne sais pas comment faire avec le helper...Le problème de ce lien est qu'il encapsule les informations (voir ci-dessous), or j'ai pas l'impression qu'on peut le faire avec le helper :'(

Quelqu'un aurait une petite idée ? Merci d'avance !

<?php foreach ($products as $product): ?>
    <a href="../products/view/<?php echo $product'Product']'id'];?>">
        <div class="fond-products">
            <img class="box" src="<?php echo $product'Product']'url_img_thumb'];?>"/>
            <p class="title-products"><em><?php echo $product'Product']'title'];?></em></p>
            <p class="prix-products">Prix : <?php echo $product'Product']'price'];?> €</p>
        </div>
    </a>
  <?php endforeach; ?>

8 réponses


Tu as bien lu la doc ? Car c'est expliqué dedans : http://book.cakephp.org/2.0/fr/core-libraries/helpers/html.html#HtmlHelper::link

Voila un exemple :

echo $this->Html->link('View image', array(
    'controller' => 'images',
    'action' => 'view',
    1,
    '?' => array('height' => 400, 'width' => 500))
);

J'avais pas vu cette petite option (pas la doc hein, ta réponse ^^) mais du coup si je comprends il s'agit de faire une requête pour le coup, or moi là dans mon exemple j'ai juste une div qui doit être cliquable, et qui doit comporter d'autres div dedans

Et j'ai une autre question associée aussi tiens.

<?php echo $this->Html->link('Retour boutique', 
            array('controller'=>'products','action' => 'index'),
            array('class'=>'btn-retour-product'));?>

J'utilise cette petite chose pour faire un lien avec une classe bouton pour l'icone. Ok, SAUF que quand je clique, il me donne en url http://127.0.0.1/whatsInMyBox/products >> alors que moi je veux voir http://127.0.0.1/whatsInMyBox/products/index

Du coup ça me fout mes images thumbnails en l'air -_-

'avais pas vu cette petite option (pas la doc hein, ta réponse ^^) mais du coup si je comprends il s'agit de faire une requête pour le coup, or moi là dans mon exemple j'ai juste une div qui doit être cliquable, et qui doit comporter d'autres div dedans
Pourquoi une requête ?

// modifier ceci
<a href="../products/view/<?php echo $product'Product']'id'];?>">
// en ceci 
  <a href="<?= $this->Html->link('View image', array(
    'controller' => 'products',
    'action' => 'view',
    $product'Product']'id'],
); =>">

J'utilise cette petite chose pour faire un lien avec une classe bouton pour l'icone. Ok, SAUF que quand je clique, il me donne en url http://127.0.0.1/whatsInMyBox/products >> alors que moi je veux voir http://127.0.0.1/whatsInMyBox/products/index
Problème de routes ça, par défaut, CakePHP enlève le index de l'url. Il va falloir la définir toi même pour le coup. (doc : http://book.cakephp.org/2.0/fr/development/routing.html#routes-configuration).

C'est dans la doc, ils parlent de requête, c'est pour ça que j'ai repris le terme.

Après je comprends tout à fait ton exemple, et c'est comme ça que je voulais le faire au début, mais en gros ton code créé un lien genre "View Image" cliquable. Or moi encore une fois, je veux que ce soit la div qui le soit, c'est pour ça qu je cale un peu :s

Pour la deuxième partie, avec la route, le truc c'est que ça ne fonctionne pas QUE sur le controller products -_- Toutes les autres routes passent bien avec les deux paramètres controller et action. Je dois quand même redéfinir la route pour ce controller ?

Or moi encore une fois, je veux que ce soit la div qui le soit, c'est pour ça qu je cale un peu :s
Je ne comprends pas trop là ? Tu veux faire une redirection ou non ? Si oui, il te faut un lien. Si c'est un problème de style, tu peux appliquer la classe de ton div à ton lien.

Pour la deuxième partie, avec la route, le truc c'est que ça ne fonctionne pas QUE sur le controller products -_- Toutes les autres routes passent bien avec les deux paramètres controller et action. Je dois quand même redéfinir la route pour ce controller ?
Quelle est la raison pour que ça ne fonctionne pas ? Quelles sont tes requirements ici ?

Je vais approfondir pour la classe, je commence à comprendre ce que tu me dis ^^

Pour la raison, c'est simple, je ne la connais pas. C'est un lien tout bidon tout ce qu'il y a de plus simple.

J'ai un bouton :

<div class="span2 btn-retour">
        <?php echo $this->Html->link('Retour boutique', 
            array('controller'=>'products','action' => 'index'),
            array('class'=>'btn-retour-product'));?>
      </div>

J'ai un Controller

<?php
class ProductsController extends AppController {
    public function index() {
        //find all products
        $products = $this->Product->find('all');
        //set counter to display number of products in a cart
        $counter = 0;
        if ($this->Session->read('Counter')) {
            $counter = $this->Session->read('Counter');
        }
        //pass variable to view
        $this->set('products',$products);
        $this->set('counter',$counter);
    }

Quand je clique sur le bouton, l'url donné est >>> 127.0.0.1/whatsInMyBox/products alors que sur tous les autres liens que je génére de la même manière je vois bien "index" ou autre apparaître.

Exemple :

<li class="logout-account">
  <?php echo $this->Html->link("Mon compte",array('action'=>'account','controller'=>'users')); ?>
</li>

Url retournée : 127.0.0.1/whatsInMyBox/users/account

Pour ton dernier problème, c'est ce que te disais prbaron quelques messages plus haut : quand tu fais un lien vers l'action "index", Cake supprime automatiquement "/index" de l'url, puisque c'est l'action par défaut d'un controller.

Donc le seul moyen d'avoir un lien généré via le Helper dans lequel il y a bien "/index" à la fin, c'est de surcharger la route par défault.

Du coup, il faut rajouter dans ton fichier routes.php quelque chose du genre :

Router::connect('/products/index', array('controller'=>'products','action' => 'index'));

Avec ça, tu devrais bien avoir l'url complète. Cela dit, comme ce n'est pas le fonctionnement par défault de Cake, tu devras surcharger cela pour tous les controllers. (ou surcharger de manière globale)