Этой статьей открываю новый раздел сайта. В нем будут перечислены все мои находки, которые могут послужить кому-то еще. Найдены в англоязычных источниках
Получить полный 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); }
Комментарии