Этой статьей открываю новый раздел сайта. В нем будут перечислены все мои находки, которые могут послужить кому-то еще. Найдены в англоязычных источниках
Получить полный 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 запросе
1 2 3 | $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
1 | $db =JFactory::getDBO(); $db ->setQuery( "SELECT * FROM #__modules WHERE id='$module_id' " ); $module = $db ->loadObject(); return JModuleHelper::renderModule( $module , $params ); |
Выполнить обычный SQL запрос
1 | $data = JFactory::getDbo()->setQuery( 'select * from #__contents' )->loadObjectList(); |
Но сниппет был про выполнение поэтому просто
1 | $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); } |
Комментарии