Новости Joomla

Как тестировать Joomla PHP-разработчику? Компонент Patch tester.

👩‍💻 Как тестировать Joomla PHP-разработчику? Компонент Patch tester.Joomla - open source PHP-фреймворк с готовой админкой. Его основная разработка ведётся на GitHub. Для того, чтобы международному сообществу разработчиков было удобнее тестировать Pull Requests был создан компонент Patch Tester, который позволяет "накатить" на текущую установку Joomla именно те изменения, которые необходимо протестировать. На стороне инфраструктуры Joomla для каждого PR собираются готовые пакеты, в которых находится ядро + предложенные изменения. В каждом PR обычно находятся инструкции по тестированию: куда зайти, что нажать, ожидаемый результат. Тестировщики могут предположить дополнительные сценарии, исходя из своего опыта и найти баги, о которых сообщить разработчику. Или не найти, и тогда улучшение или исправление ошибки быстрее войдёт в ядро Joomla. Напомню, что для того, чтобы PR вошёл в ядро Joomla нужны минимум 2 положительных теста от 2 участников сообщества, кроме автора. Видео на YouTubeВидео на VK ВидеоВидео на RuTubeКомпонент на GitHub https://github.com/joomla-extensions/patchtester@joomlafeed#joomla #php #webdev #community

Вышел релиз Revo PageBuilder Toolkit for YOOtheme Pro 1.6

Вышел релиз Revo PageBuilder Toolkit for YOOtheme Pro 1.6.2PageBuilder Toolkit - это специализированный плагин для конструктора страниц Yootheme Pro, содержит набор различных утилит для ускорения процесса работы и отладки макета, множественные улучшения в интерфейсе, включая поддержку dark mode, подсказки, быстрая смена разрешения в окне просмотра и много чего еще.v.1.6.2 Что нового?- Индикатор статусов: теперь не просто показывает состояние запросов, но и делает автоматические попытки их отправки при кратковременных сбоях в сети, а если это не помогло, то переводит конструктор в ручной режим, что позволяет сохранит макет и настройки темы прежде чем вы потеряете все, что было сделано с момента последнего сохранения- Подсветка ошибок в макете: плагин анализирует код страницы и может автоматически подсвечивать data атрибуты с кучей мусора, которые попадают в код страницы при копипасте из Figma в TinyMCE (пригодится для старых макетов, в текущей работе плагин сам очищает код мусора). Также есть подсветка семантических ошибок сборки - дубли h1 тега на странице и вложенных друг в друга заголовков.- Улучшена поддержка будущего релиза Yootheme Pro 5 и редактора CodeMirror 6Плагин для русскоязычных пользователей доступен в каталоге расширений SovMart и распространяется за символическую плату (100р). Разработчики Joomla расширений и партнеры автора могут получить плагин бесплатно.Для работы плагина необходим конструктор страниц Yootheme Pro.Разработчик плагина - участник нашего сообщества Александр Судьбинов (@alexrevo), член официальной группы поддержки Yootheme Pro. Страница расширенияОписание на сайте автора@joomlafeed#joomla #yootheme

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

denism300

  • Захожу иногда
  • 210
  • 5 / 0
обработка нажатия cancel
« : 27.02.2016, 21:27:40 »
пишу небольшой компонент.
суть такая, если в админке зайти в создание нового элемента компонента, а, затем, нажать "Отменить", то появляется ошибка
Цитировать
Null primary key not allowed.

функция Cancel
Код
function cancel() {
$htmlmap = $this->getModel('htmlmap');
$htmlmap->setState('id', $this->_fields['id']);
$htmlmap->checkin();
$msg = JText::_('EDIT_HTMLMAP_CANCELLED');
$type = 'message';
$this->setRedirect(JRoute::_('index.php?option=com_htmlmap&controller=htmlmaps&view=htmlmaps'), $msg, $type);

функция checkin
Код
function checkin() {
$map = $this->getMap();
$map->checkin();
}
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: обработка нажатия cancel
« Ответ #1 : 28.02.2016, 01:12:17 »
В ошибке же прямо сказано: "Значение null первичного ключа недопустимо". Это, видимо, из-за тоео, что у несохраненного нового элемента еще нет id.
Вы скопировали эти функции откуда-то, да? Думаю, в cancel() нужно избавиться от checkin(), хотя нелишне будет понять, что она представляет собой. Приведенный вами код ничего не говорит: что такое $map и его метод checkin?
Не будь паразитом, сделай что-нибудь самостоятельно!
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
Re: обработка нажатия cancel
« Ответ #2 : 04.03.2016, 12:11:16 »
Видимо $htmlmap->setState('id', $this->_fields['id']); не передаёт id в модель
*

denism300

  • Захожу иногда
  • 210
  • 5 / 0
Re: обработка нажатия cancel
« Ответ #3 : 07.03.2016, 11:59:31 »
В ошибке же прямо сказано: "Значение null первичного ключа недопустимо". Это, видимо, из-за тоео, что у несохраненного нового элемента еще нет id.
Вы скопировали эти функции откуда-то, да? Думаю, в cancel() нужно избавиться от checkin(), хотя нелишне будет понять, что она представляет собой. Приведенный вами код ничего не говорит: что такое $map и его метод checkin?
ну да, скопировал. так сказать, изучаю
код getMap
Код
var $_map = null;
function getMap() {
if (empty($this->_map)) {
$this->_map = $this->getTable();
$this->_map->load($this->getState('id'));
}
return $this->_map;
}
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
*

denism300

  • Захожу иногда
  • 210
  • 5 / 0
Re: обработка нажатия cancel
« Ответ #5 : 07.03.2016, 12:34:36 »
если я правильно понимаю логику работы, то получается так:
1. в таблице элементов нет.
2. я создаю новый элемент и вместо того, чтобы сохранить, отменяю его создание
3. вот эта строка: $htmlmap->setState('id', $this->_fields['id']); в поле ID пытается записать значение 0, что недопустимо, поэтому, вываливается ошибка.

добавил в функцию проверку id на 0

Цитировать
function cancel() {
      $htmlmap = $this->getModel('htmlmap');
      $htmlmap->setState('id', $this->_fields['id']);
      if ($this->_fields['id'] != 0) {
         $htmlmap->checkin();
      }
      $msg = JText::_('EDIT_HTMLMAP_CANCELLED');
      $type = 'message';
      $this->setRedirect(JRoute::_('index.php?option=com_htmlmap&controller=htmlmaps&view=htmlmaps'), $msg, $type);
}

теперь ошибка пропала.
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
Re: обработка нажатия cancel
« Ответ #6 : 07.03.2016, 12:39:36 »
$htmlmap->setState('id', $this->_fields['id']); тоже нужно вызывать, когда есть ID. Зачем 0 передавать?

Код: php
public function cancel()
{
      if ($this->_fields['id'] > 0)
      {
         $htmlmap = $this->getModel('htmlmap');
         $htmlmap->setState('id', $this->_fields['id']);
         $htmlmap->checkin();
      }

      $msg = JText::_('EDIT_HTMLMAP_CANCELLED');
      $type = 'message';
      $this->setRedirect(JRoute::_('index.php?option=com_htmlmap&controller=htmlmaps&view=htmlmaps'), $msg, $type);
}
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: обработка нажатия cancel
« Ответ #7 : 07.03.2016, 12:43:02 »
Код: php-brief
if(!($this->_fields['id']===null)){
$htmlmap->checkin();
}
P.S.
Уже ответили.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

denism300

  • Захожу иногда
  • 210
  • 5 / 0
Re: обработка нажатия cancel
« Ответ #8 : 07.03.2016, 18:07:27 »
Теперь возникла проблема с обработкой Save
Появляется такая ошибка: HTMLMapTableHTMLMap::bind(*NULL*)
Я так понимаю, что она говорит, что параметры для записи не передаются. А почему - не понимаю. Уже полдня убил на курение мануалов.

В общем, куски кода, как у меня реализовано. Большинство кода - копипаста из различных примеров, но основной принцип работы этого я улавливаю.
/tables/htmlmap.php
Код: php
jimport('joomla.database.table');
class HTMLMapTableHTMLMap extends JTable {
/* Constructor */
function __construct(&$db) {
parent::__construct('#__htmlmap', 'id', $db);
}

public function bind($array, $ignore = array()) {
if (isset($array['params']) && is_array($array['params'])) {
$registry = new JRegistry;
$registry->loadArray($array['params']);
$array['params'] = (string) $parameter;
}
return parent::bind($array, $ignore);
}
} ?>

/controllers/htmlmap.php
Код: php
jimport('joomla.application.component.controller');
class HTMLMapControllerHTMLMap extends JControllerLegacy {
var $_id = null;
var $_fields = null;
function __construct($config = array()) {
if (array_key_exists('id', $config)) {
$this->_id = $config['id'];
} else {
$this->_id = JRequest::getInt('id', 0);
}
if (array_key_exists('fields', $config)) {
$this->_fields = $config['fields'];
} else {
$this->_fields = JRequest::getVar('param');
}
parent::__construct($config);
}
function save() {
$var = $this->input->get('fields');
$htmlmap = $this->getModel($name = 'HTMLMap', $prefix = 'HTMLMapModel', $config = array());
$htmlmap->setState('fields', $this->_fields);
if ($htmlmap->save()) {
$msg = JText::_('HTMLMAP_SAVED');
$type = 'message';
} else {
$msg = JText::_('ERROR_SAVING_HTMLMAP'). ": " . $htmlmap->getError();
$type = 'error';
}
$this->setRedirect(JRoute::_('index.php?option=com_htmlmap&controller=htmlmaps&view=htmlmaps'), $msg, $type);
}
} ?>

/models/htmlmap.php
Код: php
jimport('joomla.application.component.model');
class HTMLMapModelHTMLMap extends JModelLegacy {
var $_map = null;
function __construct($config) {
if (!array_key_exists('table_path', $config)) {
$config['table_path'] = JPATH_ADMINISTRATOR . DS . 'components' . DS . 'com_htmlmap' . DS . 'tables';
}
parent::__construct($config);
}
function save() {
$map = $this->getTable($name='HTMLMap', $prefix='HTMLMapTable', $options = array());
$fields = $this->getState('fields');
if ($map->save($this->getState('fields'))) {
$this->setState('id', $map->id);
return true;
} else {
$this->setError($map->getError());
return false;
}
}
} ?>
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: обработка нажатия cancel
« Ответ #9 : 07.03.2016, 19:31:56 »
Код: php
			$array['params'] = (string) $parameter;
Код: php
		$var = $this->input->get('fields');
$htmlmap->setState('fields', $this->_fields);
$parameter,$this->input,$this->_fields откуда взялись?
Не будь паразитом, сделай что-нибудь самостоятельно!
*

denism300

  • Захожу иногда
  • 210
  • 5 / 0
Re: обработка нажатия cancel
« Ответ #10 : 08.03.2016, 12:51:03 »
$parameter,$this->input,$this->_fields откуда взялись?
вместо $parameter должно быть $registry, тут я напутал.

_fields берется отсюда:
Код: php
var $_id = null;
var $_fields = null;
function __construct($config = array()) {
if (array_key_exists('id', $config)) {
$this->_id = $config['id'];
} else {
$this->_id = JRequest::getInt('id', 0);
}
if (array_key_exists('fields', $config)) {
$this->_fields = $config['fields'];
} else {
$this->_fields = JRequest::getVar('param');
}
parent::__construct($config);
}
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
Re: обработка нажатия cancel
« Ответ #11 : 08.03.2016, 13:37:35 »
$htmlmap->setState('fields', $this->_fields);

Здесь свойство $this->_fields не пустое?

Откуда Вы брали эти примеры? Какая-то запутанный код, куча лишних строк. Зачем использовать state модели для передачи данных их формы? Зачем в конструкторе контроллера данные из реквеста получать?
У MVC Joomla вообще всё по дефу работает для метода save(), да и много ещё для чего. Лишнего особо писать не надо.

Вы примеры случаем не из Joomla 1.5 брали?
*

denism300

  • Захожу иногда
  • 210
  • 5 / 0
Re: обработка нажатия cancel
« Ответ #12 : 08.03.2016, 15:33:59 »
$htmlmap->setState('fields', $this->_fields);

Здесь свойство $this->_fields не пустое?

Откуда Вы брали эти примеры? Какая-то запутанный код, куча лишних строк. Зачем использовать state модели для передачи данных их формы? Зачем в конструкторе контроллера данные из реквеста получать?
У MVC Joomla вообще всё по дефу работает для метода save(), да и много ещё для чего. Лишнего особо писать не надо.

Вы примеры случаем не из Joomla 1.5 брали?
основную часть кода я брал из Ваших статей по созданию компонента с сайта cmscafe
обработчики save, cancel, да, из примеров доя J1.5, т.к. в Ваших статьях я не нашел реализации этого.
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
Re: обработка нажатия cancel
« Ответ #13 : 08.03.2016, 16:23:15 »
А в материалах на cmscafe нет реализации, потому что Joomla всё это по дефолту хорошо обрабатывает - нет нужды писать лишний код.
По сути самый лучший пример - это взять com_content. Если пример попроще, то com_newsfeeds.
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: обработка нажатия cancel
« Ответ #14 : 08.03.2016, 17:02:18 »
В принципе, если вам не нужно никаких особых манипуляций делать с данными, то нет необходимости создавать свои методы - JControllerForm() все за вас сделает: такие функции, как edit(), cancel(), save() там уже есть.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
Re: обработка нажатия cancel
« Ответ #15 : 08.03.2016, 17:08:48 »
В принципе, если вам не нужно никаких особых манипуляций делать с данными, то нет необходимости создавать свои методы - JControllerForm() все за вас сделает: такие функции, как edit(), cancel(), save() там уже есть.
И я о том же.
*

denism300

  • Захожу иногда
  • 210
  • 5 / 0
Re: обработка нажатия cancel
« Ответ #16 : 10.03.2016, 21:20:04 »
взял контроллер из com_content, подправил под свои нужды. теперь при нажатии на любую на сохранить, сохранить и закрыть или отмена выдает такую ошибку:
Цитировать
Последний запрос был отклонён, поскольку он содержит неправильный параметр безопасности (security token). Пожалуйста, обновите страницу и попробуйте ещё раз.
Код получился такой:
Код: php
<?php defined('_JEXEC') or die('Restricted access');

class HTMLMapControllerHTMLMap extends JControllerForm {
public function __construct($config = array()) {
parent::__construct($config);
if ($this->input->get('return') == 'htmlmaps') {
$this->view_list = 'htmlmaps';
$this->view_item = 'com_htmlmap&view=htmlmaps';
}
}

public function batch($model = null) {
JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));
$model = $this->getModel($name = 'HTMLMap', $prefix = 'HTMLMapModel', $config = array());
$this->setRedirect(JRoute::_('index.php?option=com_htmlmap&view=htmlmap' . $this->getRedirectToListAppend(), false));
return parent::batch($model);
}

protected function postSaveHook(JModelLegacy $model, $validData = array()) {
return;
}
} ?>
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: обработка нажатия cancel
« Ответ #17 : 10.03.2016, 21:23:39 »
А вы token в форму добавили?
Не будь паразитом, сделай что-нибудь самостоятельно!
*

denism300

  • Захожу иногда
  • 210
  • 5 / 0
Re: обработка нажатия cancel
« Ответ #18 : 31.03.2016, 21:46:48 »
возникла такая проблема.
необходимо, чтобы при установке компонента создавалась папка в папке images.

сделал так:
в установочный файл XML добавил строку
Код: php
<installfile>install.php</installfile>

и создал файл install.php с таким кодом
Код: php
<?php defined('_JEXEC') or die('Restricted access');

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

defined('DS') or define('DS', DIRECTORY_SEPARATOR);

function com_install() {
jimport('joomla.filesystem.folder');
$folder = JPATH_SITE . DS . 'images' . DS . 'htmlmaps';
if (@JFolder::create($folder)===false)
JError :: raiseWarning(1, JText :: _('FAILED TO CREATE DIRECTORY'). ' "' . $folder . '"');
return false;
}
} ?>

но не работает. точнее, компонент устанавливается, все ок, но папка не создается. в чем проблема?
права на папку есть, все это крутится на локалке под openserver
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: обработка нажатия cancel
« Ответ #19 : 31.03.2016, 22:56:20 »
Joomla 1.5, что ли?
Не будь паразитом, сделай что-нибудь самостоятельно!
*

denism300

  • Захожу иногда
  • 210
  • 5 / 0
Re: обработка нажатия cancel
« Ответ #20 : 31.03.2016, 22:59:46 »
нет, 3.4
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: обработка нажатия cancel
« Ответ #21 : 31.03.2016, 23:06:01 »
Используете устаревшие методы. Откройте какой-нибудь компонент 3.4-версии и посмотрите.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

denism300

  • Захожу иногда
  • 210
  • 5 / 0
Re: обработка нажатия cancel
« Ответ #22 : 31.03.2016, 23:29:36 »
сделал так:
Код: php
jimport('joomla.filesystem.folder');
if(!(JFolder::create(JPATH_ROOT . DS . 'images' . DS . 'htmlmaps'))) {
echo "FAILED TO CREATE DIRECTORY";
return false;
}

ничего не поменялось.
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Re: обработка нажатия cancel
« Ответ #23 : 01.04.2016, 07:55:04 »
Код: php
jimport('joomla.filesystem.folder');

function CF($name)
{
$result = JFolder::create(JPATH_ROOT . $name);
if (!$result)
JError::raiseWarning('', JText::_('FAILED TO CREATE DIRECTORY'));
return $result;
}

использовать:
Код: php
if (!CF('/images/htmlmaps'))
return false;
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: обработка нажатия cancel
« Ответ #24 : 01.04.2016, 08:56:35 »
Вы примеры случаем не из Joomla 1.5 брали?
да, из примеров доя J1.5
Еще раз: вы используете устаревшие методы J!1.5 для работы с версией 3.4 и удивляетесь, почему они не работают.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

denism300

  • Захожу иногда
  • 210
  • 5 / 0
Re: обработка нажатия cancel
« Ответ #25 : 01.04.2016, 11:20:53 »
Код: php
jimport('joomla.filesystem.folder');

function CF($name)
{
$result = JFolder::create(JPATH_ROOT . $name);
if (!$result)
JError::raiseWarning('', JText::_('FAILED TO CREATE DIRECTORY'));
return $result;
}

все равно не работает.
использовать:
Код: php
if (!CF('/images/htmlmaps'))
return false;
*

denism300

  • Захожу иногда
  • 210
  • 5 / 0
Re: обработка нажатия cancel
« Ответ #26 : 01.04.2016, 11:21:53 »
Еще раз: вы используете устаревшие методы J!1.5 для работы с версией 3.4 и удивляетесь, почему они не работают.
последний мой вариант был взят из установочного файла VirtueMart 3
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: обработка нажатия cancel
« Ответ #27 : 01.04.2016, 11:27:51 »
последний мой вариант был взят из установочного файла VirtueMart 3
И что там написано в функции com_install, включая коммент?
Не будь паразитом, сделай что-нибудь самостоятельно!
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
Re: обработка нажатия cancel
« Ответ #28 : 01.04.2016, 11:37:45 »
Ну по идее код был верный. По крайней мере у меня срабатывает в скрипте установки компонента:

Код: php
jimport('joomla.filesystem.folder');
...

/**
 * Method to create the necessary directories
 *
 * @return  boolean  True on success, false otherwise.
 *
 * @since   1.0
 */
private function createDirectories()
{
$result = JFolder::create(JPATH_SITE . '/ncuploads');

if (false === $result)
{
JLog::add(sprintf('Unable to create uploads folder %s', JPATH_SITE . '/ncuploads'), JLog::ERROR, 'jerror');
}

return $result;
}
*

denism300

  • Захожу иногда
  • 210
  • 5 / 0
Re: обработка нажатия cancel
« Ответ #29 : 01.04.2016, 16:02:17 »
И что там написано в функции com_install, включая коммент?
com_install это название моей функции. в VM функция, создающая папки при установке называется по другому.

Код: php
		/**
* creates a folder with empty HTML file
*
* @author Max Milbers
*
*/
public function createIndexFolder($path){

if(JFolder::create($path)) {
/*if(!JFile::exists($path .DS. 'index.html')){
JFile::copy(VMPATH_ROOT.DS.'components'.DS.'index.html', $path .DS. 'index.html');
}*/
return true;
}
return false;
}

b2z, все равно не работает. попробовал сделать в файле install.php умышленную синтаксическую ошибку - во время попытки установка мне было на нее указано, т.е. файл при установке подключается и срабатывает.
однако, ни папка не создается, ни ошибка не вываливается никакая...
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться