Перед созданием новой темы, пожалуйста, ознакомьтесь с FAQ по LinkorCMS

Исправить ошибки

Супер пользователь
Сообщений: 125
Я уже исправил очень много ошибок, но тут немного запутался

Если ввести в адрес
index.php?name=news&op=addpost&news=6&topic=*?:%;

то не проверяется topic и выходят 2 ошибки с неопределенным parent_id

Посмотрите пожалуйста где править код, да и как править

-- Изменено "Fort": 30.08.2015 11:48 --

-- Изменено "Fort": 30.08.2015 11:48 --

-- Изменено "Fort": 30.08.2015 11:48 --
Разработчик
Сообщений: 605
Это обработчик POST запроса из формы добавления комментария. Зачем к нему вы пытаетесь совершать GET запросы?
Супер пользователь
Сообщений: 125
в плане безопасности...
Разработчик
Сообщений: 605
Технически GET параметр topic нафиг не нужен для показа полной новости (она спокойно вытягивается по своему id). Так же при отключенном ЧПУ он тоже никак не используется. Но при включенном ЧПУ из него составляется ссылка на полную новость по шаблону /news/{topic}/{news_id}/.

GET параметр отфильтровывается в самом модуле новостей (в роутере в действии addpost). Единственное там кажется лишним дополнительно приводить значение id с помощью intval() к типу int. Дальше строится ссылка для редиректа после добавления комментария в функции ядра CommentsAddPost(). Больше он нигде не фигурирует.

Если вы будете вручную совершать GET запрос (или другой запрос к этому обработчику addpost), то в методе SavePost() класса Posts естественно будет происходит валидация всех пришедших данных. Ибо вы вряд ли ручками инициализировали parent_id и другие POST/GET параметры.

Если вам так не нравится, что этот обработчик пытается работать с заведомо некорректными данные (например, GET запрос, пустая POST часть и т.д.) и выводит ошибки об этом - можете в самом начале сделать проверки и отбросить эти случаи. А так то криминала я не вижу.
Супер пользователь
Сообщений: 125
Правильно ли я дописал все?:
\base\inc\system\comments.php

<?
function CommentsAddPost( $ObjectId, $CommentsTable, $Object
sTable, $CounterField, $AlloyField, $BackUrl, $BackUrlUfu, $
PageParam = 'page', $PageParamUfu = null, $BackUrlUfuSuffix 
= '' ){<br />
    if (isset($_POST['parent_id'])){<br />
        $parent_id = explode('_', $_POST['parent_id'], 2);<br />
        if($parent_id[1] == 0){<br />
            $sp = false;<br />
        }else{<br />
            $sp = true;<br />
        }<br />
    } else {<br />
        $parent_id = '';<br />
        $sp = false;<br />
    }<br />
    <br />
    if(!isset($PageParamUfu)){<br />
        $PageParamUfu = $PageParam;<br />
    }<br />
    $back_url = GetSiteUrl().Ufu(<br />
        $BackUrl.($sp ? "&$PageParam=".$_GET[$PageParam] : ''),<br />
        $BackUrlUfu.($sp ? $PageParamUfu.'{'.$PageParam.
'}/' : '').$BackUrlUfuSuffix<br />
    );<br />
    // -----------------------------------------------------<br />
    System::database()->Select($ObjectsTable, "`id`='$ObjectId'");<br />
    if (System::database()->NumRows() != 0){<br />
        $obj = System::database()->FetchRow();<br />
        $alloy_comments = $obj[$AlloyField] == '1';<br />
        $posts = new Posts($CommentsTable, $alloy_comments);
<br />
        if($posts->SavePost($ObjectId, false)){<br />
            $post_id = System::database()->GetLastId();<br />
            $counter = $obj[$CounterField] + 1;<br />
            System::database()->Update($ObjectsTable, "`$CounterField`='$counter'", "`id`='$ObjectId'");<br />
            <br />
            //$parent_id = explode('_', $_POST['parent_id'], 2);<br />
            if($parent_id != ''){<br />
                $parent_id = SafeDB($parent_id[1], 11, int);<br />
            } else {<br />
                $parent_id = 0;<br />
            }<br />
            <br />
            $post_anchor = ($parent_id != 0 ? "#post_$parent_id" : '#post_'.$post_id);<br />
            GO($back_url.$post_anchor);<br />
        }else{<br />
            System::site()->AddTextBox('Ошибка', $posts->PrintErrors());<br />
        }<br />
     }else{<br />
         System::site()->AddTextBox('Ошибка','<div class="errors_message">Произошла ошибка: запись(фото/статья/файл/...) которую вы комментируете не найдена. Возможно она была 
удалена.</div><br><br><a class="btn btn-small" href="'.GetSiteUrl().Ufu("index.php?name=articles", "{name}/").'">« Назад</a>');<br />
     }<br />
}
?>

Думаю можно сделать короче...

\modules\articles\index.php

<?
    case 'addpost':<br />
        if(!$get_art == ''){<br />
            $id = intval(SafeEnv($get_art, 11, int));<br
 />
            $cat = SafeDB($get_cat, 11, int);<br />
            CommentsAddPost(<br />
                $id,<br />
                'articles_comments',<br />
                'articles',<br />
                'comments_counter',<br />
                'allow_comments',<br />
                "index.php?name=articles&op=read&art=$id&cat=$cat",<br />
                'articles/{cat}/{art}/'<br />
            );<br />
        } else {<br />
            GO(GetSiteUrl().Ufu('index.php?name=articles', '
{name}/'));<br />
        }<br />
        break;
?>


п.с.

<?
if (isset($_GET['art'])) {$get_art = $_GET['art'];} else {$get_art = '';}
?>


я вот не пойму зачем objectId ?

comments.php

<?
function CommentsDeletePost( $ObjectId, $CommentsTable, $Obj
ectsTable, $CounterField, $DeleteUrl, $Anchor = '#comments' 
){<br />
    $posts = new Posts($CommentsTable);<br />
    $posts->DeletePageUrl = $DeleteUrl;<br />
    $deleted_posts_count = $posts->DeletePost();<br />
    if($deleted_posts_count > 0){<br />
        System::database()->Select($ObjectsTable, "`id`='$ObjectId'");<br />
        $obj = System::database()->FetchRow();<br />
        $counter = $obj[$CounterField] - $deleted_posts_count;<br />
        System::database()->Update($ObjectsTable, "`$CounterField`='$counter'", "`id`='$ObjectId'");<br />
        GoRefererUrl($_REQUEST['back'], $Anchor);<br />
    }<br />
}
?>

Что за каунтер ? если objectid заведомо не верны то что ? нужна ли тут проверка

-- Изменено "Fort": 03.09.2015 22:31 --
Разработчик
Сообщений: 605

<?
if($parent_id[1] == 0){ <br />
            $sp = false; <br />
        }else{ <br />
            $sp = true; <br />
        } 
?>

Нет смысла такое оставлять. Выражение $parent_id[1] == 0 уже дает вам тип bool. Незачем использовать if..esle. Достаточно $sp = ($parent_id[1] == 0);

Ладно, дубль $parent_id = explode('_', $_POST['parent_id'], 2); вы убрали. Но ввели другие глупости. $parent_id в начале своей жизни - массив. Зачем вы сравниваете его со строкой (это другой тип)? Не слишком хорошо. Лучше уж примерно так сделать все:

<?
function CommentsAddPost( $ObjectId, $CommentsTable, $Object
sTable, $CounterField, $AlloyField, $BackUrl, $BackUrlUfu, $
PageParam = 'page', $PageParamUfu = null, $BackUrlUfuSuffix 
= '' ){<br />
    if(isset($_POST['parent_id'])) {<br />
        $pid_parsed = explode('_', $_POST['parent_id'], 2);<br />
        $parent_id = SafeDB($pid_parsed[1], 11, int);<br />
    } else {<br />
        $parent_id = 0;<br />
    }<br />
    $sp = ($parent_id == 0);<br />
<br />
    if(!isset($PageParamUfu)){<br />
        $PageParamUfu = $PageParam;<br />
    }<br />
    $back_url = GetSiteUrl().Ufu(<br />
        $BackUrl.($sp ? "&$PageParam=".$_GET[$PageParam] : ''),<br />
        $BackUrlUfu.($sp ? $PageParamUfu.'{'.$PageParam.'}' 
: '').$BackUrlUfuSuffix<br />
    );<br />
    // -----------------------------------------------------<br />
    System::database()->Select($ObjectsTable, "`id`='$ObjectId'");<br />
<br />
    if(System::database()->NumRows() == 0) {<br />
        System::site()->AddTextBox('Ошибка', 'Объект не найден.');<br />
        return;<br />
    }<br />
<br />
    $obj = System::database()->FetchRow();<br />
    $alloy_comments = $obj[$AlloyField] == '1';<br />
    $posts = new Posts($CommentsTable, $alloy_comments);
<br />
    if($posts->SavePost($ObjectId, false)){<br />
        $post_id = System::database()->GetLastId();<br />
        $counter = $obj[$CounterField] + 1;<br />
        System::database()->Update($ObjectsTable, "`$CounterField`='$counter'", "`id`='$ObjectId'");<br />
        $post_anchor = ($parent_id != 0 ? "#post_$parent_id" : '#post_'.$post_id);<br />
        GO($back_url.$post_anchor);<br />
    }else{<br />
        System::site()->AddTextBox('Ошибка', $posts->PrintErrors());<br />
    }<br />
}
?>


Fort:
Думаю можно сделать короче...

А толк в вашем изменении какой? Лучше уж сделали в функции проверку на существование объекта комментирования. В текущей реализации это по-идее происходит, но из-за последующей ошибки в $alloy_comments, что не дело.

Fort:
Что за каунтер ? если objectid заведомо не верны то что ? нужна ли тут проверка

Если вы мучаете такие функции, то копайте глубже. counter - это счетчик комментариев у объекта (новость/статья/ect). А какие проверки вы тут хотите видеть? Ну можно еще проверять есть ли этот пост в базе. Но это менее плохой и вероятный случай, в отличии от предыдущего варианта.

-- Изменено "Мартин": 03.09.2015 23:42 --
Супер пользователь
Сообщений: 125
Если я комментирую что-то где уже закрыт доступ для комментов, то выход Сообщение не отправлено:, а почему не написано. ни как не пойму где это дописать
Разработчик
Сообщений: 605
Штатно в классе Posts есть проверки на это, но этот случай не корректно работает. Замените в файле /base/inc/posts.class.php следующие строки:

<?
if(!$this->AlloyComments){<br />
    $errors[] = 'Обсуждение закрыто';<br />
    return;<br />
}<br />
if($this->DisableComments){<br />
    $errors[] = 'Система комментариев отключена. Вы не сможете добавить к
омментарий.';<br />
}
?>

на:

<?
if(!$this->AlloyComments){<br />
    $this->LastSaveErrors[] = 'Обсуждение закрыто';<br />
    return false;<br />
}<br />
if($this->DisableComments){<br />
    $this->LastSaveErrors[] = 'Система комментариев отключена. Вы не сможете добавить к
омментарий.';<br />
    return false;<br />
}
?>
Супер пользователь
Сообщений: 125
Это заработало, но у меня вопрос. Я добавил во все модули при ошибках/сообщениях возврат на то что я комментирую и не отправленые данные сохраняются в форме...

<?
CommentsAddPost(<br />
                $id,<br />
                'news_comments',<br />
                'news',<br />
                'comments_counter',<br />
                'allow_comments',<br />
                "index.php?name=news&op=readfull&news=$id&topic=$topic",<br />
                'news/{topic}/{news}/'<br />
            );<br />
            IndexNewsReadFull();
?>


Но При

<?
    System::database()->Select($ObjectsTable, "`id`='$ObjectId'");<br />
    if (System::database()->NumRows() != 0){<br />
        $obj = System::database()->FetchRow();<br />
        $alloy_comments = $obj[$AlloyField] == '1';<br />
        $posts = new Posts($CommentsTable, $alloy_comments);
<br />
        if($posts->SavePost($ObjectId, false)){<br />
            $post_id = System::database()->GetLastId();<br />
            $counter = $obj[$CounterField] + 1;<br />
            System::database()->Update($ObjectsTable, "`$CounterField`='$counter'", "`id`='$ObjectId'");<br />
            if($parent_id != ''){<br />
                $parent_id = SafeDB($parent_id[1], 11, int);<br />
            } else {<br />
                $parent_id = 0;<br />
            }<br />
            $post_anchor = ($parent_id != 0 ? "#post_$parent_id" : '#post_'.$post_id);<br />
            GO($back_url.$post_anchor);<br />
        }else{<br />
            System::site()->AddTextBox('Ошибка', $posts->PrintErrors());<br />
            //System::site()->AddTextBox('Ошибка','<div class="errors_message">Произошла ошибка: вы пытаетесь комментировать запись(фото/статья/файл/...) у которой закрыто обсуждение.</div><p align="center"><input type="button" value="« Назад" onclick="history.back();" class="btn btn-small" style="margin-top: 6px;"></p>');<br />
        }<br />
     }else{<br />
        //System::site()->AddTextBox('Ошибка', $posts->PrintErrors());<br />
        System::site()->AddTextBox('Ошибка','<div class="errors_message">Произошла ошибка: запись(фото/статья/файл/...) которую вы комментируете не найдена. Возможно она была 
удалена.</div><p align="center"><input type="button" value="« Назад" onclick="history.back();" class="btn btn-small" style="margin-top: 6px;"></p>');<br />
     }
?>
не выпол усл (comments.php)
после ошибки
{page:enabled_comments}Комментарии:{/page:enabled_comments}
{news_comments_form}{/news_comments_form} {news_comments}{/news_comments} {comments_navigation}{/comm...
на сайте. Понятное дело почему. Не пойму как переделать. Прошу подсказку

То что не попключается форма комментов виноват только Index в news. Но я хочу убрать дубль сообщение об ошибке. Только ошибка из comments.php

Фото https://yadi.sk/i/NJflD7M3iznut
Первая ошибка из комментс и следом из индекс(ньювз)

-- Изменено "Fort": 11.09.2015 00:18 --
Разработчик
Сообщений: 605
Я не понял что с условиями, индексами и прочим. Не надо ничего сокращать, пишите более понятнее что вы хотите переделать.

То, что отображается вторая ошибка - это резонно. Первую выводит функция CommentsAddPost(), которая, не найдя объекта комментирования, сообщает об этом. Вторую выводит функция IndexNewsReadFull(), которая видимо не нашла в GET параметрах индекса news и вывела ошибку об этом (я не знаю вы там творили с этой функцией, но штатно она не рассчитана на телепатическое узнавание id и вызывается обычно сама по себе из роутера).

Теоретически, передавая еще параметр news через адрес обработчика формы ($posts->PostFormAction), можно сделать ее вызов корректным. И, проверяя в ней самой откуда она вызывается (индекс "a" массива GET параметров), можно отключать вывод ошибок в том случае, когда ее не запрашивали напрямую из роутера. Но это все костыли, по-хорошему там надо подумать и нормально все переделывать.
Супер пользователь
Сообщений: 125
мне надо сделать что бы IndexNewsReadFull не выполнялся в роутере addpost если выполняется последние условие в CommentsAddPost

<?
}else{ <br />
        //System::site()->AddTextBox('Ошибка', $posts->PrintErrors()); <br />
        System::site()->AddTextBox('Ошибка','<div class="errors_message">Произошла ошибка: запись(фото/статья/файл/...) которую вы комментируете не найдена. Возможно она была 
<br />
удалена.</div><p align="center"><input type="button" value="« Назад" onclick="history.back();" class="btn btn-small" style="margin-top: 6px;"></p>'); <br />
     }
?>
Разработчик
Сообщений: 605
Просто сделайте так, чтобы функция CommentsAddPost() возвращала значения true в случае успеха, а false - неуспеха. А дальше в роутере проверяйте что она возвратила и делайте нужные действия на основании этого.
Гости не могут отвечать на темы. Войдите или Зарегистрируйтесь.
Здесь присутствуют
(пользователей: 0, гостей: 1)
Быстрый переход: