Действия

FAQ по программированию для Joomla

Материал из База знаний Joomla

Это статья из раздела Программирование для 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',$по_умолчанию);

поясняю парметры:

  1. массив с классами
  2. имя селекта (уйдет в _POST)
  3. доп штуки, обычно пишут это
  4. имя поля объектов, в массиве $classes который сохраняется в <option value='сюда'></value>
  5. имя поля объектов, из которых состоит входной массив - <option ...>имя</value>
  6. значение для 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

Если в файле содержится код, который напрямую выполняется (будь то включение других файлов с использованием в путях каких-либо переменных, вызов фукнций или просто манипуляция с другими переменными) - требовать данную константу стоит. Если же это языковой файл, где следуют просто присвоения переменных или файл с классами или описаниями функций - то большого смысла требовать ее объявленности нет - она ни на что не повлияет, все равно код не исполняется, даже посредством прямого вызова файлов.