1

我需要 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, price, quantity, status) 值 (NULL, 'as', NULL, '', '', NULL, 2500, 25, 'enabled') 最后查询:插入产品( category_id, name, picture_id, short_description, description, uploaded_at, price, quantity, status) 值 (NULL, 'as', NULL, '', '', NULL, 2500, 25, 'enabled') MySQL 错误:列 'category_id' 不能为空`

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

谢谢!

4

3 回答 3

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 和服务器上都可以正常工作。

谢谢你们的帮助。

于 2012-01-07T16:32:40.597 回答
0

我也对必填字段的方式感到困惑:

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

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

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

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

您是否有任何机会定义了在插入之前以某种方式操纵此数据的方法beforeInsert()或方法?beforeModify()

至于 的NULLcategory_id,添加新条目时,默认情况下,两者均不选择任何项目:

$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->ownerMVCForm 对象进行试验。

此外,该exit()调用对于防止内部render()方法生成 HTML 页面并仅生成 Javascript 链很重要。

我希望这有帮助。

于 2012-01-07T03:28:08.040 回答
0

您正在哪个平台上开发以及您正在在线部署哪个平台。您可以在此处查看我之前的问题,该问题在 windows 上本地开发然后在线迁移到 linux 主机时出现类似错误 - 迁移到在线时未找到 ATK4 模型

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

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

于 2012-01-03T06:37:47.773 回答