2010-11-23 14 views
5

I globalen Array-Konstanteglobale Array-Konstante definiert in Sicht für die Verwendung von

Code in bootstrap.php

$adv_types = array('top' => 'Верх', 'left' => 'Левое', 'right' => 'Правое', 'bottom' => 'Нижнее');

Code in Ansichtsdatei

echo $form->input('Adv.type', array('type' => 'select', 'option' => $adv_types, 'label' => 'Место рекламы'));

definieren will aber CakePHP gibt Fehler:

"Undefined variable: adv_types"

+0

, wenn Sie es für Formularoptionen verwenden (wie es scheint), möchten Sie vielleicht so etwas wie verwenden: http://www.dereuromark.de/2010/06/24/static-enums-or-semihardcoded-attributes/ – mark

Antwort

5

Diese in Ihrem app_controller.php festlegen müssen, und dann auf Ihre Ansichten weitergegeben

// app_controller.php 
class AppController extends Controller { 
     var $adv_types = array('top' => 'Верх', 'left' => 'Левое', 'right' => 'Правое', 'bottom' => 'Нижнее'); 
     function beforeFilter() { 
      $this->set('adv_types', $this->adv_types); 
     } 
} 

Für mich ist bootstrap.php nicht die richtige Datei für diese Konstante

+0

Gibt es eine Möglichkeit, dieses Array von AppModel zu machen, wenn dieses Array dynamisch aus der Datenbank ist? –

8

Leider ist der Spielraum für bootstrap.php ist bootstrap.php, so dass die $adv_types Variable nicht mehr verfügbar ist, sobald PHP die Analyse beendet bootstrap.php.

Je nach Ihren tatsächlichen Anforderungen gibt es verschiedene Möglichkeiten.

Lösung 1: Sie müssen diese Variablen in vielen Ihrer Ansichten

Wenn Sie die Variable müssen in allen Ansichten zur Verfügung stehen, sollten Sie definieren und in AppController::beforeRender() gesetzt.

In app/app_controller.php:

class AppController extends Controller 
{ 

    function beforeRender() 
    { 
     parent::beforeRender(); 

     $adv_types = array('top' => 'Верх', 'left' => 'Левое', 'right' => 'Правое', 'bottom' => 'Нижнее'); 
     $this->set(compact('adv_types')); 
    } 
} 

Dies wird alle Ihre Ansichten ermöglichen die $adv_types Array zuzugreifen.

Lösung 2: Sie können den Zugriff auf diese Variable müssen überall in Ihrem CakePHP App

Wenn Sie die $adv_types Variable an anderer Stelle in Ihrer Anwendung zugreifen müssen, können Sie es auf die Configure Sammlung hinzufügen können. In bootstrap.php:

Configure::write('NameOfYourAppAsNamespace.adv_types', array('top' => 'Верх', 'left' => 'Левое', 'right' => 'Правое', 'bottom' => 'Нижнее')); 

empfehle ich den Namen Ihres Projekts als Pseudo-Namespace; adv_types ist wahrscheinlich nicht in Konflikt mit anderen Bezeichnern, aber wenn Sie diesen Ansatz häufiger verwenden, erhöht sich Ihre Chancen, Konflikte zu erstellen. Darüber hinaus können Sie die Daten, die Sie in der Configure-Auflistung speichern, unter einem Namespace gruppieren, was für das Debuggen hilfreich sein kann.

Wie auch immer, dieser Ansatz ermöglicht es Ihnen, auf die Variable in jedem Bereich unter dem CakePHP-Schirm zuzugreifen, indem Sie Configure::read() aufrufen.Also:

$adv_types = Configure::read('NameOfYourAppAsNamespace.adv_types'); 

Lösung 3: Sie müssen unbedingt diese Variable zur Verfügung haben als globale Variable

Wenn Sie muss unbedingt haben dies als Standard PHP globale Variable, könnten Sie Folgendes tun:

$GLOBALS['adv_types'] = array('top' => 'Верх', 'left' => 'Левое', 'right' => 'Правое', 'bottom' => 'Нижнее'); 

Bevor Sie dies tun, sollten Sie bitte, ob diese unbedingt erforderlich ist. Globale Variablen sind eine wirklich schmutzige Angelegenheit, und Sie sollten eine klare und gegenwärtige Notwendigkeit es zu rechtfertigen haben.


Bearbeiten/Aktualisieren!

Dreißig Sekunden in Google Translate hat mich dazu gebracht, zu entdecken, dass Ihr Array Übersetzungen enthält den Schlüssel entspricht. Vielleicht möchten Sie die Funktionen Internationalization & Localization von CakePHP untersuchen, um die Unterscheidung zwischen englischen und russischen Begriffen für oben/links/rechts/unten (und alles andere) wegzuspalten.

+0

danke Daniel für Lösungen, aber das ist nicht für die Übersetzung, es ist nur die Art der adv Ort zu definieren. – baur79

Verwandte Themen