दिलचस्प पोस्ट
इरादों की तुलना में सेवा से यूआई को अपडेट करने का अधिक कुशल तरीका? MySQL जहां क्वेरी क्वेरी डालें कक्षा Foo को MyApp और MyAppTestCase दोनों में लागू किया गया है। इन दोनों में से कोई एक प्रयोग किया जाएगा। कौन सा एक अपरिभाषित है jQuery – प्रत्येक 10 सेकंड में एजेक्स को कॉल करें सी ++ में प्रत्येक अन्य शामिल हेडर .htaccess और mod_rewrite का उपयोग करके एसएसएल / https को बल दें एस सीएसएस फ़ाइल में नियमित सीएसएस फ़ाइल आयात करें? एंड्रॉइड एमुलेटर में मैं स्क्रीन अभिविन्यास कैसे बदलूं? ग्रुप बाय के बिना हो रही है जावास्क्रिप्ट में हेक्साडेसिमल को फ्लोट करने में परिवर्तित करना सी / सी ++: स्ट्रिंग स्थिरांक के लिए पॉइंटर्स का अनुकूलन कैसे एक ही फैशन में दो ArrayLists यादृच्छिक? मैं बढ़ावा पुस्तकालय नामकरण कैसे व्याख्या कर सकता हूँ? पैटर्न के बाद सामग्री के लिए grep ViewPager से फ्रैगमेंट अपडेट करें

मैं Zend_Form फ़ाइल तत्वों पर व्यूअरन का उपयोग कैसे करूं?

मैं अपने मानक फ़ॉर्म तत्वों के लिए इस व्यूस्क्रिप्ट का उपयोग कर रहा हूं:

<div class="field" id="field_<?php echo $this->element->getId(); ?>"> <?php if (0 < strlen($this->element->getLabel())) : ?> <?php echo $this->formLabel($this->element->getName(), $this->element->getLabel());?> <?php endif; ?> <span class="value"><?php echo $this->{$this->element->helper}( $this->element->getName(), $this->element->getValue(), $this->element->getAttribs() ) ?></span> <?php if (0 < $this->element->getMessages()->length) : ?> <?php echo $this->formErrors($this->element->getMessages()); ?> <?php endif; ?> <?php if (0 < strlen($this->element->getDescription())) : ?> <span class="hint"><?php echo $this->element->getDescription(); ?></span> <?php endif; ?> </div> 

उस व्यूस्क्रिप्ट अकेले प्रयोग करने की कोशिश में त्रुटि होती है:

फ़ॉर्म द्वारा पकड़े गए अपवाद: कोई फ़ाइल डेकोरेटर नहीं मिला … फ़ाइल तत्व रेंडर करने में असमर्थ

इस अकसर किये गए सवाल को देखकर मेरी समस्या का पता चला, और मैंने अपने फॉर्म तत्व सज्जाकार को इस तरह अपडेट किया:

 'decorators' => array( array('File'), array('ViewScript', array('viewScript' => 'form/field.phtml')) ) 

अब यह फ़ाइल दृश्य को दो बार, मेरे दृश्य स्क्रिप्ट के भीतर, और मेरे दृश्य स्क्रिप्ट के बाहर फाइल तत्व के साथ अतिरिक्त तत्व प्रदान करता है:

 <input type="hidden" name="MAX_FILE_SIZE" value="8388608" id="MAX_FILE_SIZE" /> <input type="hidden" name="UPLOAD_IDENTIFIER" value="4b5f7335a55ee" id="progress_key" /> <input type="file" name="upload_file" id="upload_file" /> <div class="field" id="field_upload_file"> <label for="upload_file">Upload File</label> <span class="value"><input type="file" name="upload_file" id="upload_file" /></span> </div> 

किसी व्यूस्क्रिप्ट के साथ इसे ठीक से कैसे प्रबंधित करें पर कोई विचार?


अद्यतन: शॉन के समाधान के आधार पर, यह मेरा अंतिम कोड है:

फॉर्म तत्व:

 $this->addElement('file', 'upload_file', array( 'disableLoadDefaultDecorators' => true, 'decorators' => array('File', array('ViewScript', array( 'viewScript' => '_form/file.phtml', 'placement' => false, ))), 'label' => 'Upload', 'required' => false, 'filters' => array(), 'validators' => array(array('Count', false, 1),), )); 

स्क्रिप्ट देखें:

 <?php $class .= 'field ' . strtolower(end(explode('_',$this->element->getType()))); if ($this->element->isRequired()) { $class .= ' required'; } if ($this->element->hasErrors()) { $class .= ' errors'; } ?> <div class="<?php echo $class; ?>" id="field_<?php echo $this->element->getId(); ?>"> <?php if (0 < strlen($this->element->getLabel())): ?> <?php echo $this->formLabel($this->element->getFullyQualifiedName(), $this->element->getLabel());?> <?php endif; ?> <span class="value"><?php echo $this->content; ?></span> <?php if ($this->element->hasErrors()): ?> <?php echo $this->formErrors($this->element->getMessages()); ?> <?php endif; ?> <?php if (0 < strlen($this->element->getDescription())): ?> <p class="hint"><?php echo $this->element->getDescription(); ?></p> <?php endif; ?> </div> 

वेब के समाधान से एकत्रित समाधान "मैं Zend_Form फ़ाइल तत्वों पर व्यूअरन का उपयोग कैसे करूं?"

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

 $element->setDecorators(array('File', array('ViewScript', array('viewScript' => 'decorators/file.phtml', 'placement' => false)))); 

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

 <label for="<?php echo $this->element->getName(); ?>" class="element <?php if ($this->element->hasErrors()): ?> error<?php endif; ?>" id="label_<?php echo $this->element->getName(); ?>"> <span><?php echo $this->element->getLabel(); ?></span> <?php echo $this->content; ?> <?php if ($this->element->hasErrors()): ?> <span class="error"> <?php echo $this->formErrors($this->element->getMessages()); ?> </span> <?php endif; ?> </label> 

प्रदान किए जाने पर आपको तत्व के लिए यह html दिखाई देगा

 <label for="photo" class="element" id="label_photo"> <span>Photo</span> <input type="hidden" name="MAX_FILE_SIZE" value="6291456" id="MAX_FILE_SIZE"> <input type="file" name="photo" id="photo"> </label> 

यह एक सरल या आदर्श समाधान नहीं है क्योंकि इसे फाइल डेकोरेटर के विस्तार की आवश्यकता है … लेकिन यह निराशाजनक है कि वे फ़ाइल इनपुट पीढ़ी के तर्क से छिपी तत्व पीढ़ी के तर्क को अलग करने का प्रयास नहीं करते। मुझे यकीन नहीं है कि फ़ाइल देखें सहायक एक तत्व के मुद्दे को एक सरणी के रूप में संभालता है (ऐसा लगता है कि वे इस तरह से ऐसा करते हैं।)

फ़ाइल डेकोरेटर के विस्तार: (टिप्पणी की गई हिस्सा क्या अतिरिक्त इनपुट उत्पन्न होने का कारण बनता है।)

 <?php class Sys_Form_Decorator_File extends Zend_Form_Decorator_File { public function render($content) { $element = $this->getElement(); if (!$element instanceof Zend_Form_Element) {return $content;} $view = $element->getView(); if (!$view instanceof Zend_View_Interface) {return $content;} $name = $element->getName(); $attribs = $this->getAttribs(); if (!array_key_exists('id', $attribs)) {$attribs['id'] = $name;} $separator = $this->getSeparator(); $placement = $this->getPlacement(); $markup = array(); $size = $element->getMaxFileSize(); if ($size > 0) { $element->setMaxFileSize(0); $markup[] = $view->formHidden('MAX_FILE_SIZE', $size); } if (Zend_File_Transfer_Adapter_Http::isApcAvailable()) { $apcAttribs = array('id' => 'progress_key'); $markup[] = $view->formHidden('APC_UPLOAD_PROGRESS', uniqid(), $apcAttribs); } else if (Zend_File_Transfer_Adapter_Http::isUploadProgressAvailable()) { $uploadIdAttribs = array('id' => 'progress_key'); $markup[] = $view->formHidden('UPLOAD_IDENTIFIER', uniqid(), $uploadIdAttribs); } /* if ($element->isArray()) { $name .= "[]"; $count = $element->getMultiFile(); for ($i = 0; $i < $count; ++$i) { $htmlAttribs = $attribs; $htmlAttribs['id'] .= '-' . $i; $markup[] = $view->formFile($name, $htmlAttribs); } } else {$markup[] = $view->formFile($name, $attribs);} */ $markup = implode($separator, $markup); switch ($placement) { case self::PREPEND: return $markup . $separator . $content; case self::APPEND: default: return $content . $separator . $markup; } } } ?> 

नियंत्रक कार्रवाई में प्रपत्र सेटअप:

 $form = new Zend_Form(); $form->addElement(new Zend_Form_Element_File('file')); $form->file->setLabel('File'); $form->file->setDescription('Description goes here.'); $decorators = array(); $decorators[] = array('File' => new Sys_Form_Decorator_File()); $decorators[] = array('ViewScript', array('viewScript' => '_formElementFile.phtml')); $form->file->setDecorators($decorators); $this->view->form = $form; 

कार्रवाई दृश्य में:

 <?php echo $this->form; ?> 

तत्व स्क्रिप्ट में:

 <div class="field" id="field_<?php echo $this->element->getId(); ?>"> <?php if (0 < strlen($this->element->getLabel())) : ?> <?php echo $this->formLabel($this->element->getName(), $this->element->getLabel());?> <?php endif; ?> <span class="value"> <?php echo $this->{$this->element->helper}( $this->element->getName(), $this->element->getValue(), $this->element->getAttribs() ); ?> </span> <?php if (0 < $this->element->getMessages()->length) : ?> <?php echo $this->formErrors($this->element->getMessages()); ?> <?php endif; ?> <?php if (0 < strlen($this->element->getDescription())) : ?> <span class="hint"><?php echo $this->element->getDescription(); ?></span> <?php endif; ?> </div> 

उत्पादन होना चाहिए:

 <form enctype="multipart/form-data" action="" method="post"> <dl class="zend_form"> <input type="hidden" name="MAX_FILE_SIZE" value="134217728" id="MAX_FILE_SIZE" /> <div class="field" id="field_file"> <label for="file">File</label> <span class="value"><input type="file" name="file" id="file" /></span> <span class="hint">Description goes here.</span> </div> </dl> </form> 

इस समाधान के साथ एक समस्या यह है कि छिपे हुए तत्वों ने विचारचिह्न के भीतर रेंडर नहीं किया; यह समस्या हो सकती है यदि आप div को क्लाइंट-साइड स्क्रिप्ट में चयनकर्ता के रूप में उपयोग कर रहे हैं …

मुझे जो एहसास हुआ है, एक कस्टम डेकोरेटर वर्ग फ़ाइल क्षेत्रों को छोड़कर अधिकांश क्षेत्रों को संभाल देगा। सुनिश्चित करें कि आपका वर्ग इंटरफ़ेस को इस तरह लागू करता है:

 class CC_Form_Decorator_Pattern extends Zend_Form_Decorator_Abstract implements Zend_Form_Decorator_Marker_File_Interface 

यह मेरे लिए काम किया

इससे मुझे मेरी समस्या ठीक करने में मदद मिली मैंने तालिका के अंदर फ़ाइल तत्व को लपेट करने के लिए कोड को समायोजित कर दिया। इसे काम करने के लिए, बस viewdecorator से लेबल को हटा दें और फ़ाइल तत्व को निम्नानुसार जोड़ें:

 $form->addElement('file', 'upload_file', array( 'disableLoadDefaultDecorators' => true, 'decorators' => array( 'Label', array(array('labelTd' => 'HtmlTag'), array('tag' => 'td', 'class' => 'labelElement')), array(array('elemTdOpen' => 'HtmlTag'), array('tag' => 'td', 'class' => 'dataElement','openOnly' => true, 'placement' => 'append')), 'File', array('ViewScript', array( 'viewScript' => 'decorators/file.phtml', 'placement' => false, )), array(array('elemTdClose' => 'HtmlTag'), array('tag' => 'td', 'closeOnly' => true, 'placement' => 'append')), array(array('row' => 'HtmlTag'), array('tag' => 'tr')) ), 'label' => 'Upload', 'required' => false, 'filters' => array(), 'validators' => array(array('Count', false, 1), ), )); 

मुझे एक काम मिल गया है- जो कि व्यूस्क्रिप्ट पूरी तरह से बचा जाता है

सबसे पहले, तत्व परिभाषा:

 $this->addElement('file', 'upload_file', array( 'disableLoadDefaultDecorators' => true, 'decorators' => array( 'File', array(array('Value'=>'HtmlTag'), array('tag'=>'span','class'=>'value')), 'Errors', 'Description', 'Label', array(array('Field'=>'HtmlTag'), array('tag'=>'div','class'=>'field file')), ), 'label' => 'Upload File', 'required' => false, 'filters' => array('StringTrim'), 'validators' => array(), )); 

दूसरा, फार्म वर्ग के तत्काल बाद, मैं अपने व्यूस्क्रिप्ट के व्यवहार की नकल करता हूं:

 $field = $form->getElement('upload_file'); $decorator = $field->getDecorator('Field'); $options = $decorator->getOptions(); $options['id'] = 'field_' . $field->getId(); if ($field->hasErrors()) { $options['class'] .= ' errors'; } $decorator->setOptions($options); 

मुझे लगता है कि मुझे क्लास-आधारित सज्जाकारों में देखना चाहिए। शायद वहाँ अधिक लचीलेपन है?

सबसे आसान बात यह है कि अपने कस्टम फ़ाइल डेकोरेटर में आउटपुट में कोई भी मार्कअप नहीं जोड़ना है:

  क्लास Custom_Form_Decorator_File Zend_Form_Decorator_File विस्तारित {
         सार्वजनिक फ़ंक्शन रेंडर ($ सामग्री) {
                 वापसी $ सामग्री;
         }
 } 

अब आप इस फ़ाइल तत्व (फ़ाइल इनपुट फ़ील्ड आउटपुट और आपके लिए आवश्यक सभी छिपे हुए फ़ील्ड) के लिए अपने विचारचिह्न में जो चाहें कर सकते हैं।

सिर्फ अगर आप @ शॉन के उत्तर का अनुसरण करते हैं और आपको अभी भी त्रुटि मिलती है: सुनिश्चित करें कि आपने प्रश्न के तत्व के लिए डिफॉल्ट सजावट अक्षम कर दी है (पंक्ति 2 को देखें):

 $this->addElement('file', 'upload_file', array( 'disableLoadDefaultDecorators' => true, 'decorators' => array('File', array('ViewScript', array( 'viewScript' => '_form/file.phtml', 'placement' => false, ))), 'label' => 'Upload', 'required' => false, 'filters' => array(), 'validators' => array(array('Count', false, 1),), ));