Новости 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 Гость просматривают эту тему.
  • 173 Ответов
  • 35303 Просмотров
*

Фей

  • Давно я тут
  • 743
  • 86 / 3
  • Истина в вине!
Re: Написание компонента для Joomla 1.6
« Ответ #150 : 11.04.2012, 19:00:12 »
Дык методом тыка все умеют  8) А вот пояснить, почему так - слабо? :)

А ты телепат ? Без полного кода тут вообще нехера чего подсказывать!
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Re: Написание компонента для Joomla 1.6
« Ответ #151 : 16.04.2012, 23:38:46 »
Где-то уже оговорился, что хоту сделать поле в админпанели полностью аналогичное полю типа user. Поле это можно увидеть, например, когда создаёшь новость есть возможность сменить автора статьи.

Вот и поставлена цель сделать тоже самое, но для выбора родительского объекта - parent_id.

Приведу list типа user,... чтоб не бегать...
libraries/joomla/form/rules/user.php
Спойлер
[свернуть]

Собственно подскажите гуру как это проще решить? Я полез ковырять что это такое
Код
 function jSelectUser_' . $this->id . '(id, title) {
Если есть мысли пишите, я тоже буду отписывать!
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Re: Написание компонента для Joomla 1.6
« Ответ #152 : 16.04.2012, 23:46:16 »
Цитировать
Код:

 function jSelectUser_' . $this->id . '(id, title) {

Если есть мысли пишите, я тоже буду отписывать!
Понял. Сморозил... Это просто функция... До сих пор не пойму как все заворачивается в ту табличку
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Re: Написание компонента для Joomla 1.6
« Ответ #153 : 17.04.2012, 00:08:42 »
Собственно вот мой ответ
admin/models/fields/parentid.php
Код
<?php
defined('JPATH_PLATFORM') or die;

class JFormFieldParentid extends JFormField
{

public $type = 'Parentid';


public function getTable($type = 'Org', $prefix = 'PhonebookTable', $config = array())
{
return JTable::getInstance($type, $prefix, $config);
}


protected function getInput()
{
// Initialize variables.
$html = array();
$groups = $this->getGroups();
$excluded = $this->getExcluded();
$link = 'index.php?option=com_phonebook&amp;view=orgs&amp;layout=modal&amp;tmpl=component&amp;field=' . $this->id;

// Initialize some field attributes.
$attr = $this->element['class'] ? ' class="' . (string) $this->element['class'] . '"' : '';
$attr .= $this->element['size'] ? ' size="' . (int) $this->element['size'] . '"' : '';

// Initialize JavaScript field attributes.
$onchange = (string) $this->element['onchange'];

// Load the modal behavior script.
JHtml::_('behavior.modal', 'a.modal_' . $this->id);

// Build the script.
$script = array();
$script[] = ' function jSelectUser_' . $this->id . '(id, name) {';
$script[] = ' var old_id = document.getElementById("' . $this->id . '_id").value;';
$script[] = ' if (old_id != id) {';
$script[] = ' document.getElementById("' . $this->id . '_id").value = id;';
$script[] = ' document.getElementById("' . $this->id . '_name").value = name;';
$script[] = ' ' . $onchange;
$script[] = ' }';
$script[] = ' SqueezeBox.close();';
$script[] = ' }';

// Add the script to the document head.
JFactory::getDocument()->addScriptDeclaration(implode("\n", $script));

// Load the current username if available.
//$table = JTable::getInstance('org');
$table = $this->getTable;
if ($this->value)
{
$table->load($this->value);
}
else
{
$table->username = JText::_('JLIB_FORM_SELECT_USER');
}

// Create a dummy text field with the user name.
$html[] = '<div class="fltlft">';
$html[] = ' <input type="text" id="' . $this->id . '_name"' . ' value="' . htmlspecialchars($table->name, ENT_COMPAT, 'UTF-8'). '"'
. ' disabled="disabled"' . $attr . ' />';
$html[] = '</div>';

// Create the user select button.
$html[] = '<div class="button2-left">';
$html[] = '  <div class="blank">';
if ($this->element['readonly'] != 'true')
{
$html[] = ' <a class="modal_' . $this->id . '" title="' . JText::_('JLIB_FORM_CHANGE_USER'). '"' . ' href="' . $link . '"'
. ' rel="{handler: \'iframe\', size: {x: 800, y: 500}}">';
$html[] = ' ' . JText::_('JLIB_FORM_CHANGE_USER'). '</a>';
}
$html[] = '  </div>';
$html[] = '</div>';

// Create the real field, hidden, that stored the user id.
$html[] = '<input type="hidden" id="' . $this->id . '_id" name="' . $this->name . '" value="' . (int) $this->value . '" />';

return implode("\n", $html);
}

/**
* Method to get the filtering groups (null means no filtering)
*
* @return  mixed  array of filtering groups or null.
*
* @since   11.1
*/
protected function getGroups()
{
return null;
}

/**
* Method to get the users to exclude from the list of users
*
* @return  mixed  Array of users to exclude or null to to not exclude them
*
* @since   11.1
*/
protected function getExcluded()
{
return null;
}
}

И плюс ко всему создал layout
admin/views/orgs/tmpl/modal.php
Код
<?php
defined('_JEXEC') or die;

JHtml::addIncludePath(JPATH_COMPONENT.'/helpers/html');
JHtml::_('behavior.tooltip');

$field = JRequest::getCmd('field');
$function = 'jSelectUser_'.$field;
$listOrder = $this->escape($this->state->get('list.ordering'));
$listDirn = $this->escape($this->state->get('list.direction'));
?>
<form action="<?php echo JRoute::_('index.php?option=com_phonebook&view=orgs&layout=modal&tmpl=component');?>" method="post" name="adminForm" id="adminForm">
<fieldset class="filter">
<div class="left">
<label for="filter_search"><?php echo JText::_('JSEARCH_FILTER'); ?></label>
<input type="text" name="filter_search" id="filter_search" value="<?php echo $this->escape($this->state->get('filter.search')); ?>" size="40" title="<?php echo JText::_('COM_PB_SEARCH_IN_ORG'); ?>" />
<button type="submit"><?php echo JText::_('JSEARCH_FILTER_SUBMIT'); ?></button>
<button type="button" onclick="document.id('filter_search').value='';this.form.submit();"><?php echo JText::_('JSEARCH_FILTER_CLEAR'); ?></button>
<button type="button" onclick="if (window.parent) window.parent.<?php echo $this->escape($function);?>('', '<?php echo JText::_('JLIB_FORM_SELECT_USER')?>');"><?php echo JText::_('JOPTION_NO_USER')?></button>
</div>

</fieldset>

<table class="adminlist">
<thead>
<tr>
<th class="left">
<?php echo JHtml::_('grid.sort', 'COM_PB_ORG_HEADING_NAME', 'a.name', $listDirn, $listOrder); ?>
</th>
<th class="nowrap" width="25%">
<?php echo JHtml::_('grid.sort', 'COM_PB_ORG_HEADING_TITLE', 'a.title', $listDirn, $listOrder); ?>

</tr>
</thead>
<tfoot>
<tr>
<td colspan="15">
<?php echo $this->pagination->getListFooter(); ?>
</td>
</tr>
</tfoot>
<tbody>
<?php
$i = 0;
foreach ($this->items as $item) : ?>
<tr class="row<?php echo $i % 2; ?>">
<td>
<a class="pointer" onclick="if (window.parent) window.parent.<?php echo $this->escape($function);?>('<?php echo $item->id; ?>', '<?php echo $this->escape(addslashes($item->name)); ?>');">
<?php echo $item->name; ?></a>
</td>
<td align="center">
<?php echo $item->title; ?>
</td>

</tr>
<?php endforeach; ?>
</tbody>
</table>
<div>
<input type="hidden" name="task" value="" />
<input type="hidden" name="field" value="<?php echo $this->escape($field); ?>" />
<input type="hidden" name="boxchecked" value="0" />
<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>" />
<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>" />
<?php echo JHtml::_('form.token'); ?>
</div>
</form>
Переводы соответственно пока не делал.
Гуру прошу делать замечания.
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Re: Написание компонента для Joomla 1.6
« Ответ #154 : 17.04.2012, 09:14:52 »
Понял подсказку... Этот вариант у меня просто по образу и подобию...
Спасибо! Может что-то еще?
*

som555

  • Осваиваюсь на форуме
  • 16
  • 0 / 0
Re: Написание компонента для Joomla 1.6
« Ответ #155 : 19.04.2012, 15:56:00 »
Пишу компоненту использующую форму фильтров.
Вопрос такой: где(в каком месте кода) сбросить фильтры моей компоненты(удалить из сессии) при переходе на другой раздел сайта (переход по Главному меню)?
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
Re: Написание компонента для Joomla 1.6
« Ответ #156 : 19.04.2012, 17:17:02 »
Хмм, так не получится сделать. Как Вы в своем компоненте узнаете, что пользователь перешел на другую страницу не Вашего копонента?
*

som555

  • Осваиваюсь на форуме
  • 16
  • 0 / 0
Re: Написание компонента для Joomla 1.6
« Ответ #157 : 20.04.2012, 10:50:52 »
Ну, а если не в компоненте, то куда можно добавить обнуление фильтров?
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
Re: Написание компонента для Joomla 1.6
« Ответ #158 : 20.04.2012, 11:06:44 »
Тогда их нужно добавлять во все компоненты... А зачем Вам нужно их обнулять - они как-то мешают пользователю в дальнейшем?
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
Re: Написание компонента для Joomla 1.6
« Ответ #159 : 20.04.2012, 16:17:04 »
вообще то можно для этого написать плагин )

вообще то можно для этого написать плагин )
Да, чего-то про них я и забыл ^^
Я так понимаю, что лучше вешать на событие onAfterInitialise. А в какую группу поместить - system?
*

som555

  • Осваиваюсь на форуме
  • 16
  • 0 / 0
Re: Написание компонента для Joomla 1.6
« Ответ #160 : 20.04.2012, 20:06:27 »
Заметил, что route.php из компоненты вызывается каждый раз. Правильно ли заметил?
Может там можно что сделать?
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Re: Написание компонента для Joomla 1.6
« Ответ #161 : 17.07.2012, 13:27:19 »
Привет всем! Давно тут не был...
Вопрос: Создаю в одном ВИДе и список позиций и показ конкретной. (т.е. есть весь список, каждый элемент как ссылка; по ссылке показывает страницы с подробным описанием элемента)

Так вот пытаюсь развести по разным layers (default.php и default_item.php) при помощи проверки JRequest::getInt('id', 0) но это всегда выдает 0.
Кликаю по элементу получаю ссылку типа http://localhost/adstext/text/4-Виктория и отсюда не берется id. ссылки обрабатываются в route.php и происходит slug-преобразование.
Кажется мне что дело в этом самом slug но не понимаю как решить.
Спасибо!
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Re: Написание компонента для Joomla 1.6
« Ответ #162 : 17.07.2012, 15:20:57 »
print_r($_REQUEST); и смотрите или правильно прошел роутинг.. возможно роутер обработал как что то иное!
Огромное спасибо! Почему-то забыл о банальных проверках, хотя только ими и пользусь собственно.
да в переменных не было id. Его надо определять в массив $vars в router.php у меня там была ерунда написана. Всё исправил, всё заработало.
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Re: Написание компонента для Joomla 1.6
« Ответ #163 : 18.07.2012, 12:59:44 »
всё заработало.
Не всё к сожалению. Прошу помочь разобраться с router.php
Код
function MagnitParseRoute($segments)
{
$vars = array();
$app  =& JFactory::getApplication();
$menu =& $app->getMenu();
$item =& $menu->getActive();
// view is always the first element of the array
$count = count($segments);

switch ($item->query['view'])
{
case 'text':
$id = explode ( ':', $segments[$count-1] );
$vars['id'] = (int) $id[0];
$vars['view'] = 'text';
break;
}                 

return $vars;
}

когда я делаю пункт меню (Alias = AdsText) то в компоненте все работает шикарно.
получаю ссылки типа
/adsrexr/text/1-петя и /adsrexr/text/8-вася
id вытаскивается из последнего сегмента - всё хорошо.

Но написал я модуль для компонента!
вписал обычную ссылку как я писал в компоненте.
но ссылка урезается по типу
/component/nameComponent/text/1-петя и /component/nameComponent/text/8-вася
и ссылки не работают.
понимаю что дело в том, что надо подвязать пункт меню сюда... Подскажите! Как?
Или подскажите правильное решение.
В итоге хочу получить: ссылки из модуля по типу /adsrexr/text/8-вася
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
Re: Написание компонента для Joomla 1.6
« Ответ #164 : 18.07.2012, 15:26:22 »
Да, с модулем есть такая засадка...

Некоторые разработчики просто в параметры модуля выносят настройку Itemid, и потом этот Itemid используют в коде.
Другие пишут хелпер, в котором определяют, как правильно создать ссылку. Например, вот как для com_content:
Код
$item->link = JRoute::_(ContentHelperRoute::getArticleRoute($item->slug, $item->catslug));
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Re: Написание компонента для Joomla 1.6
« Ответ #165 : 18.07.2012, 15:39:56 »
Другие пишут хелпер, в котором определяют, как правильно создать ссылку. Например, вот как для com_content используют:
Код
$item->link = JRoute::_(ContentHelperRoute::getArticleRoute($item->slug, $item->catslug));
Если можно чуть подробнее... не всё схватил.
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
Re: Написание компонента для Joomla 1.6
« Ответ #166 : 18.07.2012, 15:42:23 »
abstract class ContentHelperRoute

Обратите внимание на метод _findItem($needles = null)
По сути Вам необходимо найти нужный Itemid во всех пунктах меню и потом использовать его в коде модуля.
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Re: Написание компонента для Joomla 1.6
« Ответ #167 : 18.07.2012, 17:09:54 »
Итак, то что я понял.
если к ссылке прикрепляем &Itemid=427 (это пример моего конкретного случая), то все у нас начинает работать.
вопрос в том, чтоб модуль сам нашел этот Itemid.
Взяв за основу модули и хелперы сказанного выше непонятнось вызывает строка
Код
$needles = array(
'article' => array((int) $id)
);
что в этой переменной должно быть?
ассоциативный массив с ключем как название view? и содержащим еще массив с одним значением id? собственно и какого id
в _findItem почти все понятно, кроме тех операций что $needles происходит.
и докучу что происходит в $lookup и зачем там массивы "лепятся"?

Убил всю функцию _findItem до вида
Код
$app = JFactory::getApplication();
$menus = $app->getMenu('site');
$component = JComponentHelper::getComponent('com_magnit');
$items = $menus->getItems('component_id', $component->id);
return $items[0]->id;

Скорее всего кучу нужного срезал. Но никак не пойму как заставить работать с lookup и needles понормальному и зачем там все это.
to b2z огромное спасибо.
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
Re: Написание компонента для Joomla 1.6
« Ответ #168 : 18.07.2012, 21:39:54 »
Ну суть в том, чтобы для каждого view обнаружить в менюшке id. needles скорее всего и не нужны. А $items[0]->id; ничего не выдает?
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Re: Написание компонента для Joomla 1.6
« Ответ #169 : 20.07.2012, 10:48:04 »
А $items[0]->id; ничего не выдает?
Все выдает и решает мою частную задачу. Но я же срезал все вот и хотел узнат что именно я срезал.
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
Re: Написание компонента для Joomla 1.6
« Ответ #170 : 20.07.2012, 15:44:16 »
Все выдает и решает мою частную задачу. Но я же срезал все вот и хотел узнат что именно я срезал.
Да я и сам не вникал в этот хелпер, если честно ^-^
*

alex-inc

  • Осваиваюсь на форуме
  • 25
  • 0 / 0
Re: Написание компонента для Joomla 1.6
« Ответ #171 : 21.10.2012, 00:45:05 »
Здравствуйте. Помогите разобраться с XML в админке.
Есть поле в xml:
Код
<field 
    name="cat"
    type="sql"
    default=""
    label="COM_ALEXESTATE_SELECT_CATEGORY"
    query="SELECT category.id, category.name FROM #__alexestate_category AS category"
    key_field="id"
    value_field="name"
    />
Как сделать чтобы defaul принимало значение залогиненного пользователя?
*

alex-inc

  • Осваиваюсь на форуме
  • 25
  • 0 / 0
Re: Написание компонента для Joomla 1.6
« Ответ #172 : 21.10.2012, 14:52:39 »
Спасибо большое. В моем примере id пользователя и не пахнет, т.к. писал глубокой ночью, и случайно не ту часть кода скопировал, но принцип мне понятен.
*

TrOn

  • Захожу иногда
  • 91
  • 0 / 0
Re: Написание компонента для Joomla 1.6
« Ответ #173 : 05.02.2013, 20:43:12 »
Всем привет, помогите разобраться как сохранить файл в админке.

сейчас в админке выводить поле из XML
Код
<field name="catalog_pdf" type="file" label="PDF (описание)" description="выбирите файл размером до 10 мегабайт" size="10" accept="application/pdf" />
а вот как его обработать в моделе? я че-то думал он там сразу выдат путь куда сохранилось.... :)
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Документация по созданию модуля для Joomla 2.5 и Joomla 3.x

Автор b2z

Ответов: 1
Просмотров: 2377
Последний ответ 29.07.2015, 09:40:30
от b2z
Создание компонента MVC

Автор borodatych

Ответов: 36
Просмотров: 4662
Последний ответ 13.04.2015, 08:17:30
от flyingspook
Подскажите как сделать русификацию компонента)

Автор stardel

Ответов: 4
Просмотров: 7068
Последний ответ 08.04.2015, 09:08:00
от oxotnikkz
JPluginHelper::importPlugin('content') в Joomla 1.7

Автор Dutch

Ответов: 2
Просмотров: 4829
Последний ответ 30.03.2015, 14:22:51
от twins717
Документация по созданию компонента для Joomla 2.5

Автор Sulpher

Ответов: 74
Просмотров: 57508
Последний ответ 17.11.2014, 13:43:07
от limon142