Kom ihåg mig?
Home Menu

Menu


Hur lagra kategorier

 
Ämnesverktyg Visningsalternativ
Oläst 2013-07-17, 18:08 #11
Anaxa Anaxa är inte uppkopplad
Medlem
 
Reg.datum: Jun 2013
Inlägg: 58
Anaxa Anaxa är inte uppkopplad
Medlem
 
Reg.datum: Jun 2013
Inlägg: 58
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);
                                    } 
Anaxa är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-07-17, 22:30 #12
yakuzaemmes avatar
yakuzaemme yakuzaemme är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2012
Inlägg: 773
yakuzaemme yakuzaemme är inte uppkopplad
Mycket flitig postare
yakuzaemmes avatar
 
Reg.datum: Jun 2012
Inlägg: 773
Snyggt!

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

Bra jobbat
yakuzaemme är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-07-17, 23:32 #13
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
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); 

Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-07-17, 23:38 #14
Anaxa Anaxa är inte uppkopplad
Medlem
 
Reg.datum: Jun 2013
Inlägg: 58
Anaxa Anaxa är inte uppkopplad
Medlem
 
Reg.datum: Jun 2013
Inlägg: 58
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?
Anaxa är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-07-18, 00:10 #15
yakuzaemmes avatar
yakuzaemme yakuzaemme är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jun 2012
Inlägg: 773
yakuzaemme yakuzaemme är inte uppkopplad
Mycket flitig postare
yakuzaemmes avatar
 
Reg.datum: Jun 2012
Inlägg: 773
Posta hela din kod så vi kan se
yakuzaemme är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-07-18, 18:12 #16
Anaxa Anaxa är inte uppkopplad
Medlem
 
Reg.datum: Jun 2013
Inlägg: 58
Anaxa Anaxa är inte uppkopplad
Medlem
 
Reg.datum: Jun 2013
Inlägg: 58
Jag gjort det :P Eller vad mer ville du ha?
Anaxa är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-07-18, 20:55 #17
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Citat:
Ursprungligen postat av Anaxa Visa inlägg
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(); 

Senast redigerad av Conny Westh den 2013-07-18 klockan 21:02
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-07-18, 22:58 #18
Anaxa Anaxa är inte uppkopplad
Medlem
 
Reg.datum: Jun 2013
Inlägg: 58
Anaxa Anaxa är inte uppkopplad
Medlem
 
Reg.datum: Jun 2013
Inlägg: 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.
Anaxa är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-07-19, 05:10 #19
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Citat:
Ursprungligen postat av Anaxa Visa inlägg
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 är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-07-19, 05:18 #20
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Citat:
Ursprungligen postat av Anaxa Visa inlägg
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"...
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 01:56.

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