Этой статьей открываю новый раздел сайта. В нем будут перечислены все мои находки, которые могут послужить кому-то еще. Найдены в англоязычных источниках

Получить полный sef URL

Класс JRoute::_ генерирует относительный путь по умолчанию. Когда надо вставить ссылку в письмо, необходим полный путь. это делается очкень просто

JRoute::_('index.php?option=...', true, -1);

Подгрузить свои jhtml классы

JHtml::addIncludePath(JPATH_ROOT.'/templates/udom/helpers');

тогда если в папке лежит

abstract class JHtmlXDResizer { function thumb ($argument1, $argument2) { //code } }

То его можно будет использовать так

jhtml::_('xdresizer.thumb', $argument1, $argument2);

Подгрузить кастомные поля

JFormHelper::addFieldPath(dirname(__FILE__));

Как их использовать смотри ниже

Получить текущий не SEF URL

Разбираясь в чужом сайте, часто возникает проблема определения - куда ведет тот или иной SEF url. В моей практике это была ссылка /user которая оказалось ведет не в компонента com_users а в ?Itemid=206&option=com_virtuemart&limitstart=0&limit=int&view=user

да, тут проще было посмотреть в Менеджере меню, но бывают случаи, когда SEF задает какой-нибудь компонент типа Artio или SEF404. Тогда такой номер не пройдет. Берем следующий код и вставляем его в любом месте шаблона

JURI::current();
$router = JSite::getRouter();
$query = $router->parse(JURI::getInstance());
echo $url = 'index.php?'.JURI::getInstance()->buildQuery($query);

Вы всегда будете видеть текеущую маршрутизацию

Как в Joomla получить значение параметра у другого модуля по id

$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('m.*');
$query->from('jml_modules AS m');
$query->where('id = '.JRequest::getInt('module_id'));
$db->setQuery($query);
$module = $db->loadObject();
$params = new JRegistry($module->params);
$email = $params->get('email','vasya@mail.ru');

Как отправить email в Joomla

$config =& JFactory::getConfig();
JUtility::sendMail($config->getValue('config.mailfrom'), $config->getValue('config.fromname'), $email, 'Новая заявка', '<p>'.$html.'</p>', true, null, null, $filename );

при этом для России актуально отправлять письмо в utf-8 кодировке. Метод не дает такой настройки, но при дальнейшем изучении видно, что он является лишь надстройкой над другим классом jMail, который в свою очередь наследует знаменитый phpmailer

Обратимся напрямую к нему:

$mail = JFactory::getMailer(); // возвращает экземпляр jMail
$mail->CharSet = 'UTF-8';
$mail->sendMail($config->getValue('config.mailfrom'), $config->getValue('config.fromname'), $email, 'Новая заявка', '<p>'.$html.'</p>', true, null, null, $filename);

Как получить значение в POST, GET запросе

$jinput = JFactory::getApplication()->input;
$id = $jinput->get('id', 0,'INT');
function xdsoft_decode_magic ($value) { return get_magic_quotes_gpc()?stripslashes($value):$value; } $coordinates = xdsoft_decode_magic($jinput->get('coordinates', '[0,0]','RAW'));

По умолчанию, третьим параметром идет STRING - это значит, что все левые символы - кавычки и т.к. далее из строки будут удалятся. Доступны следующие фильтры

  • INT
  • INTEGER
  • UINT
  • FLOAT
  • DOUBLE
  • BOOL
  • BOOLEAN
  • WORD
  • ALNUM
  • CMD
  • BASE64
  • STRING
  • HTML
  • ARRAY
  • PATH
  • RAW
  • USERNAME

Подробнее тут

Как в Joomla получить результирующий SQL запрос

Часто во время отладки чужого кода, написанного на DBO, для отладки необходимо узнать - какой SQL код генерирует в итоге Joomla. В этом нам поможет простой метод dump

$db = JFactory::getDbo(); $query = $db->getQuery(true); $query->select('m.*'); $query->from('jml_modules AS m'); $query->where('id = '.JRequest::getInt('module_id')); echo $query->dump();

Загрузить файл на сервер

В форме исправляем enctype на enctype="multipart/form-data" , в нее вставляем обычный <input type="file" name="jform[filename]">

Где-либо в компоненте, вставляем обработку приема фала. Если это православная CRUD система, то можно засунуть это в метод check в соответствующую JTable в папке tables

jimport('joomla.filesystem.file'); jimport('joomla.filesystem.folder');
jimport('joomla.filesystem.path');
$max = ini_get('upload_max_filesize');
$app = JFactory::getApplication();
$input = $app->input;
$file= $input->files->get('jform');
$file = $file['file']; 
if (!empty($file['error'])) { 
$this->setError(JText::_('COM_ROBOKASSA_ERROR_IN_UPLOAD_NATIVE').$file['error']); 
return false; 
}
if (!empty($file) and !empty($file['tmp_name']) and $file['size']) {
$filename = JFile::makeSafe($file['name']);
$robo = JPATH_ROOT . DS . "media" . DS .'robokassa';
if (!is_dir($robo)) { 
JFolder::create($robo, '0666');
}
$path = $robo.DS.'files';
if (!is_dir($path)) {
JFolder::create($path, '0666');
}
if (JPath::canChmod($path)) {
JPath::setPermissions($path, '0777', '0777');
}
$extension = JFile::getExt($file['name']);
if (in_array($extension, array('php', 'phtml'))) { 
$this->setError(JText::_('COM_ROBOKASSA_ERROR_ONLY_THESE_TYPES')); return false; } 
do{ $randname = md5($filename.rand(100, 200)).'.'.$extension; }while(file_exists($path . DS . $randname)); 
if (!JFile::upload($file['tmp_name'], $path . DS . $randname)) { 
$this->setError(JText::_('COM_ROBOKASSA_ERROR_IN_UPLOAD')); return false; 
} 
if ($this->file and file_exists($path . DS . $this->file)) { 
JFile::delete($path . DS . $this->file); }
$this->file = $randname; $this->filename = $filename;
if (JPath::canChmod($path)) { JPath::setPermissions($path, '0644', '0744'); } }

Посмотреть все доступные glyphicons в joomla3

При разработке часто приходится использовать различные иконки. В Joomla 3.x появился Bootstrap 2.3 и все его фишки, в том числе glyphicons. Однако Joomla команда переопределила все эти иконки и создала собственный список иконок. Посмотреть его можно тут

Загрузить любой модуль по его ID в своем коде php

$db =JFactory::getDBO(); $db->setQuery("SELECT * FROM #__modules WHERE id='$module_id' "); $module = $db->loadObject(); return JModuleHelper::renderModule($module, $params);

Выполнить обычный SQL запрос

$data = JFactory::getDbo()->setQuery('select * from #__contents')->loadObjectList();

Но сниппет был про выполнение поэтому просто

$data = JFactory::getDbo()->setQuery('insert into #__contents values(1,2,34,5,6)')->execute();

Больше примеров выборки и методов и вставки, удаления и обновления

Полный список методов объекта JFactory::getDbo() смотрим в документации или в исходном коде

Как вывести произвольный модуль в php

jimport('joomla.application.module.helper');
$module = JModuleHelper::getModule('mod_yourmodulename','YourModuleTitle');
echo JModuleHelper::renderModule($module); 

Как использовать стандартное media поле через php

$media = JFormHelper::loadFieldType('media', true);
$media->setForm($this->form); // $this->form можно заменить на new JForm('name')
$media->setup(simplexml_load_string('<field/>'), null);
echo $media->getInput(); 

На второй строке надо либо создать новую форму new JForm('name'), либо использовать существующую. На третьей строке в <field/> можно вписать все параметры отсюда, по коду их больше, можете посмотреть их в самом файле libraries/cms/form/field/media.php. null - это значение поля, т.е. если у вас там что-то есть из базы, то вставляйте место NULL

Вообще так можно использовать любые поля из списка. У каждого типа есть свои заморочки, и настройки. Поэтому нужно использовать оглядкой на исходный код

Исходники разбросаны по Joomla

libraries/cms/form/field/
libraries/joomla/form/fields/
legacy/form/field/

Может так случится, что вы захотите использовать какое-то свое поле, для этого Joomla надо сообщить где его искать

JFormHelper::addFieldPath(JPATH_COMPONENT . '/models/fields');

Теперь выведем тип Category

Тоже самое можно сделать и в форме или config.xml. Т.е. сли мы захотим использовать не стандартное поле то можно указать в xml файле, где-нибудь в fielset или fields

<fieldset name="base" label="Основные настройки" description="" addfieldpath="/administrator/components/com_yandex_maps/models/fields">
$category = JFormHelper::loadFieldType('category', true); $category->setForm($this->form);// работает без этой строки $category->setup(simplexml_load_string('<field name="category_id" extension="com_content" show_root="true"/>'), null); echo $category->getInput(); 

Получить категорию по ID

$category = JCategories::getInstance('Content')->get((int)$id);

Получить материал по ID

JModelLegacy::addIncludePath(JPATH_ROOT . '/components/com_content/models', 'ContentModel'); $article = JModelLegacy::getInstance('Article', 'ContentModel', array('ignore_request' => true)); $article->setState('filter.published', 1); $article->setState('article.id', (int) $id); $article->setState('params', JFactory::getApplication('site')->getParams()); $material = $article->getItem();

Получить все материалы определенной категории

$articles = JModelLegacy::getInstance('Articles', 'ContentModel', array('ignore_request' => true)); $articles->setState('params', JFactory::getApplication()->getParams()); $articles->setState('filter.category_id', 8); $items = $articles->getItems();

Как через php вывести всю позицию модулей

$document = &JFactory::getDocument(); $renderer = $document->loadRenderer( 'modules' ); $options = array( 'style' => 'raw' ); echo $renderer->render( 'header', $options, null);

Загрузить настройки другого плагина

$plgParams = new JRegistry(); $plugin = JPluginHelper::getPlugin('system','languagefilter'); if ($plugin && isset($plugin->params)) { $plgParams->loadString($plugin->params); }

Оставлять комментарии могут только зарегистрированные пользователи

Комментарии  

Елена76
# Елена76 14.08.2014 18:33
отличная статья по Joomla
# Guest 31.03.2015 19:30
Комментарий был удален администратором