Компоненты

Когда вы разрабатываете расширение Joomla, вы определяете пространство имен, которое хотите использовать в своем файле манифеста, например, для com_example:

<namespace path="src">Mycompany\Component\Example</namespace>

Давайте рассмотрим различные части этого:

  • Mycompany – вы можете указывать здесь все, что вам нравится - обычно указывается название компании, разработавшей расширение.

  • Component – для этого параметра должно быть установлено значение Component, если ваше расширение Joomla является component

  • Example – это должно соответствовать названию компонента, который вы разрабатываете

  • src – это подпапка, в которой вы храните файлы вашего класса. Вам не обязательно называть это так, но это обычная практика.

Из этого файла манифеста Joomla создаст 2 префикса пространства имен:

  • 'Mycompany\Component\Example\Site' будет указывать на components/com_example/src
  • 'Mycompany\Component\Example\Administrator' будет указывать на administrator/components/com_example/src

(Предполагая, что в вашем компоненте есть аспекты site и administrator).

Модули

Вы бы сделали то же самое для модулей:

<namespace path="src">Mycompany\Module\Example</namespace>
<files>
	<filename module="mod_example">mod_example.php</filename>
	<folder>src</folder>
	<folder>tmpl</folder>
</files>

Необязательно сопоставлять "Example" в пространстве имен с "mod_example" – именем модуля, – но вам, вероятно, будет проще это сделать.

Если это модуль сайта, то Joomla создаст префикс пространства имен:

'Mycompany\Module\Example\Site' будет указывать на modules/mod_example/src

Если это модуль администрирования, то Joomla создаст префикс пространства имен:

'Mycompany\Module\Example\Administrator' будет указывать на administrator/modules/mod_example/src

Плагины

Для плагинов:

<namespace path="src">Mycompany\Plugin\Content\Example</namespace>
	<files>
		<filename plugin="example">example.php</filename>
		<folder>src</folder>
	</files>

Здесь есть дополнительная часть пространства имен, которой необходимо присвоить тип плагина – 'Content' в примере выше.

И снова сегмент 'Example' в пространстве имен не обязательно должен точно соответствовать имени плагина plugin= "example" плагина.

Для приведенного выше Joomla создала бы префикс пространства имен:

'Mycompany\Plugin\Content\Example' будет указывать на plugins/content/example/src

Капитализация

Будьте осторожны, чтобы заглавные буквы в частях полного имени класса совпадали с заглавными буквами в названиях каталогов и файлов! Если вы разрабатываете в Windows, но вашей целевой системой является Linux, вы можете обнаружить, что ваше расширение работает на вашей машине разработки, но не в вашей целевой системе. Это связано с тем, что Windows прощает, если вы неправильно пишете заглавные буквы в именах файлов или каталогов – она все равно откроет файл для вас, – но Linux - нет.

Поиск своих занятий

После того как вы определились со своими пространствами имен, вы можете определить, где будут располагаться файлы вашего класса. Компоненты Joomla используют довольно плоскую структуру каталогов в src, но вы этого не придерживаетесь. Пока вы придерживаетесь рекомендации PSR4 по сопоставлению полных имен классов с путями к файлам, Joomla найдет исходные файлы для ваших классов. Прошли те времена, когда вам приходилось угадывать, в каком каталоге хранить ваш вспомогательный файл и какое имя присвоить файлу!

Однако есть один случай, когда вам нужно протянуть Joomla руку помощи - в форме XML-файлов.

  • если вы определяете пользовательское поле, вам нужно указать Joomla, где найти класс, который определяет это пользовательское поле
  • если вы определяете пользовательское правило проверки, вам нужно указать Joomla, где найти класс, который определяет это правило

Поскольку XML-файлы не содержат операторы PHP <namespace>, которые вы должны предоставить, эквивалентны, и проще всего сделать это, включив атрибут addfieldprefix или addruleprefix внутри XML-элемента, который указывает, где вы их используете, например:

<?xml version="1.0" encoding="utf-8"?>
<form
    addruleprefix="Mycompany\Component\Example\Administrator\Rule"
    addfieldprefix="Mycompany\Component\Example\Administrator\Field"
    >

Глобальное пространство имен PHP

Если у вас есть <namespace> оператор в вашем исходном файле PHP, тогда PHP по умолчанию предположит, что любые имена классов, на которые вы ссылаетесь в своем коде, будут находиться в этом пространстве имен. Поэтому, если вы используете какие-либо стандартные классы PHP, такие как Exception, вам придется предварять их обратной косой чертой \Exception. Обратная косая черта в начале указывает PHP, что это полное имя класса, и поскольку в этом FQN есть только один сегмент, он будет найден в глобальном пространстве имен.

Аналогично, если вы используете функцию, PHP попытается найти эту функцию в вашем пространстве имен. Но в отличие от classes, если он не найдет функцию в вашем пространстве имен, он вернется к поиску ее в глобальном пространстве имен. Так что это немного повысит производительность, если вы скажете PHP не утруждать себя поиском в вашем пространстве имен, добавив к имени функции обратную косую черту, например \strlen(...). Иногда вы увидите, что это присутствует в PHP-коде Joomla.