AJAX - PHP in posts for creating icons and restricts them

So, I am new in ajax and not so β€œpro” in php, I need help.

I created an ajax call that on document.ready shows messages from DB

$.ajax({ type:"POST", url:"testphp.php", datatype: 'json', success:function myFunction(response) { var arr = JSON.parse(response); var i; var out = " "; for(i = 0; i < arr.length; i++) { out += "<div id='"+arr[i].ID+"' class='grid-item "+arr[i].shape+"'> <div class='grid_content'>"+arr[i].img_holder+"</div><div class='grid_title red'>"+arr[i].naslovhj+"</div> <div class='content_grid'></div> </div>" } out += " "; document.getElementById("grids").innerHTML = out; console.log("uspjelo"); }, error:function(){ $("#ea").html('There was an error updating the settings'); } }); 

Content in testphp.php:

 $conn = new mysqli($servername, $username, $password, $dbname); $myArray = array(); if ($result = $conn->query("SELECT * FROM postovi")) { $tempArray = array(); while($row = $result->fetch_object()) { $tempArray = $row; array_push($myArray, $tempArray); } echo json_encode($myArray); } $result->close(); 

How to make it display 10 posts per page, and this new page goes to the bottom of this page (when I look at the bottom of the page, it adds the next 10 posts)

I tried several endless scrolls, but they do not work as I imagined.

EDIT: It would be great if this can be done using ajax in the middle, and I assume some kind of php model is needed

EDIT 2:

View code:

ALL DATABASE CONTENT IS IN #GRIDS IN THIS FORMAT

  <?php defined('BASEPATH') OR exit('No direct script access allowed'); ?><!DOCTYPE html> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1"> <script src="https://code.jquery.com/jquery-2.2.2.js" integrity="sha256-4/zUCqiq0kqxhZIyp4G0Gk+AOtCJsY1TA00k5ClsZYE=" crossorigin="anonymous"></script> <script src="https://npmcdn.com/ packery@2.0 /dist/packery.pkgd.js"></script> <script src="src/jquery.keep-ratio.js"></script> <link href='https://fonts.googleapis.com/css?family=Roboto+Condensed' rel='stylesheet' type='text/css'> <title>KO web</title> </head> <body> <div class="grid" id="grids"> <div class="grid-item grid-normal"> <div class="grid_content"><img src=""></div> <div class="grid_title red"> title </div> <div class="content_grid"> </div> </div> </body> <script> $( document ).ready(function() { //ajax tes $.ajax({ type:"POST", url:"testphp.php", datatype: 'json', success:function myFunction(response) { var arr = JSON.parse(response); var i; var out = " "; for(i = 0; i < arr.length; i++) { out += "<div id='"+arr[i].ID+"' class='grid-item "+arr[i].shape+"'><div class='grid_content'>"+arr[i].img_holder+"</div><div class='grid_title red'>"+arr[i].naslovhj+"</div><div class='content_grid'></div></div>" } out += " "; document.getElementById("grids").innerHTML = out; console.log("uspjelo"); } , error:function(){ $("#ea").html('There was an error updating the settings'); } }); //end off ajax test setTimeout(function(){ $('.grid_title').each(function() { var mrs = $(this).innerHeight(); $(this).css("margin-bottom", "-" + mrs + "px"); });}, 100); $( document ).ajaxComplete(function() { $('.grid').packery({ // options itemSelector: '.grid-item', gutter: 0 }); var clickDisabled = false; counter_p = 0; $(".grid-item").click(function(){ counter_p ++; if(counter_p == 1){ $(this).attr("id", "active-grid-item-momentum"); $(this).children(".content_grid").attr("id", "active_cont"); $(this).children(".grid_title").css("display","none"); var width1 = document.getElementById('active-grid-item-momentum').offsetWidth; var height0 = document.getElementById('active-grid-item-momentum').offsetHeight; $(this).children(".grid_content").css("height", height0 + "px"); $(this).children(".grid_content").css("width", width1 + "px"); $(this).append( "<div id='close_all'>Test</div>" ); $(this).css("cursor", "default") document.getElementById('active-grid-item-momentum').style.pointerEvents = 'none'; document.getElementById('active_cont').style.pointerEvents = 'auto'; $(this).children(".grid_content").children("img").css("opacity", "0"); document.getElementById("active_cont").innerHTML="<h1>Sea world</h1><img src='../img/Aqua-Maris-Sea-World-game.png' style='float:left; margin-top:10px; margin-bottom:10px; margin-right:10px;' /><a href='http://www.google.com'>djlkjfkld</a>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse dapibus nisi sapien, ut scelerisque diam malesuada ut. Donec eget nibh vitae erat vehicula ullamcorper. In vitae ultricies erat. Nam at dignissim arcu. Nunc nec metus ac sem porttitor pulvinar sed vel ipsum. Phasellus nec velit sapien. Quisque vel pretium purus. In at massa nibh. Aliquam condimentum mauris nunc, ac consequat dolor scelerisque sed. Nullam sed mi vitae massa accumsan tincidunt. Curabitur in sem blandit eros interdum molestie. Sed ultricies sem ac ex consequat mollis. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Integer sollicitudin nulla ac velit imperdiet gravida.Maecenas sed dictum leo. Mauris ac diam nec ex lobortis blandit in vitae sapien. Etiam a sodales augue, sollicitudin mattis ligula. In elementum ligula nunc, et porta purus tincidunt eu. Etiam bibendum interdum lectus. Sed convallis ornare placerat. Nullam sodales eget dui quis sodales. Donec consequat nisl eget sapien cursus semper. Pellentesque finibus facilisis nulla, sit amet pellentesque justo tristique et. Cras sodales nisl sed est euismod fringilla.Duis lacus ex, volutpat sed maximus et, dapibus in tortor. Vestibulum tristique lectus congue quam suscipit, quis varius leo consectetur. Proin enim eros, pretium sed purus eu, consectetur pulvinar velit. Pellentesque enim nunc, iaculis ut lacus ut, posuere dapibus eros. Integer ac sem molestie sem iaculis cursus. Vivamus quis eros in est molestie luctus eget quis massa. Curabitur ut metus sodales, eleifend dolor sit amet, dapibus magna. Phasellus a est libero. Nunc sed dui at felis varius semper. Ut neque metus, volutpat sed tortor a, venenatis consectetur ex.Ut ullamcorper placerat mattis. Aenean finibus mauris a dui volutpat, at vulputate justo porta. Proin scelerisque eleifend quam eget congue. Nunc laoreet cursus massa sit amet condimentum. Sed sit amet semper augue, et ultricies arcu. Nullam iaculis euismod est interdum tristique. Praesent magna velit, volutpat a varius eget, cursus vel ex. Morbi molestie leo quis accumsan fringilla. Donec in facilisis nisi, sit amet dictum ligula. Aenean vel sodales dolor, nec elementum mi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vivamus at tristique dolor. Sed blandit venenatis turpis, sed varius nisi euismod a. Integer quis nisl lorem.Sed lorem velit, varius non lacus vitae, tincidunt porttitor nibh. Aliquam facilisis vulputate ex, eget fermentum sapien congue eu. Nunc ac scelerisque ipsum, vel iaculis felis. Pellentesque iaculis, ligula at ullamcorper ullamcorper, erat justo egestas magna, ut egestas quam metus vel enim. Mauris elementum ut ex eget venenatis. Quisque quis porttitor nibh. Quisque fermentum mauris in libero commodo, vel viverra nisl faucibus. Curabitur posuere metus luctus facilisis pellentesque. Integer rutrum augue ac odio tristique eleifend. Integer semper ante vitae dapibus varius. Quisque interdum turpis vel enim tempor sollicitudin quis maximus est. Mauris efficitur dui ac velit mattis ultrices. Curabitur elementum dictum felis, sed eleifend ex elementum sed.! massa accumsan tincidunt. Curabitur in sem blandit eros interdum molestie. Sed ultricies sem ac ex consequat mollis. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Integer sollicitudin nulla ac velit imperdiet gravida.Maecenas sed dictum leo. Mauris ac diam nec ex lobortis blandit in vitae sapien. Etiam a sodales augue, sollicitudin mattis ligula. In elementum ligula nunc, et porta purus tincidunt eu. Etiam bibendum interdum lectus. Sed convallis ornare placerat. Nullam sodales eget dui quis sodales. Donec consequat nisl eget sapien cursus semper. Pellentesque finibus facilisis nulla, sit amet pellentesque justo tristique et. Cras sodales nisl sed est euismod fringilla.Duis lacus ex, volutpat sed maximus et, dapibus in tortor. Vestibulum tristique lectus congue quam suscipit, quis varius leo consectetur. Proin enim eros, pretium sed purus eu, consectetur pulvinar velit. Pellentesque enim nunc, iaculis ut lacus ut, posuere dapibus eros. Integer ac sem molestie sem iaculis cursus. Vivamus quis eros in est molestie luctus eget quis massa. Curabitur ut metus sodales, eleifend dolor sit amet, dapibus magna. Phasellus a est libero. Nunc sed dui at felis varius semper. Ut neque metus, volutpat sed tortor a, venenatis consectetur ex.Ut ullamcorper placerat mattis. Aenean finibus mauris a dui volutpat, at vulputate justo porta. Proin scelerisque eleifend quam eget congue. Nunc laoreet cursus massa sit amet condimentum. Sed sit amet semper augue, et ultricies arcu. Nullam iaculis euismod est interdum tristique. Praesent magna velit, volutpat a varius eget, cursus vel ex. Morbi molestie leo quis accumsan fringilla. Donec in facilisis nisi, sit amet dictum ligula. Aenean vel sodales dolor, nec elementum mi. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Vivamus at tristique dolor. Sed blandit venenatis turpis, sed varius nisi euismod a. Integer quis nisl lorem.Sed lorem velit, varius non lacus vitae, tincidunt porttitor nibh. Aliquam facilisis vulputate ex, eget fermentum sapien congue eu. Nunc ac scelerisque ipsum, vel iaculis felis. Pellentesque iaculis, ligula at ullamcorper ullamcorper, erat justo egestas magna, ut egestas quam metus vel enim. Mauris elementum ut ex eget venenatis. Quisque quis porttitor nibh. Quisque fermentum mauris in libero commodo, vel viverra nisl faucibus. Curabitur posuere metus luctus facilisis pellentesque. Integer rutrum augue ac odio tristique eleifend. Integer semper ante vitae dapibus varius. Quisque interdum turpis vel enim tempor sollicitudin quis maximus est. Mauris efficitur dui ac velit mattis ultrices. Curabitur elementum dictum felis, sed eleifend ex elementum sed.!"; $(this).css("width", "calc(100% - 10px)"); </script> 
+7
jquery ajax php codeigniter
source share
2 answers

There are several ways to do this, but here is how I could do it using Codeigniter. It is assumed that all necessary configuration settings are performed correctly, including in application/config/config.php , application/config/database.php , application/config/routes.php and optionally application/config/autoload.php .

Using the Model / View / Controller template, multiple files are created. Firstly, the controller. This will be the default controller and will be Ko_web.php . In routes.php we need this setting: $route['default_controller'] = 'ko_web'; You can enter http://example.com and go to the ko_web controller, where the index() function will be activated.

/application/controllers/Ko_web.php

 class Ko_web extends CI_Controller { public function __construct() { parent::__construct(); $this->load->model('postovi_model'); $this->load->helper('url'); //could and maybe should be 'autoloaded' } public function index() { $data = array(); //empty but $data is set just in case //get the first 10 rows of users $rows = $this->postovi_model->get_next_10(); if(isset($rows)) { //We got rows, make the html from them //FYI, The array key 'users' becomes the variable $users in the view $data['users'] = $rows; //the view is returned as a string of html fully //populated with rows of user data $data['users'] = $this->load->view('user_rows_view', $data, TRUE); } //Using method chaining here to load multiple views cause it cool and effcient $this->load //start the page with the reuseable header view file, passing page title too ->view('header_view', array('title' => "User Info")) //Next, put the rows in the grid structure //note that if $data['users'] is not set the resulting view will have no user rows ->view('user_grid_view', $data) //add closing html tags, and in this case the javascript ->view('page_close_view', $data); } public function load_more() { $offset = $this->input->post('offset'); if($offset) { $new_rows = $this->postovi_model->get_next_10($offset); if(isset($new_rows)) { $data['users'] = $new_rows; //this will return (echo) html to the ajax success function //CI takes care of making the correct response headers - sweet $this->load->view('user_rows_view', $data); } else { echo ""; //return an empty string } } } } 

The index() function will load (up to) the first 10 lines of user information.

The model is quite simple, and only one function returns an array of string arrays.

/application/models/Postovi_model.php

 <?php defined('BASEPATH') OR exit('No direct script access allowed'); class Postovi_model extends CI_Model { public function __construct() { parent::__construct(); $this->load->database(); } public function get_next_10($offset = 0) { $this->db->limit(10, $offset); $query = $this->db->get("postovi"); //same as "SELECT * FROM postovi LIMIT 10, $offset " //Got rows? If so return an array of row arrays, or return NULL if nothing retrieved return $query->num_rows() > 0 ? $query->result_array() : NULL; } } 

The model returns NULL if no rows are found. The controller checks this condition and responds accordingly.

Views are split into several files basically, so markup can be easily reused. In any case, the top of each page will have the same information.

app / views / header_view.php

 <?php defined('BASEPATH') OR exit('No direct script access allowed'); ?><!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1"> <script src="https://code.jquery.com/jquery-2.2.2.js" integrity="sha256-4/zUCqiq0kqxhZIyp4G0Gk+AOtCJsY1TA00k5ClsZYE=" crossorigin="anonymous"></script> <script src="https://npmcdn.com/ packery@2.0 /dist/packery.pkgd.js"></script> <script src="src/jquery.keep-ratio.js"></script> <link href='https://fonts.googleapis.com/css?family=Roboto+Condensed' rel='stylesheet' type='text/css'> <title><?= isset($title) ? $title : "KO web"; ?></title> </head> <body> 

Pay attention to the possibility of passing the page title, but we have a decline if it is not passed.

The next view is the grid structure. There are two things here. First var $users . The controller created this data from another view that will be shown after that. The value of $users is the html string of the grid lines. If the $users parameter is set, it will be displayed in this view and, ultimately, in the browser.

The second thing to note is that I put the "Download more ..." button at the bottom of the grid. It is bound to javascript and initiates an ajax call. You can implement the scroll loader after making sure ajax is working.

/application/views/user_grid_view.php

 <div class = "grid" id = "grids"> <div class = "grid-item grid-normal"> <div class = "grid_content"><img src = ""></div> <div class = "grid_title red">title</div> <div class = "content_grid" id='user-rows'> <?php if(isset($users)) { echo $users; } ?> </div> </div> <button type="button" id="more_rows">Load More...</button> </div> 

The next view page that builds the rows of the grid item to display

/application/views/user_rows_view.php

 <?php if(isset($users)) { foreach($users as $user) { //It easier to drop in and out of the PHP interpreter than to concantenate strings. //There is no execution penalty for doing it. //Also, it easer to read and easier to write. ?> <div id='<?= $user['ID']; ?>' class='grid-item <?= $user['shape']; ?>'> <div class='grid_content'><?= $user['img_holder']; ?></div> <div class='grid_title red'> <?= $user['naslovhj']; ?></div> <!--Is the following needed?--> <!--<div class='content_grid'></div>--> </div> <?php } } 

I hope that I correctly named the field names and understood the layout you wanted.

OK, the last view that has javascript and the corresponding html tags to close the web page.

/application/views/page_close_view.php

 <script> $(document).ready(function () { var baseURL = <?= base_url(); ?>; var row_count; $('#more_rows').on('click', function () { //what the offset? row_count = $('.grid-item').length || 0; $.ajax({ type: "POST", url: baseURL + "Ko_web/load_more", data: {offset: row_count}, datatype: 'html', success: function (response) { if (response === "") { alert("No rows to show."); } else { $('#user-rows').append(response); } }, error: function (jqXHR, textStatus, errorThrown) { console.log(jqXHR, textStatus, errorThrown); //alert("your message here"); //$("#ea").html('There was an error updating the settings'); } }); }); }); /* * Note: I left out the remaineder of the javascript from your question * because it did not seem to pertain to the answer you seek. */ </script></body></html> 

The script counts the number of lines on the screen, as determined by the "grid-item" class. I can’t check it, but I think that everything is correct. This number is passed to the controller, where it is used as an offset to query the database.

Since the controller returns a fully formed html, it is trivial to embed it in the DOM where it needs to go. I added id='user-rows' to the div that surrounds the content_grid to make it easier to find the desired insertion point.

This will create a ton of questions for which you will undoubtedly be. Here is the CodeIgniter Documentation that you already have but might be of interest to other readers.

There will be typos and, possibly, some syntax errors. But the logic should be pretty close, and the structure should be on CodeIgniter. Enjoy it!

+1
source share

Email Page Number

  $.ajax({ type:"POST", url:"testphp.php", datatype: 'json', data : {page: 1/* show page*/} success:function myFunction(response) { var arr = JSON.parse(response); var i; var out = " "; for(i = 0; i < arr.length; i++) { out += "<div id='"+arr[i].ID+"' class='grid-item "+arr[i].shape+"'> <div class='grid_content'>"+arr[i].img_holder+"</div><div class='grid_title red'>"+arr[i].naslovhj+"</div> <div class='content_grid'></div> </div>" } out += " "; document.getElementById("grids").innerHTML = out; console.log("uspjelo"); }, error:function(){ $("#ea").html('There was an error updating the settings'); } }); 

calculate the offset, leaving an interval in the results

 // file testphp.php $page = $_POST['page']; $limit = 20; $offset = ($page - 1) * $limit; //calculating next offset $conn = new mysqli($servername, $username, $password, $dbname); $myArray = array(); if ($result = $conn->query("SELECT * FROM postovi LIMIT ".$limit." OFFSET ".$offset)) { $tempArray = array(); while($row = $result->fetch_object()) { $tempArray = $row; array_push($myArray, $tempArray); } echo json_encode($myArray); } $result->close(); 
0
source share

All Articles