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

чтото не догоняю с api


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

сайт u4824.netangels.ru

делаю свой модуль инклюдю его.

использую апи для вытаскиания новостей...

модуль срабатывает один раз второй рай ругается на функцию апи...

вот текст модуля, чего не то делаю???

<?

if(!defined('DATALIFEENGINE'))

{

  die("Hacking attempt!");

}


include_once(ENGINE_DIR . '/api/api.class.php'); 


if ($cat == "2") { $cat_link = '<a href="/books/">книги</a>';  };

if ($cat == "4") {  $cat_link = '<a href="/autors/">авторы</a>';  };

//$cat="2";

    // данные для выборки

$fields = "*"; $start = 0; $limit = 1; $sort = "RAND()";

$data = $dle_api -> take_news ( $cat, $fields, $start, $limit, $sort );


    foreach ($data as $str) {

        $title_link = $str[id] . '-' . $str[alt_name];

        echo '<div class="base shortstory">';

        echo    '<h3 class="btl"><a href=' . $title_link . '.html>' . $str[title] . '</a></h3>';

        echo    '<div class="maincont">' . $str[short_story] . '</div>';

        echo    '<br><a href=' . $title_link . '.html>читать дальше...</a>';

        echo    '<p class="argcat orang small"><b>Все&nbsp' . $cat_link . '</b></p>';

        echo '</div>';

        //print_r($str);

    };

?>

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

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

Заменить ваш горе-мод на:


if ($cat == "2") $cat_link = '<a href="/books/">книги</a>';

else if ($cat == "4") $cat_link = '<a href="/autors/">авторы</a>';

else $cat_link = '';

//Чё оно такое - фиг знает, раз чё-то тащите из БД, значит, должны знать чё и как. 

if (isset($cat) && $cat>0) $data = $dle_api -> take_news ( $cat, $fields, $start, $limit, $sort );

if ($data && is_array($data) && $data!=null) {

  foreach ($data as $str) {...}

}


[/code]

Попробуйте :)

П.С. Не забывайте указывать какие именно ошибки: строка, файл и т.д. и сам текст ошибки цитировать.

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

Спасибо за ответ, но даже после изменения кода как вы сказали


<?

if(!defined('DATALIFEENGINE'))

{

  die("Hacking attempt!");

}


include_once(ENGINE_DIR . '/api/api.class.php'); 


//начальные данные

$fields = "*"; $start = 0; $limit = 1; $sort = "RAND()";


if ($cat == "2") $cat_link = '<a href="/books/">книги</a>';

else if ($cat == "4") $cat_link = '<a href="/autors/">авторы</a>';

else $cat_link = '';


if (isset($cat) && $cat>0) $data = $dle_api -> take_news ( $cat, $fields, $start, $limit, $sort );

if ($data && is_array($data) && $data!=null) {

  foreach ($data as $str)  {

        $title_link = $str[id] . '-' . $str[alt_name];

        echo '<div class="base shortstory">';

        echo    '<h3 class="btl"><a href=' . $title_link . '.html>' . $str[title] . '</a></h3>';

        echo    '<div class="maincont">' . $str[short_story] . '</div>';

        echo    '<br><a href=' . $title_link . '.html>читать дальше...</a>';

        echo    '<p class="argcat orang small"><b>Все&nbsp' . $cat_link . '</b></p>';

        echo '</div>';

        //print_r($str);

        //{$cat_info[$category_id]['name']}

    };

};    

//print_r ($cat_info[1]);

unset ($data);

?>
выдает ошибку - Fatal error: Call to a member function take_news() on a non-object in /home/u4824/u4824.netangels.ru/www/engine/modules/rnd.php on line 16 в шаблоне пишу вот так -
<td valign="top">

      {include file="engine/modules/rnd.php?cat=4"}

      {include file="engine/modules/rnd.php?cat=2"}

      </td>

почему то ругается на объект...

хотя если писать все в одном файле - а не вызывать два раза функцию - все ок! выводит то что надо...

чего он на объект то ругается не пойму.

я бы с удовольствием сделал все в одном файле,

но в шаблоне код надо вставлять в разных местах и совсем не хочется писать весь html код шаблона в модуле...

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

Все версии ДЛЕ до 8.5 лажовые, в них нет каких-либо проверок на переменные, как только что-то писал под ДЛЕ, вываливалась всегда куча ошибок с парсеров и фиг знает чего из ДЛЕ, хотя хаки/моды к этим файлам ДЛЕ никакого отношения не имели. Простой совет: не пользуйтесь тем кривым АПИ, а юзайте просто классы ДЛЕ, это надёжней, только код чуток больше. Выглядит примерно так:

$sql = "SELECT * FROM dle_post WHERE aproove='1' ORDER BY RAND() LIMIT 1";

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

Такой код можно хотя бы как-то проконтролировать на ошибки самому. ;)

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

Простой совет: не пользуйтесь тем кривым АПИ, а юзайте просто классы ДЛЕ, это надёжней, только код чуток больше. Выглядит примерно так:

$sql = "SELECT * FROM dle_post WHERE aproove='1' ORDER BY RAND() LIMIT 1";

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

Такой код можно хотя бы как-то проконтролировать на ошибки самому. ;)

прихожу к такому мнению...

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

написал так

if (isset($cat) && $cat>0) $sql = "SELECT * FROM dle_post WHERE category='4' & approve='1' ORDER BY RAND() LIMIT 1";

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

результату нету... то есть совсем нету ничего не возвращается похоже.

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

Причем здесь API и прочее, нужно просто писать правильный код своего модуля и проблем тогда не будет, а ошибка у вас в одной строке а именно:

include_once(ENGINE_DIR . '/api/api.class.php');
А теперь обратитесь к документации PHP и прочитайте что делает функция include_once. Она подключает файл только один !!! раз, за все время работы скрипта. А подключений у вас в шаблоне несколько, т.е. модулю нужно выполниться несколько раз, и при втором подключении в шаблоне, API попросту не будет работать, т.к. оно не подключиться и соответственно будет ошибка. Нужно заменить эту строчку на
include(ENGINE_DIR . '/api/api.class.php');

и все. Тогда ошибки Fatal error: Call to a member function take_news() on a non-object in /home/u4824/u4824.netangels.ru/www/engine/modules/rnd.php не будет.

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

эппс.

я почемуто думал что раз один раз апи проинклюдили, то этого и достаточно... получается надо каждый раз его цеплять?

или там разные области действий переменных?

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

эппс.

я почемуто думал что раз один раз апи проинклюдили, то этого и достаточно... получается надо каждый раз его цеплять?

или там разные области действий переменных?

....

Урра! заработало с include! огромное спасибо, но все равно не понятно почему одного раза подключиться ему мало?

вопрос закрыт!

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

но все равно не понятно почему одного раза подключиться ему мало?

потому что подключение {include file="engine/modules/rnd.php?cat=4"} запускает ваш модуль в своей изолированной среде и его переменные умирают и недоступны в после того как он отработал, а подключение include_once распространяется на всю область скрипта и имеет суперглобальную область действия. Можно было бы оставить include_once но тогда нужно было немного сложнее писать сам код модуля, и делать проверку наличия класса DLE_API и переинациализировать его если модуль подключается повторно. Я вам дал лишь самый простейший и быстрый способ устранения ошибки.

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

но все равно не понятно почему одного раза подключиться ему мало?

потому что подключение {include file="engine/modules/rnd.php?cat=4"} запускает ваш модуль в своей изолированной среде и его переменные умирают и недоступны в после того как он отработал, а подключение include_once распространяется на всю область скрипта и имеет суперглобальную область действия. Можно было бы оставить include_once но тогда нужно было немного сложнее писать сам код модуля, и делать проверку наличия класса DLE_API и переинациализировать его если модуль подключается повторно. Я вам дал лишь самый простейший и быстрый способ устранения ошибки.

вот теперь стало примерно понятно что происходит.

а что значит в своей изолированной среде?

в котором файле про это прочитать поподробнее? %)

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

в котором файле про это прочитать поподробнее? %)

Это не в файлах скрипта нужно читать, а в документации PHP, или учебниках по PHP, например вот статья описывающая области жизни переменных http://ruseller.com/lessons.php?rub=&id=751

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

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

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

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

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

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

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

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

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

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