我在ATK4 CRUD中需要帮助。我使用Agile Toolkit 4.1.3为项目构建了一个后端。 我有以下模型:
class Model_Product extends Model_Table
{
public $entity_code = 'product';
function init()
{
parent::init();
$this->addField('category_id')->refModel('Model_Category')->mandatory(true);
$this->addField('name')->mandatory(true);
$this->addField('picture_id')->refModel('Model_Picture')->mandatory(true);
$this->addField('short_description')->mandatory(true);
$this->addField('description')->type('text')->mandatory(true);
$this->addField('uploaded_at')->type('datetime');
$this->addField('price')->type('int')->mandatory(true);
$this->addField('quantity')->type('int')->mandatory(true);
$this->addField('status')->datatype('list')
->listData(array(
'enabled'=>'Enabled',
'disabled'=>'Disabled',
))
->defaultValue('enabled');
}
}
页面:
<?php
class page_index extends Page {
function init(){
parent::init();
$page=$this;
$tabs = $page->add('Tabs');
$tabs->addTab('Product')->add('CRUD')->setModel('Product');
....
在我的本地主机上,所有CRUD功能都可以正常运行,但在我尝试添加新产品后将文件上传到网络服务器后,我收到此错误:
`AJAX响应错误:SyntaxError:无效的XML属性值 的SQLException
无法执行查询:插入产品(category_id
,name
,picture_id
,short_description
,description
,uploaded_at
,{{ 1}},price
,quantity
)值(NULL,'as',NULL,'','',NULL,2500,25,'enabled')
上次查询:
插入到产品中{status
,category_id
,name
,picture_id
,short_description
,description
,uploaded_at
,{{1} },price
)值(NULL,'as',NULL,'','',NULL,2500,25,'enabled')
MySQL错误:
列'category_id'不能为null`
奇怪的是,查询中的缺失值在crud表单中是可见的,但从未进入查询。附加信息:在Model_Picture中我使用varchar id字段而不是autoincrement int但是在localhost上一切正常。
谢谢!
答案 0 :(得分:1)
我将所有的crud函数放在一个页面上,如下所示:
<?php
class page_index extends Page {
function init(){
parent::init();
$page=$this;
$tabs = $page->add('Tabs');
$tabs->addTab('Product')->add('CRUD')->setModel('Product');
$tabs->addTab('Category')->add('CRUD')->setModel('Category');
$tabs->addTab('Property')->add('CRUD')->setModel('Property');
$tabs->addTab('Property <> Product')->add('CRUD')->setModel('ProductProperty');
$tabs->addTab('Payment options')->add('CRUD')->setModel('Payment');
$tabs->addTab('Shipping options')->add('CRUD')->setModel('Shipping');
$tabs->addTab('Users')->add('CRUD')->setModel('User');
$tabs->addTab('Email addresses')->add('CRUD')->setModel('Email');
$tabs->addTab('News')->add('CRUD')->setModel('News');
$tabs->addTab('Downloads')->add('CRUD')->setModel('Download');
$tabs->addTab('Designer Aids')->add('CRUD')->setModel('Aid');
}
}
然后我为每个模型创建了一个新页面,并在每个页面上只添加了一个CRUD,它解决了问题,现在它在localhost和服务器上都能正常工作。
谢谢你们的帮助。
答案 1 :(得分:0)
您正在开发哪个平台以及您要在线部署哪个平台。您可以在Windows上本地开发然后在线移动到Linux主机时看到我之前的问题,该问题有类似的错误 - ATK4 model not found when moving to online
该案例中的错误与Linux中的区分大小写问题有关,而Windows则更容易理解案例差异,因此请检查代码中的初始资本。
当我在类文件中包含结束?>
时,我最近也在4.1.3中使用CRUD从Ajax中获得了一些错误。 agiletoolkit.org建议您不要使用结束标记,因为它可能会在输出中引入无效字符,这会破坏某些功能,因此请确保您在每个文件的顶部使用<?php
但忽略任何?>
在最后一行。
答案 2 :(得分:0)
我也很困惑如何强制性领域:
$this->addField('description')->type('text')->mandatory(true);
最终作为SQL插入字符串中的 NULL 值传递:
(NULL, 'as', NULL, '', '', NULL, 2500, 25, 'enabled')
ATK4应该已经通知该字段是必需的,如果必填字段仍为空,则永远不会导致update()
尝试。
你有没有机会定义beforeInsert()
或beforeModify()
方法在插入之前以某种方式操纵这些数据?
对于NULL
的{{1}}值,在添加新条目时,默认情况下,不会为两者选择任何项目:
category_id
和
$this->addField('category_id')->refModel('Model_Category')->mandatory(true);
因此,在添加新条目时,用户必须先从列表中明确选择。
对我来说,如果一切都失败了,我依赖于beforeModify()方法并抛出一个js() - &gt; fieldError通知:
尝试在您的模型中插入此内容:
$this->addField('picture_id')->refModel('Model_Picture')->mandatory(true);
请注意,您可能需要在function beforeModify(&$data){
if(empty($data['category_id'])){
$this->owner->owner->js()->atk4_form('fieldError','category_id',
'Select an category from the list')->execute();
exit;
}
}
上进行试验以获得MVCForm对象。
此外,$this->owner->owner
调用对于阻止内部exit()
方法生成HTML页面并仅生成Javascript链非常重要。
我希望这会有所帮助。