Agile Toolkit CRUD отлично работает на локальном хосте, выдает ошибку на сервере - PullRequest
1 голос
/ 02 января 2012

Мне нужна помощь в 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' не может быть нулевым`

Странно, что отсутствующие значения в запросевидимый в грубой форме, но никогда не сделать это на запрос.Дополнительная информация: в Model_Picture я использую поле id varchar вместо autoincrement int, но еще раз все отлично работает на localhost.

Спасибо!

Ответы [ 3 ]

1 голос
/ 07 января 2012

У меня были все мои функции 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 на каждую страницу, и это решило проблему, теперьон отлично работает как на локальном хосте, так и на сервере.

Спасибо, ребята, за вашу помощь.

0 голосов
/ 07 января 2012

Я также озадачен тем, как обязательное поле:

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

в конечном итоге будет передано как NULL значение в строке вставки SQL:

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

ATK4 должен уже уведомить о том, что это поле является обязательным и никогда не приведет к попытке update(), если обязательные поля все еще пусты.

Есть ли у вас случайно определенный метод beforeInsert() или beforeModify(), который каким-то образом манипулирует этими данными перед вставкой?

что касается значения NULL для category_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->owner, чтобы получить объект MVCForm.

также, вызов exit() важен для предотвращения внутреннего метода render() для создания HTML-страницы и только для создания цепочки Javascript.

Надеюсь, это поможет.

0 голосов
/ 03 января 2012

На какой платформе вы разрабатываете и какую платформу вы развертываете в Интернете. Вы можете увидеть мой предыдущий вопрос, у которого была похожая ошибка при локальной разработке на Windows и последующем переходе на Linux-хост здесь: Модель ATK4 не найдена при переходе на Интернет

Ошибка в этом случае была связана с чувствительными к регистру проблемами в Linux, тогда как Windows более проста в отношении различий в регистрах, поэтому проверьте ваш начальный capitilsaton в вашем коде.

Я также недавно получил некоторые ошибки от Ajax с CRUD в 4.1.3, когда я включил закрывающий ?> в файлы классов. agiletoolkit.org рекомендует не использовать закрывающие теги, так как он может вводить недопустимые символы в вывод, что нарушает некоторые функциональные возможности, поэтому просто убедитесь, что вы используете <?php в верхней части каждого файла, но пропускайте любые ?> в последней строке .

...