2011-07-15 12 views
9

पर एकाधिक प्रीग्रेस्प्लेस फ़िल्टर का उपयोग करके मैं एक एकल ज़ेंड फॉर्म तत्व पर एकाधिक प्रीग्राइस्प्लेस फ़िल्टर जोड़ना चाहता हूं। मैं नीचे दिए गए कोड का उपयोग कर एक PregReplace फिल्टर जोड़ सकते हैं:ज़ेंड फॉर्म तत्व

$word = new Zend_Form_Element_Text('word'); 
$word->addFilter('PregReplace', array(
     'match' => '/bob/', 
     'replace' => 'john' 
    )); 
$this->addElement($word); 

मैं

$word = new Zend_Form_Element_Text('word'); 
$word->addFilter('PregReplace', array(
     'match' => '/bob/', 
     'replace' => 'john' 
    )); 
$word->addFilter('PregReplace', array(
     'match' => '/sam/', 
     'replace' => 'dave' 
    )); 
$this->addElement($word);  

की कोशिश की है, लेकिन यह सिर्फ मतलब केवल दूसरे फिल्टर काम किया।

मैं एकाधिक प्रीग्रेस्प्लेस फ़िल्टर कैसे जोड़ूं?

+0

'addFilter()' एक आंतरिक रजिस्ट्री कुंजी के रूप में classname का उपयोग करता है नहीं है, तो जाहिरा तौर पर आप एक ही CLA की एकाधिक फिल्टर नहीं हो सकता एस एस। आश्चर्य की बात है कि यह कुंजी निर्दिष्ट करने के विकल्प को अनुमति नहीं देता है। शायद एक मुद्दा के रूप में दाखिल करने लायक है। –

उत्तर

1

PregReplace के बाद से php के preg_replace फ़ंक्शन का उपयोग करता (preg_replace पैटर्न और संबंधित प्रतिस्थापन तार के सरणी के सरणियों को स्वीकार करता है सकते हैं) मुझे लगता है कि कुछ इस तरह संभव होगा,:

$word = new Zend_Form_Element_Text('word'); 
$word->addFilter('PregReplace', array(
     'match' => array('/bob/', '/sam/'), 
     'replace' => array('john' , dave) 
    )); 
$this->addElement($word); 

मैं इसे हालांकि परीक्षण नहीं किया। उम्मीद है कि यह काम करेगा।

+1

धन्यवाद मार्किन, दुर्भाग्य से यह काम नहीं किया। मुझे त्रुटि मिली 'Zend_Filter_PregReplace के पास वैध MatchPattern सेट नहीं है' – AndySidd

+0

तो हम क्या कर सकते हैं? !! यह भी मेरी समस्या है !!! – afsane

0

मैं 'PregReplace' के साथ काम करने के लिए पिछले उदाहरण प्राप्त करने में असमर्थ था। मैंने इसे नए Zend_Filter_PregReplace() के साथ कॉल करने के बजाय स्विच किया। यह अब मेरे लिए काम करता है।

$word->addFilter(new Zend_Filter_PregReplace(array(
       'match' => array('/bob/', '/sam/'), 
       'replace'=> array('john', 'dave')) 
)); 
+0

मैंने वही काम किया लेकिन यह मुझे यह त्रुटि दिखाता है: "चेतावनी: preg_replace() [function.preg-replace]: डेलिमीटर को अल्फान्यूमेरिक या बैकस्लैश नहीं होना चाहिए" जब मैं प्रत्येक फ़िल्टर अलग-अलग चलाता हूं तो वे त्रुटि के बिना ठीक काम करते हैं !! – afsane

6

समस्या आप देख रहे हैं कि दूसरी फिल्टर फिल्टर ढेर ($this->_filters) Zend_Form_Element में परिभाषित में पहले एक स्थान पर आ जाएगी है।

जैसा कि डेविड ने टिप्पणी टिप्पणियों में उल्लेख किया था, फ़िल्टर स्टैक इंडेक्स ($this->_filters[$name] = $filter;) के रूप में फिल्टर नामों का उपयोग करते हैं, यही कारण है कि दूसरा फ़िल्टर पहले को ओवरराइड करता है।

आदेश इस समस्या को हल करने के लिए आपको इस रूप में एक कस्टम फिल्टर का उपयोग कर सकते हैं:

$element->addFilter('callback', function($v) { return preg_replace(array('/bob/', '/sam/'),array('john', 'dave'), $v); }); 

यह एक इनलाइन समारोह() उपयोग किया जाता है, इस स्थिति में आप PHP संस्करण उपयोग नहीं कर रहे 5.3 या

$element->addFilter('callback', array('callback' => array($this, 'funcName'))); 

और अपने रूप में अपने init() पद्धति के तहत जोड़ें::

के रूप में यह काम करने के लिए इस प्रकार अधिक है, अपने कॉलबैक सेट कर सकते हैं
function funcName($v) { 
    return preg_replace(array('/bob/', '/sam/'), array('john', 'dave'), $v); 
} 

अंत में, आप (सिंटेक्स गलत है) मार्सिन के जवाब के विपरीत केवल PregReplace फिल्टर, उपयोग करना चाहते हैं, तब भी आप इसे इस तरह कर सकते हैं:

$element->addFilter('pregReplace', array(
      array('match' => array('/bob/', '/sam/'), 
       'replace' => array('john', 'dave') 
))); 

कि चाल करना चाहिए;)

+0

हम इस तरह के फ़ंक्शन को परिभाषित नहीं कर सके! यह त्रुटि दिखाता है !! – afsane

+0

किस तरह की त्रुटि? हालांकि यह एक सही PHP5 वाक्यविन्यास है। – Liyali

+0

अप्रत्याशित फ़ंक्शन – afsane

-1

मैं एक ही-प्रतिक्रिया के लिए देख रहा था एक प्रयोग करने योग्य संस्करण

$word->addFilter(new Zend_Filter_PregReplace(new Zend_Config(array(
'match'=>array('/bob/', '/sam/'), 
'replace'=>array('john', 'dave') 
)))); 
+0

के साथ है, कृपया केवल अंग्रेजी भाषा में एन्सर पोस्ट करें। –

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