敏捷工具包CRUD在本地主机上工作完美,在服务器上抛出错误


Agile Toolkit CRUD works perfectly on localhost throws error on server

我需要ATK4 CRUD方面的帮助。我已经建立了一个后端项目使用敏捷工具包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功能工作完美,但当我将文件上传到web服务器时,当我尝试添加新产品时,我得到这个错误:

' AJAX响应错误:SyntaxError:无效的XML属性值SQLException

无法执行查询:insert into product (category_id, name, picture_id, short_description, description, uploaded_at, price, quantity, status) values (NULL, 'as', NULL, ", ", NULL, 255,25, 'enabled')最后的查询:insert into product (category_id, name, picture_id, short_description, description, uploaded_at, price, quantity, status) values (NULL, 'as', NULL, ", ", NULL, 255,25, 'enabled')MySQL错误:列'category_id'不能为空'

奇怪的是,查询中缺失的值在crud表单中是可见的,但从来没有出现在查询中。附加信息:在Model_Picture中,我使用varchar id字段而不是自动增量int,但再次在本地主机上一切正常。

谢谢!

我把所有的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,它解决了问题,现在它在本地主机和服务器上都能正常工作。

谢谢大家的帮助。

您在哪个平台上进行开发,在哪个平台上进行在线部署?你可以看到我之前的问题,当在windows上本地开发时,有一个类似的错误,然后移动到linux主机在线这里-移动到在线时找不到ATK4模型

这种情况下的错误与Linux中的大小写敏感问题有关,而Windows对大小写差异更宽容,因此请检查代码中的初始大写字母。

我最近也得到了一些错误从Ajax与CRUD在4.1.3当我在类文件中包括一个关闭?>。agiletoolkit.org建议不要使用结束标签,因为它会在输出中引入无效字符,从而破坏一些功能,因此只需确保在每个文件的顶部使用<?php,但在最后一行省略任何?>

我也很困惑,为什么一个必填字段:

$this->addField('description')->type('text')->mandatory(true);

最终在SQL插入字符串中作为NULL值传递:

(NULL, 'as', NULL, '', '', NULL, 2500, 25, 'enabled')

ATK4应该已经给出一个通知,该字段是必需的,并且如果必需的字段仍然为空,则永远不会导致update()尝试。

您是否有机会定义beforeInsert()beforeModify()方法,以某种方式在插入之前操作该数据?

对于category_idNULL值,当添加一个新条目时,默认情况下,两个条目都不被选中:

$this->addField('category_id')->refModel('Model_Category')->mandatory(true);

$this->addField('picture_id')->refModel('Model_Picture')->mandatory(true);

所以当添加一个新条目时,用户必须首先显式地从列表中选择。

对我来说,如果其他都失败了,我依赖于beforeModify()方法并抛出js()->fieldError通知:

试着在你的模型中插入这个:

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;
   }
}

请注意,您可能必须在$this->owner->owner上进行实验才能到达MVCForm对象。

同样,exit()调用对于防止内部render()方法生成HTML页面而只生成Javascript链很重要。