从视图中访问功能? 我知道正确的方法应该是控制器处理所有函数调用,但是 如果我需要调用另一个函数并在视图中传递来自db数据的变量,例如。
视图:
if($persons != ""){
foreach($persons as $p){
echo $p->name;
echo $p->lastname;
// Now I need to call a function and pass parameters from loop
$is_banned = $this->model_users->checkIfBanned($p->name);
echo $is_banned;
}
}
我应该如何在控制器中以正确的方式执行此操作?
其他的是javascript ajax调用。当我需要收到多个响应时,我一直在控制器中放入大量的javascript。例如,如果我需要通过ajax获取用户的所有帖子并获得更新帖子div的响应,加上获取帖子数量并更新帖子计数div。
我一直在做错的方式: 例如。 JS:
function insertNewPost(){
var the_text = $('#post_text_input').val();
if(the_text != ""){
$.ajax({
type:"POST",
url:base_url+"controller/insertNewPost",
data: {post_text: the_text},
cache:false,
success:function(response){
$('#post_output').prepend(response);
$('#post_text_input').val('');
}
});
}
控制器:
function insertNewPost(){
if($this->session->userdata('is_logged_in')){
$this->load->model('model_users');
$this->load->model('model_posts');
$email = $this->session->userdata('email');
$myid = $this->model_users->getUserId($email);
$post_text= $this->FilterData($this->input->post('post_text'));
if($this->model_posts->insertNewPost($myid,$post_text)){
$count = $this->model_posts->countPosts($myid);
echo 'More recent: '.$post_text;?>
<script>
var count = "<?php echo $count;?>";
$('#posts_count').html(count);
</script>
<?php
}
}else{
redirect("inicio");
}
}
是否可以同时获得2个响应并同时更新2个div中的内容?我如何获得$count
变量并将其传递给相同的ajax响应?
任何光线都会非常好。 提前致谢
正如@charlietfl所建议的那样:
更改了控制器:
function insertNewPost(){
if($this->session->userdata('is_logged_in')){
$this->load->model('model_users');
$this->load->model('model_posts');
$email = $this->session->userdata('email');
$myid = $this->model_users->getUserId($email);
$post_text= $this->FilterData($this->input->post('post_text'));
if($this->model_posts->insertNewPost($myid,$post_text)){
$content = 'More recent: '.$post_text;
$count = $this->model_posts->countPosts($myid);
$items = array($content,$count);
echo json_encode($items);
}
}else{
redirect("inicio");
}
}
并更改了js功能:
function insertNewPost(){
var the_text = $('#post_text_input').val();
var post_count = '#posts_count';
if(the_text != ""){
$.ajax({
type:"POST",
url:base_url+"controller/insertNewPost",
data: {post_text: the_text},
cache:false,
success:function(response){
var content = json_encode(response);
$('#post_output').prepend(content[0]);
$(post_count).html(content[1]);
$('#post_text_input').val('');
}
});
}
它没有发生,我一定是做错了。
答案 0 :(得分:2)
第一个问题:
它的行为方式还行。但我不推荐它,因为它不是程序员友好的。
你可以通过很多方式解决它
这是您想要的一种解决方案
在获得人员之后以这种方式发送数据之前处理您的控制器
for($i=0;$i<sizeof($persons);$i++)
{
$persons[$i]->is_banned=$this->model_users->checkIfBanned($persons[$i]->name);
}
现在将这个新的$ person发送到您的视图。您的新视图代码将是这样的
if($persons != "")
{
foreach($persons as $p)
{
echo $p->name;
echo $p->lastname;
echo $p->is_banned;
}
}
希望你明白这一点。
对于您的第二个问题,您可以使用@charlietfl解决方案
以下是摘要:
而不是调用多个ajax调用 - 调用一个ajax并将所有结果返回为array.Like
function insertNewPost()
{
//do your stuff;
$data['content']="something";//it may be anything array,string
//do your stuff;
$data['count']="something";
//do your stuff;
$data['moreresult']="something";
header('Content-type: application/json');
echo json_encode($data);
exit();
}
现在在你的js
function insertNewPost()
{
var the_text = $('#post_text_input').val();
if(the_text != "")
{
$.ajax({
type:"POST",
url:base_url+"controller/insertNewPost",
data: {post_text: the_text},
dataType: "JSON",
success:function(response){
//here you will get datas as response.content,response.count,response.moreresult
//Now use them as you want as example
$('#post_output').prepend(response.content);
$('#post_text_input').val(response.count);
$('#anotherid').val(response.moreresult);
}
});
}
希望它会对你有所帮助。