Agile Toolkit CRUD完全适用于服务器上的localhost throws错误

时间:2012-01-02 19:56:30

标签: php frameworks atk4

我在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_idnamepicture_idshort_descriptiondescriptionuploaded_at,{{ 1}},pricequantity)值(NULL,'as',NULL,'','',NULL,2500,25,'enabled') 上次查询: 插入到产品中{statuscategory_idnamepicture_idshort_descriptiondescriptionuploaded_at,{{1} },price)值(NULL,'as',NULL,'','',NULL,2500,25,'enabled') MySQL错误: 列'category_id'不能为null`

奇怪的是,查询中的缺失值在crud表单中是可见的,但从未进入查询。附加信息:在Model_Picture中我使用varchar id字段而不是autoincrement int但是在localhost上一切正常。

谢谢!

3 个答案:

答案 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链非常重要。

我希望这会有所帮助。