2012-08-31 9 views
15

मैं उपयोगकर्ताओं के लिए इनवॉइस और अन्य टैब्यूलर डेटा की पीडीएफ प्रतियां उत्पन्न करने में सक्षम होने के लिए काम कर रहा हूं। ऐसा करने के लिए, मैंने dompdf को एक लाइब्रेरी में लपेट लिया है जिसे मैं सीआई के साथ उपयोग कर सकता हूं और एक विधि बनाई है जो सीआई के output->get_output() के रिटर्न वैल्यू के आधार पर पीडीएफ उत्पन्न करेगी। रैपर this one on Github के समान है।क्या मैं कोडिग्निटर आउटपुट क्लास को डेटा प्रदर्शित किए बिना डेटा पास कर सकता हूं?

समस्या यह है कि, मैं load->view() के अलावा सीआई के आउटपुट क्लास में दृश्य (और पीडीएफ के लिए एचटीएमएल/सीएसएस की आवश्यकता) प्राप्त करने का कोई तरीका नहीं समझ सकता, जो ब्राउज़र पर लिखने जा रहा है।

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

  1. सब कुछ करते हैं मैं सामान्य रूप से प्रदर्शन
  2. लोड के लिए दृश्य तैयार करने के लिए करना चाहते हैं:

    स्पष्ट है कि, यह है कि मैं क्या पूरा करने के लिए (क्रम में है कि मैं इसे पूरा करना चाहते हैं) चाहते है सीआई उत्पादन वर्ग में देखने के लिए, लेकिन नहीं प्रदर्शित

  3. मेरी dompdf पुस्तकालय
  4. सेट करने के लिए output->get_output() के रिटर्न मान दर्रा उचित हेडर
  5. मेरी dompdf विधि है कि टी भेज देंगे निष्पादित वह ब्राउज़र के लिए पीडीएफ

मुझे output class documentation पर आधारित चरण 2 करने का कोई तरीका नहीं दिख रहा है।

क्या इसे प्रदर्शित किए बिना आउटपुट क्लास में देखना संभव है? यदि हां, तो कैसे? मैं सीआई 2.0.3 का उपयोग कर रहा हूँ।

संपादित

बहुत उपयोगी Anthony Sterling ने बताया कि I can just get what I want from the loader class तीसरा तर्क यह कह रही एक स्ट्रिंग लौटाने के बजाय सही पर दृश्य प्रस्तुत करने के लिए निर्धारित करके। उदा .:

$lotsaHtml = $this->load->view('fooview', $somearray, TRUE); 

और वह मेरी विशेष उदाहरण में बेहतर हो के बाद से मैं आंशिक लोड करने के लिए की जरूरत नहीं है जाएगा। हालांकि, यह अभी भी एक वैध और (मुझे लगता है) दिलचस्प सवाल है, यह जानना आसान होगा कि क्या मैं ओबी से भी प्राप्त कर सकता हूं, शायद अगर मैं में आंशिक का एक गुच्छा है। उनको संयोजित किया जा सकता है, लेकिन यक।

ऐसा लगता है कि मुझे आउटपुट क्लास को कुछ भी प्रस्तुत करने में सक्षम होना चाहिए (अन्यथा, get_output() क्यों मौजूद है?) तो मैं जो कुछ भी जानता हूं उसके साथ कुछ और कर सकता हूं। मुझे ऐसा करने का कोई तरीका नहीं मिल रहा है।

संपादित 2

कुछ छद्म (लेकिन अब तक वास्तविकता से) कोड को दर्शाता हुआ मैं ऐसा करने की उम्मीद है क्या, यह दिखाते हुए कि मैं क्या किया था और उसके बाद समझा क्या मैं वास्तव में चाहता था करने के लिए से।

चलो कहते हैं कि मैं एक मॉडल inv नामित का उपयोग कर invoice नाम के एक नियंत्रक में एक सार्वजनिक विधि genpdf($id) करते हैं:

public function genpdf($invoiceId) { 
    $this->load->library('dompdflib'); 
    $this->pagedata['invoice_data'] = $this->inv->getInvoice($invoiceId); 
    $html = $this->load->view('pdfgen', $this->pagedata, TRUE); 
    $this->dompdflib->sendPdf($html); 
} 

कि कोड है कि मुझे लगता है कि अभी काम करता है के लगभग समान है। वहाँ, मैं लोडर पार्स और मुझे एक स्ट्रिंग है, जो मैं अपने dompdf आवरण कि हेडर सेट करता है और ब्राउज़र के लिए PDF भेजता में कार्य करने के लिए पारित रूप में pdfgen देखने का परिणाम देने के लिए पूछना।

यह सिर्फ लग रहा था जैसे यह सिर्फ उत्पादन बफर ही (आदि सही ढंग से हेडर की स्थापना/के बाद) हो रही द्वारा ऐसा करने के लिए आसान होगा।

या मैं बस हर आंशिक मैं लोड के साथ लगातार उत्पादन वर्ग append_output() कॉल करने के लिए क्या है?

एकाधिक मॉडल की अधिकता लोड हो रहा है तरीकों को एक साथ काम करने के लिए उत्पन्न करने के लिए इन (वे एक बाद का विचार के रूप में में जा रहे हैं) की जरूरत है, तो मैं बस यह सब इकट्ठा करने और उत्पादन वर्ग से सीधे इसे पुनः प्राप्त करने की उम्मीद कर रहा था। ऐसा हो सकता है कि ऐसा करने के लिए मुझे धीरे-धीरे output->append_output() पर बात करनी पड़े।

+0

अगर पृष्ठों कैश नहीं किया जाता, तो शायद आप उसे वहाँ से मिल सकता है? – Jurgo

+0

@ जुर्गो दुर्भाग्यवश नहीं, पृष्ठों को स्वयं कैश नहीं किया जा सकता है (ठीक है, शायद वे कर सकते हैं, लेकिन _extremely_ कम समय के लिए जो विश्वसनीय रूप से काम नहीं करेगा)। –

+1

मैं यह नहीं समझ सकता कि इसके साथ क्या हो रहा है। किसी भी तरह आउटपुट क्लास '_display' स्वचालित रूप से नियंत्रक विधि के अंत में कॉल किया जाता है (मुझे लगता है)। यदि आप अपने कंट्रोलर विधि में अंतिम चरण के रूप में 'बाहर निकलें' हैं, तो फ़ंक्शन को कॉल नहीं किया जाएगा और आप किसी भी रिसाव के बिना "मैन्युअल रूप से" आउटपुट को संभालने के लिए अपेक्षित रूप से $- e output-> get_output() 'को प्रतिबिंबित कर सकते हैं। हालांकि, आउटपुट क्लास के साथ सेट किए गए कोई हेडर या तो नहीं भेजे जाएंगे (और प्रोफाइलर जैसी चीजें नहीं चलेंगी), इसलिए यह समाधान सिर्फ एक सुराग नहीं है। –

उत्तर

10

... इसलिए - यदि आप एक स्ट्रिंग के रूप में पूरे अंतिम आउटपुट (न केवल दृश्य) प्राप्त करने के लिए और उपयोगकर्ता के लिए इसे प्रदर्शित नहीं चाहता हूँ - मैं सही ढंग से समझ सकते हैं? क्यों आप नियंत्रक _output() फ़ंक्शन को अधिभारित नहीं करते हैं?

class Your_controller extends CI_Controller 
{ 
     function stuff() 
     { 
      // do whatever - prep $data etc 
      $this->load->view('your_view', $data); 
     } 

     function _output($output) 
     { 
      // send $output to your library - get results blah blah 
      $result_pdf_file = $this->your_pdf_library_generator($output); 

      // Show something else to the user 
      echo "hi - I'm not what you expected - but here is your PDF"; 

      echo $result_pdf_file; // or something like that 
     } 
} 

इसका मतलब है आप आप उत्पादन वर्ग के लिए ऐसा कुछ भेज सकते हैं - लेकिन कुछ भी आप क्या चाहते हैं को छोड़कर प्रदर्शित होता है।

इस विचार को बेहतर बनाने के तरीके हैं (यानी हुक, आउटपुट चालू/बंद आदि को चालू करने के लिए चर) - लेकिन सबसे सरल यह होगा कि यह नियंत्रक विशेष रूप से आपके pdf_generation कमांड के लिए होगा।

मुझे आउटपुट क्लास दस्तावेज़ों के आधार पर चरण 2 करने का कोई तरीका नहीं दिख रहा है। क्या इसे प्रदर्शित किए बिना आउटपुट क्लास में देखना संभव है? यदि हां, तो कैसे? मैं सीआई 2.0.3 का उपयोग कर रहा हूँ।

नियंत्रक _output() प्रलेखन यही कारण है कि आप नहीं मिल पाया CI controller documentation में वास्तव में है।

+0

यह _precisely_ है जिसे मैं ढूंढ रहा था। अगर मैंने इसे पहले देखा था, तो मैं आउटपुट क्लास को बढ़ाने की कोशिश करने के खरगोश के छेद पर नहीं जा रहा होता। मैं देख सकता हूं कि उन्होंने इसे क्यों रखा जहां उन्होंने किया था, लेकिन आउटपुट कंट्रोलर डॉक्स में इसके लिए कुछ ब्रेडक्रंब्स कुछ समय बचा चुके थे :) –

+0

हाँ - मुझे केवल एक अन्य परियोजना से पता था। बीटीडब्ल्यू - क्या आपका dompdf लाइब्रेरी रैपर कुछ साझा करने में रुचि हो सकती है? मैं सचमुच अपने सीआई परियोजनाओं में से एक में इसका उपयोग करने जा रहा हूं। यदि हां, तो मेरा ईमेल मेरे जैव में है - यदि नहीं - तो यह अच्छा लगता है - मैंने सोचा कि मैं सिर्फ पूछता हूं और मेरी किस्मत आजमाता हूं;) – Laurence

+0

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

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

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