Используйте CakePHP $ this внутри функции PHP

#php #cakephp

#php #cakephp

Вопрос:

У меня есть следующий код:

 function search_reset ()
{
    $search_query = $_GET['q'];

    if($search_query)
    {
        echo $this->Html->link('Clear', array('controller' => 'home', 'action' => 'index'), array('title' => 'Clear search query'));
    }   
}
  

Но это вызывает следующую ошибку: Fatal error: Using $this when not in object context in /Users/cameron/Sites/smplr/app/views/search/index.ctp on line 9

У меня есть два вопроса:

1.) Что я использую ВМЕСТО $this , когда внутри функции? 2.) Куда бы я поместил пользовательскую функцию, подобную этой? Поскольку я не могу поместить это в свой контроллер, поскольку это НЕ действие.

Комментарии:

1. является ли search_reset() классом?

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

3. $this доступно только в методах объектов. Это связано с PHP и не относится конкретно к CakePHP.

4. Если вы хотите использовать this для этой конкретной функции и хотите сохранить функцию изолированной (не делать ее методом класса), вы должны передать объект функции: function search_reset($this)

5. @Frankie Я хочу сделать эти функции доступными на ВСЕМ САЙТЕ, есть идеи о том, как я мог бы это сделать? Спасибо

Ответ №1:

@Cameron, вот как вы делаете это доступным для всего сайта. Сначала создайте свой пользовательский помощник и поместите его в каталог views / helpers / как search_reset.php

 <?php
class SearchResetHelper extends AppHelper {

  var $helpers = array('Html');  // include the HTML helper

  /**
  * @param string $query, This is the search query you will pass from the view
  */
  function reset_link($query = null) {
     if($query == null) {
        return;
     }    

    if(!empty($query)) {
        return $this->Html->link('Clear', array('controller' => 'home', 'action' => 'index'),  array('title' => 'Clear search query'));
    }
  }
}
  

Теперь в вашем контроллере убедитесь, что вы включили это в массив $ helpers вверху:

 var $helpers = array('SearchReset','any','other','helpers');
  

Теперь, на ваш взгляд, вы просто вызываете:

 <?php echo $this->SearchReset->reset_link($_GET['q']); ?>
  

Затем вы получите ссылку по мере необходимости. Это будет работать в любом представлении, пока вы вызываете помощника в контроллере.

Удачного кодирования!

Комментарии:

1. Потрясающе! Итак, я предполагаю, что то, что обычно было бы функцией на обычном веб-сайте PHP, становится помощником при работе с MVC?

2. Правильно. Вы могли бы добавить функцию к каждому представлению, но тогда это противоречит цели архитектуры. Это позволяет использовать ее повторно во ВСЕХ представлениях. Другими вариантами было сделать так, как предложил @deceze, и поместить это в app_helper. Я предпочитаю быть избирательным в отношении того, что я добавляю в свой app_helper. Когда я создаю помощников, мне нравится делать их переносимыми в другие приложения без необходимости использования всего app_helper.

3. На ваш взгляд, вызовите <?php echo $this-> SearchReset->reset_link($_GET[‘q’]); ?>

4. @mac, вы правы. Теперь, с CakePHP 2.x, $this требуется. Когда это было написано, $SearchReset это было приемлемо в CakePHP 1.x.

Ответ №2:

Я хочу сделать эти функции доступными по ВСЕМУ САЙТУ, есть идеи о том, как я мог бы это сделать?

Создайте свой собственный помощник или добавьте его в качестве метода в AppHelper.

Комментарии:

1. Допустим, я добавляю эти функции в свой app_helper, как мне получить к ним доступ? Поскольку простой вызов функций не работает?

2. @Cameron AppHelper — это базовый класс, от которого наследуются все помощники. Т.е. любой метод, который вы добавите в класс AppHelper, будет иметь любой помощник. Т.е. вы можете вызвать $this->Html->search_reset() , например.

Ответ №3:

Поскольку она находится в вашем ctp, у вас есть к ней прямой доступ (без $ this). Вы должны просто иметь возможность написать функцию в своем шаблоне и включить как глобальную:

 function search_reset ()
{
    global $html;
    $search_query = $_GET['q'];

    if($search_query)
    {
        echo $html->link('Clear', array('controller' => 'home', 'action' => 'index'), array('title' => 'Clear search query'));
    }   
}
  

Чтобы включить html helper в контроллер вашего приложения:

 class AppController extends Controller {    
    public function constructClasses(){
        //Apply App helpers and merge with controller helpers 
        $helpers = array('Html','Javascript' /*add whatever you want, these are global*/);
        //merge global, controller helpers
            $this->helpers = array_merge($this->helpers, $helpers); 
        parent::constructClasses(); 
    }
}
  

Приведенный выше код объединит указанные там помощники с любыми другими помощниками, указанными в вашем контроллере. Затем вы можете использовать $ html helper в любом файле ctp.

Комментарии:

1. Не работает :/ вызывает эту ошибку: Неустранимая ошибка: вызов функции-члена link() для не-объекта в /Users/cameron /Sites / smplr /app / views / search / index.ctp в строке 10` НО должен ли я вообще помещать подобную функцию внутри представления?

2. Я делаю это. Я не вижу проблемы с локальной функцией для просмотра. Вы уверены, что этот помощник включен правильно? Работает ли $html-> link() вне функции?

3. Ну $html->link это pre 1.3 cake, и я включил помощника, но все равно получаю ошибку. Но как насчет перемещения функции куда-нибудь еще, чтобы она была доступна по ВСЕМУ САЙТУ? Куда бы это пошло?

4. $html->link() приходит из помощника Html. Если у вас ее нет в вашей версии и вы не можете ее обновить, я предлагаю создать свой собственный помощник, который делает то, что вы хотите, и включить его в ваши контроллеры. Вы также можете создать app_controller (в корне вашего приложения), куда вы можете включить помощников для всех контроллеров, если хотите, чтобы это было на уровне всего сайта.

5. Я поместил эти функции внутри app_controller, но они не работают? Хотите показать пример того, как разрешить их внутри файла? Кроме того, помощник написан не так, $html-> как сейчас $this->Html в 1.3, другой больше не работает!