[PHP+Smarty] Website werkt lokaal, maar niet op server

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi allen,

Ik heb voor een schoolproject een website ontwikkeld, die lokaal op mijn laptop perfect werkt.
(Hij draait in PHP, en gebruikt als Template Engine Smarty)

Zodra ik hem op de testserver probeer te installeren, gaat het echter fout.

Deze error krijg ik dan:
Warning: Smarty::include(templates_c/%%72^724^7242060C%%main.tpl.php) [smarty.include]: failed to open stream: No such file or directory in /servername/www/MBC/code/plugins/Smarty-2.6.26/libs/Smarty.class.php on line 1256

En dat voor iedere template die ik aanroep.

Ik heb gechecked, maar alle bestanden die hij claimed niet te hebben, bestaan wel gewoon. Ook de map, waarin hij ze moet plaatsen (templates_c) is chmod 777. De files die erin worden geplaatst staan op 644, maar dit lijkt me geen probleem, aangezien zodra ze er eenmaal staan, ze alleen maar ingelezen hoeven te worden. Daarnaast heb ik bij een klasgenoot gekeken, bij wie deze instellingen ook zo staan, en waarbij het allemaal prima werkt.

Iemand die dit probleem kent, of een idee heeft wat de oplossing kan zijn?

Acties:
  • 0 Henk 'm!

  • Cascade
  • Registratie: Augustus 2006
  • Laatst online: 16-09 11:44
Paden niet ingesteld in Smarty?

Acties:
  • 0 Henk 'm!

Verwijderd

Chmod 777 is (haast) nergens voor nodig, gebruik het dan ook niet! Heb je de cache dir wel veranderd van Smarty, cache al eens uitgezet? *nix is overigens hoofdlettergevoelig, in tegenstelling tot windows.
code:
1
2
3
4
5
// van andere site
$t = new smarty;
$t->template_dir = TEMPLATE_DIR;
$t->compile_dir = $app_root . '/compile';
$t->cache_dir = $app_root . '/cache';

Acties:
  • 0 Henk 'm!

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 17-09 12:49

Nick_S

++?????++ Out of Cheese Error

Weet je heel zeker dat je een bestand hebt met de volgende naam: templates_c/%%72^724^7242060C%%main.tpl.php? Volgens mij gaat er wat mis met je encoding op de bestanden.

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


Acties:
  • 0 Henk 'm!

  • Cascade
  • Registratie: Augustus 2006
  • Laatst online: 16-09 11:44
Nick_S schreef op dinsdag 03 november 2009 @ 18:08:
Weet je heel zeker dat je een bestand hebt met de volgende naam: templates_c/%%72^724^7242060C%%main.tpl.php? Volgens mij gaat er wat mis met je encoding op de bestanden.
Soortgelijke bestandsnamen is wat de Smarty 'compiler' er van bakt. Lijkt raar maar klopt waarschijnlijk wel.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
waarschijnlijk
Ga dat dan eerst eens zeker weten...

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 01:33

MueR

Admin Tweakers Discord

is niet lief

Dat klopt, smarty maakt er dat soort namen van. Lijkt me inderdaad eerder een probleem met de paden die niet kloppen, of geen 777 op je template cache dir.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • Cascade
  • Registratie: Augustus 2006
  • Laatst online: 16-09 11:44
Cartman! schreef op dinsdag 03 november 2009 @ 18:55:
[...]

Ga dat dan eerst eens zeker weten...
Dat kan; als je het zeker wilt weten dan mag je eerst deze functie uit Smarty analyseren:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
    /**
     * get a concrete filename for automagically created content
     *
     * @param string $auto_base
     * @param string $auto_source
     * @param string $auto_id
     * @return string
     * @staticvar string|null
     * @staticvar string|null
     */
    function _get_auto_filename($auto_base, $auto_source = null, $auto_id = null)
    {
        $_compile_dir_sep =  $this->use_sub_dirs ? DIRECTORY_SEPARATOR : '^';
        $_return = $auto_base . DIRECTORY_SEPARATOR;

        if(isset($auto_id)) {
            // make auto_id safe for directory names
            $auto_id = str_replace('%7C',$_compile_dir_sep,(urlencode($auto_id)));
            // split into separate directories
            $_return .= $auto_id . $_compile_dir_sep;
        }

        if(isset($auto_source)) {
            // make source name safe for filename
            $_filename = urlencode(basename($auto_source));
            $_crc32 = sprintf('%08X', crc32($auto_source));
            // prepend %% to avoid name conflicts with
            // with $params['auto_id'] names
            $_crc32 = substr($_crc32, 0, 2) . $_compile_dir_sep .
                      substr($_crc32, 0, 3) . $_compile_dir_sep . $_crc32;
            $_return .= '%%' . $_crc32 . '%%' . $_filename;
        }

        return $_return;
    }


Als normale gebruiker van Smarty is het echt niet relevant wat de interne naamgeving voor de gecompileerde templates is, laat staan dat je zelf moet gaan valideren of die naamgeving correct is. Het is genoeg om te weten dat ze raar zijn en ongeveer die vorm hebben.

Maar dat is offtopic en niet boeiend voor dit probleem.


TS: zoals gezegd, controleer of je paden goed staan.

Wat rechten betreft moet de web server kunnen schrijven in de folders voor gecompileerde templates en de cache. Zie: http://smarty.net/manual/en/installing.smarty.basic.php.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Cascade schreef op dinsdag 03 november 2009 @ 20:58:
[...]


Dat kan; als je het zeker wilt weten dan mag je eerst deze functie uit Smarty analyseren:
PHP:
1
//code


Als normale gebruiker van Smarty is het echt niet relevant wat de interne naamgeving voor de gecompileerde templates is, laat staan dat je zelf moet gaan valideren of die naamgeving correct is. Het is genoeg om te weten dat ze raar zijn en ongeveer die vorm hebben.
Als het vervolgens niet werkt gaan we hier die functies niet uitpluizen, dat mag iemand met problemen lekker bij Smarty voorleggen natuurlijk. Maar wat een onpraktisch systeem dan zeg, pff... ik wil niet weten wat voor functies er allemaal aan te pas komen om nog eens te doen wat php vanuit zichzelf al kan.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Even voor de volledigheid van het topic,
ben inmiddels uit wat het probleem is :)

Het classpath was ooit eens aangepast in PHP.ini, waardoor het specifiek op die server niet meer werkte. (Om onduidelijke redenen, want voor de Smarty Class gebruikte ik een relatief pat naar de smarty map ipv een link in de ini file.)

Dit probleem kon op twee manieren worden opgelost:
1) classpath resetten.
2) een absolute link naar smarty toe maken. VAAG in ieder geval, maar het werkt.

Ik ga me er later nog eens in verdiepen hoe dit zo komt, maar voorlopig ben ik blij met de oplossing.
Verder iedereen die hier tijd in heeft gestoken bedankt!

Acties:
  • 0 Henk 'm!

Verwijderd

Cartman! schreef op dinsdag 03 november 2009 @ 21:19:
[...]

Als het vervolgens niet werkt gaan we hier die functies niet uitpluizen, dat mag iemand met problemen lekker bij Smarty voorleggen natuurlijk. Maar wat een onpraktisch systeem dan zeg, pff... ik wil niet weten wat voor functies er allemaal aan te pas komen om nog eens te doen wat php vanuit zichzelf al kan.
Heb je het ooit gebruikt? Je kan hier je code _compleet_ gescheiden houden van je content, ik programmeer 7 jaar PHP en wil _nooit_ meer terug naar inline HTML. Smarty levert mij 300% tijdswinst op t.o.v. spaghetticode in PHP zelf.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
7 jaar? zo zo. En nooit van MVC gehoord?

aanvulling:
MVC staat overigens nog los van dat PHP zelf ook een template engine is en je daar Smarty helemaal niet voor nodig hebt, gewoon een .php file gebruiken waar je de overbodige extra syntax niet nodig hebt.

edit: en wat HuHu zegt :)

[ Voor 85% gewijzigd door Cartman! op 09-11-2009 19:06 ]


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Verwijderd schreef op maandag 09 november 2009 @ 18:28:
[...]


Heb je het ooit gebruikt? Je kan hier je code _compleet_ gescheiden houden van je content, ik programmeer 7 jaar PHP en wil _nooit_ meer terug naar inline HTML. Smarty levert mij 300% tijdswinst op t.o.v. spaghetticode in PHP zelf.
:').

Als je gewoon logisch nadenkt, dan kun je ook in PHP je logica en je view scheiden. Wat is het verschil tussen een Smarty template, en een template gemaakt in PHP? Spaghetticode is nog altijd een product van de programmeur, niet een eigenschap van de taal.

Dat sommige programmeurs Smarty nodig hebben om te zien dat je logica en view moet scheiden (omdat Smarty je daartoe dwingt), dat ligt aan hun. Als je alles in PHP doet, dan kun je ook je logica en view scheiden. Alleen moet je daar zelf over nadenken, in plaats van dat iets (Smarty) je aan je handje vast houdt.

De logica van je applicatie:

PHP:
1
2
3
4
5
// Doe iets ingewikkelds

$this->view->key = $value;
// Of: $this->tpl->assign('key', $value);
// Het gaat om het idee :-)


Smarty template:

code:
1
2
3
<h1>Iets leuks</h1>

Kijk, de waarde van "key" is {$key}!


PHP template:

PHP:
1
2
3
4
<h1>Iets leuks</h1>

Kijk, de waarde van "key" is <?php echo $this->key; ?>
Kijk, de waarde van "key" is <?=key?>


Nou, nou... daar heb je met Smarty toch wel 300% 0% winst zeg :o ! Dit kan ook nog:

PHP:
1
2
3
4
5
6
7
8
9
<?php
// Doe iets ingewikkelds
$value = ietsIngewikkelds();

// ------- VIEW ------- \\
?>
<h1>Iets leuks</h1>

Kijk, de waarde van "key" is <?php echo $value; ?>


In alle gevallen heb je met PHP keurig de logica en de view van elkaar gescheiden. In het eerste geval doordat je templates gebruikt, zoals met Smarty. In het tweede geval doordat je jezelf zet tot het scheiden van je broncode in het document.

Het is gewoon een kwestie van logisch nadenken. Daar heb je Smarty niet voor nodig.
Pagina: 1