Новые статьи и foreach

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО
#16 10 апреля 2011 в 00:09
Может так будет понятнее…

/modules/mod_latest/module.php
  1.  
  2. <?php
  3. /*********************************************************************************************/
  4. // //
  5. // InstantCMS v1.7 (c) 2010 FREEWARE //
  6. // http://instantcms.ru/, info@instantcms.ru //
  7. // //
  8. // written by Vladimir E. Obukhov, 2007-2010 //
  9. // //
  10. /*********************************************************************************************/
  11.  
  12. function mod_latest($module_id){ // определяем последние материалы по идентификатору модуля
  13.  
  14. $inCore = cmsCore::getInstance(); // подгружаем класс cms.php
  15. $inDB = cmsDatabase::getInstance(); // подгружаем класс db.class.php
  16.  
  17. $cfg = $inCore->loadModuleConfig($module_id); //загружаем конфигурацию модуля
  18.  
  19. global $_LANG; // определяем глобальную языковую переменную
  20.  
  21. if (!isset($cfg['showrss'])) { $cfg['showrss'] = 1; } //если в конфиге не установлено значение для rss включаем rss
  22. if (!isset($cfg['subs'])) { $cfg['subs'] = 1; } //если в конфиге не установлено разрешать подразделы включем их
  23. if (!isset($cfg['cat_id'])) { $cfg['cat_id'] = 1; } //если в кофиге не задана определенная категория включаем главную
  24.  
  25. // опции постраничной разбивки
  26. $page = 1;
  27. $perpage = $cfg['newscount']; //берем из конфига количество новостей на страницу
  28.  
  29. $today = date("Y-m-d H:i:s"); //устанавливаем формат даты
  30.  
  31. if ($cfg['cat_id'] != '-1') //если в конфиге не установлено показывать из всех категорий
  32. {
  33. if (!$cfg['subs']) //если в конфиге не установлено показывать из подразделов
  34. {
  35. //select from category //то выбираем только из указанной категории по её ID
  36. $catsql = ' AND con.category_id = '.$cfg['cat_id']; //добавляем к запросу соответствующее условие
  37. }
  38. else //иначе
  39. {
  40. //select from category and subcategories // выбираем из категории и подраздела
  41. $rootcat = $inDB->get_fields('cms_category', 'id='.$cfg['cat_id'], 'NSLeft, NSRight'); //определяем родительскую категорию
  42. $catsql = "AND (cat.NSLeft >= {$rootcat['NSLeft']} AND cat.NSRight <= {$rootcat['NSRight']})"; //включаем из неё подразделы
  43. }
  44. $rssid = $cfg['cat_id']; //передаем записи из выбранной категроии в rss
  45. }
  46. else //иначе
  47. {
  48. $catsql = ''; $rssid = 'all'; //передаем записи из всех категорий
  49. }
  50. //формируем запрос к базе данных и обращаемся к таблице контента применяя сформированные выше условия
  51. $sql = "SELECT con.*,
  52. con.pubdate as fdate,
  53. u.nickname as author,
  54. u.login as author_login
  55. FROM cms_content con
  56. LEFT JOIN cms_category cat ON cat.id = con.category_id
  57. LEFT JOIN cms_users u ON u.id = con.user_id
  58. WHERE con.published = 1 AND con.showlatest = 1
  59. AND (con.is_end=0 OR (con.is_end=1 AND con.enddate >= '$today' AND con.pubdate <= '$today'))
  60. ".$catsql."
  61. ORDER BY con.id DESC
  62. LIMIT ".$cfg['newscount'];
  63.  
  64. $result = $inDB->query($sql); //получаем результат запроса
  65.  
  66. $is_con = false; // не контент
  67.  
  68. if ($cfg['is_pag']) //если включено разбиение на страницы (пэйджинация)
  69. {
  70. // Считаем общее количество материалов если опция пагинация включена SELECT 1 ???
  71. $sql_total = "SELECT 1
  72. FROM cms_content con
  73. LEFT JOIN cms_category cat ON cat.id = con.category_id
  74. WHERE con.published = 1
  75. AND con.showlatest = 1
  76. AND (con.is_end=0 OR (con.is_end=1 AND con.enddate >= '$today' AND con.pubdate <= '$today')) ".$catsql."";
  77. $result_total = $inDB->query($sql_total) ; //всего результатов
  78. $total_page = $inDB->num_rows($result_total); //всего страниц
  79. }
  80.  
  81. if ($inDB->num_rows($result)) //если результат вернулся не пустой (строка 63)
  82. {
  83. $is_con = true; // контент
  84. $inCore->loadModel('content'); // вызываем из cms.php метод loadModel
  85. $model = new cms_model_content(); //присваиваем модели новый объект контент
  86.  
  87. $articles = array(); //определяем новый пустой массив артикулов
  88. while($con = $inDB->fetch_assoc($result)) //заполняем его значениями из результата запроса выше (строка 63)
  89. { //перебирая в цикле все строки из него в виде ассоциативного массива
  90. $next = sizeof($articles); //по шагу вхождения
  91. $articles[$next]['id'] = $con['id'];
  92. $articles[$next]['title'] = $con['title'];
  93. $articles[$next]['hits'] = $con['hits'];
  94. $articles[$next]['href'] = $model->getArticleURL(null, $con['seolink']);
  95. $articles[$next]['author'] = $con['author'];
  96. $articles[$next]['authorhref'] = cmsUser::getProfileURL($con['author_login']);
  97. $articles[$next]['comments'] = $cfg['showcom'] ? $inCore->getCommentsCount('article', $con['id']) : false;
  98. $articles[$next]['date'] = $inCore->dateformat($con['fdate']);
  99. $articles[$next]['description'] = $con['description'];
  100. $articles[$next]['image'] = (file_exists(PATH.'/images/photos/small/article'.$con['id'].'.jpg') ? 'article'.$con['id'].'.jpg' : '');
  101. }
  102.  
  103. }
  104.  
  105. $smarty = $inCore->initSmarty('modules', 'mod_latest.tpl');
  106. //инициируем объект Смарти и передаем в него переменные
  107.  
  108. $smarty->assign('articles', $articles); //в Смарти {$articles}
  109. $smarty->assign('rssid', $rssid); //в Смарти {$rssid}
  110. if ($cfg['is_pag']) //если установлена пейджинация передаем в Смарти {$is_pad}
  111. {
  112. $smarty->assign('pagebar', cmsPage::getPagebar($total_page, $page, $perpage, 'javascript:conPage(%page%,'.$module_id.')')); //в Смарти {$pagebar}
  113. }
  114. $smarty->assign('is_ajax', false); //в Смарти {$is_ajax} по умолчанию ложно
  115. $smarty->assign('is_con', $is_con); //в Смарти {$is_con} наличие контента
  116. $smarty->assign('module_id', $module_id); // и т.д.
  117. $smarty->assign('cfg', $cfg);
  118. $smarty->display('mod_latest.tpl'); //выводим Шаблон Модуля
  119.  
  120. return true;
  121. }
  122. ?>
  123.  
дальше в шаблоне:
#17 10 апреля 2011 в 00:12
шаблон:
/папка_шаблона/modules/mod_latest.tpl

  1.  
  2. {if $is_con} {***если контент***}
  3.  
  4. {*** если установлена пэйджинация добавляем скрипт ***}
  5. {if $cfg.is_pag}
  6.  
  7. {/if}
  8. {*****************************************************}
  9.  
  10. {*** если опция не установлена подключаем ajax (по умолчанию из модуля приходит false) ***}
  11. {if !$is_ajax}
  12. <div id="module_ajax_{$module_id}">
  13. {/if}
  14. {*****************************************************************************************}
  15.  
  16.  
  17. {*** перебираем в цикле записи из массива $articles **************************************}
  18. {foreach key=aid item=article from=$articles}
  19. <div class="mod_latest_entry">
  20.  
  21. {******************************************************************}
  22. {if $article.image}
  23. <div class="mod_latest_image">
  24. <img src="/images/photos/small/{$article.image}" border="0" width="32" height="32" alt="{$article.title}"/>
  25. </div>
  26. {/if}
  27. {******************************************************************}
  28.  
  29. <a class="mod_latest_title" href="{$article.href}">
  30. {$article.title}
  31. </a>
  32.  
  33. {******************************************************************}
  34. {if $cfg.showdate}
  35. <div class="mod_latest_date">
  36. {$article.date} - <a href="{$article.authorhref}">{$article.author}</a>{if $cfg.showcom} - <a href="{$article.href}" title="{$article.comments|spellcount:$LANG.COMMENT1:$LANG.COMMENT2:$LANG.COMMENT10}" class="mod_latest_comments">{$article.comments}</a> - <span class="mod_latest_hits">{$article.hits}</span>{/if}
  37. </div>
  38. {/if}
  39. {******************************************************************}
  40.  
  41. {******************************************************************}
  42. {if $cfg.showdesc}
  43. <div class="mod_latest_desc" style="overflow:hidden">
  44. {$article.description}
  45. </div>
  46. {/if}
  47. {******************************************************************}
  48.  
  49. {******************************************************************}
  50. {if $cfg.showcom}
  51. {/if}
  52. {******************************************************************}
  53.  
  54. </div>
  55. {/foreach}
  56. {******************************************************************************************}
  57.  
  58. {******************************************************************}
  59. {if $cfg.showrss}
  60. <div class="mod_latest_rss">
  61. <a href="/rss/content/{$rssid}/feed.rss">
  62. {$LANG.LATEST_RSS}
  63. </a>
  64. </div>
  65. {/if}
  66. {******************************************************************}
  67.  
  68. {******************************************************************}
  69. {if $pagebar}
  70. <div class="mod_latest_pagebar">
  71. {$pagebar}
  72. </div>
  73. {/if}
  74. {******************************************************************}
  75.  
  76. {******************************************************************}
  77. {if !$is_ajax}
  78. </div>
  79. {/if}
  80. {******************************************************************}
  81. {else}
  82. <p>
  83. {$LANG.LATEST_NOT_MATERIAL} //выводим сообщение нет материалов для отображения
  84. </p>
  85. {/if}
  86.  
  87.  
#18 10 апреля 2011 в 00:16
соответственно для нескольких повторений цикла нужно сформировать свои уникальные запросы к разным категориям контента или написать функцию где категория передавалось бы в качестве параметра…
#19 10 апреля 2011 в 00:35
Или создать копии модуля в админке и задать в настройках разные категории для отображения
#20 11 апреля 2011 в 17:18
Помогите создать запрос к БД и вытянуть строки в простой массив. Хочу создать файл в /includes/myphp/ с принципом аналогичным mod_latest, но только без обращения к шаблонизатору. И попробовать поэксперементировать с массивами.
#21 11 апреля 2011 в 17:22


Помогите создать запрос к БД и вытянуть строки в простой массив. Хочу создать файл в /includes/myphp/ с принципом аналогичным mod_latest, но только без обращения к шаблонизатору. И попробовать поэксперементировать с массивами.

Пилигриm

Для примера:
  1. <?
  2. $inCore = cmsCore::getInstance();
  3. $inDB = cmsDatabase::getInstance();
  4. $cat_id = 2;
  5. $cat_id1= 16;
  6. $sql = "SELECT * FROM cms_content
  7. WHERE (category_id = ".$cat_id." OR category_id = ".$cat_id1." ) AND published = 1
  8. ORDER BY pubdate
  9. LIMIT 5
  10. ";
  11. $result = $inDB->query($sql) ;
  12. while($con = $inDB->fetch_assoc($result)){
  13. $content[] = $con['description'];
  14. $title[] = $con['title'];
  15. $date[] = $con['pubdate'];
  16. $link[] = $con['seolink'];
  17. }
  18.  
  19. ?>
Кинуть, для примера, в test.php
#22 11 апреля 2011 в 17:44
Моя идея заключается вот примерно в этом:
  1. <?php
  2. $namesimg[] = "Картинка 1";
  3. $namesimg[] = "Картинка 2";
  4. $namesimg[] = "Картинка 3";
  5. foreach ($namesimg as $value) {
  6. $aaa[] = $value;
  7. }
  8. $nimg1 = $aaa[0];
  9. $nimg2 = $aaa[1];
  10. $nimg3 = $aaa[2];
  11. $namestit[] = "Заголовок 1";
  12. $namestit[] = "Заголовок 2";
  13. $namestit[] = "Заголовок 3";
  14. foreach ($namestit as $value) {
  15. $bbb[] = $value;
  16. }
  17. $ntit1 = $bbb[0];
  18. $ntit2 = $bbb[1];
  19. $ntit3 = $bbb[2];
  20. $nameslin[] = "Ссылка 1";
  21. $nameslin[] = "Ссылка 2";
  22. $nameslin[] = "Ссылка 3";
  23. foreach ($nameslin as $value) {
  24. $ccc[] = $value;
  25. }
  26. $nlin1 = $ccc[0];
  27. $nlin2 = $ccc[1];
  28. $nlin3 = $ccc[2];
  29. echo $nimg1;
  30. echo " - ";
  31. echo $ntit1;
  32. echo " - ";
  33. echo $nlin1;
  34. echo "<br><br>";
  35. echo $nimg2;
  36. echo " - ";
  37. echo $ntit2;
  38. echo " - ";
  39. echo $nlin2;
  40. echo "<br><br>";
  41. echo $nimg3;
  42. echo " - ";
  43. echo $ntit3;
  44. echo " - ";
  45. echo $nlin3;
  46. echo "<br>";
  47. ?>
#23 11 апреля 2011 в 17:45
О! Спасибо, Yurik! Сейчас попробую.
#24 11 апреля 2011 в 21:18
УУУУ-раааа!!! Спасибо всем!!! Наконец я его добил! Вот ссылка на архив с результатом работы. Это очередной модуль для вывода последних материалов.
Дизайн я делал под свой проект, но думаю с ним проблем быть не должно.
Не забудьте добавить в ваш template.php строку:
  1. <link href="/templates/_default_/css/blok_news.css" rel="stylesheet" type="text/css" />
И в файле /includes/myphp/module_blok.php указать ID вашего раздела.
#26 20 апреля 2011 в 11:25
Внес некоторые исправления. Теперь по умолчанию отображается картинка именно последней новости, а не третьей.
+ Добавил еще один файл, или вернее, еще один аналогичный модуль, который отображает последние фотоальбомы. Здесь есть требования к самим альбомам. Обложка альбома должна быть не случайной, а выбираемой. И фото для обложки необходимо загружать квадратным. При случайных обложках будет пустой квадрат вместо картинки, а при не квадратном фото, это фото исказится, но общий дизайн не повредится в любом случае.

PS Архив перезалил. Смотрите предыдущее сообщение.
#27 20 апреля 2011 в 12:31
Обсуждение модуля в моем блоге.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.