screezeGetCssJs - Zum Ausliefern von js und css Dateien

Dieser Bereich dient dazu, eure Tricks und Erweiterungen vorzustellen, damit diese auch andere Anwender nutzen können. // This area can be used to publish your tricks and extensions to the APF to be used by other developers.
Antworten
Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

screezeGetCssJs - Zum Ausliefern von js und css Dateien

Beitrag von Screeze » 21.09.2009, 11:54:41

Und die nächste erweiterung von mir: "screezeGetCssJs"
Hierbei handelt ist sich um eine Action, welche dazu benutzt werden kann javascript und css dateien auszuliefern, welche sich NICHT im öffentlich zugänglichen Bereich befinden.
Z.b. wenn einzelne css Dateien von einem Modul benötigt werden, muss man so nicht erst die dateien kopieren, sondern liefert sie mittels action aus.
Der Sicherheit wegen habe ich es auf js und css dateien eingegrenzt, dass man sich nicht über url manipulation irgendwelche konfigurationen ausliefern lassen kann. Ich hoffe mir ist es gelungen das abzusichern, wäre nett wenn das jemand nochmal überprüft.

Die js und css dateien werden mit cache headern gesendet, sodass der browser diese für 7 Tage im cache behält. (kann angepasst werden)
Mein screezeHead, welches ich heute auchnoch vorstellen werde baut beispielsweise auf dieses Tool auf.

Dieses Modul ist allerdings nicht wirklich url_rewriting geeignet glaube ich.

Installation:

Es werden 2 Dateien unter
.../mytools/screezeGetCssJs/biz/actions/
benötigt:

screezeGetCssJsAction.php

Code: Alles auswählen

<?php
/**
 *  @namespace mytools::screezeGetCssJs::biz::actions
 *  @class screezeGetCssJsAction
 *  
 *  Implements an FC-action which returns .css and .js files
 *
 *  @author Ralf Schubert
 *  @version 1.0, 20.09.2009<br>
 *  @version 1.0.1, 21.09.2009 Set the TimeToLife variable as class member
 */

import('tools::http','HeaderManager');

class screezeGetCssJsAction extends AbstractFrontcontrollerAction {

    /**
     * 60 = 1 minute
     * 60 * 60 (3600) = 1 hour
     * 60 * 60 * 24 (86400) = 1 day
     * 60 * 60 * 24 * 7 (604800) = 7 days
     * @var int TimeToLife for cache headers in seconds
     */
    protected $__TTL = 604800;

    function screezeGetCssJsAction() {
    }
    
    function run() {
        $path = strip_tags($this->__Input->getAttribute('path'));
        $file = strip_tags($this->__Input->getAttribute('file'));
        $type = strip_tags($this->__Input->getAttribute('type'));

        // Check if all required attributes are given
        if(!isset($path) OR empty($path))
            trigger_error('[screezeGetCssJsAction::run()] The attribute "path" is empty or not present.');
        if(!isset($file) OR empty($file))
            trigger_error('[screezeGetCssJsAction::run()] The attribute "file" is empty or not present.');
        if(!isset($type) OR empty($type))
            trigger_error('[screezeGetCssJsAction::run()] The attribute "type" is empty or not present.');

        // send headers to allow caching
         HeaderManager::send('Cache-Control: public; max-age='.$this->__TTL, true);
         $modifiedDate = date('D, d M Y H:i:s \G\M\T', time());
         HeaderManager::send('Last-Modified: '.$modifiedDate, true);
         $expiresDate = date('D, d M Y H:i:s \G\M\T', time() + $this->__TTL);
         HeaderManager::send('Expires: '.$expiresDate, true);
         HeaderManager::send("Pragma: public", true);
         
       // Check if correct type is given. If not exit() for security reasons.
        switch ($type){
            case 'css':
                $ext = "css";
                HeaderManager::send('Content-type: text/css');
                break;
            case 'js':
                $ext = "js";
                HeaderManager::send('Content-type: text/javascript');
                break;
            default:
                trigger_error('[screezeGetCssJsAction::run()] The attribute "type" must be either "css" or "js".');
                exit();
        }

        // build full path and return file.
        $reg = &Singleton::getInstance('Registry');
        $libBasePath = $reg->retrieve('apf::core','LibPath');
        $file = $libBasePath.'/'. $path .'/'.$file.'.'.$ext;


        echo file_get_contents($file);
        
        
        exit();
    }
}
?>
screezeGetCssJsInput.php

Code: Alles auswählen

<?php
class screezeGetCssJsInput extends FrontcontrollerInput {
    function screezeGetCssJsInput() {

    }
}
?>
Außerdem noch eine configuration unter:
.../config/mytools/screezeGetCssJs/biz/actions/{EUER COntext}/DEFAULT_actionconfig.ini

Code: Alles auswählen

[sGCJ]
FC.ActionNamespace = "mytools::screezeGetCssJs::biz::actions"
FC.ActionFile = "screezeGetCssJsAction"
FC.ActionClass = "screezeGetCssJsAction"
FC.InputFile = "screezeGetCssJsInput"  
FC.InputClass = "screezeGetCssJsInput"
FC.InputParams = ""
Anwendung:
Ein Beispiel für eine javascript datei sieht wie folgt aus: ({Context} dient hier nur als platzhalter für meinen context.)

Code: Alles auswählen

/APF/{Context}/index.php?mytools_screezeGetCssJs_biz-action:sGCJ=path:{Context}/pres/frontend/static/js|type:js|file:jquery.min
Der action wird also der path übergeben, der type (js oder css), und der dateiname (jquery.min) OHNE die dateiendung. Diese wird aus sicherheitsgründen selbst hinzugefügt.

Einbinden könnte man das wie folgt:

Code: Alles auswählen

<script src="/APF/sites/GAME_mainpage/index.php?mytools_screezeGetCssJs_biz-action:sGCJ=path:sites/GAME_mainpage/pres/frontend/static/js|type:js|file:jquery.min" type="text/javascript"></script>
css Dateien funktionieren fast genauso:

Code: Alles auswählen

<link href="/APF/sites/GAME_mainpage/index.php?mytools_screezeGetCssJs_biz-action:sGCJ=path:sites/GAME_mainpage/pres/frontend/static|type:css|file:mainpage" rel="stylesheet" type="text/css">
Zuletzt geändert von Screeze am 21.09.2009, 19:35:34, insgesamt 1-mal geändert.

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: screezeGetCssJs - Zum Ausliefern von js und css Dateien

Beitrag von Megger » 21.09.2009, 12:18:08

Ich würde noch in der Klasse die Caching Länge mit nach oben in die Variablen nehmen.

Code: Alles auswählen

    private $__TTL = 60 * 60 * 24 * 7;
So hast du die TimeToLife zentral und man muss es nicht erst im Code suchen. In den Kommentaren oben drüber wären vielleicht noch ein paar Beispiele denkbar.

Code: Alles auswählen

    /**
    * 60 = 1 Minute
    * 60 * 60 (3600) = 1 Stunde
    * 60 * 60 * 24 (86400) = 1 Tag
Ansonsten sieht das doch schon sehr gut aus. Ich werde mir das Zuhause mal genauer anschauen.
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: screezeGetCssJs - Zum Ausliefern von js und css Dateien

Beitrag von Screeze » 21.09.2009, 19:36:07

Habe deinen vorschlag umgesetzt und die datei oben durch die aktuelle ersetzt.
Eigenartig allerdings, man kann bei klassenvariablen keine definition alla 60*60 setzen, sondern darf nur 3600 setzen. Wusste ich auch noch nicht.

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast