Доступ к переменным вида изнутри функций в CakePHP - PullRequest
1 голос
/ 26 октября 2010

Представьте себе типичное приложение CakePHP, в котором контроллер передает различные биты данных в представление, используя $this->set типичным способом:

class ThingsController extends AppController {
    function test() {
        $this->set('someparam', 5);
    }
}

Если соответствующий View должен был определить и использовать небольшую вспомогательную функцию, которая выводит некоторый HTML, есть ли способ получить доступ к этой переменной $some_param из функции? Я бы подумал, что вы можете просто обращаться к ней как к глобальной переменной, но она всегда выходит со значением NULL.

<?php
function helper_function() {
    global $someparam;
    echo var_dump($someparam); // Just prints NULL
}
?>
<h1>I am a View!</h1>
<?php helper_function(); ?>

Если честно, еще более простой вариант использования для helper_function - возможность доступа к таким вещам, как $html и $javascript помощники.

Ответы [ 3 ]

1 голос
/ 26 октября 2010

В описанной вами ситуации вы будете работать со значением после того, как вы установите его для представления. Вы можете изменить или не изменить это значение. В любом случае это может сбить с толку. Было бы понятнее - и сделать жизнь проще, когда вы забыли, как работает это приложение - сделать что-то вроде

function test() {
    $myVar = 5;
    $this->helper_function($myVar);
    $this->set('some_param', $myVar);
}

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

Это:

<h1>I am a View!</h1>
<?php helper_function(); ?>

просто не правильно (если вы написали функцию в контроллере). Я бы вызвал эту функцию в действии контроллера представления и передал результат в виде переменной. Просто попробуйте запомнить, используйте контроллер до , подготовьте данные для представления. Используйте просмотр до отображения данных.

Почему бы не написать свой собственный помощник? Казалось бы, это способ решить ваши проблемы.

1 голос
/ 26 октября 2010

Представление не входит в глобальную область, и $this->set() не делает переменную доступной для глобальной области.

Если вы хотите, чтобы переменная была доступна в helper_function(), просто передайте ее в качестве аргумента:

function helper_function( $arg )
{
    // Do stuff with $arg here
}

Доступ к другим помощникам - это , что может сделать пользовательский помощник:

class SomeHelper extends AppHelper 
{
    // Use the same syntax as the controller to add helpers to your custom helper
    var $helpers = array('Html','Javascript','Form');

    // Then in the methods, refer to these other helpers thus:
    function helper_function( $arg )
    {
        $out = '';
        $out .= $this->Html->div('class','text here');

        $this->Javascript->codeBlock("some jQuery here",array('inline'=>false));

        $out .= $this->Form->input('Model.fieldName',array('type'=>'hidden','value'=>$arg));

        return $out;
    }
}
0 голосов
/ 26 октября 2010

используйте configure :: read и write - Похоже, что они являются своего рода конфигурацией в вашем приложении

таким образом, вы можете получить к ним доступ где угодно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...