2011-02-24 9 views
5

मैं केकेपीएचपी 1.3 का उपयोग कर रहा हूं। मेरे पास एक उत्पाद मॉडल है। अन्य लोगों के बीच डीबी टेबल पर id और slug फ़ील्ड हैं।केकपीएचपी - स्लग के साथ रिवर्स रूटिंग कैसे करें?

अगर मैं एक उत्पाद है कि id:37 और slug:My-Product-Title मैं उत्पाद के लिए URL चाहते होना जरूरी:

उत्पादों/37/मेरे उत्पाद-शीर्षक

मानक के बजाय

:

उत्पादों/देखें/37

मैं एक मार्ग है कि इस तरह दिखता है बनाया:

Router::connect(
    '/products/:id/:slug', 
    array('controller' => 'products', 'action' => 'view'), 
    array('pass' => array('id'), 'id' => '[0-9]+') 
); 

अब मैं http://server/products/37/My-Product-Title के पास जाकर यह मुझे सही जगह पर ले जाता है कर सकते हैं।

लेकिन $HtmlHelper->link में स्वचालित URL को स्वचालित रूप से बनाने के लिए मैं रिवर्स रूटिंग कैसे प्राप्त करूं?

जब मैं का उपयोग करें:

echo $html->link(
    'Product 37', 
    array('controller'=>'products', 'action' => 'view', 37) 
); 

यह अभी भी मानक products/view/37 यूआरएल आउटपुट।

+0

मुझे पता है कि यह सीधे प्रासंगिक नहीं है, लेकिन मैं सुझाव देता हूं कि छद्म कोडर केकफ़्प पुस्तक में स्लग पर अनुभाग देखें (http://www.pseudocoder.com/archives/free-cakephp-e- बुक-सुपर-कमाल-उन्नत-केकफ़्प-टिप्स) यदि आपने इसे नहीं देखा है। – Tomba

उत्तर

5

मुझे विश्वास नहीं है कि ऑटो-जादुई तरीके से किया जा सकता है। सहायक केवल एक "सहायक" है जो दिए गए मानकों से लिंक बनाता है।

तो सबसे आसान तरीका इतना की तरह अपने लिंक में एक और पैरामीटर जोड़ने का है:

echo $html->link(
    'Product 37', 
    array('controller'=>'products', 'action' => 'view', 37, $slug) 
); 

जहां $ स्लग स्लग क्षेत्र से डेटा है।

शायद यह अपने विचार किया जा सकता है, लेकिन आप बहुत बुरी तरह से MVC पैटर्न :)

संपादित तोड़ने के लिए की जरूरत है:

अपने प्रश्न पढ़ना फिर मैं इसे अच्छी तरह से समझ। देखें कैसे किया जाना चाहिए:

अपने router.php में निम्नलिखित नियम जोड़ें:

Router::connect(
    '/product/*', 
    array('controller' => 'products', 'action' => 'view') 
); 

कृपया ध्यान दें कि/उत्पाद/* के बजाय है/उत्पादों/*

आपका लिंक किया जाना चाहिए इस तरह:

echo $html->link(
    'Product 37', 
    array('controller'=>'products', 'action' => 'view', 37, 'my-product-title') 
); 

और लिंक लगेगा जैसे:

http://yourdomain.com/product/37/my-product-title 

मेरे सुझाव आपके लिए बुरा अभ्यास है। इसके अलावा मुझे नहीं लगता कि यह हमेशा उपयोगकर्ता को पुनर्निर्देशित करने के लिए एसईओ बिंदु दृश्य से अच्छा है।

+0

दुर्भाग्य से यह यूआरएल को '/ products/view/37/my-product-title' के रूप में बनाता है, मैं वहां * व्यू * नहीं चाहता हूं। यह काम करता है अगर मैं 'सरणी' ('नियंत्रक' => 'उत्पादों', 'कार्रवाई' => 37, 'मेरा-उत्पाद-शीर्षक') पास करता हूं, लेकिन यह गलत लगता है। –

+0

मैंने अपनी पोस्ट अपडेट की है। इस पर एक नज़र डालें। –

0

आपको कस्टम मार्ग कक्षाओं के बारे में निम्नलिखित पोस्ट देखना चाहिए।

स्लग डेटा को डेटाबेस के साथ शामिल होने की आवश्यकता नहीं है - फ़ील्ड एक नकली क्षेत्र है जो तर्क और लुकअप को सरल बनाने के लिए उपयोग किया जाता है। यह समाधान आपको मॉडल टेबल में स्लग फ़ील्ड की आवश्यकता के बिना रूट स्लग को रिवर्स करने की अनुमति देता है। पेज है

function view($id) 
{ 
    if(isset($_SERVER) && stristr($_SERVER["REQUEST_URI"],'view/')) 
    { 
     $this->Product->id = $id; 
     $slug = $this->Product->field('slug'); 
     $this->redirect($id.'/'.$slug); 
    } 
    $data = $this->Product->find('first', array('conditions' => array('Product.id' => $id))); 
    $this->set("data", $data); 
} 

तो /view/id के माध्यम से पहुँचता यह स्वचालित रूप से उन्हें /id/slug का उपयोग कर वर्तमान पृष्ठ पर रीडायरेक्ट:

http://42pixels.com/blog/slugs-ugly-bugs-pretty-urls

+0

आपसे सहमत हैं कि यदि यूआरएल स्लग के ऊपर उपयोग किए गए प्रारूप में हैं तो केवल एसईओ के लिए है। –

+0

और यदि आप एक अलग प्रारूप चाहते हैं तो आधार के रूप में उपयोग करने के लिए आधार के रूप में उपयोग करने के लिए पर्याप्त लचीला है। बात यह है कि, एक स्लग हमेशा एक गणना क्षेत्र होता है और इस तरह इसे संग्रहीत करने की आवश्यकता नहीं होती है क्योंकि इसे फ्लाई पर गणना की जा सकती है। –

-1

मुझे यकीन है कि यह कितना बुरा ProductsController में निम्न कोड के साथ है, लेकिन नहीं कर रहा हूँ

अब मैं सिर्फ डिफ़ॉल्ट लिंक योजना का उपयोग कर सकता हूं:

echo $html->link(
    'Product 37', 
    array('controller'=>'products', 'action' => 'view', 37) 
); 

और उन्हें दाएं यूआरएल पर रीडायरेक्ट कर दिया जाएगा।

केवल समस्या यह है कि मुझे यकीन नहीं है कि उपयोगकर्ता द्वारा उत्पाद पृष्ठ पर जाने पर हर बार रीडायरेक्ट हो रहा है?

3

मार्ग के लिए:

Router::connect(
    '/products/:id/:slug', 
    array('controller' => 'products', 'action' => 'view'), 
    array('pass' => array('id'), 'id' => '[0-9]+') 
); 

आपका लिंक इस तरह दिखना चाहिए:

echo $html->link(
    'Product 37', 
    array('controller'=>'products', 'action' => 'view', 'id' => 37, 'slug' => 'my-product-title') 
); 

आप अतिरिक्त (कुंजी => मूल्य) जोड़ने के लिए अपने सरणी के लिए प्रत्येक: अपने मार्ग में परम । फिर जादू काम करेगा

+0

असल में मुझे यकीन नहीं है कि क्या यह दिए गए प्रश्न का उत्तर है, लेकिन कम से कम वही है जो मैं ढूंढ रहा था =) धन्यवाद! – flo

संबंधित मुद्दे