2012-01-11 9 views
8

में PHPExcel क्लास नहीं मिला है, मैं ज़ेंड फ्रेमवर्क में नामस्थानों के साथ संघर्ष कर रहा हूं (कम से कम मुझे लगता है कि यह नामस्थान समस्या है)।जेडेंड ऑटोलोडर

मैं अपने ज़ेंड प्रोजेक्ट में PHPExcel को एकीकृत करना चाहता हूं। प्रासंगिक फ़ाइल संरचना इस प्रकार है:

/ 
-library 
    -ABCD 
    -PHPExcel 
    -Zend 
    -ZendX 
    -PHPExcel.php 

कस्टम कक्षाओं ठीक काम करते हैं, के बाद

Zend_Loader_Autoloader::getInstance()->registerNamespace('ABCD_'); 
बूटस्ट्रैप में

। इसके अलावा, उन वर्गों का नाम एबीसीडी_ब्लहादेब्ला नाम दिया गया है।

हालांकि, रजिस्टर नेमस्पेस ('PHPExcel_') करने से ज़ेंड उचित कक्षाओं को खोजने में मदद नहीं करता है। जब मैं

$sheet = new PHPExcel; 

नियंत्रक में, मुझे "कक्षा नहीं मिली" त्रुटि मिलती है। मैं अनुमान लगा रहा हूं कि यह इसलिए है क्योंकि PHPExcel में कक्षाओं को नामस्थान उपसर्ग के साथ नामित नहीं किया गया है, या क्योंकि मुख्य PHPExcel.php फ़ाइल नामस्थान के बाहर बैठती है जिसे मैंने अभी घोषित कर दिया है। लेकिन PHPExcel संरचना मांगती है कि यह शेष वर्ग/फ़ॉन्ट/आदि फ़ाइलों की मूल निर्देशिका में बैठे।

किसी भी पॉइंटर्स की बहुत सराहना की जाएगी।

अग्रिम धन्यवाद।

+0

क्या PHPExcel अन्य कक्षाओं का उपयोग करता है? क्या कक्षा को 'My_PHPExcel' या 'App_PHPExcel' में पुनर्नामित करना संभव नहीं है और संबंधित निर्देशिका में सबकुछ डाल देना संभव नहीं है? – bububaba

+0

यह नाविक द्वारा अन्य कक्षाओं का उपयोग करता है। यह काफी refactoring नौकरी होगी। फिलहाल, मैं बस नियंत्रक में "include_once" का उपयोग कर रहा हूं; यह आदर्श नहीं है, लेकिन काम कर रहा है। – yycroman

उत्तर

10

PHPExcel के लिए एक ऑटोलोडर बनाएं और इसे ज़ेंड ऑटोलोडर स्टैक में जोड़ें।

library/My/Loader/Autoloader/PHPExcel.php में:

class My_Loader_Autoloader_PHPExcel implements Zend_Loader_Autoloader_Interface 
{ 
    public function autoload($class) 
    { 
     if ('PHPExcel' != $class){ 
      return false; 
     } 
     require_once 'PHPExcel.php'; 
     return $class; 
    } 
} 

और application/configs/application.ini में:

autoloadernamespaces[] = "My_" 
फिर

, application/Bootstrap.php में:

protected function _initAutoloading() 
{ 
    $autoloader = Zend_Loader_Autoloader::getInstance(); 
    $autoloader->pushAutoloader(new My_Loader_Autoloader_PHPExcel()); 
} 

तो फिर तुम PHPExcel का दृष्टांत में सक्षम होना चाहिए - मान लें, में नियंत्रक - एक सरल के साथ:

$excel = new PHPExcel(); 

एकमात्र चिपचिपा हिस्सा यह सब है कि PHPExcel अपनी सभी निर्भरताओं को अपने फ़ोल्डर में कैसे लोड करता है। यदि यह समझदारी से किया जाता है - या तो require_once basename(__FILE__) . '/someFile.php' जैसे कॉल के साथ या अपने स्वयं के ऑटोलोडर के साथ जो किसी भी तरह ज़ेंड ऑटोलोडर के रास्ते में नहीं मिलता है - तो सभी को ठंडा होना चाहिए। #famouslastwords

+0

बस अपेक्षित काम करता है - और अब मुझे पता है कि अन्य पुस्तकालयों के लिए इसे कैसे करना है, धन्यवाद, धन्यवाद! – yycroman

+1

मेरी खुशी। जब मैंने अंत में यह पता लगाया, तो उसने गैर-पीएसआर -0 पुस्तकालयों को एकीकृत करने के लिए एक पूरी नई दुनिया खोला, जैसे कि मैंने कई विरासत कोडों का सामना किया। चीयर्स! –

+0

बहुत उपयोगी। कस्टम कक्षाओं के लिए महान काम करते हैं –

1

PHPExcel autoloader को संशोधित करने का प्रयास करें:

/Classes/PHPExcel/Autoloader.php में रजिस्टर() विधि के पहले दो लाइनों के रूप में

if (function_exists('__autoload')) { 
     spl_autoload_register('__autoload'); 
    } 

जोड़ें, तुरंत

से पहले
return spl_autoload_register(array('PHPExcel_Autoloader', 'Load')); 
0

मुझे एक्सेल-लिब्रायर (phpxls) और एक पीडीएफ-लाइब्रेरी (fpdf) दोनों के साथ एक ही समस्या है और कुछ अलग-अलग प्रयासों के बाद मैंने बस से आवश्यक फ़ाइल को शामिल किया पुस्तकालय मैन्युअल रूप से और वहां से जाओ। बूथ phpxls और fdpd ज़ेंड ऑटोलोडर विधियों के साथ हस्तक्षेप किए बिना बाकी सब कुछ संभाल सकता है।

एक psudo_code उदाहरण इस तरह दिखेगा, जहां मैं वांछित वर्ग की वस्तु वापस कर दूंगा और फिर उसके साथ काम करना जारी रख सकता हूं। आप कन्स्ट्रक्टर में चीजों को शामिल करने और उस से निर्माण करने का चयन कर सकते हैं।

<?php 
    class exelClass{ 

     public function exelFunction(){ 

      require_once 'required_file.php'; 

      $exelObject = new exelObject(); 

      return $exelObject->Output(); 
     } 
    } 
    ?> 

यह समाधान है कि सुरुचिपूर्ण नहीं हो सकता है, लेकिन मैंने पाया यह करने के लिए पुस्तकालयों के विभिन्न प्रकार के सक्षम करने के लिए सबसे आसान तरीका था differnet autoloaders या एक दूसरे के साथ interfearing जादू कार्यों के बिना सह-अस्तित्व है।

4

आजकल संगीतकार अक्सर उपयोग किया जाने वाला टूल है जो 2012 में इतना लोकप्रिय नहीं था। जेएफएफ में निर्मित पुरानी परियोजनाएं संगीतकार और इसके ऑटोलोडर का उपयोग भी कर सकती हैं।

कैसे प्राप्त करें आपकी लाइब्रेरी प्रत्येक application.ini पर कस्टम ऑटोलोडर जोड़ने के बिना काम करने के लिए काम करते हैं? संगीतकार के autoloader

पहले की

उपयोग करें, setting up composer.json साथ शुरू करते हैं। एक बार बनाया गया, सभी आवश्यक संकुल इकट्ठा करने और संगीतकार के ऑटोलोडर बनाने के लिए composer install चलाएं।

अब, अपने प्रोजेक्ट के public/index.php को अपडेट करें। अब से संगीतकार के माध्यम से लोड की गई सभी आवश्यकताओं पर स्वत: लोड हो जाएगा।

<?php 

// Define path to application directory 
defined('APPLICATION_PATH') 
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application')); 

// Define application environment 
defined('APPLICATION_ENV') 
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'development')); 

// Include composer autoloader 
require_once __DIR__ . '/../vendor/autoload.php'; 

/** Zend_Application */ 
require_once 'Zend/Application.php'; 

// Create application, bootstrap, and run 
$application = new Zend_Application(
    APPLICATION_ENV, 
    array('config' => APPLICATION_PATH . '/configs/application.ini') 
); 

$application->bootstrap(); 
$application->run(); 

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