#php #octobercms
#php #octobercms
Вопрос:
Я пытаюсь объявить и вызвать функцию в php
разделе частичного кода, но october ее не видит. Вот как выглядит код:
function onStart() {
return sayHi();
}
function sayHi() {
return 'Hi';
}
Не могли бы вы сказать мне, что в этом плохого?
Разрешены ли здесь только те функции, которые относятся к жизненному циклу страницы? (OnStart(), onEnd(), OnInit(), OnRun() .. и т.д.)
Комментарии:
1. Вы прошли через это octobercms.com/docs/cms/partials ?
Ответ №1:
Иногда в таких вопросах было бы полезно включить фактическое сообщение об ошибке, которое вы получаете, если оно есть, чтобы люди не начали дико гадать в неправильном направлении. И в этом случае на самом деле должно появиться сообщение об ошибке типа:
ОШИБКА: вызов неопределенной функции SayHi()
Причина этой ошибки здесь в том, что функции в разделе кода шаблона определены не в глобальной области видимости, а как методы некоторого объекта. Таким образом, чтобы ссылаться друг на друга, вам пришлось бы предварять каждый вызов перекрестной функции внутри раздела $this->
, чтобы указать, что вы вызываете метод текущего объекта, а не глобальную функцию.
Изменение вашей ònStart()
функции на
function onStart() {
return $this->sayHi();
}
должно заставить ее работать.
Тем не менее, вы можете подумать о том, чего вы хотите достичь с помощью этого оператора return. При том, как разработаны OnStart() и другие функции жизненного цикла в October, оператор return обычно не ожидается. Но если она существует, цикл выполнения страницы в этот момент останавливается, и возвращаемое значение просто отправляется в качестве ответа обратно в браузер.
Если вы просто хотите отобразить сообщение «Привет» на странице (и перед всем остальным), то, возможно, вам лучше сделать это следующим образом:
function onStart()
{
$this->sayHi();
}
function sayHi()
{
echo "<h1>Hi!</h1>";
}
так что цикл рендеринга страницы все еще продолжается после этого. Но на самом деле это все равно было бы бесполезно, потому что "<h1>Hi!</h1>"
теперь выводится перед всем остальным (то есть перед открывающим <html>
тегом или чем-то еще, что находится вверху).
Я предполагаю, что на самом деле вы не хотели использовать ее таким образом, кроме как в целях тестирования функциональности, но в любом случае, подумал, что было бы неплохо объяснить, чтобы люди получили представление о том, что на самом деле там происходит, если они наткнутся на это. 😉
(В связи с этим, вот некоторая документация о правильном использовании для отправки пользовательского ответа в OctoberCMS.)
(Если вы хотите создать специальное сообщество stackechange для OctoberCMS, пожалуйста, поддержите предложение octobercms.stackexchange. Я удалю это раздражающее сообщение, как только эта цель будет достигнута — обещаю 🙂 )
Комментарии:
1. Большое тебе спасибо, троллкотце, ты спас мой день! И да, вы правы, я хотел функциональность 🙂
2. Спасибо, что дали мне знать. Если это решило вашу проблему, я был бы признателен, если бы вы приняли ответ . Таким образом, я получаю больше репутации, и люди также могут сразу увидеть, что эта проблема решена.
3. Кроме того, если вы еще не сделали этого, пожалуйста, поддержите предложение о выделенном разделе OctoberCMS stackexchange здесь . Как только мы получим по крайней мере 200 пользователей, согласившихся поддержать это, и некоторые с достаточной репутацией в других местах, предложение будет принято. Итак, ваш небольшой вклад мог бы помочь всем нам получить лучшее централизованное место для создания базы знаний OctoberCMS Q amp; A на этой замечательной платформе stackexchange. 🙂
Ответ №2:
попробуйте:
function sayHi() {
return 'Hi';
}
function onStart() {
return sayHi();
}
в противном случае, когда выполнение достигнет, return sayHi();
оно не будет знать функцию sayHi()
. немного литературы об этом …
Комментарии:
1. единственная причина, по которой функция не распознает другую, заключается в том, что она объявляется и вызывается из точки в коде, где другая не объявлена, поэтому я считаю, что ваша проблема зависит от того, как организован ваш код и в каком порядке «компилируются» ваши файлы…