Pregunta

tenemos un módulo que implementa algunos widget de funcionalidad y añade plantillas básicas para una tienda, que se definen en el widget.xml como este:

<some_module>
    <name>my name</name>
    <parameters>
        <template translate="label description">
            <visible>1</visible>
            <label>Block template</label>
            <description>Template to render the block</description>
            <type>select</type>
            <value>cms/widget/static_block/default.phtml</value>
            <values>
                <default translate="label">
                    <value>cms/widget/static_block/default.phtml</value>
                    <label>CMS Static Block Default Template</label>
                </default>
                <table_2columns translate="label">
                    <value>foobar/module/static_block/2columns.phtml</value>
                    <label>2 Columns Table</label>
                </table_2columns>
            </values>
            <sort_order>10</sort_order>
        </template>

Podemos usar esa configuración básica mucho, pero ahora quiero quitar uno de los entires en un niño de extensión, que son los que normalmente sólo se utilizan para agregar más específicas del proyecto plantillas, pero en caso de que este tiempo también eliminar uno de los valores predeterminados.Por desgracia no hay nada como quitar etiqueta de los valores de las entradas.También establecer el valor o etiqueta a una cadena vacía no funciona.:(

Actualmente estoy en busca de un evento para extender el procesador y la eliminación de los valores, pero que se siente muy sucio y sería mucho más agradable para hacer que la realidad en la widget.xml de la ampliación del módulo.Es allí una manera de hacerlo sin cambiar el código de los padres/módulo general?

¿Fue útil?

Solución

Así que como ya se ha explicado en los comentarios de Marius he creado un ayudante de bloque que se define en el widget.xml:

            <helper_block>
                <type>foobar/adminhtml_widget_values_remover</type>
                <data>
                    <block_type>foobar/widget_block</block_type>
                </data>
            </helper_block>

Ayudante de bloque se utiliza para eliminar los valores y no mostrar nada adicional como un botón (como el de magento tutoriales muestra como un ejemplo).Lamentablemente fue muy difícil volver a el widget de nodo, como el ayudante de bloque no saber sobre el nodo opciones del widget principal, así que he añadido el block_type en los datos de la sección.El propio código, a continuación, se itera sobre un posible eliminar un nodo dentro de las etiquetas.Aparte de para el diseño-xml-quite usted tiene que definir los nodos para eliminar como niño y no como un atributo, como múltiples quitar nodos se fusionaron en una sola.

Este es el código de la auxiliar de bloque:

public function prepareElementHtml(Varien_Data_Form_Element_Abstract $oElement)
{
    $aConfig = $this->getConfig();
    $aValues = $oElement->getValues();
    $oWidget = Mage::getModel('widget/widget');
    $oXmlConfig = $oWidget->getConfigAsXml($aConfig['block_type']);
    $oXmlValues = $oXmlConfig->parameters->template->values;
    $oXmlRemoves = $oXmlValues->remove;
    foreach ($oXmlRemoves->children()as $oXmlRemove) {
        $oXmlRemoveDefinition = $oXmlValues->{$oXmlRemove->getName()};
        foreach ($aValues as $iKey => $aValue) {
            $bEqualsValue = ($aValue['value'] == (string)$oXmlRemoveDefinition->value);
            if ($bEqualsValue) {
                unset($aValues[$iKey]);
            }
        }
    }
    $oElement->setValues($aValues);
}

Todavía no estoy muy contento con las iteraciones y esta re-referencia de tipo bloque, podría mejorar que alterar.

Y la quite-definición en el widget.xml:

    <parameters>
        <template>
            <values>
                <remove>
                    <table_2columns />
                </remove>

Espero que esto ayude, si alguien tiene el mismo problema.:)

Otros consejos

Desafortunadamente, no hay manera de eliminar mediante el uso de una etiqueta xml o atributo sin reescribir algo.
El método que añade un campo para el widget de opciones es este: Mage_Widget_Block_Adminhtml_Widget_Options::_addField.
Para los campos que tienen el values etiqueta esta es la forma en que funciona.

     if ($values  = $parameter->getValues()) {
        // dropdown options are specified in configuration
        $data['values'] = array();
        foreach ($values as $option) {
            $data['values'][] = array(
                'label' => $this->_translationHelper->__($option['label']),
                'value' => $option['value']
            );
        }
    }
    // otherwise, a source model is specified
    elseif ($sourceModel = $parameter->getSourceModel()) {
        $data['values'] = Mage::getModel($sourceModel)->toOptionArray();
    }

También si desea comprobar cómo los valores se pasan al objeto de parámetro desde el xml de verificación Mage_Widget_Model_Widget::getConfigAsObject.
No es este en que el método:

                // prepare values (for drop-dawns) specified directly in configuration
                $values = array();
                if (isset($data['values']) && is_array($data['values'])) {
                    foreach ($data['values'] as $value) {
                        if (isset($value['label']) && isset($value['value'])) {
                            $values[] = $value;
                        }
                    }
                }
                $data['values'] = $values;

Así que todo lo que está en los valores de la etiqueta se pasó más tarde a el elemento de campo.

No vi ningún tipo de evento distribuido en cualquiera de los métodos, así que supongo que usted tenga que volver a escribir uno de ellos de modo que usted será capaz de añadir un disabled etiqueta o atributo de los elementos dentro de la values de la etiqueta.
Si usted decide tomar este enfoque, recomiendo la reescritura de la Mage_Widget_Model_Widget::getConfigAsObject método.Costuras limpiador para mí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top