2011-08-02 3 views
1

mes urls sont commeCakePHP URL Limaces Question

example.com/deals/by_city/glasgow

J'ai une action "by_city" dans un cities_controller qui a besoin de saisir la partie d'url "glasgow" et faire des choses comment puis-je le faire avec cakephp? Je veux seulement savoir comment saisir cette partie de l'URL et la stocker en variable.

Toute l'aide :) apprécié

Merci Dave

Villes contrôleur

function city_changer($CitySlug = null) { 
     $active = $this->City->find('first', array('conditions' => array('City.slug' => $CitySlug))); 
     $cities = $this->City->find('all', array('order' => array('City.name', 'City.name ASC'))); 

     $this->set(compact('active', 'cities')); 
    } 

Ville changer.ctp

<h2>Daily Deals from <?php echo $active['City']['name'];?></h2> 
<form> 
    <select name="file" size="1" onchange="loadPage(this.form.elements[0])" target="_parent._top" onmouseclick="this.focus()"> 

<?php foreach($cities as $city) {?>   
     <option value="/new_avc/deals/by_city/<?php echo $city['City']['slug'];?>"><?php echo $city['City']['name'];?></option> 
<?php }?> 

    </select> 
</form> 

default.ctp

<div id="header_wrapper"> 
    <div id="navigation"> 
     <div id="logo"> 
      <h1>Amazing Voucher Codes</h1> 
     </div> 
     <div id="city_nav"> 
      <?php echo $this->requestAction('/cities/city_changer/'.$city['City']['slug'], array('return'));?> 
     </div> 

Comme il n'y a aucune base de données liée à default.ctp problème ayant obtenir la limace de passer au contrôleur :)

+0

Pourriez-vous clarifier la question: Avez-vous une action 'by_city' dans le contrôleur' deals' et vous voulez savoir comment cette action peut utiliser le paramètre? Ou avez-vous cette URL comme une chaîne et vous avez besoin d'extraire la dernière partie de celui-ci? Ou autre chose? – JJJ

+0

question éditée :) – Dave

+0

Le ['SluggableBehavior'] (https://github.com/CakeDC/utils/blob/master/models/behaviors/sluggable.php) peut vous aider à créer ces parties d'URL. Il suffit de l'attacher à votre modèle et d'ajouter un champ 'slug' à votre table. – deizel

Répondre

2

En supposant qu'aucune règle de routeur personnalisé interviennent, le troisième paramètre dans l'URL (après contrôleur/action) est le premier paramètre passé à l'action.

class CitiesController extends AppController { 
    function by_city($cityName) { 
     // $cityName == 'glascow' 
    } 
} 
+0

le seul problème est, le changeur de ville est dans l'en-tête qui n'utilise pas un contrôleur ou db donc je ne peux pas passer le $ cityname au contrôleur :) – Dave

+0

Je ne comprends pas ce que vous voulez dire. Voulez-vous dire que le lien est dans le fichier de mise en page? Cela ne fait aucune différence après avoir cliqué sur le lien. – JJJ

+0

J'ai posté ce que j'ai codewise. :) – Dave

2

Vous devez simplement être en mesure d'ajouter un paramètre $cityname à la méthode by_city dans le contrôleur deals: ce recevra automatiquement le nom de la ville (glasgow de l'URL ci-dessus).

+0

le seul problème est, le changeur de ville est dans l'en-tête qui n'utilise pas un contrôleur ou db :) – Dave

+0

L'en-tête est une vue comme tout autre: il rend l'ensemble de données dans la méthode du contrôleur. Ajoutez la variable de nom de ville à vos données d'affichage dans le contrôleur et vous devriez bien. Vous mélangez l'accès au segment d'URL avec le contrôle de rendu. – Femi

+0

désolé pas sûr de ce que vous voulez dire :) – Dave