我有一个已经存在的表,其中一个字段应该是唯一的但不是.我只知道这一点,因为表中的条目与另一个已存在的条目具有相同的值,这导致了问题.
如何使此字段仅接受唯一值?
使用jqgrid rowObject的结果的第一页返回预期数据,但随后返回结果的后续页面的不完整数据.为什么?
结果的第一页:rowObject [3]将等于"2"
后续结果页:rowObject [3]将等于"undefined",返回结果的第一页现在也将等于"undefined".
更多细节和一些代码:
使用jqGrid,如果要实现自定义格式化程序,可以使用名为rowObject的参数,该参数包含行数据.因此,例如,一行rowObject可能是这样的:
["18", "133", "Betelguese", "3", "photo.jpg", "", "0", ""]
Run Code Online (Sandbox Code Playgroud)
所以我的自定义格式化程序使用这些数据中的一些来准备链接,如下所示:
var newval = '<a href="/proj/' + rowObject[3] + '/images/' + imgval + '">' + imgval + '</a>';
Run Code Online (Sandbox Code Playgroud)
这给了我一个网址:
<a href="/proj/3/images/photo.jpg">photo.jpg</a>
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.我的问题是当我在jqgrid中转到结果的下一页时,我丢失了一些这样的数据并得到:
<a href="/proj/undefined/images/photo.jpg">photo.jpg</a>
Run Code Online (Sandbox Code Playgroud)
如果我加载显示所有结果的页面一切正常,但是如果我使用分页,只有第一页结果将具有rowObject [3]的正确值,而后续页面上的每个其他结果都不具有该rowObject值!
那么为什么rowObject包含关于最初加载到网格中的内容的正确数据,并且当网格结果的下一页出现时似乎丢失了该数据?
我在Firebug中看到的一件事我不明白...当页面最初加载时我得到:
console.log(rowObject);
["18", "133", "Betelguese", "3", "photo.jpg", "", "0", ""]
Run Code Online (Sandbox Code Playgroud)
在结果的下一页,我发现事情就像我预期的那样停止工作
console.log(rowObject);
Object { photo_id="18", site_id="133", more...}
Run Code Online (Sandbox Code Playgroud)
为什么要改变?第一个结果是json,为什么我现在得到这个对象?
问题:如何生成导航,允许从多维数组中将不同的类应用于不同的子项?
在我需要多级导航之前,我就是这样做的:
Home
Pics
About
Run Code Online (Sandbox Code Playgroud)
并通过调用nav()生成:
function nav(){
$links = array(
"Home" => "home.php",
"Pics" => "pics.php",
"About" => "about.php"
);
$base = basename($_SERVER['PHP_SELF']);
foreach($nav as $k => $v){
echo buildLinks($k, $v, $base);
}
}
Run Code Online (Sandbox Code Playgroud)
这是buildLinks():
function buildLinks($name, $page, $selected){
if($selected == $page){
$theLink = "<li class=\"selected\"><a href=\"$page\">$name</a></li>\n";
} else {
$thelink = "<li><a href=\"$page\">$name</a></li>\n";
}
return $thelink;
}
Run Code Online (Sandbox Code Playgroud)
我的问题,再次:
我将如何实现以下导航(并注意到可见的子导航元素仅在该特定页面上出现时):
Home
something1
something2
Pics
About
Run Code Online (Sandbox Code Playgroud)
和...
Home
Pics
people
places
About
Run Code Online (Sandbox Code Playgroud)
我试过的
从它看来,SPL中的某些迭代器似乎很适合这个,但我不知道如何处理它.我玩过RecursiveIteratorIterator,但我不知道如何将不同的样式仅应用于子菜单项,以及如何在正确的页面上显示这些项目.
我构建了这个数组来测试,但不知道如何单独使用子菜单项:
$nav = array(
array(
"Home" …Run Code Online (Sandbox Code Playgroud) 我已经看过很多关于cron和ZF的帖子,但大多数解决方案都让这项工作可以让公众触发.
如果你想设置一个只能由cron运行的动作怎么办?不是某个匿名用户而是某个必须登录的人?
我正在使用的解决方案涉及将一个文件放在我的web根目录之外,让它足够引导ZF以使用我需要的东西(比如,我不需要视图),然后从cron中找到它.我的问题是,这是一种"最佳实践"方式吗?如果您需要通过Web访问代码但仍需要阻止随机用户查找和运行代码,该怎么办?
为了说明,这里是我正在做的(有效)从php命令行运行的cron作业,并在同一台服务器上,如下所示:
* 10 * * * php /Apps/ZF/cronjobs/crontest.php
Run Code Online (Sandbox Code Playgroud)
Webroot是: /Apps/ZF/someproject/
crontest.php:
<?php
ini_set('include_path', ini_get('include_path') . ':/Apps/ZF/someproject/library');
define('APPLICATION_PATH','/Apps/ZF/someproject/application');
define('APPLICATION_ENVIRONMENT','test');
//Include the loader (for loading ZF resources)
require_once 'Zend/Loader.php';
//Include the model (to access the Sites model in this case)
require_once(APPLICATION_PATH . '/models/Planets.php');
Zend_Loader::registerAutoload();
$configuration = new Zend_Config_Ini(
APPLICATION_PATH . '/config/config.ini',
APPLICATION_ENVIRONMENT
);
// DB adapter
$dbAdapter = Zend_Db::factory($configuration->database);
// DB table setup
Zend_Db_Table_Abstract::setDefaultAdapter($dbAdapter);
// Whatever code we want to run...
$test = new Model_Planets();
$test->fetchEntries();
Zend_Debug::dump($test);
?> …Run Code Online (Sandbox Code Playgroud) 我的数据库中的时间戳采用以下格式:
2011-02-26T13:00:00-05:00
Run Code Online (Sandbox Code Playgroud)
但是通过MySQL获取当前时间戳:
SELECT current_timestamp();
Run Code Online (Sandbox Code Playgroud)
给我一些格式化的东西......
2011-02-26 13:05:00
Run Code Online (Sandbox Code Playgroud)
我的最终目标是遍历所有条目(每2天)并删除超过2天的条目,那么如何将条目与2011-02-26T13:00:00-05:00时间戳与当前时间戳进行比较?
我只在Firefox 4中出现以下错误(不在FF 3.6.16,Safari,Chrome,Opera或IE中):
jQuery("#list").jqGrid is not a function
loadComplete: function(){console.log('complete');}
myfile.js line 542
Run Code Online (Sandbox Code Playgroud)
loadComplete是jqgrid代码块的最后一行(第542行).所以它到达jqgrid的调用结束然后抛出此错误.
这是在过去一年一直运作良好的网站上.一旦我升级到Firefox 4,我遇到了这个问题.我确定在加载所有其他javascript之后我将这个调用加载到jqgrid(并且它在所有其他测试的浏览器和旧版本的Firefox中都能正常工作).
什么可能导致这样的事情?我本来以为可以简单地通过makeing确保调用的jqGrid是jQuery和在jqGrid的插件后进行加载,但是......这似乎已经是这样来解决(我甚至尝试上加载设置5秒的超时调用jqgrid的位,以便确保加载所有内容但仍然失败).无论如何,为什么只在FF4?
额外信息:
这是页面上的js加载顺序:
<script type="text/javascript" src="/js/jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="/js/jquery-ui-1.8.1.custom.min.js"></script>
<script type="text/javascript" src="/js/i18n/grid.locale-en.js"></script>
<script type="text/javascript" src="/js/jquery.jqGrid.js"></script>
<script type="text/javascript" src="/js/ajaxupload.js"></script>
Run Code Online (Sandbox Code Playgroud)
然后在页面末尾加载jqgrid调用的特定视图:
<script type="text/javascript" src="/js/viewspecific.js"></script>
Run Code Online (Sandbox Code Playgroud)
最后一个是由Zend Framework中的一个方法加载的,该方法可以预先加载,附加或偏移加载文件.在对此进行故障排除时,我明确使用了append以及偏移量来强制此脚本最后加载死机.我甚至尝试在视图脚本的底部包含原始JS,而不是作为单独的文件加载,但没有任何区别.
有关如何排除故障的任何想法?
Oleg提供的修复方法是修改各种包含文件的加载方式.在loader(jquery.jqGrid.js)中,您将看到特定于浏览器的代码,如:
if(jQuery.browser.safari ) {
jQuery.ajax({url:filename,dataType:'script', async:false, cache: true});
} else {
if (jQuery.browser.msie) {
document.write('<script type="text/javascript" src="'+filename+'"></script>');
} else {
IncludeJavaScript(filename);
}
}
Run Code Online (Sandbox Code Playgroud)
我用更通用的代替了它:
document.writeln("<script type='text/javascript' src='"+filename+"'></script>");
Run Code Online (Sandbox Code Playgroud)
现在一切都在所有浏览器中都很好.
要where在Zend Framework中的MySQL表行更新中使用,我有类似的东西:
public function updateBySiteId(array $data, $id) {
$table = $this->gettable();
$where = $table->getAdapter()->quoteInto('site_id = ?', $id);
return $table->update($data, $where);
}
Run Code Online (Sandbox Code Playgroud)
而且,我希望,这给我一些像......
UPDATE foo SET ponies = 'sparkly' WHERE site_id = '1'
Run Code Online (Sandbox Code Playgroud)
但是如果我想创建以下内容呢?
UPDATE foo SET ponies = 'sparkly' WHERE site_id = '1' AND type = 'zombie'
Run Code Online (Sandbox Code Playgroud)
在手册中我没有看到如何使用quoteInto(或引用或其他一些安全的方法......这可能只是意味着我在错误的地方但是...... 叹息).
我正在尝试使用Zend_Dom进行一些非常轻的屏幕抓取(我想抓住一个标题,一些正文和我网站上一小块新闻项目的链接)我不知道如何处理DOMElement它给了我.
在Zend_Dom的手册中,代码说:
foreach ($results as $result) {
// $result is a DOMElement
}
Run Code Online (Sandbox Code Playgroud)
我如何使用这个DOMElement?
一个详细的例子(在Google上寻找锚元素):
$url='http://google.com/';
$client = new Zend_Http_Client($url);
$response = $client->request();
$html = $response->getBody();
$dom = new Zend_Dom_Query($html);
$results = $dom->query('a');
foreach($results as $r){
Zend_Debug::dump($r);
}
Run Code Online (Sandbox Code Playgroud)
这给了我:
object(DOMElement)#81 (0) {
}
object(DOMElement)#82 (0) {
}
object(DOMElement)#83 (0) {
}
... etc, etc...
Run Code Online (Sandbox Code Playgroud)
我觉得令人困惑的是,这看起来每个元素都不包含任何东西(0)!事实并非如此,但这是我的第一印象.所以我在网上找到了,发现我可以添加nodeValue以获得一些东西:
Zend_Debug::dump($r->nodeValue);
Run Code Online (Sandbox Code Playgroud)
这给了我:
string(6) "Images"
string(6) "Videos"
string(4) "Maps"
...etc, etc...
Run Code Online (Sandbox Code Playgroud)
但是遇到麻烦的地方是获取特定元素及其内容.
比如给出这个html:
<div class="newsBlurb">
<span class="newsDate">Mon, 11 October 2010</span>
<h3 class="newsHeadline"><a href="http://foo.com/1/2/">Some text</a></h3> …Run Code Online (Sandbox Code Playgroud) 我的问题:当我在jqGrid中拖动一行并完成自定义重新加载功能时,网格的单元格(以前在定义网格时设置的所有不同宽度)都会调整为大小相同的宽度.这种情况发生在Webkit浏览器中,但不发生在Firefox中.
代码: 我已拖动到网格上启用排序:
$mygrid.jqGrid(
'sortableRows', {
update: function(e, ui) {
sort_grid(e, ui);
}
}
);
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我有一个名为drag complete的排序函数sort_grid.这里是:
function sort_grid(e, ui) {
var current_grid = $(ui.item[0]).closest('table').attr('id');
var $current_row, moved_id, next_id, next_priority;
var $moved_row = $('#' + current_grid + ' tr');
var cnt = 0;
this_id = ui.item[0].id;
$moved_row.each(function () {
if ($(this).attr('id') == this_id) {
$current_row = $moved_row.eq(cnt);
moved_id = $current_row.attr("id");
next_id = $current_row.next().attr("id");
next_priority = $current_row.next().children("td:first").attr("title");
}
cnt++;
});
if ( typeof moved_id !== 'undefined' ) { …Run Code Online (Sandbox Code Playgroud) 为什么要形成if像...
if (null === $this->foo){...}
if (0 === count($bar)){...}
Run Code Online (Sandbox Code Playgroud)
而不是...
if ($this->foo === null){...}
if (count($bar) === 0){...}
Run Code Online (Sandbox Code Playgroud)
我在很多编码器和项目的代码中都注意到了这一点,但是我不知道为什么他们这样做.我是第二种方式,因为它遵循我的想法"如果这个值与null相同然后......"而询问"如果null与此值相同......"对我来说似乎有点不太明显.所以为什么?
php ×5
javascript ×3
jqgrid ×3
jquery ×3
mysql ×2
cron ×1
dom ×1
if-statement ×1
iterator ×1
navigation ×1