Новости Joomla

Совет по Joomla: $db->getQuery(true) стал устаревшим

Совет по Joomla: $db->getQuery(true) стал устаревшим

👩‍💻 Совет по Joomla: $db->getQuery(true) стал устаревшим.Раньше при создании запросов в базу данных мы всегда получали объект запроса с помощью метода

getQuery(). Если передавался параметр
$new =
true, то получали новый запрос. Если без - последний.

use Joomla\CMS\Factory;$db = Factory::getContainer()->get('DatabaseDriver');$query = $db->getQuery(new: true);// и строим запрос
Под капот Joomla 4 вошёл Joomla Framework (PHP фреймворк а-ля Laravel, Yii и т.д.), а для Joomla 5 он обновился - версия 3.4.1 вышла 6 октября 2023г. В методе фреймворка есть примечание о том, что параметр
$new, который передавался в метод
getQuery() помечен как устаревший и будет удалён в версии фреймворка 4.0.
The parameter $new is deprecated and will be removed in 4.0, use %s::createQuery() instead.В Joomla 4 версия Joomla Framework была 2.x., в Joomla 5 - 3.x. Поэтому есть предположение, что с выходом Joomla 6 обновится и версия фреймворка - станет 4.0. Поэтому для получения объекта для новых запросов следует использовать метод
createQuery(). Он уже представлен в ядре и широко используется. При этом метод
getQuery() останется, но, скорее всего, будет выполнять функцию только геттера - получения текущего запроса.
@joomlafeed#joomla #php #разработка

0 Пользователей и 1 Гость просматривают эту тему.
  • 82 Ответов
  • 4387 Просмотров
*

DaGGeR

  • Осваиваюсь на форуме
  • 36
  • 0 / 0
Цитировать
Другие теги так не надо! Просто!
$body .= "<b>Уважаемый администратор!</b>";

а если выводит так: <b>Уважаемый администратор!</b>
то вы выводите либо в textarea
либо вы обернули где то в htmlspecialchars
все равно так и выводит : <b>Уважаемый администратор!</b>
еще раз повторюсь, сам текст сообщения выводится в теге <pre>, а точнее в <pre class="pre_message">
*

Aleks.Denezh

  • Живу я здесь
  • 3404
  • 428 / 4
покажите то что выводит в режиме просмотра кода
*

DaGGeR

  • Осваиваюсь на форуме
  • 36
  • 0 / 0
Код
<ul class="adminformlist">
<li>От Super User</li>

<li>Отправлено. 30.11.-0001</li>

<li>Тема Сообщение </li>

<li>Сообщение <pre class="pre_message">&lt;b&gt;Уважаемый администратор!&lt;/b&gt;
Строка текста:
</pre></li>
</ul>
вот что выводит
*

Aleks.Denezh

  • Живу я здесь
  • 3404
  • 428 / 4
ну вот видите у вас строка сохраняется в замененными скобочками < и > на &lt; и &gt;
А это значит что вы скорее всего где то пропустили перед сохранением строку через htmlspecialchars
*

DaGGeR

  • Осваиваюсь на форуме
  • 36
  • 0 / 0
ну вот видите у вас строка сохраняется в замененными скобочками < и > на &lt; и &gt;
А это значит что вы скорее всего где то пропустили перед сохранением строку через htmlspecialchars
хз, зашел в БД, там хранится текст как надо "<b>Уважаемый администратор!</b>"
ладно, не суть, спасибо)

вот другой вопрос еще появился: нужно передать в БД время, когда юзер оправил свои данные.
чтобы не плясать с бубном, какая функция в Joomla за время отвечает?или проще средствами php самому уж накатать?
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
какая функция в Joomla за время отвечает?
Текущее время для sql-запроса:
$db->quote(JFactory::getDate()->toSql())
*

Aleks.Denezh

  • Живу я здесь
  • 3404
  • 428 / 4
хз, зашел в БД, там хранится текст как надо "<b>Уважаемый администратор!</b>"
ладно, не суть, спасибо)
А как вы выводите?
*

DaGGeR

  • Осваиваюсь на форуме
  • 36
  • 0 / 0
А как вы выводите?
как вы и говорили, так и выводил, но уже не важно, ибо придется ковырять в самой Joomla где-то вывод, и исправлять, короче забил я)
*

DaGGeR

  • Осваиваюсь на форуме
  • 36
  • 0 / 0
ещё вопрос: как средствами Joomla узнать ID администратора?для отправки сообщения присваиваю вручную, но хотелось бы универсальности
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
А зачем Вам id админа? послать письмо ему? тогда уж получайте сразу его email. Админов, в т.ч. супер-админов может быть несколько, а вот в случае чего, J будет посылать письмо тому супер-админу, который изначально устанавливал систему, получить его email:
$query 'select email from #__users where sendemail = 1 order by id limit 1';
Во всяком случае, крайне редко бывает более одного супер-админа.
Можно более сложно:
$query 'select u.email from #__users u, #__user_usergroup_map m where (u.sendemail = 1) and ((m.group_id = 8) and (u.id = m.user_id)) order by u.id limit 1';
Здесь 8 - id группы супер-админов, как правило, никогда не меняется. Гарантированно получите email первого в списке пользователей супер-админа, у которого установлен флаг отправки ему системных сообщений с сайта, как правило он и есть тот, кто ставил систему изначально.

Здесь есть подводный камень: email этим самым супер-админом может быть указан левый...
« Последнее редактирование: 13.05.2014, 13:06:09 от AlekVolsk »
*

DaGGeR

  • Осваиваюсь на форуме
  • 36
  • 0 / 0
А зачем Вам id админа? послать письмо ему? тогда уж получайте сразу его email. Админов, в т.ч. супер-админов может быть несколько, а вот в случае чего, J будет посылать письмо тому супер-админу, который изначально устанавливал систему, получить его email:
$query 'select email from #__users where sendemail = 1 order by id limit 1';
Во всяком случае, крайне редко бывает более одного супер-админа.
Можно более сложно:
$query 'select u.email from mfo_users u, mfo_user_usergroup_map m where (u.sendemail = 1) and ((m.group_id = 8) and (u.id = m.user_id)) order by u.id limit 1';
Здесь 8 - id группы супер-админов, как правило, никогда не меняется. Гарантированно получите email первого в списке пользователей супер-админа, у которого установлен флаг отправки ему системных сообщений с сайта, как правило он и есть тот, кто ставил систему изначально.

Здесь есть подводный камень: email этим самым супер-админом может быть указан левый...
это всё конечно здорово, спасибо, но нужно узнать именно ID супер админа, он один у меня всегда.
письмо то формирую во встроенную почту Joomla
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Пожалуйста:
$query 'select u.id from #__users u, #__user_usergroup_map m where (m.group_id = 8) and (u.id = m.user_id) order by u.id limit 1';
Гарантированно именно супер-админ, первый в списке (а вдруг - гипотетически - еще один заведется?)

PS: если не секрет, а как вы получаете адрес встроенной почты J?
« Последнее редактирование: 13.05.2014, 13:05:45 от AlekVolsk »
*

DaGGeR

  • Осваиваюсь на форуме
  • 36
  • 0 / 0

PS: если не секрет, а как вы получаете адрес встроенной почты J?
да не секрет конечно, просто формирую запрос в таблицу сообщений с нужными значениями полей, и профит)
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Хмм, а текст запроса?
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Здесь 8 - id группы супер-админов, как правило, никогда не меняется.
Дополнение: я не знаю, какая у вас версия J, с 2.5 не работал, значение 8 актуально для 3.x, для 2.5 посмотрите в базе самостоятельно.
*

DaGGeR

  • Осваиваюсь на форуме
  • 36
  • 0 / 0
Хмм, а текст запроса?
ну я там в фунуции делаю, но смысл поймёте)

Код
$params = JComponentHelper::getParams( 'com_form' );
    
    $recipient = $params->get( 'recipient' );
    
    $subject = $params->get( 'subject' );
    
    $table = $this->getTable( 'messages' );
    
    $archiveData = array(
        'subject' => 'Сообщение,
'user_id_from' => '42',
'user_id_to' => '42',
'folder_id' => '0',
        'message' => $body
    );
    
    $table->bind( $archiveData );
я не во все поля значения передаю, ибо не доделал, но полей там всего 9:
message_id, user_id_from, user_id_to, folder_id, date_time, state, priority, subject, message
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Спасибо.
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Код: php
<?php echo "admin_id = ".array_pop(Jaccess::getUsersByGroup(8)); ?>
« Последнее редактирование: 13.05.2014, 13:28:14 от zomby6888 »
интернет-блог: http://websiteprog.ru
*

DaGGeR

  • Осваиваюсь на форуме
  • 36
  • 0 / 0
Спасибо.
да вам тоже спасибо)
*

DaGGeR

  • Осваиваюсь на форуме
  • 36
  • 0 / 0
Код: php
<?php echo "admin_id = ".array_pop(Jaccess::getUsersByGroup(8)); ?>
спасибо)
*

DaGGeR

  • Осваиваюсь на форуме
  • 36
  • 0 / 0
возникла ещё одна проблемка, хотел сделать валидацию формы не на стороне сервера, а на стороне клиента, добавил JHtml::_( 'behavior.formvalidation' ); но при нажатии на кнопку открывается страница с каракулями...привожу код ниже, что я сделал не то?
Код
<?php

defined( '_JEXEC' ) or die;
?>
<div class="item-page">
<h1>Форма</h1>

<form action="<?php echo JRoute::_( 'index.php?view=form' )?>" method="post" class="form-validate">

<div class="control-group form-inline">
            <div class="control-label"><?php echo $this->form->getLabel( 'fam' ); ?></div>
            <div class="controls"><?php echo $this->form->getInput( 'fam' ); ?></div>
        </div>

<div class="control-group form-inline">
            <div class="control-label"><?php echo $this->form->getLabel( 'name' ); ?></div>
            <div class="controls"><?php echo $this->form->getInput( 'name' ); ?></div>
        </div>


<input type="hidden" name="task" value="form.save" />
        <input type="submit" value="Отправить" />
        <?php echo JHtml::_( 'behavior.formvalidation' ); ?>
</form>
</div>
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
включите отображение ошибок
интернет-блог: http://websiteprog.ru
*

DaGGeR

  • Осваиваюсь на форуме
  • 36
  • 0 / 0
включите отображение ошибок
как раз таки отображение ошибок включено, но выдает "Неверный параметр"
вот и весь бред в этом...
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
А кстатии кнопка отправки формы там вроде должна иметь класс validate. может в этом дело:
Код: php
<button type="submit" class="validate">Submit form</button>
ссылку можете скинуть на страничку с формой?
интернет-блог: http://websiteprog.ru
*

DaGGeR

  • Осваиваюсь на форуме
  • 36
  • 0 / 0
ссылку можете скинуть на страничку с формой?
я на денвере делаю)
заменил кнопку, теперь кроме иероглифов выдало:
Спойлер
[свернуть]
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
На это можно не обращать внимания
интернет-блог: http://websiteprog.ru
*

DaGGeR

  • Осваиваюсь на форуме
  • 36
  • 0 / 0
На это можно не обращать внимания
а в чём тогда ошибка?  :o
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Ну ваш компонент ее возможно неправильно обрабатывает. Содержимое вашего контроллера хотябы покажите. Кстатии он у вас в какой кодировке сохранен?
интернет-блог: http://websiteprog.ru
*

DaGGeR

  • Осваиваюсь на форуме
  • 36
  • 0 / 0
Ну ваш компонент ее возможно неправильно обрабатывает. Содержимое вашего контроллера хотябы покажите. Кстатии он у вас в какой кодировке сохранен?
кодировка UTF(без BOM)

ну а контроллер пользовательской части вот:
Код
<?php


defined( '_JEXEC' ) or die;


class FormController extends JControllerLegacy
{


function display( $cachable = false, $urlparams = array() )
{
$this->default_view = 'archives';
parent::display( $cachable, $urlparams );
}

}
« Последнее редактирование: 15.05.2014, 18:05:15 от DaGGeR »
*

DaGGeR

  • Осваиваюсь на форуме
  • 36
  • 0 / 0
вот ещё проблема, пытался добавить капчу по этому уроку http://ссылка вырезана, так как домен распространяет вирусы/blog/joomla/uroki-po-sozdaniyu-komponentov-dlya-joomla-chast-5-sozdanie-svoego-polya
версия Joomla у меня 2.5, в итоге при отправке данных ошибка Fatal error: Call to a member function get() on a non-object
ругается на строку
Код
$data = $this->input->post->get( 'jform', array(), 'array' );
хотель бы узнать, что не так?

так же привожу весь код контроллера формы
Код
<?php

defined( '_JEXEC' ) or die;

jimport( 'joomla.application.component.controllerform' );


class FormControllerForm extends JControllerForm
{


function __construct( $config = array() )
{
$this->view_list = 'result';
parent::__construct( $config );
}


public function allowSave()
{
return true;
}


public function save( $key = null, $urlVar = null )
{
   
    $app = JFactory::getApplication();
    $data = $this->input->post->get( 'jform', array(), 'array' );
    $model = $this->getModel();
    $form = $model->getForm( $data, false );
    $validData = $model->validate( $form, $data );
    $recordId = $this->input->getInt( $urlVar );
    $context = "$this->option.edit.$this->context";
    $session = JFactory::getSession();
    if ( (int)$session->get( 'mycaptcha' )!= (int)$data['mycaptcha'] ) {
        $app->setUserState( $context . '.data', $validData );
        $this->setError( JText::sprintf( 'Неверная сумма цифр', $this->getModel()->getError() ) );
        $this->setMessage( $this->getError(), 'error' );
        $this->setRedirect(
            JRoute::_(
                'index.php?option=' . $this->option . '&view=' . $this->view_item
                . $this->getRedirectToItemAppend( $recordId, $urlVar ), false
            )
        );
 
        return false;
    }
    return parent::save( $key, $urlVar );
}
}
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться