#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, другой больше не работает!