示例#1
0
 /**
  * Process this form field as a DOM element to place it in the template at the given node.
  *
  * @param DOMNode $node
  * @param I2CE_Template $template
  */
 public function processDOM($node, $template)
 {
     $i2ce_config = I2CE::getConfig()->modules->forms;
     $ele_name = $this->getHTMLName();
     $showForm = $this->withinForm($node);
     if ($node->hasAttribute("href")) {
         //This is a link
         if ($node->hasAttribute("no_value")) {
             $href_link = $node->getAttribute("href");
         } else {
             $href_link = $node->getAttribute("href") . $this->getDBValue();
         }
         if ($node->hasAttribute("parent") && $this->getContainer() instanceof I2CE_Form) {
             //needs to be handled better
             $href_link .= "&parent=" . $this->getContainer()->getParent();
         }
         $href = $template->createElement("a", array("href" => $href_link));
         if ($node->attributes instanceof DOMNamedNodeMap) {
             foreach ($node->attributes as $name => $attrNode) {
                 if ($name == 'href' || !$attrNode instanceof DOMAttr) {
                     continue;
                 }
                 $href->setAttribute($name, $attrNode->value);
             }
         }
         $node->parentNode->replaceChild($href, $node);
         while ($node->firstChild instanceof DOMNode) {
             $href->appendChild($node->firstChild);
         }
         $node = $href;
     } elseif ($node->hasAttribute("head") || $node->hasAttribute("showhead")) {
         if ($node->hasAttribute("head")) {
             $head = $node->getAttribute("head");
         } else {
             $head_type = $node->getAttribute("showhead");
             if ($this->hasHeader($head_type)) {
                 $head = $this->getHeader($head_type);
             } elseif ($this->hasHeader()) {
                 $head = $this->getHeader();
             } else {
                 $head = ucfirst($this->getName());
             }
         }
         $display = 'default';
         if ($node->hasAttribute("display")) {
             $t_display = $node->getAttribute('display');
             if (strtolower($t_display) != 'true' && strtolower($t_display) != 'false') {
                 if (isset($i2ce_config->template_displays->{$t_display})) {
                     $display = $t_display;
                 }
             } else {
                 $display = strtolower($t_display);
             }
         }
         if ($showForm) {
             $template_file = 'form_field.html';
             $template_file_root = 'p';
             $i2ce_config->setIfIsSet($template_file, "template_displays/default/showForm/field");
             $i2ce_config->setIfIsSet($template_file, "template_displays/{$display}/showForm/field");
             if ($display !== 'default') {
                 $i2ce_config->setIfIsSet($template_file_root, "template_displays/default/showForm/field_root");
                 $i2ce_config->setIfIsSet($template_file_root, "template_displays/{$display}/showForm/field_root");
             }
         } else {
             $template_file = 'display_field.html';
             $template_file_root = 'tr';
             $i2ce_config->setIfIsSet($template_file, "template_displays/default/displayed/field");
             $i2ce_config->setIfIsSet($template_file, "template_displays/{$display}/displayed/field");
             if ($display !== 'default') {
                 $i2ce_config->setIfIsSet($template_file_root, "template_displays/default/displayed/field_root");
                 $i2ce_config->setIfIsSet($template_file_root, "template_displays/{$display}/displayed/field_root");
             }
         }
         $form_node = $template->loadFile($template_file, $template_file_root);
         $node->parentNode->replaceChild($form_node, $node);
         foreach (array('class', 'auto_link') as $a) {
             //I hate having an explicit reference to auto_link here :-(
             if ($node->hasAttribute($a)) {
                 $form_node->setAttribute($a, $node->getAttribute($a));
             }
         }
         $title_attr = null;
         if ($node->hasAttribute("title")) {
             $title_attr = $node->getAttribute("title");
         } elseif ($node->hasAttribute("showtitle")) {
             $title_type = $node->getAttribute("showtitle");
             if ($this->hasHeader($title_type)) {
                 $title_attr = $this->getHeader($title_type);
             } elseif ($this->hasHeader("title")) {
                 $title_attr = $this->getHeader("title");
             }
         }
         if ($title_attr !== null) {
             $form_node->setAttribute("title", $title_attr);
         }
         $field_head_class = 'field_head';
         $form_field_class = 'form_field';
         $i2ce_config->setIfIsSet($field_head_class, "template_displays/default/field_head_class");
         $i2ce_config->setIfIsSet($form_field_class, "template_displays/default/form_field_class");
         if ($display !== 'default') {
             $i2ce_config->setIfIsSet($field_head_class, "template_displays/{$display}/field_head_class");
             $i2ce_config->setIfIsSet($form_field_class, "template_displays/{$display}/form_field_class");
         }
         $head_node = $template->query("descendant::*[@class='" . $field_head_class . "']", $form_node);
         if ($head_node->length > 0) {
             $head_node = $head_node->item(0);
         } else {
             $head_node = false;
         }
         $field_node = $template->query("descendant::*[@class='" . $form_field_class . "']", $form_node);
         if ($field_node->length > 0) {
             $field_node = $field_node->item(0);
         } else {
             $field_node = false;
         }
         if ($field_node) {
             $field_name = $this->getContainer()->getName() . '_' . $this->getName();
             $template->addClass($field_node, $field_name);
             while ($node->hasChildNodes()) {
                 $field_node->appendChild($node->childNodes->item(0));
             }
         }
         if ($head_node) {
             $head_node->appendChild($template->createElement("label", array("for" => $ele_name), $head));
         }
         if ($head_node && $node->hasAttribute("showhelp")) {
             $title_type = $node->getAttribute("showhelp");
             if ($this->hasHeader($title_type)) {
                 $title_attr = $this->getHeader($title_type);
                 $head_node->appendChild($template->createElement("span", array('title' => $title_attr, 'class' => 'fieldhelp'), " (?) "));
             }
         }
         if (!$showForm) {
             if ($field_node) {
                 $field_node->appendChild($this->getDisplayNode($node, $template));
             }
         } elseif ($display == 'true') {
             if ($field_node) {
                 $field_node->appendChild($this->getDisplayNode($node, $template));
             }
         } elseif ($template->isReview() || $node->hasAttribute("noedit") && $node->getAttribute('noedit') && $this->issetValue() || $node->hasAttribute('noedit') && $node->getAttribute('noedit') == 'strict') {
             if ($field_node) {
                 $processorNotEditable = 'processDOMNotEditable';
                 if ($node->hasAttribute('display') && $this->_hasMethod('processDOMNotEditable_' . $node->getAttribute('display'))) {
                     $processorNotEditable = 'processDOMNotEditable_' . $node->getAttribute('display');
                 }
                 if ($node->hasAttribute('display')) {
                     $field_node->setAttribute('display', $node->getAttribute('display'));
                 }
                 $this->{$processorNotEditable}($field_node, $template, $node);
             }
         } else {
             $this->setElement(false);
             $this->processHeaderEditable($template, $node, $head_node);
             if ($field_node) {
                 if ($this->hasInvalid()) {
                     $this->displayInvalid($template, $field_node);
                 }
                 $processorEditable = 'processDOMEditable';
                 if ($node->hasAttribute('display') && $this->_hasMethod('processDOMEditable_' . $node->getAttribute('display'))) {
                     $processorEditable = 'processDOMEditable_' . $node->getAttribute('display');
                 }
                 $postprocessorEditable = 'postprocessDOMEditable';
                 if ($node->hasAttribute('display') && $this->_hasMethod('postprocessDOMEditable_' . $node->getAttribute('display'))) {
                     $postprocessorEditable = 'postprocessDOMEditable_' . $node->getAttribute('display');
                 }
                 $this->{$processorEditable}($field_node, $template, $node);
                 $this->{$postprocessorEditable}($field_node, $template, $node);
             }
             $element = $this->getElement();
             if ($element) {
                 if ($this->hasInvalid()) {
                     $class = "error";
                     if ($element->hasAttribute("class")) {
                         $class .= " " . $element->getAttribute("class");
                     }
                     $element->setAttribute("class", $class);
                 }
                 if ($node->hasAttribute("onchange")) {
                     $element->setAttribute("onchange", $node->getAttribute("onchange"));
                 }
                 if ($node->hasAttribute("onfocus")) {
                     $element->setAttribute("onfocus", $node->getAttribute("onfocus"));
                 }
             }
         }
     } else {
         if (!$showForm || $node->hasAttribute("noedit")) {
             // Just replacing the node text with the value in the database.
             $node->appendChild($this->getDisplayNode($node, $template));
         } else {
             $options = array("name" => $ele_name, "type" => "hidden", "value" => $this->getDBValue());
             if ($node->hasAttribute('alt_name')) {
                 $options['name'] = $node->getAttribute('alt_name');
             }
             $hidden = $template->createElement("input", $options);
             $node->parentNode->replaceChild($hidden, $node);
         }
     }
 }