WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Hur lagra kategorier (https://www.wn.se/forum/showthread.php?t=1058548)

Anaxa 2013-07-17 18:08

Jag löste det genom att lägga till en parameter till identeringsfunktionen. Tack för hjälp .

PHP-kod:

function intendChildren($children$growth) {
                                        foreach(
$children as $row) {
                                            
$intend "";
                                            for(
$i=0;$i<$growth;$i++) {
                                                
$intend .= "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
                                            }
                                            echo 
'<option '.((isset($_SESSION["last_parent_category"]) && $_SESSION["last_parent_category"] == $row["id"]) ? 'selected' '').' value="'.$row["id"].'">'.$intend.'|__'.$row["name"].'</option>';
                                            
intendChildren($row["children"], ($growth+1));
                                        }
                                    }
                                
                                    foreach(
$ordered_categories as $row) {
                                        echo 
'<option '.((isset($_SESSION["last_parent_category"]) && $_SESSION["last_parent_category"] == $row["id"]) ? 'selected' '').' value="'.$row["id"].'">|__'.$row["name"].'</option>';
                                        
intendChildren($row["children"], 1);
                                    } 


yakuzaemme 2013-07-17 22:30

Snyggt!

Tänk på att du kan köra $return[] = array(värden här) istället för $return[x]

Bra jobbat :)

Conny Westh 2013-07-17 23:32

Flytta ner '{' från slutet på raden till första synliga tecken på nästa rad så det går att läsa koden. Sen tycker jag att din parameter $growth borde heta $level i stället för det är ju vad det är, en typ av "nivå" på indenteringen, eller nästningsdjupet.

Sätter du måsvingarna under varandra som jag visar i mitt exempel nedan så ser du en textuell symmetri som gör det många gånger lättare att följa flödet i strukturen än om du sätter första måsvingen i slutet på raden och den avslutande måsvingen i början av sista raden i blocket.

PHP-kod:

function intendChildren($children$level

    foreach(
$children as $row
    { 
        
$intend ""
        for(
$i=0;$i<$level;$i++) 
        { 
            
$intend .= "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
        } 
        echo 
'<option '.((isset($_SESSION["last_parent_category"]) && $_SESSION["last_parent_category"] == $row["id"]) ? 'selected' '').' value="'.$row["id"].'">'.$intend.'|__'.$row["name"].'</option>'
        
intendChildren($row["children"], ($level+1)); 
    } 

                                 
foreach(
$ordered_categories as $row

    echo 
'<option '.((isset($_SESSION["last_parent_category"]) && $_SESSION["last_parent_category"] == $row["id"]) ? 'selected' '').' value="'.$row["id"].'">|__'.$row["name"].'</option>'
    
intendChildren($row["children"], 1); 



Anaxa 2013-07-17 23:38

Conny, att välja vart måsvingar ska sitta och hur man ska identera kod är en smaksak. Det finns inget standardsätt att skriva sånt på. Hur bra tyckte du annars jag löste uppgiften med att sortera dem? yakuza skrev på skype att man borde såhär: http://pastebin.com/DL7kkAEi
Men tar inte det längre tid att göra fler anrop till DB än att hantera en stor array i PHP?

yakuzaemme 2013-07-18 00:10

Posta hela din kod så vi kan se :)

Anaxa 2013-07-18 18:12

Jag gjort det :P Eller vad mer ville du ha?

Conny Westh 2013-07-18 20:55

Citat:

Ursprungligen postat av Anaxa (Inlägg 20474140)
Jag gjort det :P Eller vad mer ville du ha?

Det går inte att testköra koden, eftersom du saknar databasconnection, och testkod.

Gör en komplett Console app som går att testköra så kan du få mer hjälp. Annars måste jag bygga en helt egen app bara för att testköra detta .....

Du bör ju göra Category till en klass med metoder för add(), remove(), load()/fetchall(), save(), move(), delete()....

I klassen ska du ha en privat variabel som innehåller själva trädstrukturen, så det går att skapa fler instanser av klassen, om man nu vill göra det.

Du bör ha en helt egen klass som innehåller databasconnection och som man kan göra ett static anrop till för att få den eventuellt öppna Connection som finns till databasen. För varje tabell du har i databasen gör du (minst) en egen klass (ibland behövs fler klasser för en tabell om man har en komplex struktur). Connectionklassen kan då återanvändas mellan alla dessa tabellklasser, Connection är troligen samma för hela databasen (undantag finns).

PHP-kod:

// File: DBConnection.php
class DBConnection
{
    protected 
$activeConnection;

    static function 
getConnection()
    {
        
/// Code goes here ....
    
}


PHP-kod:

// File: category.php
class Category
{
    protected 
$categories = array();

    
// Initiate array of cateories on instance creation
    
function __construct()
    {
        
$categories = array();
    }
        
    
// Destruct activity when instance dies 
    
function __destruct()
    {
    }
        
    
// Load all categories from datavbase to array in instance   
    
function load()
    {
        
$mainCategories mysql_query("SELECT id, name FROM categories WHERE parent=0"getConnection());
        while(
$ds mysql_fetch_assoc($mainCategories))
        {
            
$categories[] = array
            (
               
"Name" => $ds["name"],
               
"Children" => GetChildren($ds["id"])
             );
        }
    }
    
    function 
GetChildren($parent)
    {
       
$children = array();
       
$childCats mysql_query("SELECT id, name FROM categories WHERE parent='".$parent."'");
       while (
$cat mysql_fetch_array($childCats)) 
       { 
         
$children[] = array
         (
           
"Name" => $cat["name"],
           
"Children" => GetChildren($cat["id"])
         );
       }
       return 
$children;
    }
 
    
// Add one category    
    
function add()
    {
    }
    
    
// Delete one cateory and all sub categories
    
function remove()
    {
    }
    
    
// Move one category from one parent toi another
    
function move()
    {
    }
    
    
// Save all unsaved categories in memory to database
    
function save()
    {
    }

    
// Find category by name, and return ID    
    
function find()
    {
    }



PHP-kod:

// File: categoryTest.php
// Testcode goes here
class CategoryTest
{
    function 
__construct()
    {
        print 
"Test Starts now.\n"
        
$this->testAdd();        
        
$this->testMove();        
        
$this->testRemove();        
        
$this->testSave();        
        
$this->testLoad();        
    }
    
    function 
testAdd()
    {
        print 
"Test of Add function.\n"
        
        
$testCategories = new Category();
        
        
$cat1 $testCategories.add("Test1");
    }
    
    function 
testAdd()
    {
    }
    
    function 
testMove()
    {
    }
    
    function 
testRemove()
    {
    }
    
    function 
testSave()
    {
    }
    
    function 
testLoad()
    {
    }
    
    function 
__destruct()
    {
        print 
"Test is Done.\n"
    
}
}

new 
categoryTest(); 


Anaxa 2013-07-18 22:58

Jag uppskattar att du tog dig tid att skriva det där men det kommer blir en högre laddningstid om man ska göra instanser av varje kategori. Använd gärna mysqli eller PDO och inte mysql_*** för den är typ gammal eller nåt har jag för mig. Jag förstår verkligen inte heller varje en kategori bör ha massa metoder som jag aldrig kommer använda.

Conny Westh 2013-07-19 05:10

Citat:

Ursprungligen postat av Anaxa (Inlägg 20474167)
Jag uppskattar att du tog dig tid att skriva det där men det kommer blir en högre laddningstid om man ska göra instanser av varje kategori. Använd gärna mysqli eller PDO och inte mysql_*** för den är typ gammal eller nåt har jag för mig. Jag förstår verkligen inte heller varje en kategori bör ha massa metoder som jag aldrig kommer använda.

Givetvis ska du använda PDO, när du kör OO-paradigmen. Det är dock din egen kod jag klistrat in med SQL-satserna.

Men du missar hela idén med att dela upp programmet i små funktioner. Det är skitsnack att du skulle få "längre laddtider", det kanske tar 0,00001 sekunder längre tid, tror du att en användare skulle märka skillnaden?

Den stora skillnaden blir när du ska utöka funktionaliteten i programmet, du får mindre buggar, för varje funktion är enkel att använda.

Om du inte vill "instanciera" så kan du göra alla funktionerna static. Men din Array måste du instanciera i vilket fall för du måste lagra den i en variabel och då har du redan instansierat arrayen. Så argumentet att det sinkar programmet är inte relevant. Men det underlättar programutvecklingen enormt mycket.

Du gör ju exempelvis add() redan när du laddar upp din Array idag, det är bara att du inte gjort det till en återanvändbar funktion, så om du vill lägga till en kategori så måste du lägga till den i databasen och sen ladda om hela arrayen, då tar det tid må jag säga. Eller hur har du tänkt att använda detta program?

Metoderna som jag föreslog är ju bara "standardmetoder" för att lägga till, ta bort och hämta data från kategori arrayen eller från databasen, det är i princip samma metoder du har på alla tabeller i databasen, sen kan t det finnas vissa tabeller man har fler metoder för men det bygger man ut efter behov. Bygger man det objektorienterat från början så blir det enklare att utöka och ändra allteftersom man jobbar med programmet.

Konsekvensen blir at programmet blir enklare att underhålla, det går snabbare att införa förändringar och det blir mindre buggar. Det är givetvis ingen garanti men det är i vart fall min och de flesta andra OO-förespråkares erfarenhet.

Conny Westh 2013-07-19 05:18

Citat:

Ursprungligen postat av Anaxa (Inlägg 20474078)
Jag löste det genom att lägga till en parameter till identeringsfunktionen. Tack för hjälp .

PHP-kod:

function intendChildren($children$growth) {
                                        foreach(
$children as $row) {
                                            
$intend "";
                                            for(
$i=0;$i<$growth;$i++) {
                                                
$intend .= "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
                                            }
                                            echo 
'<option '.((isset($_SESSION["last_parent_category"]) && $_SESSION["last_parent_category"] == $row["id"]) ? 'selected' '').' value="'.$row["id"].'">'.$intend.'|__'.$row["name"].'</option>';
                                            
intendChildren($row["children"], ($growth+1));
                                        }
                                    }
                                
                                    foreach(
$ordered_categories as $row) {
                                        echo 
'<option '.((isset($_SESSION["last_parent_category"]) && $_SESSION["last_parent_category"] == $row["id"]) ? 'selected' '').' value="'.$row["id"].'">|__'.$row["name"].'</option>';
                                        
intendChildren($row["children"], 1);
                                    } 


Intend betyder "avse"...
...medan ...
Indent betyder "indrag"...


Alla tider är GMT +2. Klockan är nu 20:21.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson