2011-01-31 10 views
5

En http://alanstorm.com/magento_system_configuration_in_depth_tutorial @AlanStorm ofrece un muy buen tutorial para la configuración del sistema.¿puede un campo magento adminhtml depender de más de un campo o valor?

También explica cómo usar un < depende de la etiqueta> para mostrar un campo solo cuando se establece un valor específico en otro campo.

Mi Q es cómo puedo hacer que fieldB sea visible si el campo A tiene valor V1 o V2. y hay otras opciones con < depende>?

Además, si alguien sabe en qué parte del código de magento está implementado, también me gustaría echarle un vistazo al código.

Gracias

Respuesta

3

Hay una forma mejor, pero tendrá que reemplazar los archivos del núcleo

reemplazar el método bajo el siguiente archivo aplicación \ code \ core \ Mago \ Adminhtml \ Bloquear \ Widget \ forma \ Elemento \ 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; 
} 

En la aplicación \ code \ core \ Mago \ Adminhtml \ Bloquear \ System \ Config \ form.php Modificar los initFields método

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

modificar el archivo JavaScript JS \ mago \ \ 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(); 
    } 
} 

Utilice la siguiente sintaxis para varios valores de la dependencia en su xml

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

Gracias andrew. No he verificado esta solución pero parece sólida. Si alguien realmente intenta esto, publique un comentario. – epeleg

+0

Lo probé, y CASI funcionó. Probablemente sea porque estoy en 1.6.2.0 y esta solución fue pensada para una versión anterior de Magento. De todos modos, revisa mi respuesta a continuación, si estás interesado. Ahora funciona para mí Gracias, Andrew! – pancake

3

no estoy seguro de que en el artículo de Alan se explica, pero no como lo hago: es sólo un poco de Javascript.
En su grupo, coloca una etiqueta de comentario con el javascript incrustado en.
Por ejemplo, aquí es mi código que comprueba el valor de un campo con el fin de mostrar (o no) otro:

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

como se puede ver, escribo una pequeña función que compruebe el valor de un campo a determinar si mostrar otro o no. Luego, vinculo el evento onchange a la función y disparo la función para mostrar los campos correctos a medida que se carga la página.
Para sus necesidades, simplemente agregue la condición en la función js.
Esperamos que ayuda a

+0

1 para el sucio truco de "código en el comentario". – epeleg

+0

Sin embargo, parece que no logré escaparse correctamente en mi Q y el era invisible en ambos lugares. así que ahora arreglé la Q, y aún espero que alguien pueda ayudarme con la utilización de la etiqueta . Tenga en cuenta que el truco de "código en el comentario" hace que sea difícil traducir los comentarios (que puede no ser un problema si coloca este código en el comentario de un campo que en realidad no tiene un comentario real). – epeleg

+0

por extraño que parezca, al comentar se puede escribir tal como está. mientras que al publicar la Q debe escribirse < depende> o se convertirá en html invisible. – epeleg

0

respuesta de Andrew casi hizo el truco. Estoy en 1.6.2.0 en este momento y he modificado el método initFields() en app\code\core\Mage\Adminhtml\Block\System\Config\Form.php de la siguiente manera:

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

Además, no es necesario editar los archivos principales. I overrode the admin theme para insertar mi propia versión de form.js y reescribí las dos clases de PHP utilizando el config.xml de un módulo personalizado.

13

Si entiendo correctamente las notas de la versión de Magento 1.7.0.1, esta funcionalidad se ha implementado (http://goo.gl/ZgHG0). Lo probé con éxito en un Magento CE 1.7.0.2.

Debe declarar un parámetro separador en la dependencia de campo así:

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

Tenga en cuenta que depends_from_field_value_1 y depends_from_field_value_2 están separados por una coma, el símbolo exacto que se declara en separator=","

Cuestiones relacionadas