Page 1 of 1

Autocomplete field shows twice in the translation form

PostPosted: Mon Mar 12, 2012 10:55 pm
by the_woz
I noticed a couple of problems today in the translation form, the first was the preview for the logo field was missing, and the "View field in New Window" link pointed to an URL of this type:

http://www.mysite.com/http://www.mysite ... gofile.gif

I traced the problem to the default template file "Dataface_TranslationForm_element.html"

and changed this:

Code: Select all
   {if $properties.image_preview}
   <img src="{$smarty.server.HOST_URI}{$properties.image_preview}" style="display: block; max-height: 200px" alt="{$field.name} preview image"/>
   {/if}
   {if $properties.preview}
   <a href="{$smarty.server.HOST_URI}{$properties.preview}" target="_blank">{translate id="scripts.GLOBAL.MESSAGE_VIEW_FIELD_CONTENT"}View Field Content in new Window{/translate}</a>
   {/if}


to this (made a copy on my theme directory instead of changing the original file):

Code: Select all
   {if $properties.image_preview}
   <img src="{$properties.image_preview}" style="display: block; max-height: 200px" alt="{$field.name} preview image"/>
   {/if}
   {if $properties.preview}
   <a href="{$properties.preview}" target="_blank">{translate id="scripts.GLOBAL.MESSAGE_VIEW_FIELD_CONTENT"}View Field Content in new Window{/translate}</a>
   {/if}


Now the logo field preview shows correctly.

The second problem, and the cause of this post is a very strange one, field with a autocomplete widget type display twice in the translation form, it happens only with this widget type, yui_autocomplete displays correctly.

Here's a screenshot:
Image

The country field is set as yui_autocomplete while Language is set as autocomplete and is shown twice.

I was using Xataface 1.3rc6 when I found this, I updated to 1.3.2 but nothing changed.

Re: Autocomplete field shows twice in the translation form

PostPosted: Wed Mar 14, 2012 5:44 pm
by the_woz
Any idea about what can be causing this?

I traced the problem to DatafaceTranslationForm::display(), the duplicate field appears after a call to $this->_build() (line 248 of /Dataface/TranslationForm.php).

function display(){
if ( $this->_resultSet->found()>0 || $this->_new ){
$res = $this->_build(); //<<<<<-----echoing the fieldnames from inside Dataface_Quickform::_build() here shows each field only once, as it should be
if ( PEAR::isError($res) ){
return $res;
}
else {
//$this->displayTabs();
if ( !$this->_new and !Dataface_PermissionsTool::edit($this->_record) ){
$this->freeze();
}

if ( $this->_new and /*!Dataface_PermissionsTool::edit($this->_table)*/!Dataface_PermissionsTool::checkPermission('new',$this->_table) ){
$this->freeze();
}
$this->accept($this->_renderer); //<<<<<-----echoing the fieldnames from inside HTML_Quickform::accept(&$renderer) here shows the autocomplete field already duplicated
//$formTool =& Dataface_FormTool::getInstance();


if ( $this->_new || Dataface_PermissionsTool::view($this->_record) ){
echo $this->_renderer->toHtml();
//echo $formTool->display($this);
} else {
echo "<p>".df_translate('scripts.GLOBAL.INSUFFICIENT_PERMISSIONS_TO_VIEW_RECORD','Sorry you have insufficient permissions to view this record.')."</p>";
}
//parent::display();
}
} else {
echo "<p>".df_translate('scripts.GLOBAL.NO_RECORDS_MATCHED_REQUEST','No records matched your request.')."</p>";
}
}


I tried uncommenting line 507 of /Dataface/QuickForm.php (inside the _build() method)

Code: Select all
            //$this->addElement($el);


And as I suspected it resulted in all the fields being duplicated, but instead of getting 4 copies of the autocomplete field, there was only 3.

This is as far (or near the problem) as I could get, any help or hit on how to fix this problem will be very appreciated.

Re: Autocomplete field shows twice in the translation form

PostPosted: Fri Mar 16, 2012 3:00 pm
by the_woz
I finally managed to trace the bug to /Dataface/FormTool/autocomplete.php

Code: Select all
<?php

class Dataface_FormTool_autocomplete {
   function &buildWidget(&$record, &$field, &$form, $formFieldName, $new=false){
      $widget =& $field['widget'];
      $options =& Dataface_FormTool::getVocabulary($record, $field);
      $el =& $form->addElement('autocomplete', $formFieldName, $widget['label'], array('class'=>$widget['class'], 'id'=>$field['name']) );
      $el->setOptions($options);
      return $el;
   }
}


When building the form (any form, not just the translation form), this function is called twice per widget from different places.
The element must be added to the form only once, near the end of FormTool::buildWidget(), but here in autocomplete.php it's added each time is called; resulting in duplicated fields.

To fix this problem, I made the following modifications after checking the buildWidget functions of other widget types:

Code: Select all
<?php

class Dataface_FormTool_autocomplete {
   function &buildWidget(&$record, &$field, &$form, $formFieldName, $new=false){
      $widget =& $field['widget'];
      $options =& Dataface_FormTool::getVocabulary($record, $field);
      $factory =& Dataface_FormTool::factory();
      $el =& $factory->addElement('autocomplete', $formFieldName, $widget['label'], array('class'=>$widget['class'], 'id'=>$field['name']) );
      $el->setOptions($options);
      return $el;
   }
}



Now the autocomplete widgets shows only once in the translation form, and still works fine in the edit form.

Re: Autocomplete field shows twice in the translation form

PostPosted: Fri Mar 16, 2012 3:15 pm
by shannah
Thanks for the patch. I've added this change to SVN.

1.3.x branch rev 3423
1.5.x branch rev 3424
trunk rev 3422

It will be included in all future releases.

-Steve

Re: Autocomplete field shows twice in the translation form

PostPosted: Sat Mar 17, 2012 9:50 am
by the_woz
You're welcome :)

I'm glad to be of help in the development of this great framework.