【问题标题】:Agile Toolkit CRUD works perfectly on localhost throws error on serverAgile Toolkit CRUD 在 localhost 上完美运行在服务器上引发错误
【发布时间】:2012-01-02 19:56:30
【问题描述】:

我需要 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 属性值 SQL异常

无法执行查询:插入产品(category_idnamepicture_idshort_descriptiondescriptionuploaded_atpricequantitystatus)值( NULL, 'as', NULL, '', '', NULL, 2500, 25, '启用') 最后查询: 插入产品(category_idnamepicture_idshort_descriptiondescriptionuploaded_atpricequantitystatus)值(NULL,'as',NULL, '', '', NULL, 2500, 25, '启用') MySQL错误: 列“category_id”不能为空`

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

谢谢!

【问题讨论】:

  • 我在这里添加了一个与您的案例有关的键盘示例:codepad.agiletoolkit.org/stackcrud,即使这些字段是强制性的,敏捷工具包也允许将它们保留为空值。我对这个问题感到困惑,你确定桌子是一样的吗?可以删除并重新创建表吗?
  • 我删除然后用sqldump再次添加表,但错误仍然存​​在。我什至尝试了上面的查询,将 NULL 和缺失值更改为有意义的值并且它有效。使用 Model_Category 的 Crud 页面添加类别有效。如果我找不到解决方案,我会在周末从头开始重写整个东西。

标签: php frameworks atk4


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

感谢大家的帮助。

【讨论】:

    【解决方案2】:

    您在哪个平台上进行开发以及在线部署到哪个平台。你可以看到我之前的问题,它在 windows 上本地开发时出现了类似的错误,然后在此处在线移动到 linux 主机 - ATK4 model not found when moving to online

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

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

    【讨论】:

    • 主机是Linux,我的本地平台是Windows,但我仔细检查了所有大小写,没有发现任何错误,也省略了关闭php标签,所以仍然找不到导致这种情况的原因。不过还是谢谢!
    • 我也有同样的挫败感——因为你的实时环境和开发环境在不同的操作系统上,我敢肯定这会是一个区分大小写的问题,但这些真的很难追踪——我花了更多的钱比一个星期试图找到我的。如果你有机会,也许安装 Oracle Virtual Box 之类的东西,然后创建一个本地 unix 安装并从那里运行它——它可以让你更好地控制环境,你可以在 linux 中的 firefox 上运行 firebug,这可能会给你带来更好的错误比您的在线主机报告。您在此处发布的内容看不出有什么问题。
    【解决方案3】:

    我也对强制字段如何感到困惑:

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

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

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

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

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

    至于category_idNULL 值,在添加新条目时,默认情况下两者都不选择:

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

    $this-&gt;addField('picture_id')-&gt;refModel('Model_Picture')-&gt;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-&gt;owner-&gt;owner 进行试验才能获得 MVCForm 对象。

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

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-13
      • 2015-04-15
      • 2015-06-02
      • 1970-01-01
      • 1970-01-01
      • 2019-05-21
      • 1970-01-01
      • 2011-05-14
      相关资源
      最近更新 更多