Создание модуля - вывод информации из БД

#1 20 ноября 2012 в 11:45
Здравствуйте! помогите разобраться в написание модуля: Есть таблица в БД:

  1. id f_gdpec w_gdpec url_gdpec p_gdspec
  2. 1 Москва Красноярск www.test.ru 450
  3. 2 Москва Красноярск www.test.ru 900
  4. 3 Москва Красноярск www.test.ru 600
вот что я сделал:
Создана папка — mod_gdspec, в ней module.php:
  1. <?php
  2. function mod_gdspec($module_id){
  3.  
  4. $inCore = cmsCore::getInstance(); // подключаем ядро
  5. $inDB = cmsDatabase::getInstance(); // подключаем базу
  6. $cfg = $inCore->loadModuleConfig($module_id);
  7. //код модуля
  8. //Формируем запрос:
  9. $sql = "SELECT f_gdpec,
  10. w_gdpec,
  11. url_gdpec,
  12. p_gdspec
  13. FROM cms_gdspec";
  14. //Выполняем запрос:
  15. $result = $inDB->query($sql) ;
  16. /* Считаем количество выведенных записей */
  17. if ($inDB->num_rows($result)){
  18. $items = array();
  19. //Получаем данные из ответа БД:
  20. while ($item=$inDB->fetch_assoc($result)){
  21. $items=$item
  22. }
  23. }
  24. return true;
  25.  
  26. $smarty = $inCore->initSmarty('modules', 'mod_gdspec.tpl');
  27. $smarty->assign('items', $items);
  28. $smarty->display('mod_gdspec.tpl');
  29.  
  30. return true;
  31. }
  32. ?>
Сам шаблон:
  1. {foreach item=item from=$items}
  2.  
  3. <div class="mod_latest_entry">
  4.  
  5. <div class="mod_latest_f_gdpec">
  6.  
  7. {$item.f_gdpec}
  8.  
  9. </div>
  10.  
  11. <div class="mod_latest_w_gdpec" >
  12.  
  13. {$item.w_gdpec}
  14.  
  15. </div>
  16.  
  17. </div>
  18. {/foreach}
Модуль установил. Скрипт установки:
  1. <?php
  2.  
  3. function info_module_mod_gdspec(){
  4.  
  5. //
  6. // Описание модуля
  7. //
  8.  
  9. //Заголовок (на сайте)
  10. $_module['title'] = 'вывод данных из БД';
  11.  
  12. //Название (в админке)
  13. $_module['name'] = 'вывод данных из БД';
  14.  
  15. //описание
  16. $_module['description'] = 'вывод данных из БД';
  17.  
  18. //ссылка (идентификатор)
  19. $_module['link'] = 'mod_gdspec';
  20.  
  21. //позиция
  22. $_module['position'] = 'sidbar';
  23.  
  24. //автор
  25. $_module['author'] = 'braincord';
  26.  
  27. //текущая версия
  28. $_module['version'] = '1.9';
  29.  
  30. //
  31. // Настройки по-умолчанию
  32. //
  33. $_module['config'] = array();
  34.  
  35. return $_module;
  36.  
  37. }
  38.  
  39. // ========================================================================== //
  40.  
  41. function install_module_mod_gdspec(){
  42.  
  43. return true;
  44.  
  45. }
  46.  
  47. // ========================================================================== //
  48.  
  49. function upgrade_module_mod_gdspec(){
  50.  
  51. return true;
  52.  
  53. }
  54.  
  55. // ========================================================================== //
  56.  
  57. ?>
Установил, отметил позици где показывать данный модуль. Результат:
— сам модуль не отображает информацию, и после него не грузится страница сайта.
Прошу помощи у сообщества. Уже какой день голову ломаю.
#2 20 ноября 2012 в 11:54
так опечатку одну сам нашел в module.php, верно будет так:
  1. <?php
  2.  
  3. function mod_gdspec($module_id){
  4.  
  5. $inCore = cmsCore::getInstance(); // подключаем ядро
  6. $inDB = cmsDatabase::getInstance(); // подключаем базу
  7. $cfg = $inCore->loadModuleConfig($module_id);
  8. //код модуля
  9. //Формируем запрос:
  10. $sql = "SELECT f_gdpec,
  11. w_gdpec,
  12. url_gdpec,
  13. p_gdspec
  14. FROM cms_gdspec";
  15. //Выполняем запрос:
  16. $result = $inDB->query($sql) ;
  17. /* Считаем количество выведенных записей */
  18. if ($inDB->num_rows($result)){
  19. $items = array();
  20. //Получаем данные из ответа БД:
  21. while ($item=$inDB->fetch_assoc($result)){
  22. $items[]=$item;
  23. }
  24. }
  25.  
  26. $smarty = $inCore->initSmarty('modules', 'mod_gdspec.tpl');
  27. $smarty->assign('items', $items);
  28. $smarty->display('mod_gdspec.tpl');
  29.  
  30. return true;
  31. }
  32. ?>
но данные из базы так и не выводятся. Что не так сделал?
#3 20 ноября 2012 в 16:23
return true; перед выводом в шаблон уберите
#4 20 ноября 2012 в 16:35
Олег, извиняюсь, это опечатка была, в экспериментальном скрипте этого нет.

Проблема в следующем:
— Когда поставил отобразить модуль в определенной позиции сайта, заметил — что модуль не грузит mod_gdspec.tpl, а module.tpl. Пробовал в базе в таблице модули менять шаблон на нужный мне. Ну раз модуль не видит какой шаблон грузить, соответсвенно и данные не передаются в smarty.
Уже и так и сяк крутил, прошу прощение за мою не опытность. Нуждаюсь в вашей помощи.
#5 20 ноября 2012 в 17:54
попробуйте бес шаблона вывести информацию
while ($item=$inDB->fetch_assoc($result)){
$items[]=$item;
}
}

$smarty = $inCore->initSmarty('modules', 'mod_gdspec.tpl');
$smarty->assign('items', $items);
$smarty->display('mod_gdspec.tpl');
замените на
while ($item=$inDB->fetch_assoc($result)){
echo $item['f_gdpec'];
echo $item['url_gdpec'];
echo $item['p_gdspec'];
}
}
#6 20 ноября 2012 в 18:04
Олег, так все работает — проверял. На всякий случай, еще раз проверил — работает. Но хотелось бы через smarty вывести.
Могу выложить исходники, если у вас есть возможность проверить их.
#7 20 ноября 2012 в 18:28
{foreach item=item from=$items}
замените на
{foreach key=id item=item from=$items}
#8 20 ноября 2012 в 18:51
Поправил скрипт, оказалось, что пробелы не поставил, между переменной и знаком присваивания.
  1. while ($item = $inDB->fetch_assoc($result)){
  2. $items[] = $item;
Теперь шаблон подгружается.
Осталось понять почему не передаются переменные в шаблон.
#9 20 ноября 2012 в 18:55
в шаблоне
{foreach item=item from=$items}
замените на
{foreach key=id item=item from=$items}
#10 20 ноября 2012 в 19:05
Олег, поменял. Сейчас модуль выводит три записи:
  1. <div>
  2. <div class="mod_latest_entry">
  3. <div class="mod_latest_f_gdpec">
  4. //пусто
  5. </div>
  6. <div class="mod_latest_w_gdpec">
  7. //пусто
  8. </div>
  9. </div>
  10. <div class="mod_latest_entry">
  11. <div class="mod_latest_f_gdpec">
  12. //пусто
  13. </div>
  14. <div class="mod_latest_w_gdpec">
  15. //пусто
  16. </div>
  17. </div>
  18. <div class="mod_latest_entry">
  19. <div class="mod_latest_f_gdpec">
  20. //пусто
  21. </div>
  22. <div class="mod_latest_w_gdpec">
  23. //пусто
  24. </div>
  25. </div>
  26.  
  27. </div>
но в каждой пусто.
может надо прописать:
  1. $is_items = false;
  2. $is_items = true;
?
не сработало..:(
#11 20 ноября 2012 в 19:32
попробуй переименовать переменую в шаблоне
вместо
{foreach key=id item=item from=$items}
написать
{foreach key=id item=mes from=$items}
(вместо mes любую переменую)
ну и следовательно все переменые выводимые переименовать в шаблоне
{$item. на {$mes.
#12 20 ноября 2012 в 19:46
Олег,
Сделал так (ввел переменную gdt):
  1. <?php
  2.  
  3. function mod_gdspec($module_id){
  4.  
  5. $inCore = cmsCore::getInstance(); // подключаем ядро
  6. $inDB = cmsDatabase::getInstance(); // подключаем базу
  7. $cfg = $inCore->loadModuleConfig($module_id);
  8. //код модуля
  9. //Формируем запрос:
  10. $sql = "SELECT * FROM cms_gdspec";
  11. //Выполняем запрос:
  12. $result = $inDB->query($sql) ;
  13. /* Считаем количество выведенных записей */
  14. if ($inDB->num_rows($result)){
  15. $items = array();
  16. //Получаем данные из ответа БД:
  17. while ($gdt = $inDB->fetch_assoc($result)){
  18. $items[] = $gdt;
  19. }
  20. }
  21.  
  22. $smarty = $inCore->initSmarty('modules', 'mod_gdspec.tpl');
  23. $smarty->assign('gdt', $items);
  24. $smarty->display('mod_gdspec.tpl');
  25.  
  26. return true;
  27. }
  28. ?>
И в шаблоне, тоже, поменял:
  1. {foreach key=id item=gdt from=$items}
  2. <div class="mod_latest_entry">
  3. <div class="mod_latest_f_gdpec">
  4. {$gdt.f_gdpec}
  5. </div>
  6. <div class="mod_latest_w_gdpec">
  7. {$gdt.w_gdpec}
  8. </div>
  9. </div>
  10. {/foreach}
результат такой же как в посте №10
#13 20 ноября 2012 в 19:56
$smarty->assign('gdt', $items);

вы передали в шаблон перемненую gdt назначив её $items и следовательно в шаблоне $items вы непередали
$smarty->assign('gdt', $items);
замените на
$smarty->assign('items', $items);
и заработает
#14 20 ноября 2012 в 20:11
Олег, Спасибо огромное! заработало!:) Завтра буду продолжать пилить, только опишу это красиво. Вдруг это кому то пригодится.
#15 20 ноября 2012 в 20:13
отлично)))
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.