Имеет много комбо-бокс в тортPHP - PullRequest
0 голосов
/ 19 декабря 2010

Я новый пекарь. Я разработал веб-сайт для автомобилей, где в каждой категории есть много автомобилей, и каждая машина принадлежит только одной категории. В своей модели Cars я написал следующий код:

    class Cars extends AppModel 
    {
     var $name = 'Cars';
     var $belongsTo = array('Carcategory','User');
    }  

И в моей модели Carcategory я написал следующий код:

    class Carcategory extends AppModel {
        var $name = 'Carcategory';
        var $hasMany = array(
        'Car' => array(
            'className'     => 'Car',
            'foreignKey'    => 'carcategory_id',
            'order'    => 'carcategory.name ASC',
            'dependent'=> true
        )
    );

}  

И в моем car_controller я написал следующий код:

    function beforeFilter(){
 $this->set('car_categories',$this->Carcategory->find('list', array('order' => 'name')));
  }

И в своем автомобильном представлении я написал следующий код:

echo $form->input('carcategory_id', array('options' => $car_categories, 'label' => 'Cars Categories : ', 'class' => 'short'));  

Мои таблицы базы данных выглядят следующим образом:

    CREATE TABLE `carcategories` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(50) NOT NULL,
  `image` varchar(50) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;  

     CREATE TABLE `cars` (
  `id` int(11) NOT NULL auto_increment,
  `title` varchar(255) character set utf8 collate utf8_bin NOT NULL,
  `name` varchar(255) character set utf8 collate utf8_unicode_ci NOT NULL,
  `model` varchar(100) character set utf8 collate utf8_unicode_ci NOT NULL,
  `motorcc` varchar(100) character set utf8 collate utf8_unicode_ci NOT NULL,
  `details` text character set utf8 collate utf8_unicode_ci NOT NULL,
  `carcategory_id` int(11) NOT NULL,
  `userid` int(11) NOT NULL,
  `hits` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;  

Я назвал первую категорию таблицы, потому что я мог бы добавить другие службы на свой сайт, и эти службы могут иметь другие категории
Мой код генерирует следующую ошибку

    Notice (8): Undefined property: CarsController::$Carcategory [APP\controllers\cars_controller.php, line 14]
Fatal error: Call to a member function find() on a non-object in c:\wamp\www\work\cake\app\controllers\cars_controller.php on line 14

Я не могу понять, что не так в моем коде. Пожалуйста, дайте мне руку
Спасибо

Ответы [ 2 ]

1 голос
/ 19 декабря 2010

Прежде всего, вы не придерживаетесь правил именования CakePHP. (Проверьте их здесь ). Это поможет вам обнаружить небольшие ошибки, например, название вашей модели: Автомобили , когда оно должно быть Автомобиль . Я бы также переименовал вашу таблицу в car_categories и, следовательно, все вхождения от Carcategory до CarCategory.

Модели / car.php

class Car extends AppModel {
    var $name = 'Car';
    var $belongsTo = array('CarCategory', 'User');
}

Модели / car_category.php

class CarCategory extends AppModel {
    var $name = 'CarCategory';
    var $hasMany = array(
        'Car' => array(
            'className' => 'Car',
            'foreignKey' => 'car_category_id',
            'order' => 'CarCategory.name ASC',
            'dependent' => true
        )
    );
}

Контроллеры / cars_controller.php

function beforeFilter() {
    $this->set('carCategories', $this->Car->CarCategory->find('list'));
}

Примечание: вам не нужно указывать порядок, потому что вы уже упомянули его в модели как порядок по умолчанию. Также обратите внимание на соглашения об именах для переменной представления. Это позволило бы нам сделать магию CakePHP и просто напечатать это в представлении:

вид

echo $form->input('car_category_id', array('class' => 'short'));

Опять же, не для того, чтобы быть педантичным, но метка должна быть Категория машины вместо Категории автомобилей , как у вас сейчас, так как Автомобиль может принадлежать только к одной категории ваша модель данных.

Если вам нужен разделитель ":" для всех ваших ярлыков, вы можете использовать CSS для их добавления. Проверьте здесь , чтобы узнать как. Вы также можете указать опцию between для ввода формы.

Таблица

Переименуйте таблицу carcategories в car_categories Переименуйте столбец carcategory_id в таблице автомобилей на car_category_id

Возвращаясь к вашей актуальной проблеме:

Undefined property: CarsController::$CarCategory

Это означает, что вы не можете получить доступ к модели CarCategory из CarsController. По умолчанию CarsController будет управлять моделью Car. Чтобы управлять моделью CarCategory, вы можете сделать это одним из многих способов:

  • Использование ассоциаций: $this->Car->CarCategory->find( ... )
  • В вашем контроллере установите переменную $ used следующим образом: var $uses = array('Car', 'Carcategory');

Вы также можете загружать модели «на лету» (используя loadModel или ClassRegistry::init, если вам это интересно), но, поскольку вы выбираете список категорий автомобилей в beforeFilter, вам следует придерживаться одного из них. из вышеуказанных методов (предпочтительно ассоциаций).

Надеюсь, это поможет. Не забудьте внимательно посмотреть на названия всех ваших моделей, контроллеров, файлов и таблиц.

0 голосов
/ 19 декабря 2010

В вашем контроллере автомобиля найти должно быть

$this->set('car_categories',$this->Car->Carcategory->find('list', array('order' => 'name')));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...