Question

nous avons un module général qui implémente certaines fonctionnalités de widget et ajoute des modèles de base à une boutique, qui sont définis dans le widget.xml comme ça:

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

Nous utilisons beaucoup cette configuration de base, mais souhaitons maintenant supprimer l'un des éléments entiers d'une extension enfant, qui sont généralement simplement utilisés pour ajouter des modèles plus spécifiques au projet, mais devraient cette fois également supprimer l'un des modèles par défaut.Malheureusement, il n'y a rien de tel qu'une balise de suppression pour les entrées de valeurs.De plus, définir la valeur ou l'étiquette sur une chaîne vide ne fonctionne pas.:(

Je recherche actuellement un événement pour étendre le moteur de rendu et supprimer les valeurs qu'il contient, mais cela semble assez sale et il serait beaucoup plus agréable de le faire en fait dans le widget.xml du module d'extension.Existe-t-il un moyen de faire cela sans changer le code du module parent/général ?

Était-ce utile?

La solution

Ainsi, comme déjà discuté dans les commentaires de Marius, j'ai créé un bloc d'assistance qui est défini dans le widget.xml :

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

Ce bloc d'assistance est utilisé pour supprimer les valeurs et pour ne rien afficher de plus sous forme de bouton (comme le montrent les didacticiels magento à titre d'exemple).Malheureusement, il était très difficile de revenir au nœud du widget, car le bloc d'assistance ne connaît pas les options de nœud du widget principal, j'ai donc ajouté le block_type dans la section données.Le code lui-même parcourt ensuite un éventuel nœud de suppression à l'intérieur des balises.Outre le layout-xml-remove, vous devez définir les nœuds à supprimer en tant qu'enfants et non en tant qu'attribut, car plusieurs nœuds de suppression seraient fusionnés en un seul.

Voici le code du bloc d'assistance :

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

Je ne suis pas encore vraiment satisfait des itérations et cette re-référence du type de bloc pourrait améliorer cette modification.

Et la définition de suppression dans le widget.xml :

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

J'espère que cela aidera, si quelqu'un a le même problème.:)

Autres conseils

Malheureusement, il n'existe aucun moyen de le supprimer en utilisant une balise ou un attribut XML sans réécrire quelque chose.
La méthode qui ajoute un champ aux options du widget est la suivante : Mage_Widget_Block_Adminhtml_Widget_Options::_addField.
Pour les champs qui ont le values tag voici comment ça marche.

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

Aussi, si vous souhaitez vérifier comment les valeurs sont transmises à l'objet paramètre à partir de la vérification XML Mage_Widget_Model_Widget::getConfigAsObject.
Il y a ceci dans cette méthode :

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

Ainsi, tout ce qui se trouve dans la balise values ​​sera transmis ultérieurement à l'élément field.

Je n'ai vu aucun événement distribué dans aucune des méthodes, donc je suppose que vous devez en réécrire une pour pouvoir ajouter un disabled balise ou attribut sur les éléments à l'intérieur du values étiqueter.
Si vous décidez d'adopter cette approche, je vous recommande de réécrire le Mage_Widget_Model_Widget::getConfigAsObject méthode.Les coutures me paraissent plus propres.

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top