2011-01-31 56 views
5

http://alanstorm.com/magento_system_configuration_in_depth_tutorial @AlanStorm提供了一个非常好的系统配置教程。可以一个magento adminhtml字段依赖多于一个字段或值?

他还解释了如何使用一个< depends>标记来使字段仅在特定值设置在另一个字段中时显示。

我的问题是,如果字段A的值为V1或V2,我该如何使fieldB可见。 和<还有其他选项吗?

另外如果有人知道magento的代码是在哪里实现的,我还想自己看一下代码。

感谢

回答

3

有一个更好的办法,但你需要重写核心文件

覆盖以下文件 应用程序\代码\核心下的方法\法师\ Adminhtml \块\小工具\表\元素\ Dependence.php

public function addFieldDependence($fieldName, $fieldNameFrom, $refValues) 
{ 
    /* 
    if (is_array($refValues)) { 
     Mage::throwException('Dependency from multiple values is not implemented yet. Please fix to your widget.xml'); 
    } 
    */ 
    $this->_depends[$fieldName][$fieldNameFrom] = $refValues; 
    return $this; 
} 

在应用程序\代码\核心\法师\ Adminhtml \块\ SYSTEM \ CONFIG \ form.php的 修改方法initFields

if ($e->depends) { 
       foreach ($e->depends->children() as $dependent) { 
        $dependentId = $section->getName() . '_' . $group->getName() . '_' . $fieldPrefix . $dependent->getName(); 
        if ($dependent->count()) { 
         $dependentValue = (array) $dependent; 
         $dependentValue = array_values($dependentValue); 
        } else { 
         $dependentValue = (string) $dependent; 
        } 

        $this->_getDependence() 
         ->addFieldMap($id, $id) 
         ->addFieldMap($dependentId, $dependentId) 
         ->addFieldDependence($id, $dependentId, $dependentValue); 
       } 
      } 

修改JavaScript文件JS \法师\ adminhtml \ form.js

trackChange : function(e, idTo, valuesFrom) 
{ 
    // define whether the target should show up 
    var shouldShowUp = true; 
    for (var idFrom in valuesFrom) { 

     if (valuesFrom.hasOwnProperty(idFrom)) { 
      if (typeof(valuesFrom[idFrom])=="object") { 
       shouldShowUp = false; 
       for(var idVal in valuesFrom[idFrom]) { 
        if (valuesFrom[idFrom].hasOwnProperty(idVal)) { 
         if (typeof(idVal)!="undefined" && ($(idFrom).value == valuesFrom[idFrom][idVal])) { 
          shouldShowUp = true; 
         } 
        } 
       } 
      } else if (typeof(valuesFrom[idFrom])=="string") { 
       if ($(idFrom).value != valuesFrom[idFrom]) { 
        shouldShowUp = false; 
       } 
      } 
     } 
     /* 
     if ($(idFrom).value != valuesFrom[idFrom]) { 
      shouldShowUp = false; 
     } 
     */ 
    } 

    // toggle target row 
    if (shouldShowUp) { 
     $(idTo).up(this._config.levels_up).select('input', 'select', 'td').each(function (item) { 
      if (!item.type || item.type != 'hidden') { // don't touch hidden inputs, bc they may have custom logic 
       item.disabled = false; 
      } 
     }); 
     $(idTo).up(this._config.levels_up).show(); 
    } else { 
     $(idTo).up(this._config.levels_up).select('input', 'select', 'td').each(function (item){ 
      if (!item.type || item.type != 'hidden') { // don't touch hidden inputs, bc they may have custom logic 
       item.disabled = true; 
      } 
     }); 
     $(idTo).up(this._config.levels_up).hide(); 
    } 
} 

用于多值依赖以下语法上的XML

      <depends> 
          <field1> 
           <val1>text</val1> 
           <val2>radio</val2> 
          </field1> 
         </depends> 
3

我不知道在哪里艾伦的文章中的解释,但我如何做到这一点:这只是一些JavaScript。
在你的组中,你把一个评论标签与JavaScript嵌入到。
例如,这里是我的代码检查,以显示(或没有),一个又一个一个字段的值:

<?xml version="1.0" encoding="UTF-8"?> 
<config> 
    <sections> 
     <points_options translate="label" module="points"> 
      <tab>general</tab> 
      <label>Loyalty Points</label> 
      <frontend_type>text</frontend_type> 
      <sort_order>1002</sort_order> 
      <show_in_default>1</show_in_default> 
      <show_in_website>1</show_in_website> 
      <show_in_store>1</show_in_store> 
      <groups> 
       <config_points translate="label"> 
        <label>Configuration</label> 
        <comment><![CDATA[ 
         <script type="text/javascript"> 
          checkExpirationPeriod = function() { 
           if ($('points_options_config_points_expiration_period').getValue() > 0) { 
            $('points_options_config_points_expiration_reminder').up(1).appear(); 
           } else { 
            $('points_options_config_points_expiration_reminder').up(1).fade(); 
           } 
          } 

          Event.observe(window, 'load', function() { 
           Event.observe('points_options_config_points_expiration_period', 'change', checkExpirationPeriod); 
           checkExpirationPeriod(); 
          }) 
         </script> 
        ]]></comment> 

,你可以看到,我写了一个小功能,检查一个字段的值确定是否显示另一个。然后,我将onchange事件链接到函数,并在加载页面时触发该函数显示正确的字段。
为了您的需要,只需在js函数中添加条件即可。
希望帮助

+0

+1所申报的确切符号分开肮脏的“评论代码”诡计。 – epeleg 2011-01-31 20:05:19

+0

然而,看起来我没有妥善处理我Q上的逃跑,并且两个地方都看不到。所以我现在修复了问题,并且我希望有人能够利用标签提供帮助。请注意,“注释中的代码”技巧使翻译注释变得困难(如果您将此代码置于实际上没有真正意见的字段的注释中,这可能不是问题)。 – epeleg 2011-01-31 20:09:41

0

安德鲁的回答几乎是没有的伎俩。我现在在1.6.2.0和我修改app\code\core\Mage\Adminhtml\Block\System\Config\Form.phpinitFields()方法如下:

if ($e->depends) { 
    foreach ($e->depends->children() as $dependent) { 
     Mage::log((array)$dependent); 
     $dependentId = $section->getName() 
      . '_' . $group->getName() 
      . '_' . $fieldPrefix 
      . $dependent->getName(); 

     if ($dependent->hasChildren()) { 
      $dependentValue = (array) $dependent; 
      $dependentValue = array_values($dependentValue); 
     } else { 
      $dependentValue = (string) $dependent; 
     } 

     $shouldBeAddedDependence = true; 
     $dependentFieldName  = $fieldPrefix . $dependent->getName(); 
     $dependentField   = $group->fields->$dependentFieldName; 
     /* 
     * If dependent field can't be shown in current scope and real dependent config value 
     * is not equal to preferred one, then hide dependence fields by adding dependence 
     * based on not shown field (not rendered field) 
     */ 
     if (!$this->_canShowField($dependentField)) { 
      $dependentFullPath = $section->getName() 
       . '/' . $group->getName() 
       . '/' . $fieldPrefix 
       . $dependent->getName(); 
      if (is_array($dependentValue)) { 
       foreach ($dependentValue as $dependentOption) { 
        $shouldBeAddedDependence |= $dependentOption != Mage::getStoreConfig(
         $dependentFullPath, 
         $this->getStoreCode() 
        ); 
       } 
      } else { 
       $shouldBeAddedDependence = $dependentValue != Mage::getStoreConfig(
        $dependentFullPath, 
        $this->getStoreCode() 
       ); 
      } 
     } 
     if($shouldBeAddedDependence) { 
      $this->_getDependence() 
       ->addFieldMap($id, $id) 
       ->addFieldMap($dependentId, $dependentId) 
       ->addFieldDependence($id, $dependentId, $dependentValue); 
     } 
    } 
} 

而且它并不需要编辑的核心文件。 I overrode the admin theme插入我自己的form.js版本,并使用自定义模块的​​3210重写了这两个PHP类。

13

如果我正确理解Magento 1.7.0.1的发行说明,此功能性已实施(http://goo.gl/ZgHG0)。我已经在Magento CE 1.7.0.2上成功地进行了测试。

你必须在场上扶养这样的声明分离参数:

<depends> 
    <depends_from_field separator=","> 
     depends_from_field_value_1,depends_from_field_value_2 
    </depends_from_field> 
</depends> 

注意depends_from_field_value_1depends_from_field_value_2一个逗号,即在separator=","

相关问题