在Laravel4中,我设置了一个助手函数,用于将时间戳转换为可读的日期。该函数在StringEdit文件中称为“getDate”。php(在“helpers”文件夹中)。我知道这个功能是有效的。
我试图在一个jQuery调用中使用这个函数,从数据库中获取数据,并将其加载到div id(每次点击加载更多数据)。下面是代码:
<script type="text/javascript">
$(function() {
<?php $number_of_posts = 2; ?>;
<?php $_SESSION['posts_start'] = isset($_SESSION['posts_start']) ? $_SESSION['posts_start'] : $number_of_posts; ?>;
//<?php $_SESSION['posts_start'] = $_SESSION['posts_start'] ? $_SESSION['posts_start'] : $number_of_posts; ?>;
//<?php $_SESSION['posts_start'] = 2 ?>;
//var start = <?php echo $_SESSION['posts_start']; ?>;
var start = {{ Session::get('posts_start', 2) }};
var initialPosts = <?php echo Fanartist::friend_activity_json(0, $_SESSION['posts_start']); ?>;
//var initialPosts = <?php echo Fanartist::friend_activity_json(0, 2); ?>;
var desiredPosts = <?php echo $number_of_posts; ?>;
var template = '<tr>'
+'<td>'
+'<div class="friend_image">'
+'<img src="https://graph.facebook.com/fbid/picture" alt="" height="65" width="65" class="img-rounded">'
+'</div>'
+'</td>'
+'<td>'
+'<div class="friend_activity">'
+'<span class="activity_text"><span class="first_name"></span> <span class="last_name"></span> indicated that <span class="gender"></span> wants <a href="/artists/artist_id"><span class="stage_name"></span></a> to come to <span class="city"></span></span>'
+'<br><span class="activity_subtext"><span class="created_at"></span></span>'
+'</div>'
+'</td>'
+'</tr>';
var activity = $('#activity'),
// Element to load the posts
content = activity.find('.content'),
// the more button
more = activity.find('.more'),
// the post counter
counter = activity.find('.badge');
// Create alerts elements (Display Success or Failure)
var alerts = {
requestEmpty : $('<div class="alert alert-info">No more data</div>'),
requestFailure : $('<div class="alert alert-error">Could not get the data. Try again!</div>')
}
var progressElement = $('<div class="progress" style="margin-bottom:0"><div class="bar"></div></div>');
var progressBar = progressElement.find('.bar');
var postHandler = function(posts){
// Set the progress bar to 100%
progressBar.css('width', '100%');
// Delay the normal more button to come back for a better effect
window.setTimeout(function(){more.html('More <span class="caret"></span>')}, 500);
// insert childrens at the end of the content element
for (post in posts){
// Clone the element
var $post = $(template).clone();
$post.attr('id', 'post-' + posts[post].ID);
var $img = $post.find('div.friend_image').find('img');
$img.attr('src', $img.attr('src').replace('fbid', posts[post].fbid));
$img.attr('alt', posts[post].first_name);
var $spantext = $post.find('div.friend_activity').find('span.activity_text');
$spantext.html($spantext.html().replace('artist_id', posts[post].artist_id));
//$post.find('.fbid').html(posts[post].fbid);
$post.find('.first_name').html(posts[post].first_name);
$post.find('.last_name').html(posts[post].last_name);
$post.find('.city').html(posts[post].city);
$post.find('.gender').html(posts[post].gender == 'male' ? 'he' : 'she');
//$post.find('.artist_id').html(posts[post].artist_id);
$post.find('.stage_name').html(posts[post].stage_name);
$post.find('.created_at').html(posts[post].created_at);
content.append($post);
}
content.animate({
scrollTop: $('#post-' + posts[0].ID).offset().top + (content.scrollTop()- content.offset().top)
}, 200);
}
// place the initial posts in the page
postHandler(initialPosts);
// add the click event to the more button
more.click(function(){
// Set the progress bar to 0%
progressBar.css('width', '0%');
// remove the more button innerHTML and insert the progress bar
more.empty().append(progressElement);
// AJAX REQUEST
$.ajax({
url: "http://crowdtest.dev:8888/fans/setup_widget",
type: 'GET',
// We do not want IE to cache the result
cache: false,
data: {
'start': start,
'desiredPosts': desiredPosts
}
}).success(function (data, text) {
// parse the response (typeof data == String)
data = JSON.parse(data);
if (data.length > 0){
// Update the total number of items
start += data.length;
// Update the counter
counter.html(start);
// load items on the page
postHandler(data);
}else{
$alert = alerts.requestEmpty;
// insert the empty message
activity.prepend($alert);
// Set the progress bar to 100%
progressBar.css('width', '100%');
// Remove the more button
window.setTimeout(function(){more.remove()}, 500);
// remove the empty message after 4 seconds
window.setTimeout(function(){$alert.remove()}, 4000);
}
}).error(function (request, status, error) {
$alert = alerts.requestFailure;
// insert the failure message
activity.prepend($alert);
// Set the progress bar to 100%
progressBar.css('width', '100%');
// Delay the normal more button to come back for a better effect
window.setTimeout(function(){more.html('More <span class="caret"></span>')}, 500);
});
});
console.log(desiredPosts);
console.log(start);
console.log(initialPosts);
});
</script>
在html中使用div id“activity”调用:
<div id="activity">
<table class="table table-striped">
<thead>
<tr>
<th><div class="friend_image"></div></th>
<th><div class="friend_activity"></div></th>
</tr>
</thead>
<tbody class="content">
</tbody>
</table>
<button class="more btn btn-block">
More <span class="caret"></span>
</button>
</div>
除了created_at部分,所有内容都正确输出。我得到的错误:
SyntaxError: missing ) after argument list
参考该行:
$post.find('.created_at').html(posts[post].StringEdit::getDate(created_at));
你知道我将如何调用这个函数来编辑jQuery中数据库中的created_at实体吗?谢谢你的帮助。
为什么不在数据库的雄辩模型上使用一个访问器,这样就根本不需要getDate()函数了?
class User extends Eloquent {
public function getCreatedAt($value)
{
// created_at will now be formatted as "d-m-Y"
return date('d-m-Y', strtotime($value));
}
}
只需将date()函数格式更改为所需格式(即与getDate()函数格式相同)
根据您的回复,关于传递给blade模板的变量,您编写了您提供的javascript代码——“它在blade文件本身中,post变量通过ajax绑定。”我想解决方案相当简单-您只需使用blade和php即可满足您的需求,而无需使用JS(这在您的情况下是多余的)
在laravel控制器中
1)将$posts变量传递给视图(然后返回它、显示或任何模板实现)
View::make('posts', $posts);
在您的刀片模板中
1)将变量发送到模板,就像您已经做的那样
2)将javascript中的“模板”变量作为刀片模板php代码进行结构
3)使用刀片用数据填充变量(而不是像您现在这样用JS解析模板代码)
下面的一些示例(只是一个片段):
// app/views/posts.blade.php
{{-- this is a blade comment --}}
<div id="activity">
<table class="table table-striped">
<thead>
<tr>
<th><div class="friend_image"></div></th>
<th><div class="friend_activity"></div></th>
</tr>
</thead>
<tbody class="content">
{{-- in the below foreach loop you put the html you currently have in javascript template variable var template; --}}
@foreach ($posts as $post)
{{-- inside the foreach loop you have access to all your $posts, so while iterating you can do: --}}
{{-- 1) access $post fields --}}
{{ $post->id }}
{{ $post->fbid }}
{{ $post->whatever }}
{{-- 2) access $post fields and apply function on them --}}
{{ StringEdit::getDate($post->whatever) }}
@endforeach
</tbody>
</table>
<button class="more btn btn-block">
More <span class="caret"></span>
</button>
</div>
如果你按照建议去做,你就不必担心Php到Javascript的问题,而且它看起来确实是一个更干净、更简单的解决方案。当然,你会得到你想要的东西——你可以在模板中使用字符串助手函数:)
编辑:
我更新了上述帖子,在评论中加入了讨论信息
编辑2:
从评论中回答您的后续请求:
使用自定义雄辩模型访问器
假设您的模型中有一个字段(数据列)(这当然是表示数据库中的一个表),该字段的名称是MyFancyField。现在,对于您的系统,您需要有一种可能性,来获取这个字段的预处理内容——您需要它是大写的。因此,您创建了一个自定义访问器,如下所示,并将其作为模型的另一个字段来引用(使用它)。
型号:/app/models/Book。php
class Book extends Eloquent {
protected $table = 'books';
public function toArray()
{
$array = parent::toArray();
foreach ($this->getMutatedAttributes() as $key)
{
if ( ! array_key_exists($key, $array)) {
$array[$key] = $this->{$key};
}
}
return $array;
}
public function getUpperMyFancyField()
{
return strtoupper($this->myFancyField);
}
}
控制器: /app/controllers/
public function index(Book $book)
{
$this->book = $book;
echo "The original field fetched by a default accessor: " . $this->book->myFancyField;
echo "The uppercased field fetched by another custom accessor: " . $this->book->upperMyFancyField;
}
就为了记录,toArray()故意重载,因为默认情况下,Laravel 4不将“自定义访问器字段”作为数组包含到返回的对象中。所以如果你没有这个,想要这个$-
关于执行查询的信息 $this->db->insert_id() 当执行 INSERT 语句时,这个方法返回新插入行的ID。 注解 If using the PDO driver with PostgreSQL, or using the Interbase driver, this function requires a $name parameter, which specifies the
简介 Laravel 包含各种各样的全局「辅助」PHP 函数,框架本身也大量地使用了这些功能;如果你觉得方便,你可以在你的应用中自由的使用它们。 可用方法 数组 & 对象 array_add array_collapse array_divide array_dot array_except array_first array_flatten array_forget array_get arra
列标字符转化 获取扩展版本 查看作者信息
辅助函数,顾名思义,是帮助我们完成特定任务的函数。每个辅助函数文件仅仅是一些函数的集合。例如,URL Helpers 可以帮助我们创建链接,Form Helpers 可以帮助我们创建表单,Text Helpers 提供一系列的格式化输出方式,Cookie Helpers 能帮助我们设置和读取COOKIE, File Helpers 能帮助我们处理文件,等等。 跟其他部分不同的是,辅助函数不是用类的
辅助函数,顾名思义,是帮助我们完成特定任务的函数。每个辅助函数文件都是某一类 函数的集合。例如, URL 辅助函数 帮助我们创建链接,表单辅助函数**帮助 我们创建表单元素,**本文辅助函数 帮助我们处理文本的格式化,Cookie 辅助函数 帮助我们读取或设置 Cookie ,文件辅助函数 帮助我们处理文件,等等等等。 不同于 CodeIgniter 中的大多数系统,辅助函数没有使用面向对象的方式
存放位置 Laravel 提供了很多 辅助函数,有时候我们也需要创建自己的辅助函数。 必须 把所有的『自定义辅助函数』存放于 app 文件夹中。 并在 composer.json 文件中加载,方法请见: Laravel 的自定义函数 helpers.php 文件存放位置