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: Verbesserungsvorschlag: Kategorie mitsamt enthaltener Artikel deaktivieren

    Tomcraft

    • modified Team
    • Gravatar
    • Beiträge: 46.367
    • Geschlecht:
    Die Änderungen der Service-Packs im Template sind nicht funktionsrelevant!

    Grüße

    Torsten
    Shop Hosting

    web28

    • modified Team
    • Beiträge: 9.404
    Diese Funktion ist bereits enthalten, allerdings auskommentiert:

    "/admin/includes/classes/categories.php"

    Code: PHP  [Auswählen]
    function set_category_recursive

    Den Codeblock für die Produkte einfach wieder aktivieren.

    Allerdings ist das nicht besonders performant, bei großer Kategorieverschachtelung und Artikelbeständen kann es Probleme geben (Timeout Error)

    Ansonsten funktioniert das super, fehlt nur noch ein Optionschalter für die Produkte.

    Das kann man sich aber einfach beim ZenCart Shop abschauen.

    Gruss Web28

    Modulfux

    • Experte
    • Beiträge: 3.590
    • Geschlecht:
    @web28

    Du meinst diesen Part aus der "/admin/categories.php" vom ZenCart adaptieren und anpassen?

    Code: PHP  [Auswählen]
    case 'update_category_status':
            if (isset($_POST['categories_id'])) {
                    $categories_id = zen_db_prepare_input($_POST['categories_id']);
        $categories = zen_get_category_tree($categories_id, '', '0', '', true);
                    for ($i=0, $n=sizeof($categories); $i<$n; $i++) {
                            $product_ids = $db->Execute("
                                    select products_id
                                    from "
    . TABLE_PRODUCTS_TO_CATEGORIES . "
                                    where categories_id = '"
    . (int)$categories[$i]['id'] . "'"
                            );
                            while (!$product_ids->EOF) {
                                    $products[$product_ids->fields['products_id']]['categories'][] = $categories[$i]['id'];
                                    $product_ids->MoveNext();
                            }
                    }
                    // change the status of categories and products
        zen_set_time_limit(600);
                    for ($i=0, $n=sizeof($categories); $i<$n; $i++) {
                            if ($_POST['categories_status'] == '1') {
                                    $categories_status = '0';
                                    $products_status = '0';
                            } else {
                                    $categories_status = '1';
                                    $products_status = '1';
                            }
                            $sql = "update " . TABLE_CATEGORIES . " set categories_status='" . $categories_status . "'
                                                            where categories_id='"
    . $categories[$i]['id'] . "'";
                            $db->Execute($sql);
                            // set products_status based on selection
                            if ($_POST['set_products_status'] == 'set_products_status_nochange') {
                                    // do not change current product status
                            } else {
                                    if ($_POST['set_products_status'] == 'set_products_status_on') {
                                            $products_status = '1';
                                    } else {
                                            $products_status = '0';
                                    }
                                    $sql = "select products_id from " . TABLE_PRODUCTS_TO_CATEGORIES . " where categories_id='" . $categories[$i]['id'] . "'";
                                    $category_products = $db->Execute($sql);
                                    while (!$category_products->EOF) {
                                            $sql = "update " . TABLE_PRODUCTS . " set products_status='" . $products_status . "' where products_id='" . $category_products->fields['products_id'] . "'";
                                            $db->Execute($sql);
                                            $category_products->MoveNext();
                                    }
                            }
                    } // for
            }
      zen_redirect(zen_href_link(FILENAME_CATEGORIES, 'cPath=' . $_GET['cPath'] . '&cID=' . $_GET['cID'] . (isset($_GET['page']) ? '&page=' . $_GET['page'] : '') . ((isset($_GET['search']) && !empty($_GET['search'])) ? '&search=' . $_GET['search'] : '')));
    break;

    Gruß
    Ronny

    mhbosch

    • Schreiberling
    • Beiträge: 394
    • Geschlecht:
    Müßte man mal testen, wie performant das reine SQL-Statement gegen die PHP Schleife ist!

    Dann könnte man die Funktion ja austauschen, oder?

    vr

    • modified Team
    • Beiträge: 2.664
    Hallo Michael

    [...]
    Muß aber zugeben, da mir dein Beispiel etwas Bauchschmerzen macht, dass die Kategorietiefe vorgegeben ist.
    [...]

    Die ist nicht vorgegeben, sondern funktioniert im Beispiel bis einschließlich 4 Ebenen. Wenn mehr gebraucht werden, einfach das "select statement" analog erweitern, der Aufbau wiederholt sich ja.

    Das kann man sicher auch anders machen. Normalerweise sind aber Abfragen immer schneller als Schleifen.

    Grüße, Volker

    web28

    • modified Team
    • Beiträge: 9.404
    @web28

    Du meinst diesen Part aus der "/admin/categories.php" vom ZenCart adaptieren und anpassen?

    Code: PHP  [Auswählen]
    case 'update_category_status':
            if (isset($_POST['categories_id'])) {
                    $categories_id = zen_db_prepare_input($_POST['categories_id']);
        $categories = zen_get_category_tree($categories_id, '', '0', '', true);
                    for ($i=0, $n=sizeof($categories); $i<$n; $i++) {
                            $product_ids = $db->Execute("
                                    select products_id
                                    from "
    . TABLE_PRODUCTS_TO_CATEGORIES . "
                                    where categories_id = '"
    . (int)$categories[$i]['id'] . "'"
                            );
                            while (!$product_ids->EOF) {
                                    $products[$product_ids->fields['products_id']]['categories'][] = $categories[$i]['id'];
                                    $product_ids->MoveNext();
                            }
                    }
                    // change the status of categories and products
        zen_set_time_limit(600);
                    for ($i=0, $n=sizeof($categories); $i<$n; $i++) {
                            if ($_POST['categories_status'] == '1') {
                                    $categories_status = '0';
                                    $products_status = '0';
                            } else {
                                    $categories_status = '1';
                                    $products_status = '1';
                            }
                            $sql = "update " . TABLE_CATEGORIES . " set categories_status='" . $categories_status . "'
                                                            where categories_id='"
    . $categories[$i]['id'] . "'";
                            $db->Execute($sql);
                            // set products_status based on selection
                            if ($_POST['set_products_status'] == 'set_products_status_nochange') {
                                    // do not change current product status
                            } else {
                                    if ($_POST['set_products_status'] == 'set_products_status_on') {
                                            $products_status = '1';
                                    } else {
                                            $products_status = '0';
                                    }
                                    $sql = "select products_id from " . TABLE_PRODUCTS_TO_CATEGORIES . " where categories_id='" . $categories[$i]['id'] . "'";
                                    $category_products = $db->Execute($sql);
                                    while (!$category_products->EOF) {
                                            $sql = "update " . TABLE_PRODUCTS . " set products_status='" . $products_status . "' where products_id='" . $category_products->fields['products_id'] . "'";
                                            $db->Execute($sql);
                                            $category_products->MoveNext();
                                    }
                            }
                    } // for
            }
      zen_redirect(zen_href_link(FILENAME_CATEGORIES, 'cPath=' . $_GET['cPath'] . '&cID=' . $_GET['cID'] . (isset($_GET['page']) ? '&page=' . $_GET['page'] : '') . ((isset($_GET['search']) && !empty($_GET['search'])) ? '&search=' . $_GET['search'] : '')));
    break;

    Gruß
    Ronny

    Nein, nur die Abfrage per Javascript, ob der gewünschte Status auch für die Produkte übernommen werden soll.
    Das komplette aktivieren/deaktivieren ist ja bereits in modified eCommerce Shopsoftware enthalten (wie schon beschrieben)

    Gruss Web28

    mhbosch

    • Schreiberling
    • Beiträge: 394
    • Geschlecht:
    Hallo,

    mal als Lösung:

    Code: PHP  [Auswählen]
            function set_category_recursive($categories_id, $status = "0") {

            // set status of categories with sub categories
            xtc_db_query("update ".TABLE_CATEGORIES." set categories_status = '".$status."' where categories_id in (       
                                                                                                                                    SELECT
                                                                    categories_id
                                                                    FROM
                                                                    (
                                                                    SELECT
                                                                    @rownum := @rownum+1 AS rownum,
                                                                    IF(@lastid <> mylist.categories_id, @id := mylist.categories_id, @id) AS pathid,
                                                                    @lastid := mylist.categories_id AS categories_id,
                                                                    @id := (SELECT parent_ID FROM "
    .TABLE_CATEGORIES." WHERE categories_id = @id) AS parent_ID
                                                                    FROM
                                                                    (SELECT @id := 0, @lastid := 0, @rownum := 0) AS vars,
                                                                    (SELECT categories_id FROM "
    .TABLE_CATEGORIES.") AS myloop,
                                                                    (SELECT categories_id FROM "
    .TABLE_CATEGORIES.") AS mylist
                                                                    ) AS t
                                                                    WHERE
                                                                    pathid = '"
    .$categories_id."')");
            // set status of products
                    xtc_db_query("  UPDATE ".TABLE_PRODUCTS." set products_status = '".$status."' where products_id in (
                                                                    SELECT products_id FROM  products_to_categories WHERE categories_id IN  (
                                                                    SELECT
                                                                    categories_id
                                                                    FROM
                                                                    (
                                                                    SELECT
                                                                    @rownum := @rownum+1 AS rownum,
                                                                    IF(@lastid <> mylist.categories_id, @id := mylist.categories_id, @id) AS pathid,
                                                                    @lastid := mylist.categories_id AS categories_id,
                                                                    @id := (SELECT parent_ID FROM "
    .TABLE_CATEGORIES." WHERE categories_id = @id) AS parent_ID
                                                                    FROM
                                                                    (SELECT @id := 0, @lastid := 0, @rownum := 0) AS vars,
                                                                    (SELECT categories_id FROM "
    .TABLE_CATEGORIES.") AS myloop,
                                                                    (SELECT categories_id FROM "
    .TABLE_CATEGORIES.") AS mylist
                                                                    ) AS t
                                                                    WHERE
                                                                    pathid = '"
    .$categories_id."')
                                                                    )"
    );
    }
            ?>

    Ich gehe ja mal davon aus, dass dafür die Funktion auch gedacht war. Eine Abfrage, ob nun rekursiv oder nicht, sollte dann nicht von der Funktion abhängen.

    Vielleicht wäre das Vorgehen in dem nächsten Update richtig!

    Generell glaube ich, das die SQL Funktionalitäten mit in die Funktionen vom Shop mit übernommen werden können/sollten, oder?
    Managed Server
    2 Antworten
    1813 Aufrufe
    01. Januar 2018, 12:12:35 von romanNDS
    1 Antworten
    683 Aufrufe
    17. September 2022, 09:23:06 von noRiddle (revilonetz)
    17 Antworten
    1514 Aufrufe
    11. April 2023, 14:36:26 von noRiddle (revilonetz)
               
    anything