Определите константу глобального массива для использования в представлении - PullRequest
5 голосов
/ 23 ноября 2010

Я хочу определить константу глобального массива

код в bootstrap.php

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

код в файле вида

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

, но cakephp выдает ошибку:

"Неопределенная переменная: adv_types"

Ответы [ 2 ]

8 голосов
/ 23 ноября 2010

К сожалению, область действия bootstrap.php равна bootstrap.php, поэтому переменная $adv_types выйдет из области видимости, как только PHP завершит синтаксический анализ bootstrap.php.

. Существует несколько подходов, которые вы можете использовать.может принимать, в зависимости от ваших фактических требований.

Решение 1: вам нужны эти переменные во многих ваших представлениях

Если вам нужна переменная, которая будет доступна во всех представлениях, вы должны определить и установить его в AppController::beforeRender().

В app/app_controller.php:

class AppController extends Controller
{

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

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

Это позволит любому из ваших представлений получить доступ к массиву $adv_types.

Решение 2: вам может понадобиться доступ к этой переменной в любом месте вашего приложения CakePHP

Если вам нужен доступ к переменной $adv_types в другом месте вашего приложения, вы можете добавить ее вConfigure коллекция.В bootstrap.php:

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

я рекомендую использовать имя вашего проекта в качестве псевдо-пространства имен;adv_types вряд ли конфликтует с другими идентификаторами, но если вы начнете использовать этот подход чаще, ваши шансы на создание конфликтов возрастут.Кроме того, это позволяет группировать данные, хранящиеся в коллекции Configure, в одном пространстве имен, что может быть удобно для отладки.

В любом случае, этот подход позволит вам получить доступ к переменной в любой областипод зонтиком CakePHP, вызвав Configure::read().Таким образом:

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

Решение 3: вы обязательно должны иметь эту переменную в качестве глобальной переменной

Если вы абсолютно должны иметь это какстандартная глобальная переменная PHP, вы можете сделать следующее:

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

Перед этим , пожалуйста, подумайте, строго ли это необходимо .Глобальные переменные - это действительно грязный бизнес, и у вас должна быть ясная и существующая потребность для ее обоснования.


Редактировать / обновить!

Тридцать секунд в Google Translate позволили мне обнаружить, что ваш массив содержит переводы, соответствующие ключам.Возможно, вы захотите изучить возможности Интернационализация и локализация в CakePHP, чтобы абстрагироваться от различий между английскими и русскими терминами top / left / right / bottom (и всем остальным).

5 голосов
/ 23 ноября 2010

Они должны быть установлены в вашем app_controller.php, а затем переданы в ваши представления

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

Для меня bootstrap.php не является правильным файлом для этой константы

...