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

Рекомендованные сообщения

Дошло наконец-то до меня проверить какой идет запрос на SQL. Обнулять мне нужно было не только $news, но и $fav_list, иначе при каждой новой итерации $list вбирал в себя все предыдущие значения и на основании этого делал выборку...

Код получился следующий:

   while ( $row = $db->get_row( $a ) ) {


/* Всякая служебная фигня */


$list = explode( ",", $row['Order'] );


foreach ( $list as $daten ) {

	$fav_list[] = "'" . $daten . "'";

}


$list = implode( ",", $fav_list );


$fav_list = ''; // То самое обнуление


$favorites = "(" . $list . ")";

$sql = "SELECT id, title FROM " . PREFIX . "_post where id in $favorites";

$sql_result = $db->query( $sql );


	while ( $rows = $db->get_row( $sql_result ) ) {

			$news .= '"'.$rows['title'].'+'.$rows['id'].'" ';

	}

			$tpl->set('{order}', $news);

			$tpl->compile( 'content' );

			$news = '';


		}

Спасибо за помощь, более менее разобрался, буду дальше делать потихоньку)

Ссылка на сообщение
Поделиться на других сайтах

$list = explode( ",", $row['Order'] );

foreach ( $list as $daten ) {

$fav_list[] = "'" . $daten . "'";

}

$list = implode( ",", $fav_list );

$fav_list = ''; // То самое обнуление

$favorites = "(" . $list . ")";

а зачем всё это? в одну строку же пишется:

$sql = "SELECT id, title FROM " . PREFIX . "_post where id in ({$row['Order']})";

При условии, что $row['Order'] всегда заполнено.

Плюс.... не буду утверждать наверняка, но может это можно и через один запроса сделать. Нужно почитать по mysql, может там сразу можно разделить $row['Order'] и там же отправить её как параметр на объединение. ПО крайней мере на 5 наверняка можно.

Ссылка на сообщение
Поделиться на других сайтах

Вопрос по разработке модов с подключением через шаблон.

Имеем мод, который использует функции API. При подключении в шаблоне дважды мы имеем следующее:

Fatal error: Call to a member function load_from_cache() on a non-object in ...site.ru\www\engine\modules\modul_name.php on line 44

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

Изменено пользователем Chrono-xXx
Ссылка на сообщение
Поделиться на других сайтах

Вопрос по разработке модов с подключением через шаблон.

Имеем мод, который использует функции API. При подключении в шаблоне дважды мы имеем следующее:

Fatal error: Call to a member function load_from_cache() on a non-object in ...site.ru\www\engine\modules\modul_name.php on line 44

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

http://forum.dle-news.ru/index.php?showtopic=47173

Ссылка на сообщение
Поделиться на других сайтах

Благодарю, теперь другое предложение по API

Допустим мне надо собственный парсер, который обработает текст как нужно моду. Чтобы не трогать файлы движка была бы удобна такая конструкция {include file="engine/modules/mymod.php?text={full-story}"}

Естественно вывод будет вместо {full-story} результат работы самого мода. На текущий момент выводится результат работы до и после, но сам текст остается необработанным. Т.е. в модуле если echo "<hr>".$text."<hr>" - то выводятся две линии до и после, но если пытатся применять форматирование к самому содержимому $text - то оно игнорируется.

Такое можно реализовать?

Изменено пользователем Chrono-xXx
Ссылка на сообщение
Поделиться на других сайтах

Благодарю, теперь другое предложение по API

Допустим мне надо собственный парсер, который обработает текст как нужно моду. Чтобы не трогать файлы движка была бы удобна такая конструкция {include file="engine/modules/mymod.php?text={full-story}"}

Такое можно реализовать?

это вопрос не API, это в пожелания к новым версиям скрипта, и должно быть реализовано на уровне скрипта

Ссылка на сообщение
Поделиться на других сайтах

Chrono-xXx,

Наврядли это технически реализуемо потому что URL требует особого формата и ряда ограничений, mymod.php?text= это полный аналог URL и параметра GET, и соответственно вы можете например передать туда число, или простейший текст, но передать текст содержащий HTML форматирование и все прочее вы не сможете через GET, как например не можете это сделать в URL браузера. Но все это можно сделать и не правя кода скрипта, просто берете в своем модуле из супер глобальной переменной $_GET id новости и считываете текст новости из БД. Нагрузка правда будет немного больше чем править файлы скрипта.

Ссылка на сообщение
Поделиться на других сайтах

это реализуемо причем получить можно любую шаблонную переменную как простой текст так и форматированный со спец и др символами причем для этого не нужны вызовы вида {include file="engine/modules/mymod.php?text={full-story}"} все шаблонные переменные(определенные на момент вызова модуля) доступны модулю по умолчанию в виде {author} => $this->data['{author}'] и тд как сделать написано тут http://forum.4dle.ru/topic10673.html

Ссылка на сообщение
Поделиться на других сайтах

Благодарю, только это опять-таки требует изменения файлов скрипта, в частности templates.class.php, а мое пожелание было чтобы была такая возможность не трогая ни один из файлов движка. Все равно большое спасибо, пока будем значит так.

Ссылка на сообщение
Поделиться на других сайтах

Благодарю, только это опять-таки требует изменения файлов скрипта, в частности templates.class.php, а мое пожелание было чтобы была такая возможность не трогая ни один из файлов движка. Все равно большое спасибо, пока будем значит так.

celsoft вам уже дал верный ответ

это вопрос не API, это в пожелания к новым версиям скрипта, и должно быть реализовано на уровне скрипта

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

Изменено пользователем dlehack
Ссылка на сообщение
Поделиться на других сайтах

Добавлено две новые фичи.

1) Добавлен метод update_user ($user_id, $vars = Array())

/**

* Изменение пользователя

* @param $user_id int - ID пользователя

* @param $vars array - Массив вида ключ->значение. Все ключи будут заменены на значения.

* @return null

*/

Позволяет реализовывать пополнение баланса или обновление любого другого поля.

2) В метод change_user_group($user_id, $new_group, $timelimit = 0) добавлен необязательный параметр $timelimit

/**

* Изменение группы пользователя

* @param $user_id int - ID пользователя

* @param $new_group int - ID новой группы пользователя

* @param $timelimit int - Время присутствия в группе

* @return bool - true в случае успеха и false если указан ID несуществующей группы

*/

Поправлена функция смены группу.

Добавлен параметр prolong.

/**

* Изменение группы пользователя

* @param $user_id int - ID пользователя

* @param $new_group int - ID новой группы пользователя

* @param $timelimit int - Время присутствия в группе

* @param $prolong bool - Продлить время в группе

* @return bool - true в случае успеха и false если указан ID несуществующей группы

*/

Итак. Если:

change_user_group($user_id, $new_group, 3600);

На час кидает user_id в группу нужную.

Если:

change_user_group($user_id, $new_group, 3600, true);

На час продлит пользователю его членство в группе

Версия обновлена до 0.09

Также добавлено текущее время с коррекцией в $dle_api->_TIME

Изменено пользователем IT-Security
Ссылка на сообщение
Поделиться на других сайтах

Вот нашел на одном из форумов, сам еще не смотрел, но у кого есть желание и т.д. можете проверить

Уязвимость позволяет удаленному пользователю выполнить произвольный PHP сценарий на целевой системе. Уязвимость существует из-за недостаточной обработки входных данных в параметре «dle_config_api» сценарием api.class.php. Удаленный пользователь может выполнить произвольный PHP сценарий на целевой системе с привилегиями Web сервера.

Эксплоит:

www.site/path /engine/api/api.class.php?dle_config_api=[shell.txt?]

Источник: _http://www.xakep.ru/post/49351/default.asp

п.с. надо попробовать, отпишитесь если у кого вышло как на локалке так и на удаленных. Целсофт превед, публикуй фикс

Ссылка на сообщение
Поделиться на других сайтах

kaliostro, Спокойствие, только спокойствие :)

Что то я также не понял, и причем здесь переменная dle_config_api, ее вообще нет в этом файле.

Ха, увидел где используется dle_config_api, в нелегальных копиях скрипта, ну и ладно нехай их ломают, если подобная уязвимость есть, я даже тестировать ее не буду. Все легальные пользователи могут спать спокойно, у них ничего подобного нет.

Изменено пользователем Kvazar
Ссылка на сообщение
Поделиться на других сайтах

Вообще я могу бесконечно расширять API, но мне нужны люди, которым это нужно =)

Кроме меня и Владимира конечно =)

Вот хороший пример отличной API:

http://wiki.modxcms.com/index.php/Category:API

Юзаем эту CMS на работе, и меня система Снипетов и АПИ очень обрадовала.

Комбинируя можно зделать что угодно и на любой вкус.

При этом хочю обратить внимание на такие функции как:

getDocumentи getDocuments.

Самое интерестное в них, это переменные которые передаются данным функциям.

array getDocument(int $id[, string $fields[, int $published[, int $deleted]]])

array getDocument(array $ids[, int $published[, int $deleted[, string $fields[, string $where[, string $sort[, string $dir[, string $limit]]]);

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

Это только небольшой пример.

Ссылка на сообщение
Поделиться на других сайтах

присоединяюсь modx одна из лучших CMF уже писал

http://www.modx-cms.ru/modx-api.html здесь список API CMS MODx вполне подойдет как источник идей.

Вот например regClientScript - подключает js файлы удобство в том что е сли на сайте используются несколько разных модулей которые при этом подключают одни и теже js файлы ну например jquery.js то функция сама подключит нужные файлы при подключении первого модуля и проигнорирует остальные подключения таким образом разработчику нет необходимости думать над тем подключен ли нужный js можно смело подключать нужный js и точно знать что не будет лишних подключений одинаковых файлов.(надеюсь понятно написал)

Ссылка на сообщение
Поделиться на других сайтах

Подумаю что можно сделать.

Была идея сделать getStaticPage(); так как это часто бывает нужно чтобы вывести у себя в модулях информацию, которая может меняться.

Причём сделать полную обработку всех тэгов стат. страницы (Вырезать {PAGEBREAK} наверное только).

Ссылка на сообщение
Поделиться на других сайтах

IT-Security,

пожалуй так повелось, что мне пока АПИ применять необходимости нет. Однако я вижу, что ты делаешь не малую работу, поэтому решил просмотреть файл и возможно какие-то мои рекомендации тебе покажутся полезными. Всё это конечно ИМХО и все мои критически замечания - на самом деле всего лишь форма изложения.

1. change_user_name

где обработка $new_name? От АПИ будет реальная польза не только когда оно будет делать простые инсерты в БД, но и когда оно будет выполнять всё то, что делает движок. В противном случае - толковый разраб будет вынужден городить все эти проверки за пределами АПИ (придётся каждую версию отслеживать изменения в движке и менять свой код), а не толковый - будет пихать в базу всё без проверки (и АПИ для него не даст никакой пользы).

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

2. change_user_password - тоже самое для пароля.

3. change_user_email - тоже самое для email

4. external_auth - а где контроль бана по ип и по нику? Опять придётся всё делать за пределами АПИ. А если не делать - АПИ выдаст разрешение аутентификации для стороннего модуля, хотя реально пользователь забанен, и ведь даже не передаст никаких флагов, уведомляющих об этом сторонний модуль. Тут потребуется либо новый запрос, либо писать свой модуль проверки авторизации.

5. external_auth - тоже самое, что и для пунктов 1-3 для полей пароля и ника. Ну хотя бы

 ! preg_match( "/[\||\'|\<|\>|\"|\!|\?|\$|\@|\/|\\\|\&\~\*\+]/", $_POST['login_name'] ) 

6. external_register - тоже самое про проверки валидности входных параметров

7. send_pm_to_user - ......

8. load_from_cache. В этой функции я затрудняюсь что-либо утверждать, т.к. не владею полной информацией, но мне кажется, что делать три обращения к файлу кэша смысла нет. Зачем проверять сначала его существование, потом таймаут (а если он на 0 - сразу возвращаем ложь, или бесконечный [очень большой] - нет смысла проверять).

9. edit_config - мне кажется необходимо внести запрет на изменение некоторых ключевых параметров скрипта. Той же самой версии, отключение кэша и т.п. (надо смотреть конфиг и искать там критические параметры, которые нельзя разрешать менять сторонним модулям)...Номер версии точно, т.к. он может потом доставить проблем при апгрейде (Только не спрашивай меня - кто захочет его изменить - у нас много умельцев B) ).

Относительно кэша.

Что больше всего заставляет парится при работе с ним в дле?))) Мало опций это ещё пол беды. Вторая половина - куча входных параметров, которые нужно много где прописать.

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

Допустим, мне надо получить кэш. Если его нет - выйти, создать и сохранить.

Инициализируем кэш:

$c_id = $this->sc_filename('all_posts', '-1', false, md5($sql['where']. (string)$this->request['page']), true, 0);

(можно без $c_id, это опциональный элемент. У меня прописаны везде this, т.к. я его использую как extends)

Получаем $this->sc_get($c_id);

Если его нет - ставим флаг сохранения.

$this->sc_saveact(true, $c_id);

Если вдруг передумали сохранять - $this->sc_saveact(false, $c_id);

Почему ставим флаг сохранения, а не сохраняем: потому что кэш может работать и с многомерными массвами. Допустим: array('users', 'tags'), и в ходе работы надо проверить существование всех из них - если кого-то нет - сохранить весь файл. И не нужно прописывать бесконечные if (users - нету || tags - нету || и т.п.), ведь задача - облегчить работу программисту, чтобы было меньше ошибок и написание шло быстрее.

Ну и где-то в конце вызвать $this->sc_save(); независимо от того - надо сохранять или нет. Лично у меня это вообще сделано так:

function __destruct(){

$this->sc_save();

}

(только на 4 пхп не прокатит)

Преимущество такого подхода в том, что:

- параметры прописаны только один раз

- нет необходимсоти таскать данные вне пределах кэша. Иногда у меня в классе установка параметра кэша прописана в одном методе, получение в другом - сохранение в третьем. И мне не нужно таскать всюду эти данные кэша. $c_id в данном случае должен иметь доступ для его ручного назначения.

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

Есть правда и недостаток у такого подхода. Иногда получаются конструкции типа

$this->CACHE[$c_id] .= $tpl->result['navigation'];

или

$tpl->result['navigation'] = $this->CACHE[$c_id];

Дело в том, что нельзя потом делать так unset($this->CACHE[$c_id]), т.к. потом кэш нужно сохранить.

Но если подумать - это можно обойти, разрешив сохранение данных сразу в шаблонизаторе.

Ссылка на сообщение
Поделиться на других сайтах

Учту замечания и посмотрим что сможем сделать.

Хочу ещё сделать версию под PHP5 попозже.

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

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