[javascript] Plugin di lancio TypeError dopo l'aggiornamento di Wordpress 4.5



Answers

Stavo ancora ricevendo questo errore dopo aver provato la patch nella risposta di Ben: Uncaught TypeError: Impossibile leggere la proprietà 'custom' di undefined

Così ho modificato html2element in composer-view.js come segue:

 html2element: function(html) {
        var $template, attributes = {},
            template = html;

        $template = $(template(this.model.toJSON()).trim());
        if($template.get(0))
        {
            _.each($template.get(0).attributes, function(attr) {
            attributes[attr.name] = attr.value
        })};

        this.$el.attr(attributes).html($template.html()),
        this.setContent(),
        this.renderContent()
    },
Question

Sto eseguendo il debug di un plugin per visual compositore che si è rotto dopo aver aggiornato Wordpress a 4.5 e non riesco a capire perché stia lanciando un errore TypeError.

Il messaggio di errore nella console:

JQMIGRATE: Migrate is installed, version 1.4.0              load-scripts.php?....
Uncaught TypeError:     $template.get is not a function     composer-view.js?ver=4.1.1.1:73

Le uniche occorrenze di $template si trovano nel codice qui sotto. Capisco che questo non è molto contesto da cui partire, ma come posso risolvere questo errore?

/**
 * Convert html into correct element
 * @param html
 */
html2element: function(html) {
  var attributes = {},
    $template;
  if (_.isString(html)) {
    this.template = _.template(html);
    $template = $(this.template(this.model.toJSON()).trim());
  } else {
    this.template = html;
    $template = html;
  }
  _.each($template.get(0).attributes, function(attr) { // **errors on this line**
    attributes[attr.name] = attr.value;
  });
  this.$el.attr(attributes).html($template.html());
  this.setContent();
  this.renderContent();
},


Aggiornare:

Sembra che questo potrebbe essere un problema con jQuery. Wordpress 4.5 include jQuery 1.12 che risolve un bug che permetteva di eseguire determinati codici con sintassi errata. Suppongo che il codice del plugin debba avere una sintassi errata, ma è comunque rimasto in esecuzione fino ad ora.

https://wordpress.org/support/topic/read-this-first-wordpress-45-master-list#post-8271654




Sto usando il tema Astra. Questa soluzione funziona al 99,9%. Per alcuni però, si ferma solo la ruota che gira, ma quando la pagina non carica il compositore visivo no.

Ho apportato una leggera modifica a questo codice (che è pubblicato ovunque ormai)

Codice del tema Astra originale qui (compositore-view.js)

        html2element:function (html) {
        var attributes = {},
            $template;
        if (_.isString(html)) {
            this.template = _.template(html);
            $template = $(this.template(this.model.toJSON()).trim());
        } else {
            this.template = html;
            $template = html;
        }
        _.each($template.get(0).attributes, function (attr) {
            attributes[attr.name] = attr.value;
        });
        this.$el.attr(attributes).html($template.html());
        this.setContent();
        this.renderContent();
    },

Il codice che funziona:

html2element: function(html) {
    var $template, 
    attributes = {},
    template = html;
    $template = $(template(this.model.toJSON()).trim()), 
     _.each($template.get(0).attributes, function(attr) {
    attributes[attr.name] = attr.value
}); this.$el.attr(attributes).html($template.html()), this.setContent(), this.renderContent()

},

La differenza principale si trova qui (rispetto al codice originale)

}); this.$el.attr

C'è un punto e virgola al posto della virgola originale :):

}), this.$el.attr

Gente di applausi :) Quindi




Il checkout sotto il codice per entrambi $ template.get non è una funzione e Uncaught TypeError: Impossibile leggere la proprietà 'attributes' di undefined. Ha funzionato per me

html2element: function(html) {
    var $template, attributes = {},
            template = html;

        $template = $(template(this.model.toJSON()).trim());
        if($template.get(0))
        {
            _.each($template.get(0).attributes, function(attr) {
            attributes[attr.name] = attr.value
        })};

        this.$el.attr(attributes).html($template.html()),
        this.setContent(),
        this.renderContent()
}



Sto usando il tema Applay (2.1.3, un po 'obsoleto). Ho appena aggiornato WP e tutti i plugin alla versione più recente (4.5.2) e sono arrivato a questo problema. Non ho analizzato il flusso di questo componente (js_composer), solo questa funzione "rotta" (non è veramente rotta). Ho capito che this.template e $ template stanno ottenendo tipi di oggetto errati (ha bisogno di un'altra convalida da parte _.isString(html) ). L'ho risolto aggiungendo un blocco try & catch come segue:

ORIGINALE

    html2element:function (html) {
        var attributes = {}, 
            $template;
        if (_.isString(html)) {
            this.template = _.template(html);
            $template = $(this.template(this.model.toJSON()).trim());
        } else {
            this.template = html;                                                                                                                                            
            $template = html;
        }
        _.each($template.get(0).attributes, function (attr) {
            attributes[attr.name] = attr.value;
        }); 
        this.$el.attr(attributes).html($template.html());
        this.setContent();
        this.renderContent();
    },

MODIFICATA

    html2element:function (html) {
        var attributes = {}, 
            $template;
        if (_.isString(html)) {
            this.template = _.template(html);
        } else {
            try {
                this.template = _.template(html());                                                                                                                          
            } catch (err) {
                this.template = html;
            }   
        }   
        $template = $(this.template(this.model.toJSON()).trim());
        _.each($template.get(0).attributes, function (attr) {
            attributes[attr.name] = attr.value;
        }); 
        this.$el.attr(attributes).html($template.html());
        this.setContent();
        this.renderContent();
    },



Ho apportato questa modifica che funziona sul mio WP 4.8.1 (PHP7)

nel file wp-content / plugins / js_composer / assets / js / backend / composit-view.js

è necessario modificare il metodo di rendering :

sostituire questa linea

this.html2element(_.template($shortcode_template_el.html(), this.model.toJSON())); 

da questa linea

this.html2element( $shortcode_template_el.html() );

Sembra che la funzione _.template () non funzioni perfettamente e non restituisca l'oggetto buono, quindi è meglio dare il codice html.




Links