Помогите, пожалуйста, получить динамический идентификатор записи в списке записей в Cakephp 2.3.9.

Я использовал Bake для создания cms таблицы настроек.

Он содержит три поля.

Тип столбца Null id по умолчанию int(11) Нет
ключ varchar(10) Нет
значение varchar(200) Нет

И у него есть 3 записи.

Все функции создания работают нормально. Но удаление и редактирование приведет к редактированию/удалению только первой записи.

Для получения ссылки...

Я использовал следующий код в файле просмотра.


 foreach ($languages as $language){
     echo $this->Html->link(__('Edit'), array('action' => 'edit', $language['Language']['id'])); ?>
     echo $this->Form->postLink(__('Delete'), array('action' => 'delete', $language['Language']['id']), null, __('Are you sure you want to delete # %s?', $language['Language']['id']));
 }

Я присвоил следующее значение переменной languages из контроллера.


 $this->Language->recursive = 0;
 $this->set('languages', $this->paginate());

Схема:

CREATE TABLE IF NOT EXISTS languages (
    id int(11) NOT NULL AUTO_INCREMENT,
    title varchar(30) NOT NULL,
    slug enum('eng','rus') NOT NULL DEFAULT 'eng',
    symbol varchar(50) NOT NULL,
    status enum('A','I','D') NOT NULL DEFAULT 'A',
    created_dt timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    modified_dt datetime NOT NULL, PRIMARY KEY (id),
    UNIQUE KEY Unique Language code (slug),
    KEY status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;

person Parag Kuhikar    schedule 03.09.2013    source источник
comment
Я не думаю, что ваша схема действительна. Первичный не может быть нулевым по умолчанию. Возможно, вам не хватает автоинкремента и уникальности идентификатора.   -  person mark    schedule 03.09.2013
comment
Спасибо за ответ... Пожалуйста, проверьте таблицу. CREATE TABLE IF NOT EXISTS languages ( id int(11) NOT NULL AUTO_INCREMENT, title varchar(30) NOT NULL, slug enum('eng','rus') NOT NULL DEFAULT 'eng', symbol varchar(50) NOT NULL, status enum('A','I','D') NOT NULL DEFAULT 'A', created_dt timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, modified_dt datetime NOT NULL, PRIMARY KEY (id), UNIQUE KEY Unique Language code (slug), KEY status ( status) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;   -  person Parag Kuhikar    schedule 04.09.2013
comment
Нет. Эта таблица имеет правильный идентификатор автоматического увеличения, а также правильное значение по умолчанию.   -  person Parag Kuhikar    schedule 04.09.2013
comment
Пожалуйста, не могли бы вы опубликовать, что содержит $languages, значит распечатать здесь массив $languages   -  person Er.KT    schedule 04.09.2013
comment
Array ([0] =› Array ([Language] =› Array ([id] =› 5 [title] =› Russia [slug] =› rus [symbol] =› Russia [status] =› A [created_dt] = › 28.08.2013 10:49:00 [modified_dt] =› 28.08.2013 10:49:00 )) [1] =› Array([Language] =› Array([id] =› 6 [title ] =› asdasdasd [slug] =› eng [символ] =› asdsadasd [статус] =› A [created_dt] =› 2013-08-28 10:54:00 [modified_dt] =› 28-08-2013 10:54 :00 ) ) )   -  person Parag Kuhikar    schedule 06.09.2013
comment
Эта проблема решена. В коде нет ни одной ошибки. Я использовал Foundation 4 для листинга, и при нажатии на изображение появится всплывающая ссылка для редактирования и удаления. Но в котором я забыл сделать для этого динамический идентификатор. Поэтому, когда я нажимаю на изображение, всегда появляется первый идентификатор. Поэтому, когда я использовал динамический идентификатор всплывающего окна, это решит проблему. Еще раз спасибо за ваш ответ.   -  person Parag Kuhikar    schedule 16.09.2013


Ответы (1)


в вашем контроллере сделайте следующее

public function edit($id = null) {
    if (!$id) {
          throw new NotFoundException(__('Invalid Edit Id'));
    }
    $language = $this->Language->find('first', array(
          'conditions' => array(
                  'Language.id' => $id,
           ),
    ));

    if (empty($language)) {
           throw new BadRequestException(__('Invalid Data'));
    }

    if ($this->request->is('post') || $this->request->is('put')) {
         if ($this->Language->save($this->request->data()) {
            $this->Session->setFlash(__('saved'));
         } else {
            $this->Session->setFlash(__('something went wrong'));
         }
    }

    if (empty($this->request->data)) {
        $this->request->data = $language;
    }
}

public function delete($id = null) {
 $this->Language->id = $id;
 if (!$this->Language->exists()) {
     throw new NotFoundException(__('Invalid Language'));
 }
 $this->request->onlyAllow('post', 'delete');
 if ($this->Language->delete()) {
        $this->Session->setFlash(__('Language deleted'));
        $this->redirect(array('action' => 'index'));
 }
 $this->Session->setFlash(__('Language was not deleted'));
 $this->redirect(array('action' => 'index'));
}
person Chris Pierce    schedule 13.11.2013