2011-08-03 17 views
5

क्या सिम्फनी 2 के लिए कोई खुला स्रोत (या उदाहरण) कोड है जो एकाधिक पैरामीटर का उपयोग करके कुछ मॉडल फ़िल्टर कर सकता है? मैं जो खोज रहा हूं उसका एक अच्छा उदाहरण इस ट्रुलिया वेब पेज पर देखा जा सकता है।symfony2 के साथ फ़िल्टरिंग

http://www.trulia.com/for_sale/30000-1000000_price/10001_zip/

http://www.trulia.com/for_rent/Chicago,IL/#for_rent/Chicago,IL/0-500_price/wd,dw_amenities/sm_dogs_pets"

http://www.trulia.com/for_rent/Chicago,IL/#for_rent/Chicago,IL/400-500_price/wd,dw_amenities

http://www.trulia.com/for_rent/Chicago,IL/#for_rent/Chicago,IL/wd,dw_amenities"

http://www.trulia.com/for_rent/Chicago,IL/#for_rent/Chicago,IL/400p_price/dw,cs_amenities

http://www.trulia.com/for_rent/Chicago,IL/#for_rent/Chicago,IL/1p_beds/1p_baths/400p_price/dw,cs_amenities

नोट करें कि फ़ॉर्म में क्लिक करते समय यूआरएल कैसे बनाया जाता है, मुझे लगता है कि इन सभी मार्गों के लिए एक नियंत्रक का उपयोग कर रहा है, यह कैसे किया जाता है? मुझे नहीं लगता कि यह सभी संभावित मार्गों को एक विशिष्ट नियंत्रक, (नीचे दिखाया गया), शायद कुछ प्रकार की गतिशील रूटिंग पर पुनर्निर्देशित करेगा?

/** 
* @Route("/for_rent/{state}/{beds}_beds/{bath}_bath/{mix_price}-{max_price}_price /{amenities_list} 
* @Route("/for_rent/{state}/{mix_price}-{max_price}_price/{amenities_list} 
* @Route("/for_rent/{state}/{bath}_bath/{mix_price}-{max_price}_price/{amenities_list} 
* @Route("/for_rent/{state}/{mix_price}_price/{amenities_list} 
* @Route("/for_rent/{state}/{beds}_beds/{bath}_bath/{amenities_list}  
* ........ 
*/ 

public function filterAction($state, $beds, $bath, $min_price, $max_price ....) 
{ 
    .... 
} 

धन्यवाद।

उत्तर

1

सरल प्रश्नों के लिए (यानी जहां आपको डेटा रेंज की आवश्यकता नहीं है, जैसे कि न्यूनतम-अधिकतम मूल्य), आप दिए गए अनुरोध पैरामीटर द्वारा इकाइयों को ढूंढने के लिए इकाई भंडार का उपयोग कर सकते हैं। यह मानते हुए कि आपकी संस्था Acme\FooBundle\Entity\Bar है:

$em = $this->getDoctrine()->getEntityManager(); 
$repo = $em->getRepository('AcmeFooBundle:Bar'); 

$criteria = array(
    'state' => $state, 
    'beds' => $beds, 
    // and so on... 
); 
$data = $repo->findBy($criteria); 

जब $criteria सरणी का निर्माण, तो आप शायद कुछ तर्क चाहता हूँ ताकि आप केवल प्रकार मानदंड है कि प्रदान किया गया है, के बजाय सभी संभव मूल्यों से। $data में मानदंडों से मेल खाने वाली सभी इकाइयां शामिल होंगी।

अधिक जटिल प्रश्नों के लिए, आप DQL (और शायद custom repository) को उन संस्थाओं के बेहतर नियंत्रण के लिए देखना चाहते हैं, जिन्हें आप खींच रहे हैं।

1

अपने मार्गों का निर्माण करने के लिए, मुझे यकीन है कि आपने प्रलेखन के Routing पृष्ठ पर एक नज़र डाली है, लेकिन क्या आपने देखा है कि आप मार्गों पर आवश्यकताएं डाल सकते हैं? This पृष्ठ बताता है कि एनोटेशन के साथ इसे कैसे किया जाए।

फ़िल्टरिंग के लिए, मुझे लगता है कि डीक्यूएल ठीक रहेगा, लेकिन आप सीधे सिद्धांत के साथ एसक्यूएल लिख सकते हैं, और अपनी क्वेरी के परिणामों को एक या अधिक इकाइयों में मैप कर सकते हैं। यह here वर्णित है। यह डीक्यूएल से अधिक लचीला हो सकता है।

+0

एनोटेशन, आप एक से अधिक मार्ग है, जो महान है मिलान करने के लिए अनुमति देते हैं, लेकिन उस से बचने नहीं करता आप फ़िल्टर के सभी पैरामीटर के लिए मैन्युअल रूप से सभी संभव संयोजनों लिखने के लिए मेरा मतलब है, एबीसी मापदंडों सभी संभव मार्ग संयोजन हो जाएगा हो रही है, एबीसी, एबी, बीसी, एसी, जो दर्द है। मुझे नहीं पता कि आपके अपने रूटिंग को कार्यान्वित करने से इस तरह के गतिशील यूआरएल मिलान की अनुमति मिल जाएगी। – csg

+1

एक समाधान मिला, बहुत सरल/** * @ रूट ("/ खोज/{q}", आवश्यकताएं = {"q": "। +"}) * ........ */ q फिर यूआरएल के अंत तक सबकुछ मैच करेगा। यह आपके ऊपर "क्यू" पार्स करने के लिए है, अधिक जानकारी http://symfony.com/doc/current/cookbook/routing/slash_in_parameter.html – csg

0

सीएसएस, आपका समाधान अच्छा है (@Route ("/ search/{q}) के साथ यदि आपको केवल" एक तरफा "में रूटिंग का उपयोग करने की आवश्यकता है। लेकिन क्या होगा यदि आपको कुछ मूल्य फ़िल्टर लिंक प्रिंट करना होगा पेज यूआरएल द्वारा पहुँचा जा सकता: http://www.trulia.com/for_sale/30000-1000000_price/10001_zip/

@Route("/search/{q} के मामले में आप का उपयोग करने के मार्ग विधि url पैरामीटर के साथ उत्पन्न नहीं कर सकेंगे

0

वहाँ एक महान बंडल LexikFormFilterBundle "lexik/form-filter-bundle": "~2.0" कहा जाता है में मदद करता है कि आप के बाद जटिल DQL उत्पन्न है। उपयोगकर्ता द्वारा पूरा किया गया फ़िल्टर फॉर्म।

आई सी एक बंडल का उपयोग किया, जो उस पर निर्भर करता है, जो किसी दिए गए फॉर्मटाइप के प्रकार को बदलता है (जैसे सेनसिओ जेनरेटर बंडल द्वारा उत्पन्न), तो आप सही फ़िल्टरफॉर्म प्रदर्शित कर सकते हैं और उसके बाद डीक्यूएल (लेक्सिक के साथ) बना सकते हैं।

आप संगीतकार के साथ स्थापित कर सकते हैं, इस README.md

सभी यह करता है सिद्धांत प्रकार guesser, कि प्रत्येक इकाई क्षेत्र के लिए आवश्यक FormType पता चलता है ओवरराइड है निम्नलिखित है, और उचित LexikFormFilterType द्वारा दिए गए प्रकार बदलें। उदाहरण के लिए, filter_number द्वारा एक साधारण NumberType को प्रतिस्थापित करता है जो दो संख्याओं, अधिकतम और न्यूनतम अंतराल सीमाओं के रूप में प्रस्तुत करता है।

private function createFilterForm($formType) 
{ 
    $adapter = $this->get('dd_form.form_adapter'); 
    $form = $adapter->adaptForm(
     $formType, 
     $this->generateUrl('document_search'), 
     array('fieldToRemove1', 'fieldToRemove2') 
    ); 
    return $form; 
} 

प्रपत्र पर जमा करें, तो आप सिर्फ के रूप में मेरे उदाहरण में दिखाया गया, Lexik को दे और उत्पन्न क्वेरी चलाते हैं।

public function searchAction(Request $request) 
{ 
    // $docType = new FormType/FQCN() could do too. 
    $docType = 'FormType/FQCN'; 
    $filterForm = $this->createFilterForm($docType); 
    $filterForm->handleRequest($request); 

    $filterBuilder = $this->getDocRepo($docType) 
     ->createQueryBuilder('e'); 
    $this->get('lexik_form_filter.query_builder_updater') 
     ->addFilterConditions($filterForm, $filterBuilder); 

    $entities = $filterBuilder->getQuery()->execute(); 

    return array(
     'entities' => $entities, 
     'filterForm' => $filterForm->createView(), 
    ); 
}