FAQ по программированию для Joomla
Как получить доступ к имени текущего пользователя
global $my; //$my->username - логин //$my->name - имя, указанное при регистрации //$my->id - идентификатор юзера, из таблицы #__users var_dump($my);
Как мне из своего компонента поменять title у страницы
global $mainframe; $mainframe->setPageTitle("Hello")
Как мне из своего компонента поменять description и keywords
global $mainframe; $mainframe->appendMetaTag( 'description', 'Описание' ); $mainframe->appendMetaTag( 'keywords', 'Ключевые слова' );
Как обращаться к базе данных, читать и записывать данные
Прочтите статью Работа с базой данных в Joomla.
Где задаются пункты меню для админки компонента
В XML-файле компонента, в тэге «<menu>».
Зачем нужен префикс «#__» в именах таблиц
Это псевдо префикс (там два подчеркивания). В методе setQuery() он будет заменен на реальный префикс, записанный в конфиге.
Как хранить ассоциированную с пользователем информацию
В Joomla нет встроенного механизма, поэтому надо использовать сессии.
Как редактировать объекты — строки таблицы и манипулировать ими
Можно использовать класс database и прямо в нем делать запросы типа INSERT или UPDATE, а можно использовать встроенный механизм — класс mosDBTable и его методы bind(), check() и store(). Более подробно об этом написано в статье Использование mosDBTable
Как сделать captcha в моем компоненте
Есть вариант с securityImages, но они тяжелые очень. Поэтому проще всего взять класс генерации рисунков на captcha.ru.
Я генерирую картинку и хочу вывести ее пользователю, но Joomla выводит свой код, а я хочу только изображение
Для этого все запросы фронта переправляйте на URL
/index2.php?option=com_компонент&task=xxx&no_html=1
. Для админки это index3.php. Тут будет выведен только ваш компонент, и ничего более. Вы даже можете выводить тут свои заголовки функцией header.
Возникает ошибка Fatal error: Cannot redeclare functionName() (previously declared in modules\mod_XXXX.php:7) in modules\mod_XXXX.php on line ZZ
Т.е. вы делаете модуль и совершаете одну частую ошибку — объявляете функцию внутри файла mod_xxxx.php. Все дело в том, что если модуль будет скопирован на другую позицию, то этот файл будет включен снова — и произойдет попытка снова объявить эту функцию. Вариантов решения два:
- Объявлять функцию внутри блока
if(!function_exists('functionName')) { function functionName() {...} }
- Вынести функцию в отдельный файл и включать его при помощи require_once. А этот файл копировать при установке модуля рядом с ним (надо добавить строчку в xml-файл)
Как построить select-список из данных, хранящихся в БД
Рассмотрен пример абстрактной таблицы #__classes. Никакого мануала, просто пример использования. Выдрано из контекста левой задачи.
$database->setQuery("SELECT id,name FROM #__classes ORDER BY id"); $classes = $database->loadObjectList();
в форме надо выдать селект-список
mosHTML::selectLIst($classes,'idclass','class="inputbox" size="1"', 'id','name',$по_умолчанию);
поясняю параметры:
- массив с классами
- имя селекта (уйдет в _POST)
- доп штуки, обычно пишут это
- имя поля объектов, в массиве $classes который сохраняется в <option value=’сюда’></value>
- имя поля объектов, из которых состоит входной массив — <option …>имя</value>
- значение для 4 по умолчанию
где $classes — массив из $class->id — айдишник записи, $class->name — имя класса (такие поля находятся в БД)
Как в админке заблокировать меню, при работе своего компонента
Параметр называется hidemainmenu. Если 0 — показать меню, 1 — скрыть меню. Достаточно в url добавить параметр &hidemainmenu=1 что бы меню было не доступно.
Есть ли шаблонизатор в Joomla
Нет. Точнее есть — patTemplate, но им пользуются только разработчики, да и то только в теории. Странный он и не интересный. Если вы раньше пользовались Smarty или XTemplate — продолжайте их использовать.
Как создать js-окно с подтверждением перехода по ссылке (например удаления объекта)
<a href='#' onClick="javascript:if(confirm("Вы уверены?")) document.location='xxx.yyy.zzz';" >
Какая функция используется для получения входных данных
$param = mosGetParam($_REQUEST,'имя','по_умолчанию')
Первый параметр — входной массив, второй — имя переменной, а третий — если ее там нет — то будет взято это значение. Помните, что после этой функции данные уже будут безопасными для вставки в базу данных (слэши будут добавлены, SQL-injection не пройдет). Если хочется записать их в файл — надо сделать:
$param = stripslashes($param);
Обратите внимание на особенность этой функции. Если вы хотите получить строковый параметр, то «значение_по_умолчанию» должно быть пустой строкой, а если числовой, то нулем. Если вы захотите например сделать так:
$task = mosGetParam($_REQUEST,'task',0);
То даже если в адресе передано index.php?option=com_xxx&task=zzz, то строки zzz вы в переменной не увидите. Надо вместо нуля использовать пустую строку:
$task = mosGetParam($_REQUEST,'task',"");
Если вы получаете числовой параметр (например ID), очень желательно делать приведение к целому:
$abc = (int)mosGetParam($_REQUEST,'abc',0);
Но это не снимает с вас ответственности в борьбе с SQL-Injection
Какие еще системные переменные можно использовать
- $mosPageNav — генерация постраничной навигации
+ в любом случае надо прочитать статью API функции Joomla.
Чем отличается работа в режиме стандартного SEF от обычного режима
Этот вопрос был создан только для того, что бы рассказать об одной не очевидной вещи — в режиме стандартного SEF нельзя пользоваться переменной
$_SERVER['REQUEST_URI']
Дело в том, что в внутри компонента данный элемент массива уже не будет совпадать с тем, что содержится в адресной строке.
Когда нужно использовать константу _VALID_MOS
Если в файле содержится код, который напрямую выполняется (будь то включение других файлов с использованием в путях каких-либо переменных, вызов функций или просто манипуляция с другими переменными) — требовать данную константу стоит. Если же это языковой файл, где следуют просто присвоения переменных или файл с классами или описаниями функций — то большого смысла требовать ее объявлений нет — она ни на что не повлияет, все равно код не исполняется, даже посредством прямого вызова файлов.