Перейти к публикации

Sander1

местные
  • Публикации

    109
  • Зарегистрирован

  • Посещение

  • Дней в лидерах

    19

Сообщения, опубликованные пользователем Sander1

  1. При создании категории или подкатегории не учитывается параметр posi. Вернее у новой категории этот параметр позиции равен единице, отчего при создании категория размещается не в конце списка, а в начало ветки:

    VwDOs68BSKGnAd_jkDoACg.png

     

    Лично мне это кажется дико неудобным. Создал, перетянул (а когда категорий 50 и тянуть со скроллом, запоминая на глазок отсутп... уфф) в конец списка, сохранил. Многовато-лишних действий.

     

    <?xml version="1.0" encoding="utf-8"?>
    <dleplugin>
    	<name>Правильное расположение новых категорий</name>
    	<description>Расположение новой добавленной категории в конец списка ветки. by Sander</description>
    	<icon></icon>
    	<version></version>
    	<dleversion></dleversion>
    	<versioncompare>less</versioncompare>
    	<mysqlinstall><![CDATA[]]></mysqlinstall>
    	<mysqlupgrade><![CDATA[]]></mysqlupgrade>
    	<mysqlenable><![CDATA[]]></mysqlenable>
    	<mysqldisable><![CDATA[]]></mysqldisable>
    	<mysqldelete><![CDATA[]]></mysqldelete>
    	<file name="engine/inc/categories.php">
    		<operation action="after">
    			<searchcode><![CDATA['$disable_rating', '$disable_comments')" );]]></searchcode>
    			<replacecode><![CDATA[	$new_id = $db->insert_id();
    	$posi = $db->super_query("SELECT MAX(posi) as posi FROM ".PREFIX."_category WHERE parentid = $category LIMIT 1");
    	$posi = $posi['posi'] + 1;
    	$db->query("UPDATE ".PREFIX."_category SET posi = $posi WHERE id = $new_id");]]></replacecode>
    		</operation>
    	</file>
    </dleplugin>

    Данный метод подойдет так же и для предыдущих версий DLE. Только там код подключения немного отличается, вставлять нужно после строки, которая начинается на:

    $db->query( "INSERT INTO " . PREFIX . "_category

     

    С уважением,

    Олег Александрович a.k.a. Sander

  2. Когда категорий не много или занимаешься созданием развернутой структуры категорий - при каждом обновлении страницы приходится повторно нажимать кнопку "Развернуть все".

    Данный хак запоминает состояние кнопки и при перезагрузке страницы нет необходимости повторно нажимать эту кнопку.

    Плагин для DLE 13.0

    <?xml version="1.0" encoding="utf-8"?>
    <dleplugin>
    	<name>Запоминать состояние категорий в админке</name>
    	<description>Запоминать состояние кнопок "Развернуть все" и "Свернуть все". by Sander</description>
    	<icon></icon>
    	<version></version>
    	<dleversion></dleversion>
    	<versioncompare>less</versioncompare>
    	<mysqlinstall><![CDATA[]]></mysqlinstall>
    	<mysqlupgrade><![CDATA[]]></mysqlupgrade>
    	<mysqlenable><![CDATA[]]></mysqlenable>
    	<mysqldisable><![CDATA[]]></mysqldisable>
    	<mysqldelete><![CDATA[]]></mysqldelete>
    	<file name="engine/inc/categories.php">
    		<operation action="before">
    			<searchcode><![CDATA[		$('.nestable-action').on('click', function(e)]]></searchcode>
    			<replacecode><![CDATA[		if (localStorage.getItem('categoryExpand')) {
    			$('.dd').nestable('expandAll');
    		}]]></replacecode>
    		</operation>
    		<operation action="after">
    			<searchcode><![CDATA[			if (action === 'expand-all') {
    ]]></searchcode>
    			<replacecode><![CDATA[				localStorage.setItem('categoryExpand', true);]]></replacecode>
    		</operation>
    		<operation action="after">
    			<searchcode><![CDATA[			if (action === 'collapse-all') {]]></searchcode>
    			<replacecode><![CDATA[				localStorage.removeItem('categoryExpand');]]></replacecode>
    		</operation>
    	</file>
    </dleplugin>

    Для предыдущих версий (но с новой админкой) так же будет работать, но изменения нужно будет вносить вручную.

     

    С уважением,
    Олег Александрович a.k.a. Sander

     

  3. Данный хак будет полезен тем, кто часто добавляет новые подкатегории или просто вы ленивая жопа устали каждый раз перебирать файлы шаблона в поисках всех custom-ов и [category для добавления нового ID.

    С помощью этого хака достаточно будет прописать:

    [category={subcat=3}]
    {custom category="{subcat=7}"}
    [catlist={subcat=2}]

    В момент загрузки файла шаблона хак выполнит обработку тега, в итоге обработчик получит привычный вид:

    [category=3,21,22,25,29,33,34,35,39]
    {custom category="7,59,60,61,66,67,68,69,80"}
    [catlist=2,8,9,10]

    Так же можно комбинировать теги:

    [category={subcat=3},100,105-110]
    [category={subcat=3},{subcat=7},551]


    Установка:
    Для DLE 13.0 достаточно установить плагин:

    <?xml version="1.0" encoding="utf-8"?>
    <dleplugin>
        <name>Обработка тега {subcat=x}</name>
        <description>Автоматический вывод списка ID подкатегорий заданной &quot;x&quot; категории</description>
        <icon></icon>
        <version></version>
        <dleversion></dleversion>
        <versioncompare>less</versioncompare>
        <mysqlinstall><![CDATA[]]></mysqlinstall>
        <mysqlupgrade><![CDATA[]]></mysqlupgrade>
        <mysqlenable><![CDATA[]]></mysqlenable>
        <mysqldisable><![CDATA[]]></mysqldisable>
        <mysqldelete><![CDATA[]]></mysqldelete>
        <file name="engine/classes/templates.class.php">
            <operation action="before">
                <searchcode><![CDATA[function load_template($tpl_name) {]]></searchcode>
                <replacecode><![CDATA[//////////////////////////////////////////////////////////////
        private function getSubCatList($match)
        {
            global $cat_info;
            $id = is_array($match) ? $match[1] : $match;
    
            if (!$cat_info[$id]) {
                return $id;
            }
            $list = [$id];
            foreach ($cat_info as $v) {
                if ($v['parentid'] == $id) {
                    $list[] = $this->getSubCatList($v['id']);
                }
            }
            return join(',', $list);
        }
    //////////////////////////////////////////////////////////////]]></replacecode>
            </operation>
            <operation action="after">
                <searchcode><![CDATA[$this->template = file_get_contents( $this->dir . "/" . $tpl_name );]]></searchcode>
                <replacecode><![CDATA[//////////////////////////////////////////////////////////////////////////////////////////////
            $this->template = preg_replace_callback("#\{subcat=(\d+)\}#i", [&$this, 'getSubCatList'], $this->template);
    //////////////////////////////////////////////////////////////////////////////////////////////]]></replacecode>
            </operation>
            <operation action="after">
                <searchcode><![CDATA[$template = file_get_contents( $templatefile );]]></searchcode>
                <replacecode><![CDATA[//////////////////////////////////////////////////////////////////////////////////////////////
            $template = preg_replace_callback("#\{subcat=(\d+)\}#i", [&$this, 'getSubCatList'], $template);
    //////////////////////////////////////////////////////////////////////////////////////////////]]></replacecode>
            </operation>
        </file>
    </dleplugin>

     

    Для предыдущих версий инструкция у меня на сайте, если кому будет интересно конечно.

     

    С уважением,
    Олег Александрович a.k.a. Sander

    • Поддерживаю 1
    • Спасибо 1
  4. Есть предложения по управлению плагинами.

    1. При внесении изменений в php файл в кеше файла в шапке записывать какой именно плагин внес изменения.

    <?php
    // Название плагина
    // И еще название другого плагина
    /*
    =====================================================
     DataLife Engine - by SoftNews Media Group 

     

    2. Добавить в админку поиск по файлу. Чтобы можно было вбить локальный адрес файла и получить сравнительную информацию как на гитхабе. Слева оригинал, справа - модифицированная копия с подсветкой изменений. Или хотя бы просто показать список плагинов которые вносят изменения в этот файл.

     

    3. В имени кеша файла перед хешем прописывать имя файла, к примеру engine.php_226ba0642590b9136386fb777e0a09ec.php

     

    4. Добавить кнопку для пересохранения всех плагинов. Сейчас для этого нужно открыть плагин и просто нажать сохранить, но как-то это не продуктивно.

     

    5. Добавить возможность текстового экспорта/импорта плагина без фактического использования xml файлов.

    • Нравится 1
  5. Админка, добавление новостей на сайте и комментарии:

    <?xml version="1.0" encoding="utf-8"?>
    <dleplugin>
    	<name>Froala p tag</name>
    	<description>Перенос строки тегом p вместо br</description>
    	<icon></icon>
    	<version></version>
    	<dleversion></dleversion>
    	<versioncompare>less</versioncompare>
    	<mysqlinstall><![CDATA[]]></mysqlinstall>
    	<mysqlupgrade><![CDATA[]]></mysqlupgrade>
    	<mysqlenable><![CDATA[]]></mysqlenable>
    	<mysqldisable><![CDATA[]]></mysqldisable>
    	<mysqldelete><![CDATA[]]></mysqldelete>
    	<file name="engine/editor/shortnews.php">
    		<operation action="after">
    			<searchcode><![CDATA[$('.wysiwygeditor').froalaEditor({]]></searchcode>
    			<replacecode><![CDATA[enter: $.FroalaEditor.ENTER_P,]]></replacecode>
    		</operation>
    	</file>
    	<file name="engine/editor/shortsite.php">
    		<operation action="after">
    			<searchcode><![CDATA[$('.wysiwygeditor').froalaEditor({]]></searchcode>
    			<replacecode><![CDATA[enter: $.FroalaEditor.ENTER_P,]]></replacecode>
    		</operation>
    	</file>
    	<file name="engine/editor/comments.php">
    		<operation action="after">
    			<searchcode><![CDATA[$('#comments').froalaEditor({]]></searchcode>
    			<replacecode><![CDATA[enter: $.FroalaEditor.ENTER_P,]]></replacecode>
    		</operation>
    	</file>
    </dleplugin>

    Не забываем обновлять страницу Ctrl->F5

    • Поддерживаю 1
  6. Выскажу свою скромную точку зрения по поводу маркета в том виде как его сейчас обсуждают.

    Нет и однозначно нет.

     

    Анализировать код и гарантировать его качество/безопасность/надежность? Я вообще даже не представляю, кто на это пойдет. Тем более если учитывать, что очень часто модули кодируют (я в том числе), причем некоторые вообще глобально все файлы закрывают.

     

    В моём представлении - достаточно просто чего-то вроде доски объявлений. К примеру тот же Avito.

    Чтобы был хоть какой-никакой, но централизованный каталог модулей к DLE. Как бесплатных, так и платных.

    Можно сделать ограничение, к примеру на одну платную публикацию - одна бесплатная.

    Или сделать ограничение по рейтингу, хочешь в платный раздел - набери 10, 20, 50 лайков за бесплатные модули.

    Еще как вариант - добавить официальную группу разработчиков проверенных репутацией и временем.

    • Нравится 2
  7. 3 минуты назад, celsoft сказал:

    ошибка в данном случае не в работе DLE, а в вашей логике построения шаблона.

    Да я ж не спорю, я к тому, что стоит этот момент как-то задокументировать.

    Мол так и так, при использовании на главной custom вместо content - нужно скрывать тег {content} в not-aviable=main

  8. 3 часа назад, celsoft сказал:

    Это лишь вы так делаете.

    Я так не делаю. Нужно было проверить другую вещь и я столкнулся с такой ситуацией.

    Я лишь сообщил, что при обычном использовании стандартных функций движка выдает не корректный итоговый результат. Параметр этот - http://prntscr.com/jfa92t

    Что делать с этой информацией - решать вам.

     

    3 часа назад, celsoft сказал:

    Навигация на сайте должна быть одна, а не две,

    Так и есть. В настройках выбрана опция отображения custom на главной. При этом содержимое переменной $tpl->result['content'] пусто и соответственно навигации в нем нет.

     

  9. Очень радует п.3.

    Однако есть некоторые сомнения по способам его использования. Ну и предложения само собой.

     

    К примеру по инструкции нужно вставить код в functions.php после строки:

    else $config['allow_cache'] = false;

    Но таки строки в файле 2, а вставлять нужно после второй. Можно конечно заменять бОльший участок кода:

        } else $custom_limit = $config['news_number'];
    
        if( preg_match( "#cache=['\"](.+?)['\"]#i", $param_str, $match ) ) {
            if( $match[1] == "yes" ) $config['allow_cache'] = 1;
            else $config['allow_cache'] = false;

    Но вот допустим в 13.1 добавится еще код, который будет как раз между этими блоками. И все, инструкцию опять переписывать и адаптировать/совмещать под 2 версии dle.

    Это частный случай, подобных мест может быть очень много.

     

    Следующая возможная проблема - несовместимость 2х модулей в следствии внесенных изменений.

    К примеру

    else $config['allow_cache'] = false;

    На:

    else {
        $config['allow_cache'] = false;
        include "file.php";
    }

     

    Ну, в принципе по большому счету это не такая уж большая проблема, легко решаема в частном порядке в рамках техподдержки. Но мне кажется будет уже значительно сложнее отслеживать изменения от других файлов и проводить отладку.

     

    По поводу предложения.

    Добавить автозагрузчик классов с поддержкой namespace`ов, чтобы можно было изначально в init.php подключить свои классы модуля.

    Или же аналогичным образом добавить точки автоподключения файлов модулей в init.php и engine.php.

    Чтобы можно было автоматически подгружать свои файлы с функциями/классами/загрузчиками и чтобы можно было легко делать вывод контента модулем не подключая его внутри switch ($do)

     

    В общем идя интересная и уже хочется пощупать в живую :)

    • Поддерживаю 2
  10. Почитал описание функции в пресс релизе, полистал Документацию, посмотрел в подписи к параметру в настройках DLE.

    Нигде не написано, что при использовании параметра "Новости выводимые в шаблоне при помощи тега {custom}" необходимо скрывать тег {content} в not-aviable=main

    Иначе на страницах навигации {custom navigation="yes"} будет отображать ошибку 404, мол ничего нету.

     

    Ошибку показывает обработчик в modules/main.php:563

     

    Не исключаю варианта, что я просто плохо искал документацию по этому функционалу. Но мне кажется, как минимум, в админке в настройках при включении этого параметра должна быть описана эта особенность.

    • Поддерживаю 2
  11. При загрузке изображения по URL выполняется проверка заголовков, в частности Content-Length

    Некоторые хостинги изображений не отдают этот заголовок, отчего скрипт возвращает ошибку, мол файла нет или он не доступен.

    http://prntscr.com/j9fe12

     

    На скорую руку заменил строку:

                    if ( preg_match("#Content-Length: ([0-9]+)#i",$x,$size) ) return intval($size[1]); else return 0;

    На:
     

                    if (preg_match("#Content-Length: ([0-9]+)#i",$x,$size)) {
                        return intval($size[1]);
                    } else {
                        $x = @file_get_contents($this->from);
                        $x = strlen($x);
                        return $x;
                    }

    И все заработало.

    Т.е. проблема исключительно в отсутствии заголовка Content-Length

     

    Так же неплохо было бы добавить поддержку URL`ов вида:

    example.com/image.jpg?123123

    Чтобы не нужно было вручную удалять ?123123

  12. 5.6.38-log MySQLi

     

    https://dev.mysql.com/doc/refman/8.0/en/innodb-restrictions.html

    Цитата

    SHOW TABLE STATUS does not give accurate statistics on InnoDB tables except for the physical size reserved by the table. The row count is only a rough estimate used in SQL optimization.

    Сама документация говорит, что данный запрос не может давать точно значение количества записей в таблицах InnoDB.

  13. Да, действительно не зависит от версии DLE.

    Записал видео для наглядности:

    https://sandev.pro/uploads/show_db.wmv

     

    1 час назад, celsoft сказал:

    Никаких проверок в этом файле нет, он выполняет команды описанные в файле бекапа. И в файле бекапа стоят MySQL запросы и на создание таблиц и на вставку данных. Это во время импорта, а во время экспорта тоже проверок нет, он экспортирует все, что выдает БД.

     

    Запрос на получение данных.

    211: $result = mysqli_query($dblink, "SHOW TABLE STATUS");

     

    Получение количества записей в таблице

    222: $tabinfo[$item['Name']] = $item['Rows'];

     

    Проверка (которой нет?), на количество записей в таблице.

    303: if ($tabinfo[$table] > 0) {

     

    И получается, что строки 303 - 333 просто игнорируются, т.к. скрипт ошибочно считает что записей в БД нет.

     

    Это судя по всему известная проблема.

    https://www.google.com.ua/search?q=show+table+status+rows+wrong

  14. Сделал тут давеча бекап средствами DLE и через некоторое время решил восстановить БД. После импорта слетела авторизация. Каково же было мое удивление, когда оказалось, что таблица dle_users не была сохранена, но при импорте была пересоздана и оказалась пустой. Т.е. полностью слетели данные таблицы dle_users и dle_admin_sections (возможно и другие некоторые).

    Выполняю запрос на dle 12.1

    SHOW TABLE STATUS WHERE name like 'dle_users'

    В результате вижу Rows = 0, хотя записи однозначно есть.

    http://prntscr.com/j7d450

    Выполняю этот же запрос на DLE 12, все норм.

    Кодировка utf-8, версия PHP: 5.6, 7.0, 7.1

     

    PS. Кто не знает, в файле engine/inc/dumper.php именно по результатам этого запроса выполняется проверка, экспортировать данные из таблицы или нет (т.к. их нету типа).

  15. DLE 12.

    Если у группы пользователей запрещен доступ (или открыт) в определенные категории, то он получит ошибку:

    Unknown column 'dle_post.category' in 'where clause'

     

    Код:

    (SELECT id FROM " . PREFIX . "_comments " . $where . " ORDER BY id desc LIMIT ".$fromcstart.", ".intval($config['comm_nummers'])." ) as sub

    Имеем запрос:

    (SELECT id FROM dle_comments WHERE dle_post.category NOT REGEXP '[[:<:]](3)[[:>:]]' ORDER BY id desc LIMIT 0, 30 ) as sub

    не хватает LEFT JOIN dle_post ON ...

     

    (SELECT " . PREFIX . "_comments.id FROM " . PREFIX . "_comments LEFT JOIN " . PREFIX . "_post ON " . PREFIX . "_comments.post_id=" . PREFIX . "_post.id " . $where . " ORDER BY " . PREFIX . "_comments.id desc LIMIT ".$fromcstart.", ".intval($config['comm_nummers'])." ) as sub

     

  16. engine/modules/show.short.php

    Разве эта строка должна находиться внутри цикла while?

    $xfields = xfieldsload();

    Я бы так вообще предложил такой вариант, перед while:

    	$xfields = xfieldsload();
    	foreach ($xfields as $k => $v) {
    		if (stripos($tpl->copy_template, '_'.$v[0].']') == false) {
    			unset($xfields[$k]);
    		}
    	}

     

    • Нравится 1
  17. При временном размещении пользователя в группе используется разный формат даты в datepicker и тот что выводит DLE.

    DLE: d.m.Y H:i:s

    datepiker: Y-m-d H:i

     

    Открыть engine/inc/editusers.php

    Найти строку:

    if( $row['time_limit'] != "" ) $row['time_limit'] = date( $langformatdatefull, $row['time_limit'] );

    Заменить на:

    if( $row['time_limit'] != "" ) $row['time_limit'] = date( "Y-m-d H:i", $row['time_limit'] );

     

  18. 14 часа назад, SKYNET74 сказал:

    С чего это он будет отображаться как обычный текст?
    Будет отображаться точно так же, как и был добавлен.

    С того, что htmlpurifier был добавлен только в 11.2. До этого в стандартном BB редакторе подобная конструкция легко проходит и отображается в итоге http://example.com/

  19. Подключаю файл:

    {include file="file.php?field=[xfvalue_poster]"}

     

    Имя картинки примерно такое:

    /uploads/posts/2016-05/1027396235-agenty-sch.i.t..jpg

     

    В файле engine/classes/templates.class.php в строке 

    $name = str_replace( '..', '', $name );

    Заменяются точки не только в пути подключения файла, но и в передаваемом значении. После чего в файле уже получаем значение с неправильным адресом.

    /uploads/posts/2016-05/1027396235-agenty-sch.i.tjpg

     

×
×
  • Создать...