Neuigkeiten
  • Die modified eCommerce Shopsoftware ist kostenlos, aber nicht umsonst.
    Spenden
  • Damit wir die modified eCommerce Shopsoftware auch zukünftig kostenlos anbieten können:
    Spenden
  • Thema: ANLEITUNG: Attributsystem mit jQuery (vermeidet Speicher-Fehler beim Einsatz vieler Artikelmerkmale)

    Simon

    • Viel Schreiber
    • Beiträge: 1.322

    Damit hast du wohl Recht.
    Die Leidgeplagten kann man nicht solange warten lassen. Deshalb besser erst einmal das zur Überbrückung.

    derrichi

    • Neu im Forum
    • Beiträge: 1
    Problem mit Attributen durch Code Anpassung gelöst! Auch meine Attribute konnten teilweise (die letzteren) nicht gespeichert werden! Der Code von Web0Null hat bei meinem Shopsystem nicht funktioniert. Der Code von Dj-Ready funktioniert jedoch einwandfrei!

    Also an all jene die Probleme haben die Attribute im Gambio bzw. XT Commerce System zu speichern. Das Problem liegt anscheinend daran, dass der Provider suhosin max_import_vars zu niedrig gesetzt hat. Es werden genau 8 Variablen pro Attribut benötigt. Also bei einem Wert von max_input_vars = 1000 hat man also bald die Grenze erreicht.

    Also 1. Möglichkeit diesen Wert in der .htaccess Lokal erhöhen (Wenn das der Server zulässt, sonst Server-Error)
    2. Möglichkeit den Provider bitten diesen Wert zu erhöhen
    3. Möglichkeit den Code von Dj-Ready nehmen!

    Dadurch werden nicht alle Attribute gleichzeitig gesendet, sondern nur die aktiven.

    GELÖST!

    web0null

    • Experte
    • Beiträge: 1.998
    Zitat
    Der Code von Dj-Ready funktioniert jedoch einwandfrei!
    Hast du den Code verändert, denn so wie er im ersten Posting steht kann er nicht richtig funktionieren.
    Denn er triggert das submit bei jedem Button und sendet somit immer alles gleich ab, sodass die eigentliche Funktion erst gar nicht initialisiert werden kann.

    Schau mal nach was alles gesendet wird.
    Gruß

    gero01

    • Mitglied
    • Beiträge: 239

    habe ebenfalls mal die Attribute versucht auzureizen !
    gleiches Fehlerbild wie oben beschrieben,

    1) Der Code von Dj-Ready funktioniert

    2) von noRiddle & web0null leider fehlerhaft, unten die Button ohne Funktion (ohne Bezeichng)

    zur Info

    Gerd

    Mad

    • Neu im Forum
    • Beiträge: 37
    @DJ-ready: Daumen Hoch !

    Vielen Dank dafür. Das Phänomen konnten wir auch bei all-inkl. feststellen und nunmehr lassen sich die Vielzahl der Attribute wieder speichern. Dank des Gimmik "Aktive Attribute anzeigen", kann man sogar , wenn man schnell genug ist, die Haken wegnehmen, wenn ein Attribute gerade nicht mehr aktiv sein soll, ohne mühsam sich durch die Seiten zu scrollen, um sein Attribut zu finden.

    Vielen Dank dafür

    cschiller

    • Fördermitglied
    • Beiträge: 143
    • Geschlecht:
    Vielen Dank für diese Lösung! Der Code von DJ-ready funktioniert einwandfrei bei mir in der Version 1.05 SP1d!  :thx:

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 11.520
    • Geschlecht:
    Das kann ich nicht ganz glauben.
    Das Problen ist nämlich, daß im Falle man neue Attribute per checkbox zu einem Produkt hinzufügen möchte, das 'Checken' der Checkboxen nicht 'live' erkannt wird und die neu ge-checkten Attribute mit ausgeblendet/removed werden.
    Mehrfach getestet.

    Gruß,
    noRiddle

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 11.520
    • Geschlecht:
    Mich wundert etwas, daß hier niemand mehr reagiert hat auf meinen Einwand (und vorher auch nicht auf web0nulls Einwand).
    Jedenfalls hier eine Variante die definitiv funktioniert:
    Code: XML  [Auswählen]
    <script type="text/javascript">
        $(document).ready(function($) {
            $("#button_save, #view_attrib").show();
            var flag  = true;
            //var input = $('input[type="checkbox"]').not(':checked').parent().parent();
            //input.hide();
            $('input[type="checkbox"]').not(':checked').parent().parent().hide();

            $('#view_attrib').click(function() {
                var input_n_ch = $('input[type="checkbox"]').not(':checked');
                var input = input_n_ch.parent().parent();
                if(flag){
                    input.show();
                    $(this).html('Nur aktive Attribute anzeigen');
                    $("#button_save").html('Alle Attribute speichern');
                    flag = false;
                }else{
                    input.hide();
                    $(this).html('Alle Attribute anzeigen');
                    $("#button_save").html('Aktive Attribute speichern');
                    flag = true;
                }
            });
            $("#button_save").click(function() {
                var input_n_ch = $('input[type="checkbox"]').not(':checked');
                var input = input_n_ch.parent().parent();
                if(flag){input.remove();}
                    $("#realsubmitbutton").click();
            });
        });
    </script>

    <td colspan="<?php echo $colspan;?>" class="main" style="border-top: 1px solid #a3a3a3">
    <div>
        <a class="button" id="button_save" style="display:none;">Aktive Attribute speichern<a/>&emsp;
        <a class="button" id="view_attrib" style="display:none;">Alle Attribute anzeigen<a/>&emsp;
        <?php
          // echo xtc_button(BUTTON_SAVE) . '&nbsp;';
          echo xtc_button_link(BUTTON_BACK, xtc_href_link(FILENAME_NEW_ATTRIBUTES, $param));
      ?>
    </div>
    <div style="display:none !important">
        <input type="submit" class="button" onclick="this.blur();" value="Speichern" id="realsubmitbutton" >
    </div>
    </td>

    Kann man sicherlich noch optimieren, habe ich nur gerade keine Zeit für.

    Das Problem war sowohl in Dj-Readys als auch in web0nulls Variante, daß gerade gecheckte oder un-checkte Checkboxes nicht beachtet und ausgeblendet und beim Absenden natürlich auch removed wurden.

    Im auskommentierten Teil des Javascript-Blicks wurden die unchecked Checkboxes bereits in eine Variable gespeichert und zwar vor dem click-event.
    Das geht natürlich nicht da neuerdings angeklickte Checkboxes nicht berücksichtigt werden sondern nur der Status bei Aufruf des Dokuments, bzw. der Seite.
    Wurde also #view_attrib,
    der Button mit der Beschriftung "Alle Attribute anzeigen" oder "Nur aktive Attribute anzeigen",
    geklickt, war der neue Status der geänderten Checkboxes nicht in der Variablen gespeichert.
    Es mußten die Variablen also innerhalb der Funktionen definiert werden.

    Viel Freude damit.

    Gruß,
    noRiddle

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 11.520
    • Geschlecht:
    Da ich privat Anfragen bekam wie denn das ganze genau eingebaut wird, hier die Anleitung:

    In /admin/new_attributes.php
    unter
    Code: XML  [Auswählen]
    <script type="text/javascript" src="includes/general.js"></script>

    das einfügen
    Code: XML  [Auswählen]
    <?php //BOC implement jQuery for buttons in /includes/modules/new_attributes_include.php, noRiddle ?>
    <script type="text/javascript" src="<?php echo '../templates/'.CURRENT_TEMPLATE.'/javascript/jquery.js';?>"></script>
    <script type="text/javascript">
        $(document).ready(function($) {
            $('.button_save, .view_attrib').show();
            var flag  = true;
            $('input[type="checkbox"]').not(':checked').parent().parent().hide();

            $('.view_attrib').click(function() {
                var input_n_ch = $('input[type="checkbox"]').not(':checked');
                var input = input_n_ch.parent().parent();
                if(flag){
                    input.show();
                    $(this).html('Nur aktive Attribute anzeigen');
                    $('.button_save').html('Alle Attribute speichern');
                    flag = false;
                }else{
                    input.hide();
                    $(this).html('Alle Attribute anzeigen');
                    $(".button_save").html('Aktive Attribute speichern');
                    flag = true;
                }
            });
            $('.button_save').click(function() {
                var input_n_ch = $('input[type="checkbox"]').not(':checked');
                var input = input_n_ch.parent().parent();
                if(flag){input.remove();}
                $('#realsubmitbutton').trigger('click');
            });
        });
    </script>
    <?php //EOC implement jQuery for buttons in /includes/modules/new_attributes_include.php, noRiddle ?>

    In /admin/includes/modules/new_attributes_include.php
    unter
    Code: XML  [Auswählen]
    <form action="<?php echo FILENAME_NEW_ATTRIBUTES; ?>" method="post" name="SUBMIT_ATTRIBUTES" enctype="multipart/form-data"><input type="hidden" name="current_product_id" value="<?php echo $_POST['current_product_id']; ?>"><input type="hidden" name="action" value="change">

    das einfügen
    Code: PHP  [Auswählen]
    <?php // BOC new buttons to send only checked post values, noRiddle ?>
    <td colspan="<?php echo $colspan;?>" class="main" style="border-top:1px solid #a3a3a3;">
    <div>
        <a class="button button_save" style="display:none;">Aktive Attribute speichern</a>&emsp;
        <a class="button view_attrib" style="display:none;">Alle Attribute anzeigen</a>&emsp;
        <?php
           // echo xtc_button(BUTTON_SAVE) . '&nbsp;';
           echo xtc_button_link(BUTTON_BACK, xtc_href_link(FILENAME_NEW_ATTRIBUTES, $param));
       ?>
    </div>
    </td>
    <?php // EOC new buttons to send only checked post values, noRiddle ?>

    und in selbiger Datei unten, anstatt dies
    Code: XML  [Auswählen]
        <td colspan="<?php echo $colspan;?>" class="main" style="border-top: 1px solid #a3a3a3"><br />
          <?php
         echo xtc_button(BUTTON_SAVE) . '&nbsp;';
         echo xtc_button_link(BUTTON_BACK, xtc_href_link(FILENAME_NEW_ATTRIBUTES, $param));
         ?>
        </td>

    das einfügen
    Code: XML  [Auswählen]
    <?php // BOC new buttons to send only checked post values, noRiddle ?>
        <!--<td colspan="<?php echo $colspan;?>" class="main" style="border-top: 1px solid #a3a3a3"><br />
         <?php
         //echo xtc_button(BUTTON_SAVE) . '&nbsp;';
         //echo xtc_button_link(BUTTON_BACK, xtc_href_link(FILENAME_NEW_ATTRIBUTES, $param));
         ?>
       </td>-->
        <td colspan="<?php echo $colspan;?>" class="main" style="border-top:1px solid #a3a3a3;">
            <div>
                <a class="button button_save" style="display:none;">Aktive Attribute speichern</a>&emsp;
                <a class="button view_attrib" style="display:none;">Alle Attribute anzeigen</a>&emsp;
                <?php
               echo xtc_button_link(BUTTON_BACK, xtc_href_link(FILENAME_NEW_ATTRIBUTES, $param));
               ?>
            </div>
            <div style="display:none !important">
                <input type="submit" class="button" onclick="this.blur();" value="Speichern" id="realsubmitbutton" >
            </div>
        </td>
    <?php // EOC new buttons to send only checked post values, noRiddle ?>

    Damit hat man oben und unten die Buttons, was je nach Menge der Attribute hilfreich ist.
    Meinen Avatar-Namen kann man natürlich weglassen.

    Gruß,
    noRiddle

    web28

    • modified Team
    • Beiträge: 9.404
     :good: :thx:

    [EDIT] Gerade getestet in einem Shop mit 801 Optionswerten -funktioniert einwandfrei!  :thumbs:

    Ohne diese Änderung würden 801 x 9 = 7209 POST Vars übertragen (max_input_vars war bei diesem Shop schon auf 5000 gesetzt)

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 11.520
    • Geschlecht:
    Korrektur:
    Habe festgestellt, daß es noch ein kleines Fehlerchen gibt, sodaß die Beschriftung eines Buttons sich bei Klick nur bei diesem geklickten Button ändert und nicht auch bei dem anderen Button (es gibt ja die Buttons aus User-Freundlichkeits-Gründen oben und unten).
    Die Funktion ist zwar nicht beeinträchtigt aber es ist natürlich so unschön.
    Hier also der korrigierte Code für die /admin/new_attributes.php:
    Code: Javascript  [Auswählen]
        $(document).ready(function($) {
            $('.button_save, .view_attrib').show();
            var flag  = true;
            $('input[type="checkbox"]').not(':checked').parent().parent().hide();
            var $vattr = $('.view_attrib');
            $vattr.click(function() {
                var input_n_ch = $('input[type="checkbox"]').not(':checked');
                var input = input_n_ch.parent().parent();
                if(flag){
                    input.show();
                    $vattr.html('Nur aktive Attribute anzeigen');
                    $('.button_save').html('Alle Attribute speichern');
                    flag = false;
                }else{
                    input.hide();
                    $vattr.html('Alle Attribute anzeigen');
                    $(".button_save").html('Aktive Attribute speichern');
                    flag = true;
                }
            });
            $('.button_save').click(function() {
                var input_n_ch = $('input[type="checkbox"]').not(':checked');
                var input = input_n_ch.parent().parent();
                if(flag){input.remove();}
                $('#realsubmitbutton').trigger('click');
            });
        });

    Danke an h-h-h ;-).

    Gruß,
    noRiddle

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 11.520
    • Geschlecht:
    Auf eine Idee von web28 hin die Überschriften (= product_options_name) anklickbar zu machen, sodaß man nicht immer gleich den Button "Alle Attribute anzeigen" anklicken muß wenn man eine Option hinzufügen möchte, habe ich das mal umgesetzt.

    Habe noch ein paar optische Features eingebaut:
    • Bei Klick auf eine Überschrift wird diese rot um sichtbar zu machen, daß die Optionen für diesen product_options_name geöffnet sind.
    • Bei erneutem Klick wird die Überschrift grün, quasi als Zeichen, daß man mit der Bearbeitung fertig ist. Die nicht ge-check-ten Optionen werden dabei wieder ausgeblendet.
    • Bei Klick auf "Alle Attribute anzeigen" wird der Button "Alle Attribute speichern" rot, als Warnung, daß man mom. alle Attribute speichern würde bei Klick auf den Button und somit evtl. Probleme mit den "max_input_vars" bekäme.
      Bei erneutem Klick auf den nun mit "Nur aktive Attribute anzeigen" beschrifteten Button wird der Button "Aktive Attribute speichern" grün, als Zeichen dafür, daß nun alles okay ist.

    Der Klick auf die Überschriften ist sinnvollerweise nur möglich wenn die nicht ge-check-ten Optionen ausgeblendet sind.

    Hier also der Code dafür (für die /admin/new_attributes.php):
    Code: Javascript  [Auswählen]
        $(document).ready(function($) {
            $('.button_save, .view_attrib').show();
            $('input[type="checkbox"]').not(':checked').parent().parent().hide();
            var flag  = true;
            var $bsave = $('.button_save');
            var $vattr = $('.view_attrib');
            var $dthr = $('.dataTableHeadingRow');
            $dthr.css('cursor', 'pointer');

            $vattr.click(function() {
                var input_n_ch = $('input[type="checkbox"]').not(':checked');
                var input = input_n_ch.parent().parent();
                if (flag) {
                    input.show();
                    $vattr.html('Nur aktive Attribute anzeigen');
                    $bsave.html('Alle Attribute speichern');
                    $bsave.css('color', '#c00');
                    $dthr.css('cursor', 'default');
                    flag = false;
                } else {
                    input.hide();
                    $vattr.html('Alle Attribute anzeigen');
                    $bsave.html('Aktive Attribute speichern');
                    $bsave.css('color', '#060');
                    $dthr.css('cursor', 'pointer');
                    flag = true;
                }
            });

            $dthr.click(function() {
                var input_n_ch = $('input[type="checkbox"]').not(':checked');
                var ch_this = $(this).nextUntil('.dataTableHeadingRow').find(input_n_ch);
                var input = ch_this.parent().parent();
                if (flag) {
                    input.toggle();
                }
            });

            $dthr.toggle(function() {
                $(this).css('color', '#c00');
            }, function() {
                $(this).css('color', '#060');
            });

            $('.button_save').click(function() {
                var input_n_ch = $('input[type="checkbox"]').not(':checked');
                var input = input_n_ch.parent().parent();
                if (flag) {input.remove();}
                $('#realsubmitbutton').trigger('click');
            });
        });

    Es wäre evtl. sinnvoll das Script auszulagern und per <script src=" "> zu implementieren.
    Auslagern z.B. in /admin/includes/javascript.

    Bitte testen und Feedback geben.

    Von mir in 1.06 rev4642 erfolgreich getestet.

    Viel Freude damit.

    Gruß,
    noRiddle

    *NACHTRAG*
    Für die die sich vielleicht wundern über meine Variablen-Definitionen:
    Um bereits als jQuery-Object definierte Variablen optisch leicht von anderen Variablen zu unterscheiden benutze ich für erstere das $-Zeichen.

    Dull

    • Neu im Forum
    • Beiträge: 36
    Super, Danke!! Genau zur richtigen Zeit  :-D

    Habs eben auch mit der v. 1.06 getestet und es funktioniert einwandfrei.

    MrWhite

    • Frisch an Board
    • Beiträge: 95
    • Geschlecht:
    Hallo
    Von dem Problem der Speicherung mit 1000 Attribute Werten habe ich schonmal hier gelesen.
    Möchte an dieser Stelle auch nur mal auf mein Modul hinweisen.
    Es geht um das Modul:
    Produkt-Bearbeitung mit jQuery Attribute-Manager
    Es wird wie man es von den Sonderangeboten kennt per Klick auf den Button, in einem Iframe eingeblendet, und kann auch in einem neuen Fenster geöffnet werden um die Attribute zu dem Produkt zu bearbeiten.
    Eine stabile Version, die jetzt auch für Version 1.06 überarbeitet wurde.
    Alle Funktion die man benötigt, und auch die Speicher Funktion funktioniert easy und einfach mit Ajax.

    Hier geht es zum Modul-Beitrag:
    MODUL: Produkt-Bearbeitung mit jQuery Attribute-Manager

    Checksedas ...
    MfG MrW

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 11.520
    • Geschlecht:
    Es gibt noch ein Fehlerchen  :oops:
    Habe das ja so implementiert, daß wenn alle Attribute aufgeklappt sind die einzelnen Überschriften sinnvollerweise nicht anklickbar sind.
    Allerdings änderte sich noch die Farbe, was natürlich nur sein soll wenn nur aktive Attribute angezeigt werden.
    Funktion ist nicht beeinträchtig ist aber unschön.

    Hier also noch ein Fix (wieder nur für die /admin/new_attributes.php):
    Code: Javascript  [Auswählen]
        $(document).ready(function($) {
            $('.button_save, .view_attrib').show();
            $('input[type="checkbox"]').not(':checked').parent().parent().hide();
            var flag  = true;
            var $bsave = $('.button_save');
            var $vattr = $('.view_attrib');
            var $dthr = $('.dataTableHeadingRow');
            $dthr.css('cursor', 'pointer');

            $vattr.click(function() {
                var input_n_ch = $('input[type="checkbox"]').not(':checked');
                var input = input_n_ch.parent().parent();
                if (flag) {
                    input.show();
                    $vattr.html('Nur aktive Attribute anzeigen');
                    $bsave.html('Alle Attribute speichern');
                    $bsave.css('color', '#c00');
                    $dthr.css('cursor', 'default');
                    $dthr.removeClass('att-red att-green');
                    flag = false;
                } else {
                    input.hide();
                    $vattr.html('Alle Attribute anzeigen');
                    $bsave.html('Aktive Attribute speichern');
                    $bsave.css('color', '#060');
                    $dthr.css('cursor', 'pointer');
                    flag = true;
                }
            });

            $dthr.click(function() {
                var input_n_ch = $('input[type="checkbox"]').not(':checked');
                var ch_this = $(this).nextUntil('.dataTableHeadingRow').find(input_n_ch);
                var input = ch_this.parent().parent();
                var $className = $(this).attr('class');
                if (flag) {
                    input.toggle();
                    if ($className == 'dataTableHeadingRow att-green' || $className == 'dataTableHeadingRow') {
                        $(this).removeClass('att-green').addClass('att-red');
                    } else if ($className == 'dataTableHeadingRow att-red') {
                        $(this).removeClass('att-red').addClass('att-green');
                    }
                }
            });

            $('.button_save').click(function() {
                var input_n_ch = $('input[type="checkbox"]').not(':checked');
                var input = input_n_ch.parent().parent();
                if (flag) {input.remove();}
                $('#realsubmitbutton').trigger('click');
            });
        });

    Für den Farbwechsel muß noch in /admin/includes/stylesheet.css folgendes eingetragen werden:
    Unter
    Code: CSS  [Auswählen]
    /* data table */
    .dataTableHeadingRow {
    background-color: #F6F6F6;
    color: #000000;
    border-bottom: 1px solid;
    border-color: #000000;
    }

    das hier eintragen:
    Code: CSS  [Auswählen]
    /* BOC new classes for new_attributes.php, noRiddle */
    .dataTableHeadingRow.att-red {color:#c00;}
    .dataTableHeadingRow.att-green {color:#060;}
    /* EOC new classes for new_attributes.php, noRiddle */

    Werde da demnächst noch ein Paketchen schnüren mit der kompletten Anleitung, damit man sich das nicht aus den letzten sechs Posts zusammensuchen muß.

    Gruß,
    noRiddle
    11 Antworten
    5059 Aufrufe
    23. Mai 2010, 17:52:42 von mikeSo
    7 Antworten
    4886 Aufrufe
    31. Januar 2011, 13:24:40 von itnorden
    1 Antworten
    1644 Aufrufe
    06. Februar 2014, 20:30:51 von ShopNix