webForumDet fria alternativet

Programmera smart

21 svar · 1 291 visningar · startad av Melea

MeleaMedlem sedan juli 20033 147 inlägg
#1

Tjingeling,

jag sitter och grubblar över hur jag ska bygga upp en sida, så smart som möjligt.
Saken är den att jag börjar komma in på ganska avancerad programmering, och vet inte hur jag ska bygga upp strukturen.

  1. Hur sparar ni era klasser, för att enklast kunna inkludera dem på sidan? I en egen katalog? En klass per fil?
  2. Ponera att jag kör som jag beskrev ovan, då känns det som man måste göra väldigt många inkluderingar på varje sida, detta anser jag vara ganska kluddigt, finns det något smart sätt att komma förbi detta? Kanske genom att ha en tredjepartsfil som inkluderar de filer som ska inkluderas, och så inkluderar man denna fil för sig?
  3. Hur bygger jag enklast upp layouten? Sparar jag den som header och bottom, eller ska jag använda mig av templates? Om jag nu bestämmer mig för att använda mig av templates för att enklare separera php-kod från layouten, tillkommer det väldigt mycket bekymmer med att hålla koden "ren" imo. Är detta ett "känt" fenomen?

Känns rätt hopplöst att börja bygga på något stort, då man en dag senare kommer på ett smartare sätt att göra det på, vilket hela tiden händer.
Vore betydligt enklare om man var ett team, som kunde se problemen från andra synvinklar än ens egna syn på det.
När man kommer till denna storleksordningen, är det dumt att bygga något på egen hand?

Tack!

nitro2k01Medlem sedan aug. 20039 342 inlägg
#2

1. Jag brukar spara funktioner med närliggande funktionalitet i samma fil, och kod som hör ihop. Precis en klass per fil är kanske lite överdrivet stringent.
2. Inkludera i flera nivåer. Om du har en PHP-fil för att hantera inlägg, och en för att hantera smilies, inkludera smilies-filen i inläggs-filen, istället för allt i main-filen.
3. Jag har använt en fullösning, på en en-fils-site, där jag har en kategori-variabel som skickas som querystring. Sedan använder jag en switch-sats. För större projekt är det nog en idé att göra iordning nån template-kod. Studera indelningen på vBulletin, du som är utvecklare här på wF. Försök i allmänhet att koda så generellt så möjligt, håll isär ren kod, design samt innehåll, och gör det till 100%!

MeleaMedlem sedan juli 20033 147 inlägg
#3

nitro2k01 skrev:

1. Jag brukar spara funktioner med närliggande funktionalitet i samma fil, och kod som hör ihop. Precis en klass per fil är kanske lite överdrivet stringent.

Jo, det låter smart. Ska testa mig fram lite, och återkommer om jag stöter på några problem.

nitro2k01 skrev:

2. Inkludera i flera nivåer. Om du har en PHP-fil för att hantera inlägg, och en för att hantera smilies, inkludera smilies-filen i inläggs-filen, istället för allt i main-filen.

Gott, en bit på vägen! ;)
Man får totalt hjärnstopp om man inte får tips utifrån.

nitro2k01 skrev:

3. Jag har använt en fullösning, på en en-fils-site, där jag har en kategori-variabel som skickas som querystring. Sedan använder jag en switch-sats. För större projekt är det nog en idé att göra iordning nån template-kod. Studera indelningen på vBulletin, du som är utvecklare här på wF. Försök i allmänhet att koda så generellt så möjligt, håll isär ren kod, design samt innehåll, och gör det till 100%!

Jo, perfektionist (när det handlar om kodning) som jag är, så blir det alltid struktur på koden, det går före allt.
Men du menar alltså att det är onödigt att använda sig av ett templatesystem om man endast ska bygga en inte allt för stor företagssida?

nitro2k01Medlem sedan aug. 20039 342 inlägg
#4

Melea skrev:

Men du menar alltså att det är onödigt att använda sig av ett templatesystem om man endast ska bygga en inte allt för stor företagssida?

Jag menar snarare att jag har varit för lat för att slänga ihop ett template-baserat system. Annars är det nog enklast, då du kan återvända koden på ett annat sätt, samt byta ut designen lättare. Så template-baserat är nog att föredra.

MeleaMedlem sedan juli 20033 147 inlägg
#5

Okelidokeli, tack för hjälpen! :bire

Se så wF, bättre kan ni, behöver fler tips!

Dies_IraeMedlem sedan aug. 2001145 inlägg
#6

Själv gör jag alltid på detta sätt:

  1. Skapar en prepare.php fil som jag lägger i roten, denna fil inluderas av alla sidor.
    prepare laddar in dom vanligaste classer/functioner/sätter globala variablar osv.

Alla klasser lägger jag i en katalog (kallar dom moduler)

Bla tar jag alltid med en page class

  1. Page classen har en hel del olika funktioner som tillhör sidan, tex:

$page->settitle(string)
$page->setdescription(); och alla dom sakerna. dock alltid satt ett standardvärde på alla variablar i page så man endast ändrar om man måste/vill.

$page->load_module("classnamn"); Som require_once i den katalog där classerna ligger. Bättre att alltid referera till en absolut katalog på ett ställa så man slipper ändra överallt om man vill flytta filerna.
$page->load_function("namn"); laddar in funktions filen (namn)

Detta sätt tycker iaf jag är behagligt att arbeta med.

Så en sida kunde tex göras så här:

<?
include "prepare.php";
$page->settitle("Min tuffa medlems sida");
$user = $page->load_module("user");

$page->require_login($user); // Om de krävs att man är inloggad.

// Hit kommer vi inte om man inte är inloggad.

$page->add_left_menu("användarmeny"); // Inkluderar en speciel medlems meny kanske?

// Kanske skulle vilja ha en counter på denna sida också
$counter = $page->load_module("counter");
$counter->increase();

$page->load_header();
?>
Hej <?= $user->get("name"); ?> denna sida har visats <?= $counter->gettotal(); ?> gånger, weho.
<?
$page->load_footer();

?>
aasahMedlem sedan mars 20034 471 inlägg
#7

De filer som inkluderas i praktiskt taget alla filer, låter jag inkluderas i header-filen, dvs den där jag har CSS och menyn. Sedan låter jag resten inkludera den.

Om jag skulle göra om min hemsida, vilket jag kanske gör i framtiden, så skulle jag samla alla databasanrop i en dbklass som jag la i en separat fil och inkluderade i headerfilen. Det blir betydligt lättare att uppdatera db-strukturen då. Man slipper fundera över vilka fler filer som möjligen använder just denna tabell någonstans...

PeeerMedlem sedan mars 20025 907 inlägg
#8

Flyttas från PHP (På trådskaparens begäran!

MeleaMedlem sedan juli 20033 147 inlägg
#9

Dies_Irae skrev:

...

Härligt! Det fick in mig på lite nya tankebanor! Tack för att du tog dig tid! :)

aasah skrev:

De filer som inkluderas i praktiskt taget alla filer, låter jag inkluderas i header-filen, dvs den där jag har CSS och menyn. Sedan låter jag resten inkludera den.

Om jag skulle göra om min hemsida, vilket jag kanske gör i framtiden, så skulle jag samla alla databasanrop i en dbklass som jag la i en separat fil och inkluderade i headerfilen. Det blir betydligt lättare att uppdatera db-strukturen då. Man slipper fundera över vilka fler filer som möjligen använder just denna tabell någonstans...

Jag löste det som Dies_Irae beskrev ovan, har en fil där jag inkluderar klasserna, och sedan inkluderar jag denna filen högst upp på varje sida.

Ledsen om jag väntade med svaret, hade helt glömt bort tråden.

jmeMedlem sedan maj 20012 237 inlägg
#10

Mycket bra tråd! Den här tråden bör få mer innehåll och placeras högst upp.

Jag funderar själv på liknande idéer. Jag vill helst samla ihop alla databas-relaterade funktionaliteter i en klass.

Sedan försöker jag alltid skilja på html och kod, så mycket som möjligt.
Har nu börjat kika mer på templates.

Jag installerade Joomla och har börjat studera dess struktur. Jag gillar idén att man enkelt kan placera olika moduler på sidan utan större problem.
Dvs just som Dies_Irae gör.

wyndanMedlem sedan okt. 200450 inlägg
#11

Håller på och testar lite med en autoloader till ett nystartat projekt och det verkar riktigt smidigt. Inga klasser behöver inkluderas manuellt, autoloadern läser in dom vid behov, blir ett visst extrajobb för servern men det är försumbart.

MeleaMedlem sedan juli 20033 147 inlägg
#12

Jo, __autoload() verkar ju vara grymt smidigt! Ska sätta mig ikväll och kolla igenom det.

PaceMedlem sedan juni 20019 024 inlägg
#13

När det gäller mallar så tycker jag att du ska läsa igenom det här dokumentet:

Enforcing Strict Model-View Separation in Template Engines (PDF)

Det är en väldigt bra grund när du ska separera kod från mallarnas innehåll. Visst, tråkig och akademisk men väldigt nyttig. Artikeln hjälper dig göra rätt från början.

MeleaMedlem sedan juli 20033 147 inlägg
#14

Pace skrev:

När det gäller mallar så tycker jag att du ska läsa igenom det här dokumentet:

Enforcing Strict Model-View Separation in Template Engines (PDF)

Det är en väldigt bra grund när du ska separera kod från mallarnas innehåll. Visst, tråkig och akademisk men väldigt nyttig. Artikeln hjälper dig göra rätt från början.

Ska ta och läsa igenom den när jag får tid. ;)
Funderat lite, se bifogad fil.
Givetvis endast använt mig av nyheter som ett exempel.
Om vi säger att jag lagrar formulär och layouten av nyheten i en klass, och sedan kör alla databas-anrop i en annan. Är detta ett okej sätt att bygga det på?
Tanken är ju då att man enklare ska kunna uppdatera flera sidor(portaler, domäner osv...) samtidigt,
genom att uppdatera endast en klass, istället för att behöva gå in på resp. sida och leta upp koden.

Untitled-1.jpg
BeEssMedlem sedan jan. 200524 inlägg
#15

Bra tråd

Det här var en bra tråd med intressanta och vettiga idéer att inspireras av.

MeleaMedlem sedan juli 20033 147 inlägg
#16

*bump*

Det är alltså såhär jag menar.

 
class Fetch
 
   var $db;
 
   function Fetch($db);
 
      $this->db = $db;
 
   }
 
   function FetchData($table, $where, $order, $limit)
 
      $sql = "
      SELECT *
      FROM $table
      ";
 
      if(!empty($where)) $sql .= " WHERE $where";
      if(!empty($order)) $sql .= " ORDER BY $order";
      if(!empty($limit)) $sql .= " LIMIT $limit";
 
      $result = $this->db->query($sql);
 
      while($row = $result->fetch()) {
         $data[] = $row;
      }
 
      return $data;
 
   }
 
}
$fetch = new Fetch($db);
$data = $fetch->FetchData('news', 'newscat = 1', 'id DESC', 5);
 
for($i = 0; $i <= (count($data)-1); $i++) {
   $data['topic'][$i].'<br />';
}

Vad tycker ni? Är det ett okej sätt att bygga upp det på?

Tack på förhand!

jmeMedlem sedan maj 20012 237 inlägg
#17

Just nu kan du bara ha en variabel i WhERE-satsen. Ofta har man ju mer specifika WHERE-satser. Ge metoden två vektorer som parametrar. En vektorn har kolumn-namnen till WHERE-satsen och den andra själva värden:

arr1[0] = "newscat";
arr1[1] = value2;

arr2[0] = VÄRDE_FÖR_newscat;
arr2[1] = VÄRDE_FÖR_value2;

Sen kör du med PreparedStatement:

for(int i = 0; i < arr1.length; ++i)
{
if(!first)

query += " AND " + arr1*=?"

}

PreparedStatement stmt = connection.prepareStatement(query);

for(int i = 0; i < arr2.length; ++i)
{
// givetvis måste du på nåt sätt hålla reda på, vilken typ det är
stmt.setXXX(i+1, arr2*);
}**

MeleaMedlem sedan juli 20033 147 inlägg
#18

jme skrev:

Just nu kan du bara ha en variabel i WhERE-satsen. Ofta har man ju mer specifika WHERE-satser. Ge metoden två vektorer som parametrar. En vektorn har kolumn-namnen till WHERE-satsen och den andra själva värden:

arr1[0] = "newscat";
arr1[1] = value2;

arr2[0] = VÄRDE_FÖR_newscat;
arr2[1] = VÄRDE_FÖR_value2;

Jo, det där var bara ett exempel jag skrev ihop i all hast på jobbet idag, säger inte att det är komplett på det viset.
Men själva sättet att hämta nyheterna och skriva ut dem, är det ur "snabbhet" (kommer inte på ett bättre ord ;)) ett bra sätt att strukturera upp det på?

jmeMedlem sedan maj 20012 237 inlägg
#19

Gillar Hibernates sätt att göra samma sak som PreparedStatements:

query = "SELECT * FROM blaargh where name = :name AND age = :age" ;

stmt.setString("name", value);
stmt.setInt("age", value2);

byter alltså ut :name samt :age mot value resp. value2. Väldigt smidigt!

Man behöver inte bry sig om i vilken ordning de kommer och har man samma värde flera gånger i frågan så sätts dessa automatiskt. Du behöver inte ha två setString("name", value);

aasahMedlem sedan mars 20034 471 inlägg
#20

jme skrev:

Just nu kan du bara ha en variabel i WhERE-satsen. Ofta har man ju mer specifika WHERE-satser. Ge metoden två vektorer som parametrar. ...

Men inget hindrar att man skickar hela villkoret som sträng.

$where = "A.X = 13 AND (B.T <> C.D OR B.T = 'Anders') AND....";
function FetchData("A natural join B natural join C", $where, '', '');

Eventuellt kan du ha med en $select i FetchData om du då och då inte vill ta ut alla kolumner.

138 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)