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

bvp77

  • Новичок
  • 4
  • 0 / 0
Подскажите, пожалуйста, как реализовать "добавление в блокнот" объявлений? К примеру, как на этом сайте http://topmarket.biz/index.php?option=com_adsmanager&page=show_category&catid=277&text_search=&order=0&expand=0&Itemid=46.
Т.е. посетитель (как зарегистрированный, так и гость) мог добавить в свой блокнот некое количество объявлений и потом просмотреть их.
Заранее благодарен.
*

bvp77

  • Новичок
  • 4
  • 0 / 0
Неужели никто не может подсказать, в какую сторону хоть смотреть? Нужен хоть какой то блокнот. ХЕЛП ПЛИЗЗЗ!
*

grinat

  • Захожу иногда
  • 356
  • 34 / 2
Сделать кнопку, которая посредством js в будет в json или в любом другом формате, сохранять в куки id объявлений. Затем сделать страницу, которая будет забирать куки и получать из них id объявлений, которые нужно отобразить. В общем все довольно просто, но мне кажется лучше оставить эту функцию только для зарегистрированных, ведь тогда id можно хранить в базе, таким образом я с могу компьютера найти нужны мне объявления и пометить их, а затем с кпк обратиться к ним, дабы узнать какие-то подробности, более точный адрес и проч.
*

GlooM

  • Давно я тут
  • 558
  • 91 / 0
  • AdsManager
Сделать кнопку, которая посредством js в будет в json или в любом другом формате, сохранять в куки id объявлений. Затем сделать страницу, которая будет забирать куки и получать из них id объявлений, которые нужно отобразить. В общем все довольно просто, но мне кажется лучше оставить эту функцию только для зарегистрированных, ведь тогда id можно хранить в базе, таким образом я с могу компьютера найти нужны мне объявления и пометить их, а затем с кпк обратиться к ним, дабы узнать какие-то подробности, более точный адрес и проч.
Grinat, реализуй на public и выложи решение :)

// кстати, тоже сейчас интересуюсь этой проблемой. Реализую на досуге.
« Последнее редактирование: 17.08.2010, 13:13:44 от GlooM »
*

grinat

  • Захожу иногда
  • 356
  • 34 / 2
Цитировать
Grinat, реализуй на public и выложи решение
Много кода, боюсь пользователи могут испугаться), но попробую

Добавление объявлений в блокнот
Все ниженаписанное тестировалось под AdsManager 2.5 RC2 joostina 1.2, но скорее всего подходит для любого adsmanager и точно подходит для любой версии Joomla. Поддерживаться должны все браузеры, но тестировалось и точно работает в chrome5, где-то еще проверять было лень, в общем just for lulz Код дан с комментариями, потому делайте с ним что хотите и как хотите, главное мне никаких вопросов не задавайте.

Также во вложение даны рабочие модифицированные файлы и инструкция что ниже.

Инструкция:
0.   Открываем adsmanager.html.php функция(show_html_ad) и находим:
Код: html4strict
						adsmanager_html::showFieldValue($row,$field,$field_values,$conf->email_display,$option,$itemid,1,$plugins); /* 1 = Ad Mode */
}
} ?>
</h2>
после этого вставляем:
Код
						<?php
global $script_yzhe_ispolsuetsya;
if($script_yzhe_ispolsuetsya==0){  // Если скрипт не используется
    $script_yzhe_ispolsuetsya = 1; // Сообщаем что скрипт уже используется
?>
    <script type="text/javascript">
window.onload = reload_link; // После загрузки страницы будет вызвана функция
function reload_link(){ // рисуем ссылки на основе данных из куков
    var dc   = document.cookie; // получаем куки
var adid = 0;
var ids_ = '';
var ids  = new Array();
    if(dc.indexOf('notepad_ids')>0){ // если есть нужная нам кука
                                ids_ = getCookie('notepad_ids'); // получаем значения
if(ids_!=null){
    ids = ids_.split(','); // формируем массив из значений
}else{
    ids = new Array();
}
}
var divs = document.getElementsByTagName('div'); // получаем все дивы
for(var i=0;i<divs.length;i++){ // перебираем
    if(divs[i].getAttribute('class')=='notepadid_'){ // если это нужный нам div
    adid = divs[i].getAttribute('id').split('_')[1];// узнаем id объявления, к которому он относится
ids_ = ',' + ids_ + ','; // преобразуем дабы избежать ошибок
if(ids_.indexOf(','+adid+',')>0){ // если этот id уже есть в блокноте
    divs[i].innerHTML = '<a href="javascript:upd_notepad('+adid+',1);">Delete from notepad</a>'; // рисуем код для удаления
}else{
    divs[i].innerHTML = '<a href="javascript:upd_notepad('+adid+',0);">Add to notepad</a>'; // рисуем код для добавления
}
}
}
}
</script>
<script type="text/javascript">
function upd_notepad(adid,parametr){ // Добавляем/удаляем id из кук
    var dc   = document.cookie; // получаем куки
var ids_ = '';
var ids  = new Array();
var f    = 0;
    if(dc.indexOf('notepad_ids')>0){ // если есть нужная нам кука
                                ids_ = getCookie('notepad_ids'); // получаем значения
if(ids_!=null){
    ids = ids_.split(','); // формируем массив из значений
}else{
    ids = new Array();
}
}
for(var i=0;i<ids.length;i++){
    if(ids[i]==adid){
    if(parametr==1){ //Удалить
        ids.splice(i,1);
}
f = 1;
}
}
ids_ = ids.join(',');
if(f==0 && parametr==0){ // Добавить
    ids_ = ids_ + ',' + adid;
}
var days = 365; // сколько дней хранить куку
var expires = new Date(); // получаем текущую дату
                            expires.setTime(expires.getTime() + (1000 * 86400 * days)); // вычисляем срок хранения cookie
document.cookie = 'notepad_ids=' + escape(ids_) + '; expires=' + expires + '; path=/';
reload_link(); // Обновим данные
}
</script>
<script type="text/javascript">
// стандартные функции для работы с куками
function getCookie(name) { // Получение значения
var cookie = " " + document.cookie;
var search = " " + javascript:void(0);name + "=";
var setStr = null;
var offset = 0;
var end = 0;
if (cookie.length > 0) {
offset = cookie.indexOf(search);
if (offset != -1) {
offset += search.length;
end = cookie.indexOf(";", offset)
if (end == -1) {
end = cookie.length;
}
setStr = unescape(cookie.substring(offset, end));
}
}
return(setStr);
}
</script>
<?php } ?>
<div style="float:right;" id="notepadid_<?php echo $row->id; ?>" class="notepadid_">Loading...</div><br />

1. Открываем adsmanager.html.php функция(show_list) и находим:
            
Код
<tr class="<?php echo $classad;?>"> 
<td>
после этого вставляем:
                
Код
  <?php
global $script_yzhe_ispolsuetsya;
if($script_yzhe_ispolsuetsya==0){  // Если скрипт не используется
    $script_yzhe_ispolsuetsya = 1; // Сообщаем что скрипт уже используется
?>
    <script type="text/javascript">
window.onload = reload_link; // После загрузки страницы будет вызвана функция
function reload_link(){ // рисуем ссылки на основе данных из куков
    var dc   = document.cookie; // получаем куки
var adid = 0;
var ids_ = '';
var ids  = new Array();
    if(dc.indexOf('notepad_ids')>0){ // если есть нужная нам кука
                                ids_ = getCookie('notepad_ids'); // получаем значения
if(ids_!=null){
    ids = ids_.split(','); // формируем массив из значений
}else{
    ids = new Array();
}
}
var divs = document.getElementsByTagName('div'); // получаем все дивы
for(var i=0;i<divs.length;i++){ // перебираем
    if(divs[i].getAttribute('class')=='notepadid_'){ // если это нужный нам div
    adid = divs[i].getAttribute('id').split('_')[1];// узнаем id объявления, к которому он относится
ids_ = ',' + ids_ + ','; // преобразуем дабы избежать ошибок
if(ids_.indexOf(','+adid+',')>0){ // если этот id уже есть в блокноте
    divs[i].innerHTML = '<a href="javascript:upd_notepad('+adid+',1);">Delete from notepad</a>'; // рисуем код для удаления
}else{
    divs[i].innerHTML = '<a href="javascript:upd_notepad('+adid+',0);">Add to notepad</a>'; // рисуем код для добавления
}
}
}
}
</script>
<script type="text/javascript">
function upd_notepad(adid,parametr){ // Добавляем/удаляем id из кук
    var dc   = document.cookie; // получаем куки
var ids_ = '';
var ids  = new Array();
var f    = 0;
    if(dc.indexOf('notepad_ids')>0){ // если есть нужная нам кука
                                ids_ = getCookie('notepad_ids'); // получаем значения
if(ids_!=null){
    ids = ids_.split(','); // формируем массив из значений
}else{
    ids = new Array();
}
}
for(var i=0;i<ids.length;i++){
    if(ids[i]==adid){
    if(parametr==1){ //Удалить
        ids.splice(i,1);
}
f = 1;
}
}
ids_ = ids.join(',');
if(f==0 && parametr==0){ // Добавить
    ids_ = ids_ + ',' + adid;
}
var days = 365; // сколько дней хранить куку
var expires = new Date(); // получаем текущую дату
                            expires.setTime(expires.getTime() + (1000 * 86400 * days)); // вычисляем срок хранения cookie
document.cookie = 'notepad_ids=' + escape(ids_) + '; expires=' + expires + '; path=/';
reload_link(); // Обновим данные
}
</script>
<script type="text/javascript">
// стандартные функции для работы с куками
function getCookie(name) { // Получение значения
var cookie = " " + document.cookie;
var search = " " + name + "=";
var setStr = null;
var offset = 0;
var end = 0;
if (cookie.length > 0) {
offset = cookie.indexOf(search);
if (offset != -1) {
offset += search.length;
end = cookie.indexOf(";", offset)
if (end == -1) {
end = cookie.length;
}
setStr = unescape(cookie.substring(offset, end));
}
}
return(setStr);
}
</script>
<?php } ?>
<div style="float:right;" id="notepadid_<?php echo $row->id; ?>" class="notepadid_">Loading...</div>
2. Открываем adsmanager.html.php функция(showGeneralLink) и находим:
Код
echo '<a href="'.$link_show_rules.'">'.ADSMANAGER_MENU_RULES.'</a>';
и добавляем после:
Код
echo ' | <a href="'.sefRelToAbs("index.php?option=$option&amp;page=notepad&amp;Itemid=$itemid").'">Notepad</a>';
3. Открываем adsmanager.php и находим:
Код
  case 'show_profile': {
и перед этим вставляем:
Код
  case 'notepad': {
    notepad('notepad',0,$option,$expand,$text_search,$order,$limitstart,$plugins);
    break;
  }
4. Открываем adsmanager.php и вставляем в конец:
Код
function notepad($page,$catid,$option,$expand,$text_search,$order,$limitstart,$plugins){

    $text = 'Notepad'; // Название
$description = ''; // описание
$url = "index.php?option=$option&page=$page&text_search=$text_search";
$ids_ = mosGetParam( $_COOKIE, 'notepad_ids');
$search = " a.id IN (0 $ids_)";
$update_possible =0;

global $my,$database,$mosConfig_absolute_path;

if ($text_search <> "") {
$search .= " AND (a.ad_headline LIKE '%$text_search%' OR a.ad_text LIKE '%$text_search%') AND a.published = 1";
}
else
$search .= " AND a.published = 1";

$url .= $url_param;

$query = "SELECT DISTINCT a.id FROM #__adsmanager_ads as a ".
"LEFT JOIN #__adsmanager_adcat as adcat ON a.id = adcat.adid WHERE $search";
$database->setQuery($query);
$total = count($database->loadObjectList());

// get configuration
$database->setQuery( "SELECT * FROM #__adsmanager_config");
$database->loadObject($conf);
if ($database -> getErrorNum()) {
echo $database -> stderr();
return false;
}
$limit = $conf->ads_per_page;

if ($conf->display_expand == 0)
$expand = 0;
else if ($conf->display_expand == 2)
$expand = 1;
else if ($expand == -1)
$expand = 0;

$database->setQuery( "SELECT f.* FROM #__adsmanager_fields AS f WHERE f.published = 1" );

$fields = $database->loadObjectList();

if ($order == -1)
{
$order_text = "a.views DESC, a.date_created DESC ,a.id DESC";
}
else if ($order != 0)
{
$database->setQuery( "SELECT f.name,f.sort_direction,f.type FROM #__adsmanager_fields AS f WHERE f.fieldid=$order AND f.published = 1" );
$database->loadObject($sort);
if (($sort->type == "number")||($sort->type == "price"))
$order_text = "a.".$sort->name." * 1 ".$sort->sort_direction;
else
$order_text = "a.".$sort->name." ".$sort->sort_direction;
}
else
{
$order_text = "a.date_created DESC ,a.id DESC";
}

$database->setQuery( "SELECT f.title,f.fieldid,f.catsid FROM #__adsmanager_fields AS f WHERE f.sort = 1 AND f.published = 1" );

$searchs = $database->loadObjectList();

require_once( $mosConfig_absolute_path . '/includes/pageNavigation.php' );
$pageNav = new mosPageNav( $total, $limitstart,$limit );

if($conf->display_fullname == 1)
{
$name = "u.name";
}
else
{
$name = "u.username";
}

$query = "SELECT a.*, p.name as parent, p.id as parentid, c.name as cat, c.id as catid, $name as user ".
"FROM #__adsmanager_ads as a ".
"LEFT JOIN #__adsmanager_adcat as adcat ON adcat.adid = a.id ".
"LEFT JOIN #__users as u ON a.userid = u.id ".
"LEFT JOIN #__adsmanager_categories as c ON adcat.catid = c.id ".
"LEFT JOIN #__adsmanager_categories as p ON c.parent = p.id ".
"WHERE $search and c.published = 1 ".
"GROUP BY a.id ORDER BY $order_text";

if (function_exists("updateQuery")) {
updateQuery($query);
}

$database->setQuery($query,$limitstart,$limit);

$ads = $database->loadObjectList();

//*****************Mod by TomekOmel *******************

$database->setQuery("SELECT c.* ".
"FROM #__adsmanager_columns as c ".
"ORDER BY c.ordering ");


$columns = $database->loadObjectList();

if (isset($columns))
{
$licz=0;
$col = array();

foreach ($columns as $c ) {

if ($c->catsid == ",-1,") //// TUTAJ POPRAWIC
array_push( $col, $c );
else
{
$find = ",".$catid.",";
if (strstr($c->catsid, $find))
array_push( $col, $c );
}
}
}

unset($columns);
$columns = $col;

//***************** END of TomekOmel **********************/

$database->setQuery( "SELECT c.* FROM #__adsmanager_fields AS c ".
"WHERE c.columnid != -1 AND c.published = 1 ORDER by c.columnorder,c.fieldid" );

$fields = $database->loadObjectList();

// establish the hierarchy of the menu
$fColumn = array();
// first pass - collect children
if (isset($fields))
{
foreach ($fields as $f ) {
$pt = $f->columnid;
$list = @$fColumn[$pt] ? $fColumn[$pt] : array();
array_push( $list, $f );
$fColumn[$pt] = $list;
}
}

$database->setQuery( "SELECT * FROM #__adsmanager_positions WHERE 1 " );

$positions = $database->loadObjectList();
if ($database->getErrorNum()) {
echo $database->stderr();
return;
}

$database->setQuery( "SELECT f.* FROM #__adsmanager_fields AS f ".
"WHERE f.pos != -1 AND f.published = 1 ORDER by f.posorder" );

$fields = $database->loadObjectList();
if ($database->getErrorNum()) {
echo $database->stderr();
return;
}

// establish the hierarchy of the menu
$fDisplay = array();
// first pass - collect children
if (isset($fields))
{
foreach ($fields as $f ) {
$pt = $f->pos;
$list = @$fDisplay[$pt] ? $fDisplay[$pt] : array();
array_push( $list, $f );
$fDisplay[$pt] = $list;
}
}

//get value fields
$database->setQuery( "SELECT * FROM #__adsmanager_field_values ORDER by ordering ");
$fieldvalues = $database->loadObjectList();
if ($database -> getErrorNum()) {
echo $database -> stderr();
return false;
}

$field_values = array();
// first pass - collect children
if (isset($fieldvalues))
{
foreach ($fieldvalues as $v ) {
$pt = $v->fieldid;
$list = @$field_values[$pt] ? $field_values[$pt] : array();
array_push( $list, $v );
$field_values[$pt] = $list;
}
}

foreach($fields as $field)
{
if ($field->cbfieldvalues != "-1")
{
/*get CB value fields */
$database->setQuery( "SELECT *, fieldtitle as fieldvalue FROM #__comprofiler_field_values WHERE fieldid = $field->cbfieldvalues ORDER by ordering ");
$cbfieldvalues = $database->loadObjectList();
if ($database -> getErrorNum()) {
echo $database -> stderr();
return false;
}
$field_values[$field->fieldid] = $cbfieldvalues;
}
}

if (($conf->show_contact == 1)&&($my->id == "0"))
$show_contact = 0;
else
$show_contact = 1;

$itemid = intval( mosGetParam( $_GET, 'Itemid', 0 ));

$nav_link = $url."&expand=".$expand."&amp;Itemid=".$itemid;

adsmanager_html::show_list($catid,$description,$text,$url,$page,$ads,$pageNav,$nav_link,
   $show_contact,$expand,$order,$text_search,
   $itemid,$option,$my->id,$update_possible,
   $searchs,
   $columns,$fColumn,$positions,$fDisplay,$field_values,
   $conf,
   $fields_searchable,$plugins);
}

[вложение удалено Администратором]
*

GlooM

  • Давно я тут
  • 558
  • 91 / 0
  • AdsManager
Отличное и изящное решение.
Сам начал уже делать, но времени на это пока что нет, занимаюсь сейчас созданием модуля заказа из каталога (типа корзины)
*

bvp77

  • Новичок
  • 4
  • 0 / 0
Огромное СПАСИБО за проделанную работу!

Правда у меня не выводятся в блокноте сообщения (т.е. если в блокнот ничего не добавлено - то пишет "Нет объявлений", а вот если добавлять - то есть только шапка, а объявлений нет). но уже есть где пробовать разбираться ). В написании совсем нуб новичок, а на написанном коде надеюсь разберусь ).
Да, так на заметку, на IE7 скрипт не отрабатывается, т.е. остается Loading... , а скрипт не подгружается (но для меня это пока второстепенно).

В любом случае, еще раз ОГРОМНОЕ СПАСИБО! )   
*

bvp77

  • Новичок
  • 4
  • 0 / 0
Ну и как только смогу с меня +   ^-^
*

KDES

  • Осваиваюсь на форуме
  • 18
  • 0 / 0
как АМ2.6 применить?
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Заглушки с http://placehold.it вместо картинок в списке объявлений

Автор efimov777

Ответов: 6
Просмотров: 5554
Последний ответ 12.04.2020, 07:25:59
от Pavel
Хочу уточнить, есть в AdsManager возможность загрузки объявлений с парсера?

Автор DomBeri

Ответов: 3
Просмотров: 9519
Последний ответ 28.03.2019, 17:20:10
от DomBeri
Удалить карту объявлений Google

Автор trel

Ответов: 7
Просмотров: 3845
Последний ответ 25.03.2019, 09:02:25
от Technic
Вывод объявлений в случайном порядке

Автор Sabotage

Ответов: 3
Просмотров: 1674
Последний ответ 28.09.2018, 14:21:05
от Sabotage
Поля в списке объявлений

Автор klekovkinandrey

Ответов: 0
Просмотров: 1407
Последний ответ 17.01.2018, 10:18:34
от klekovkinandrey