6 Stimmen

CodeIgniter und Layouts?

Welche CodeIgniter-Bibliothek kann diese Funktionalität bieten?

http://media.railscasts.com/videos/008_content_for.mov

Es scheint so einfach auf Schienen, aber ich kann einfach nicht finden, eine einfache Möglichkeit, dies auf Codeigniter zu erreichen.. bitte helfen. Ich hasse es, meine Stile oder Javascript in den Körper des Dokuments einfügen

8voto

eazery Punkte 96

Ich hasse Vorlagen wie Smarty oder http://williamsconcepts.com/ci/codeigniter/libraries/template/

Mit meiner eigenen Implementierung von Zend-ähnlichem Layout.

Haken /application/hooks/Layout.php hinzufügen:

<?php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

/**
 *
 */
class Layout {

    function render() {

        global $OUT;
        $CI = & get_instance();
        $output = $CI->output->get_output();
        if (!isset($CI->layout)) {
            $CI->layout = "default";
        }
        if ($CI->layout != false) {
            if (!preg_match('/(.+).php$/', $CI->layout)) {
                $CI->layout .= '.php';
            }

            $requested = BASEPATH . '../application/layouts/' . $CI->layout;
            $default = BASEPATH . '../application/layouts/default.php';

            if (file_exists($requested)) {
                $layout = $CI->load->file($requested, true);
            } else {
                $layout = $CI->load->file($default, true);
            }

            $view = str_replace("{content}", $output, $layout);
            $view = str_replace("{title}", $CI->title, $view);

            $scripts = "";
            $styles = "";
            $metas = "";
            if (count($CI->meta) > 0) {     //   -
                $metas = implode("\n", $CI->meta);
            }
            if (count($CI->scripts) > 0) {  //   
                foreach ($CI->scripts as $script) {
                    $scripts .= "<script type='text/javascript' src='" . base_url() . "js/" . $script . ".js'></script>";
                }
            }
            if (count($CI->styles) > 0) {   //   
                foreach ($CI->styles as $style) {
                    $styles .= "<link rel='stylesheet' type='text/css' href='" . base_url() . "css/" . $style . ".css' />";
                }
            }

            if (count($CI->parts) > 0) {    //    
                foreach ($CI->parts as $name => $part) {
                    $view = str_replace("{" . $name . "}", $part, $view);
                }
            }
            $view = str_replace("{metas}", $metas, $view);
            $view = str_replace("{scripts}", $scripts, $view);
            $view = str_replace("{styles}", $styles, $view);
            $view = preg_replace("/{.*?}/ims", "", $view); //     
        } else {
            $view = $output;
        }
        $OUT->_display($view);
    }

}

?> 

Aktivieren Sie dann Hooks in Ihrer /application/config/config.php:

$config['enable_hooks'] = TRUE;

Danach fügen Sie zu /application/config/hooks.php hinzu:

$hook['display_override'][] = array('class' => 'Layout',
    'function' => 'render',
    'filename' => 'Layout.php',
    'filepath' => 'hooks'
);

Ordner /anwendung/layouts/ erstellen

Erstellen Sie die Datei /application/layouts/default.php:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
    <head>
        <title>{title}</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        {metas}
        {scripts}
        {styles}
        <link rel="icon" href="<?= base_url() ?>favicon.ico" type="image/x-icon" />
        <link rel="shortcut icon" href="<?= base_url() ?>favicon.ico" type="image/x-icon" />
    </head>
    <body>
        <div class="head">
            {head}
        </div>
        <div class="content">
            {content}
        </div>
    </body>
</html>

Verwenden Sie es vom Controller aus:

class main extends MY_Controller {

    function __construct() {
        parent::Controller();
        $this->parts[head] = $this->load->view("frontend/global/header.php", null, true);
        $this->scripts = array("JQuery/jquery-1.4.2.min", "JQuery/form", "Core", "Frontend");
        $this->styles = array("style");
        $this->title = "Blah blah";
    }

    function index() {
        $this->load->view('frontend/index.php');
    }

}

4voto

Colin Brock Punkte 20787

In der Vergangenheit habe ich dies folgendermaßen erreicht Vorlagenbibliothek . Aus der Dokumentation:

Die Template-Bibliothek, geschrieben für die CodeIgniter PHP-Framework geschrieben wurde, ist ein Wrapper für die View-Implementierung von CI. Template ist eine Reaktion auf die zahlreichen Fragen aus der CI-Gemeinschaft darüber, wie man mehrere Views für einen mehrere Views für einen Controller anzeigen kann, und wie man "Views innerhalb von Views" in einer standardisierten Weise einbetten kann. Darüber hinaus, Template das Laden von zusätzlichen Views Fähigkeiten, die Möglichkeit zur Nutzung von einen beliebigen Template-Parser (wie Smarty) und Abkürzungen für die Einbindung von CSS, JavaScript und anderen gängigen Elementen in Ihr fertig gerendertes HTML.

Informieren Sie sich insbesondere über die Bibliothek weitere Dienstprogramme . Damit können Sie so etwas in Ihren Controller einbauen:

$this->template->add_js('js/YourJavascriptFile.js');

または

$this->template->add_js('alert("Hello!");', 'embed');

Echo $_scripts in Ihrer Vorlage (vorzugsweise in der <head> Abschnitt) zu JavaScript zu verwenden, das über diese Methode hinzugefügt wird.

Das Gleiche können Sie mit Ihrem CSS machen:

$this->template->add_css('css/main.css');
$this->template->add_css('#logo {display: block}', 'embed', 'print');

und einfach ein Echo $_styles あなたの中の <head> Abschnitt.

Ich hoffe, das hilft.

2voto

Bjørn Børresen Punkte 1002

Schauen Sie sich Twig an - es unterstützt "Vererbung" (anstelle des traditionellen include header, include footer, etc)

http://www.twig-project.org/

CodeIgniter-Hilfsmittel:

http://github.com/jamiepittock/codeigniter-twig または http://github.com/MaherSaif/codeigniter-twig

(ich habe beides nicht ausprobiert, aber es sieht so aus, als ob letzteres ein Fork mit den neuesten Commits ist)

0voto

ben Punkte 1515

Ich hatte das gleiche Problem mit der Suche nach einer Vorab-Layout-Bibliothek, also habe ich meine eigene Version geschrieben, die auch Ihren Bedürfnissen entspricht (mit YAML-Datei).

Eigenschaften

  • Verwalten Sie Layouts, Seitentitel, Metas, Css und Js mit YAML-Dateien für saubere und einfachere Controller.
  • Standardkonfigurationen können in den Controller-Konfigurationen überschrieben werden. So können Sie Ihr css und js in kleinere Dateien aufteilen und flexibler gestalten.
  • Kombinieren und minimieren Sie css- und js-Dateien im Produktionsmodus, um das Laden von Seiten zu beschleunigen.

Verwendung

  // in the controller
  $this->view->render();

Diese Lib holt sich das Layout, die Ansicht, den Seitentitel, css, js, metas aus Ihren YAML-Konfigurationen

Dokumentation

herunterladen

  • Quellcode herunterladen von Github

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X