2011-01-31 13 views
5

http://alanstorm.com/magento_system_configuration_in_depth_tutorial @AlanStorm, sistem yapılandırması için çok iyi bir öğretici sunar.magento adminhtml alanı birden fazla alana veya değere bağlı olabilir mi?

O da belirli bir değer başka bir alana ayarlanır sadece bir saha gösterisi yapmak için> bir < bağlıdır etiketinin nasıl kullanılacağı açıklanır.

Aracım, A alanı ya V1 ya da V2 değerine sahipse, alan B'yi nasıl görünür yapabilirim? ve < ile başka seçenekler var mı?

birisi Magento'nın kodunda bu uygulanmaktadır nerede ayrıca kod kendim bakmak istiyorum bilen Ayrıca edin.

Teşekkür

cevap

3

yardımcı olur
Umut \ Mage \ Adminhtml \ Blok \ Widget \ Form \ Eleman \ Dependence.php Mage \ Adminhtml \ Blok \ Sistem \ yapılandırma \ giriş başlıkları yöntem 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); 
       } 
      } 
değiştirme \ uygulama \ kodu \ çekirdek üzerinde

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; 
} 

sizin xml üzerinde birden çok değerin bağımlılığı aşağıdaki sözdizimini kullanın

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(); 
    } 
} 

form.js javascript dosyası js \ büyücü \ adminhtml \ değiştirme

      <depends> 
          <field1> 
           <val1>text</val1> 
           <val2>radio</val2> 
          </field1> 
         </depends> 
+0

Teşekkürler andrew. Bu çözümü doğrulamamış ancak sağlam görünüyor. Bunu gerçekten deneyen biri varsa lütfen yorum yapın. – epeleg

+0

Denedim ve ALMOST çalıştı. Muhtemelen 1.6.2.0'dayım ve bu çözüm daha önceki bir Magento sürümü için kullanıldı. Her neyse, ilgilenirsen, cevabımı kontrol et. Şimdi benim için çalışıyor. Teşekkür ederim, Andrew! – pancake

3

Alan'ın makalesinde bu açıkladı nereye emin değilim ama bunu nasıl vardır: o javascript sadece biraz bu.
Grubunuzda, içine gömülü javascript içeren bir yorum etiketi koyarsınız. Gördüğünüz gibi

<?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> 

, ben bir alanın değerini kontrol küçük bir işlev yazma:
Örneğin , işte bir diğeri göstermek (veya değil) amacıyla bir alanın değerini denetler my kodudur Başka bir tane gösterip göstermeyeceğini belirleyin. Sonra onchange olayı işlevine bağlarım ve sayfa yüklendikçe doğru alanları gösterecek işlevi tetiklerim.
Gereksinimleriniz için, koşulu js işlevine eklemeniz yeterlidir. Daha iyi bir yol olduğunu, ancak çekirdek dosyalarını

geçersiz kılma Aşağıdaki dosya uygulama \ kodu \ çekirdeğinin altında yöntem geçersiz kılmak gerekir

+0

+ 1'de bildirilmiş kesin sembolü ile ayrılır kirli "yorumda kod" hilesi. – epeleg

+0

Ancak, benim Q düzgün bir şekilde kaçan yönetmedim gibi görünüyor ve her iki yerde de görünmez oldu. Bu yüzden şimdi Q'yu sabitledim ve hala birisinin etiketini kullanarak yardım sağlayabileceğini umuyorum. "Yorumda kod" hilesinin yorumları çevirmeyi zorlaştırdığını unutmayın (bu kodu, gerçekte gerçek bir yorumu olmayan bir alanın yorumuna koyarsanız, sorun çıkarılabilir). – epeleg

+0

garibi, yorum yaparken olduğu gibi sadece yazılabilir. Q yazarken < yazılmalıdır> ya da görünmez html olur. – epeleg

0

Andrew cevabı neredeyse hile yaptı. Şu anda 1.6.2.0 çıkıyorum ve şöyle ben app\code\core\Mage\Adminhtml\Block\System\Config\Form.php içinde initFields() yöntemi modifiye:

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); 
     } 
    } 
} 

Ayrıca çekirdek dosyaları düzenlemek için gerekli değildir. Kendi sürümümüeklemek için overrode the admin theme ve özel bir modülün config.xml kullanarak iki PHP sınıfını yeniden yazdım.

13

Magento 1.7.0.1 sürümünden sürüm notlarını doğru şekilde anlarsam, bu işlev (http://goo.gl/ZgHG0) uygulanmıştır. Bunu bir Magento CE 1.7.0.2 üzerinde başarılı bir şekilde test ettim.

Böyle alan dependancy bir ayırıcı parametresini ilan etmeli

:

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

Not depends_from_field_value_1 olduğunu ve depends_from_field_value_2 virgül için separator=","