Jump to content
  • 0

Вывод постраничной навигации (из б/д)


vitaxastifler
 Share

Question

Парни,кто то может помочь в выводе постраничной навигации

Тоесть из вот этого сделать что бы на стр выводило только по 20 записей,ну и стрелочки например вперёд,назад...!

<?php	foreach ($this->result as $dbname=> $db) {		if($dbname !== 'needle') {			echo "<br><span style='font-size: 18px;background-color:#309603; color: #FFF;'>Знайдено записів: " . count($db) . ' ' . $dbname . " </span>";			foreach ($db as $field => $value) {				echo '<div class="item">';				foreach ($value as $key=> $r) {							$r = str_ireplace($this->result['needle'][0], '<span style="background-color:#FFFE4E;">' . $this->result['needle'][0] . '</span>', $r);					$r = str_ireplace($this->result['needle'][1], '<span style="background-color:#FFFE4E;">' . $this->result['needle'][1] . '</span>', $r);					$r = str_ireplace($this->result['needle'][2], '<span style="background-color:#FFFE4E;">' . $this->result['needle'][2] . '</span>', $r);					$r = str_ireplace($this->result['needle'][3], '<span style="background-color:#FFFE4E;">' . $this->result['needle'][3] . '</span>', $r);					if($key == 'author') {						echo $r . '<br />';					} else {						echo $r;					}				}				echo '</div>';			}			}			}			?>
Edited by vitaxastifler
Link to comment
Share on other sites

Recommended Posts

  • 0

для начала где запрос, который дает данные?
а стрелочки можно дописать на вроде

echo "<a href=\"?page=". $page-1 ."\">Назад</a>";echo "<a href=\"?page=". $page+1 ."\">Вперед</a>";

Можно добавить проверку на первую и последнюю страницы

Link to comment
Share on other sites

  • 0

можно LIMIT старт  макс использовать. НОесли записей в таблице будет очень много - сотни тысяч - милионы. Лимит будет тормозить. Лучше структуру таблицы переделывать


                                        $r = str_ireplace($this->result['needle'][0], '<span style="background-color:#FFFE4E;">' . $this->result['needle'][0] . '</span>', $r);					$r = str_ireplace($this->result['needle'][1], '<span style="background-color:#FFFE4E;">' . $this->result['needle'][1] . '</span>', $r);					$r = str_ireplace($this->result['needle'][2], '<span style="background-color:#FFFE4E;">' . $this->result['needle'][2] . '</span>', $r);					$r = str_ireplace($this->result['needle'][3], '<span style="background-color:#FFFE4E;">' . $this->result['needle'][3] . '</span>', $r);

проясните

Edited by Николя223
Link to comment
Share on other sites

  • 0

Вот эта команда:

foreach ($this->result as $dbname=> $db)

производит перебор значений полученных из БД, выше нее не наблюдается ни каких запросов в БД

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

ORDER BY - для упорядочивания 

LIMIT - для указания с какой и сколько строк выводить

 

так же можно использовать автоинкримент, для вывода нужного количества строк по их id

Edited by Switch74
Link to comment
Share on other sites

  • 0

Мне надо перезалить б/д (24 тыс записей)!

Если я сейчас её залью, то он упадёт при большом выводе

Поэтому для начала нужно навигация.

Сайт на joomla 1.7

 

 

Мой наставник говорит мол читай mysql limit,и надо циклом отрисовать всё.

Edited by vitaxastifler
Link to comment
Share on other sites

  • 0

Николя223 Тот кусок кода что ты вы делил вроде ничего не меняет,только жёлтыйм цветом подчёркивает имя автора при выводе

 

Вот ещё интересный кусок кода нашёл,мб в него добавлять что то надо?

http://hostingkartinok.com/show-image.php?id=ee7f354120333b0a5a5ff59c0c36ea03

Edited by vitaxastifler
Link to comment
Share on other sites

  • 0
Тот кусок кода что ты вы делил вроде ничего не меняет,только жёлтыйм цветом подчёркивает имя автора при выводе

четыре то зачем?))) переменная перезаписывается ок дошло

 

реплейс можно ещё и массивами делать)) ну это так к слову

 

Без знания того как у вас таблицы БД устроены, сложно что то подходящее предложить.

Можете только в запрос в конец добавить   LIMIT $start, $count

 

Где переменная старт будет началом отсчета, можете этот параметр передавать в $_GET 

и $count - сколько выводить в списке.

 

Но повторюсь - если записей в этой таблице(не в БД, а именно в таблице) очень много, то тормоза будут

 

И как посоветовал 

Switch74  - добавьте также туда ORDER BY поле  (например ID)

Для сортировки таблицы перед выводам по нужному полю

Edited by Николя223
Link to comment
Share on other sites

  • 0

Николя223 я даже не знаю,вот напримет при запросе "Шевченко" находит 241 книгу это всё в одну стр,а мне надо что бы их было 25 стр)

А как там остальные,без понятия)

 

Знать бы ещё куда код тулить)

Тут же с плагинов всё написано на старовинной Джумле.

Edited by vitaxastifler
Link to comment
Share on other sites

  • 0
<div id="new_search"><span class="open_search">Шукати ще!</span><div class="new_search_form"><form method="post" action="<?php echo JRoute::_('index.php?option=com_katalog&task=search&page=1'); ?>"><fieldset><legend><?php echo JText::_('COM_KATALOG_SEARCH_PARAM'); ?></legend><table><tr><td><select name="fields[]"><option value="author">Автор</option><option value="title">Назва</option><option value="rubric">Рубрика</option><option value="keywords">Ключ. слова</option><option value="person">Персоналii</option><option value="publisher">Рiк</option><option value="geograf">Географ. назва</option><option value="sourse">Джерело</option></select></td><td><input type="text" name="search_words[]"/><br /></td></tr><tr><td><select name="fields[]"><option value="author">Автор</option><option value="title">Назва</option><option value="rubric">Рубрика</option><option value="keywords">Ключ. слова</option><option value="person">Персоналii</option><option value="publisher">Рiк</option><option value="geograf">Географ. назва</option><option value="sourse">Джерело</option></select></td><td><input type="text" name="search_words[]"/><br /></td></tr><tr><td><select name="fields[]"><option value="author">Автор</option><option value="title">Назва</option><option value="rubric">Рубрика</option><option value="keywords">Ключ. слова</option><option value="person">Персоналii</option><option value="publisher">Рiк</option><option value="geograf">Географ. назва</option><option value="sourse">Джерело</option></select></td><td><input type="text" name="search_words[]"/><br /></td></tr><tr><td><select name="fields[]"><option value="author">Автор</option><option value="title">Назва</option><option value="rubric">Рубрика</option><option value="keywords">Ключ. слова</option><option value="person">Персоналii</option><option value="publisher">Рiк</option><option value="geograf">Географ. назва</option><option value="sourse">Джерело</option></select></td><td><input type="text" name="search_words[]"/><br /></td></tr></table><input type="radio" name="search_type" checked="checked" value="similar" />Подiбний<br /><input type="radio" name="search_type" value="exect" />Точний<br /></fieldset><fieldset><legend><?php echo JText::_('COM_KATALOG_CHOOSE_DB'); ?></legend><table><tr><td><input type="checkbox" name="dbname[]" value="БД книг" id="book"/><label for="book"><?php echo JText::_('COM_KATALOG_BOOK'); ?></label></td><td><input type="checkbox" name="dbname[]" value="БД статей із періодики" id="bibl"/><label for="bibl"><?php echo JText::_('COM_KATALOG_BIBL'); ?></label></td><td><!--<input type="checkbox" name="db[]" value="period" id="period"/><label for="period"><?php echo JText::_('COM_KATALOG_PERIOD'); ?></label><br />--></td></tr><tr><td><input type="checkbox" name="dbname[]" value="БД аудіо-відео матеріалів" id="kffd"/><label for="kffd"><?php echo JText::_('COM_KATALOG_KFFD'); ?></label></td><td><input type="checkbox" name="dbname[]" value="БД краєзнавчих матеріалів" id="kray"/><label for="kray"><?php echo JText::_('COM_KATALOG_KRAY'); ?></label></td><td><input type="checkbox" name="dbname[]" value="БД методичних матеріалів" id="method"/><label for="method"><?php echo JText::_('COM_KATALOG_METHOD'); ?></label></td></tr></table></fieldset><input type="submit" value="Пошук" /></form></div></div><?phpforeach ($this->result as $dbname=> $db) {if($dbname !== 'needle') {echo "<br><span style='font-size: 18px;background-color:#309603; color: #FFF;'>Знайдено записів: " . count($db) . ' ' . $dbname . " </span>";foreach ($db as $field => $value) {echo '<div class="item">';foreach ($value as $key=> $r) { $r = str_ireplace($this->result['needle'][0], '<span style="background-color:#FFFE4E;">' . $this->result['needle'][0] . '</span>', $r);$r = str_ireplace($this->result['needle'][1], '<span style="background-color:#FFFE4E;">' . $this->result['needle'][1] . '</span>', $r);$r = str_ireplace($this->result['needle'][2], '<span style="background-color:#FFFE4E;">' . $this->result['needle'][2] . '</span>', $r);$r = str_ireplace($this->result['needle'][3], '<span style="background-color:#FFFE4E;">' . $this->result['needle'][3] . '</span>', $r);if($key == 'author') {echo $r . '<br />';} else {echo $r;}}echo '</div>';} }} ?><a href="?option=com_katalog&task=search&page=1&word1=<?=$this->result['needle'][0]?>&word2=<?=$this->result['needle'][1]?>&word3=<?=$this->result['needle'][2]?>&word4=<?=$this->result['needle'][3]?>">1////</a><a href="?option=com_katalog&task=search&page=2&word1=<?=$this->result['needle'][0]?>&word2=<?=$this->result['needle'][1]?>&word3=<?=$this->result['needle'][2]?>&word4=<?=$this->result['needle'][3]?>">2////</a><a href="?option=com_katalog&task=search&page=3&word1=<?=$this->result['needle'][0]?>&word2=<?=$this->result['needle'][1]?>&word3=<?=$this->result['needle'][2]?>&word4=<?=$this->result['needle'][3]?>">3////</a></div>

 

Edited by vitaxastifler
Link to comment
Share on other sites

  • 0


Николя223 спасибо тебе!

<?php
// No direct access


defined( '_JEXEC' ) or die( 'Restricted access' );


jimport( 'joomla.application.component.model' );


class KatalogModelKatalog extends JModel
{
    /**
    * Gets the greeting
    * @return string The greeting to be displayed to the user
    */
    function getResult($post) {
    $db =& JFactory::getDBO();


//get a dbfields and parameters
$first_field = $post['fields'][0];
$second_field = $post['fields'][1];
$third_field = $post['fields'][2];
$fourth_field = $post['fields'][3];
$first = $post['search_words'][0];
$second = $post['search_words'][1];
$third = $post['search_words'][2];
$fourth = $post['search_words'][3];
$search_type = $post['search_type'];


if($first !== '%') {
$first = "AND $first_field LIKE '$first'";
} else {
$first = '';
}


if($second !== '%') {
$second = "AND $second_field LIKE '$second'";
} else {
$second = '';
}


if($third !== '%') {
$third = "AND $third_field LIKE '$third'";
} else {
$third = '';
}


if($fourth !== '%') {
$fourth = "AND $fourth_field LIKE '$fourth'";
} else {
$fourth = '';
}


//search data in choosen db's
$result = array();
foreach($post['dbname'] as $dbname) {
$query = "SELECT author, title, pub_info, publisher, pages, seria, source FROM #__katalog WHERE dbname LIKE '$dbname' 
$first $second $third $fourth";
$db->setQuery( $query );
   $result[$dbname] = $db->loadObjectList();
}
return $result;
}
}

Edited by vitaxastifler
Link to comment
Share on other sites

  • 0

сорри, отвлекали меня все)))  

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

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

 Впринципе, перед выводом можно ещё массив отсортировать по полю db_name - но это дело десятое

<?php       $result               = array();    $result["pagination"] = "";    $part                 = 1;    $LIMIT                = " LIMIT 10";   //Колличество страниц    $AND_WHERE            = " AND id > 0";    if(isset($_POST["part_id"] and !empty($_GET["part_id"]) ))   {        $part             =   $_GET["part_id"];         $AND_WHERE        =  " AND id >= ".$part." ";    //Отбираем номера больше ID    }    $dbNames = implode("' OR dbname LIKE '",$post['dbname']);    $dbNames = " ( dbname LIKE  '".$dbNames."'   )  ";  //Собираем запрос вместо цикла         //Пагинация            $query_pagination ="                  SET    @Counter :=0;                  SET    @p       :=0;                  SELECT id                       , if(@Counter>=11,@Counter:=1,@Counter:=@Counter+1) AS C                       , (@p:=@p+1) as page                  FROM `#__katalog`                  HAVING  c=1                  WHERE  ".$dbNames."                   $first $second $third $fourth $AND_WHERE                  ORDER BY id ";                            $db->setQuery( $query_pagination );          $result["pagination"]     =      $db->loadObjectList();                   $query = "             SELECT                  author,                 title,                  pub_info,                  publisher,                  pages,                  seria,                  source,                 dbname              FROM #__katalog              WHERE  ".$dbNames."                   $first $second $third $fourth $AND_WHERE        ORDER BY id ".$LIMIT;       $db->setQuery( $query );     $result["content"]   = $db->loadObjectList();      ?>//Вторая часть<?php    $out_array  = array();    $out_array["content"] = "";    $out_array["needle"]  = array();            	foreach ($this->result["content"] as $level1=> $db) {           $dbname       = $db["dbname"];           $db["dbname"] = false;   //удаляем            			//$out_array[$level1][]       = "<br /><span style='font-size: 18px;background-color:#309603; color: #FFF;'>Знайдено записів: " . count($db) . ' ' . $dbname . " </span>";            //Потом допишем, если работает остальное  , просто к выводу добавим COUNT в новую ячейку массива                          // <!=================                        if($dbname != "needle"){                                                                         foreach ($db as $field => $value) {				$out_array["content"] .= '<div class="item">';				foreach ($value as $key=> $r) {	                                                     $out_array["content"] .= $r;					 					if($key == 'author') {						$out_array["content"] .= '<br />';					} 				}				$out_array["content"] .= '</div>';			  }	                                            }else{                //$out_array["needle"][] = Не понял откуда этот параметр. поправь и раскомментируй            }            // ====================>					 			}	     /*  Как  подменишь needle - расскомментируй    $result_needle = $out_array["needle"];    $array1 = array($result_needle[0],$result_needle[1],$result_needle[2],$result_needle[3]);    $array2 = array(                              '<span style="background-color:#FFFE4E;">' .$result_needle[0] . '</span>',                              '<span style="background-color:#FFFE4E;">' .$result_needle[1] . '</span>',                              '<span style="background-color:#FFFE4E;">' .$result_needle[2] . '</span>',                              '<span style="background-color:#FFFE4E;">' .$result_needle[3] . '</span>');                    	    $result["content"] = str_ireplace($array1, $array2, $out_array["content"]); */                $pages_array      = $this->result['pagination'];         foreach ($pages_array AS $key => $page){          //Ниже подставь адресс ссылки со всеми параметрами $_GET и добавь          echo '<a href="сюда напишите адресс страницы?part_id='.$page["id"].'">'.$page["page"].'</a>';    }    echo $out_array["content"];?>
Edited by Николя223
  • Like 1
Link to comment
Share on other sites

  • 0

я бы делал так:

$on_page = 20;$page = is_int($_GET['page']) ?  $_GET['page'] : 1;$page_start = ($page-1)*20+1;$limit = " LIMIT ".$page_start.", ".$on_page;

и добавил переменную $count для получения через запрос количества записей

SELECT COUNT(*)FROM #__katalog

а в ссылках передавал

if($page > 1) echo "<a href=\"?page=". $page-1 ."\">Назад</a>";if($page < ceil($count/$on_page)) echo "<a href=\"?page=". $page+1 ."\">Вперед</a>";
  • Like 1
Link to comment
Share on other sites

  • 0

Николя223 когда копирую твой код,то у меня вообще пустая белая страница

Дело в том что тут 2-а файла в одном подкл,а в другом вывод

 

Вывод:

<?php	foreach ($this->result as $dbname=> $db) {		if($dbname !== 'needle') {			echo "<br><span style='font-size: 18px;background-color:#309603; color: #FFF;'>Знайдено записів: " . count($db) . ' ' . $dbname . " </span>";			foreach ($db as $field => $value) {				echo '<div class="item">';				foreach ($value as $key=> $r) {					$r = str_ireplace($this->result['needle'][0], '<span style="background-color:#FFFE4E;">' . $this->result['needle'][0] . '</span>', $r);					$r = str_ireplace($this->result['needle'][1], '<span style="background-color:#FFFE4E;">' . $this->result['needle'][1] . '</span>', $r);					$r = str_ireplace($this->result['needle'][2], '<span style="background-color:#FFFE4E;">' . $this->result['needle'][2] . '</span>', $r);					$r = str_ireplace($this->result['needle'][3], '<span style="background-color:#FFFE4E;">' . $this->result['needle'][3] . '</span>', $r);					if($key == 'author') {						echo $r . '<br />';					} else {						echo $r;					}				}				echo '</div>';			}		}	}	?>

Подкл:

//search data in choosen db's		$result = array();		foreach($post['dbname'] as $dbname) {			$query = "SELECT author, title, pub_info, publisher, pages, seria, source FROM #__katalog WHERE dbname LIKE '$dbname'					$first $second $third $fourth";			$db->setQuery( $query );		    $result[$dbname] = $db->loadObjectList();		}		return $result;	}}

И я в них путаюсь

Edited by vitaxastifler
Link to comment
Share on other sites

  • 0

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

 

Ну и вид ссылок для перемещения по страницам. Это вставляется в код вывода.

 

То что подключено - это как раз и есть запрос в базу

что такое '$first $second $third $fourth' хз, возможно можно и удалить нафиг.

Переменные ввести в начале

ну и добавить запрос и возврат COUNT

//search data in choosen db's$on_page = 20;$page = is_int($_GET['page']) ?  $_GET['page'] : 1;$page_start = ($page-1)*20+1;$limit = " LIMIT ".$page_start.", ".$on_page;$result = array();foreach($post['dbname'] as $dbname) {$query = "SELECT author, title, pub_info, publisher, pages, seria, source FROM #__katalog WHERE dbname LIKE '$dbname'$first $second $third $fourth";$db->setQuery( $query );   $result[$dbname] = $db->loadObjectList();$query = "SELECT COUNT(*) FROM #__katalog WHERE dbname LIKE '$dbname'";$db->setQuery( $query );   $result['count'] = $db->loadObjectList();}return $result;}}

Что-то вроде, но нужно понять каким образом у вас тут все работает, для чего $first $second $third $fourth и цикл

я так понимаю здесь передается список баз, и выборка идет по всем из них

Link to comment
Share on other sites

  • 0

по прежнему - потому что мы в запрос не вставили $limit, а вставить его можно будет поняв для чего $first $second $third $fourth

попробуйте поставить там $limit вместо $first $second $third $fourth

Edited by Switch74
Link to comment
Share on other sites

  • 0

Значит я взял 

//get a dbfields and parameters$first_field = $post['fields'][0];
 
и
 
if($first !== '%') {$first = "AND $first_field LIKE '$first'";} else {$first = '';}

И переименовал,получилось:

$limit_field = $post['fields'][0];
if($limit !== '%') {$limit = "AND $limit_field LIKE '$limit'";} else {$limit = '';}
Шукати ще!

Знайдено записів: 0 БД книг 
Знайдено записів: 1 count

52945
 
Или я не так понял?(
Edited by vitaxastifler
Link to comment
Share on other sites

  • 0

С таким вот расскладом 404 ошибка 

<?php
// No direct access
 
defined( '_JEXEC' ) or die( 'Restricted access' );
 
jimport( 'joomla.application.component.model' );
 
class KatalogModelKatalog extends JModel
{
    /**
    * Gets the greeting
    * @return string The greeting to be displayed to the user
    */
    function getResult($post) {
    $db =& JFactory::getDBO();
 
//get a dbfields and parameters
        $limit_field = $post['fields'][0];
$second_field = $post['fields'][1];
$third_field = $post['fields'][2];
$fourth_field = $post['fields'][3];
$first = $post['search_words'][0];
$second = $post['search_words'][1];
$third = $post['search_words'][2];
$fourth = $post['search_words'][3];
$search_type = $post['search_type'];
 
        if($limit !== '%') {
            $limit = "AND $limit_field LIKE '$limit'";
        } else {
            $limit = '';
        }
 
if($second !== '%') {
$second = "AND $second_field LIKE '$second'";
} else {
$second = '';
}
 
if($third !== '%') {
$third = "AND $third_field LIKE '$third'";
} else {
$third = '';
}
 
if($fourth !== '%') {
$fourth = "AND $fourth_field LIKE '$fourth'";
} else {
$fourth = '';
}
 
//search data in choosen db's
$result = array();
foreach($post['dbname'] as $dbname) {
            $query = "
                        SELECT author, title, pub_info, publisher, pages, seria, source
                        FROM #__katalog
                        WHERE dbname LIKE '$dbname'
                        $limit";
$db->setQuery( $query );
   $result[$dbname] = $db->loadObjectList();
}
return $result;
}
}
 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy