cakephp - изменение и сохранение данных - PullRequest
2 голосов
/ 26 марта 2012

Недавно я пытался выучить cakephp, но я изо всех сил пытаюсь найти какие-либо учебные пособия, которые касаются сохранения данных в таблице после ее изменения. Я привык иметь полный контроль над всем, что происходит в PHP, поэтому было сложно приспособиться к автоматизированному процессу MVC.

Я подумал, что хорошим первым экспериментом было бы взять ввод и связать с ним букву (скажем, «м»). Затем сохраните исходное значение и объединенное значение в таблице с полями «orignal» и «concatenated». Итак, если бы я набрал «привет», значение в исходном поле было бы «привет», а объединенное поле было бы «хеллом».

Мой вопрос: будет ли модель отвечать за объединение первоначального значения? Будет ли это также экономить или ответственность контролеров?

Вот мой код: я получаю следующую ошибку. Неустранимая ошибка: вызов функции-члена save () для необъекта в /Applications/XAMPP/xamppfiles/htdocs/cake/app/Model/Concatenate.php в строке 6

View/Concatenates/add.php
<h1>Add Something</h1>
<?php

   echo $this->Form->create('Concatenate');
   echo $this->Form->input('original');
   echo $this->Form->end('Add Numbers');

?>

Теперь для модели

class Concatenate extends AppModel {

function saveConcat($original,$concatenated) {
        $this->set(array(
        'original' => $original,
        'concatenated' => $concatenated));
        $this->save();
        }

}

?>

Теперь для контроллера

<?php
class ConcatenatesController extends AppController {

public  $helpers = array('Html', 'Form');
public $components = array('Session');

public function index() {
     $this ->set('concatenates', $this->Concatenate->find('all'));  
} 

 public function add() {
    if ($this->request->is('post')) {
        $original = $this->request->data['Concatenate']['original'];
        $concatenated =  $original."m" ;
        $this->Concatenate->saveConcat($original,$concatenated);
    }
}

function isempty(){ //used to check if there is data in the table. If there isn't any, "no data" will be displayed
       $mysorts = $this->Concatenate->find('all');
       $this->set('concatenates', $mysorts);
 }
}
?>

1 Ответ

1 голос
/ 26 марта 2012

Это бесконечные дебаты (или предпочтение ) о толстой модели / тощем контроллере и наоборот.

Что касается сохранения , модель должна определенно обрабатывать логику для этого. Хотя, скорее всего, вы бы назвали его с контроллера как $myModel->save($data);

При объединении значений я бы лично обрабатывал это в контроллере, потому что это бизнес-логика, которая не имеет прямого отношения к модели. Например, вы можете объединить строку и вместо этого отправить ее в представление.

[EDIT]

Отказ от ответственности: у меня почти нулевой опыт работы с CakePHP, но основные принципы те же.

Вы упомянули, что вы не можете заставить его работать, поэтому я замечаю одну вещь: у вас есть функция с именем Concatenate() в вашей модели. Это стиль конструкторов PHP4, и он больше не является «наилучшей практикой» (если, конечно, вы не используете PHP4, но зачем вам это делать). На самом деле, это, скорее всего, полностью устареет в ближайшем будущем. PHP5 способ создания конструкторов с помощью функции __construct(). Если вы решите использовать конструктор, я обязательно вызову parent::__construct();, чтобы родительский класс AppController загружался правильно.

Что касается функциональности метода Concatenate(), я сомневаюсь, что вы все равно намерены использовать его в качестве конструктора. Переименуйте эту функцию во что-то понятное, например saveConcat(). Кроме того, я не уверен, что буду использовать $this->request->data в качестве источника на случай, если вы захотите повторно использовать эту функцию и вызывать ее с любым значением. В этом случае я бы добавил параметр в функцию

class Concatenate extends AppModel {

    function saveConcat($data) {

       if ($this->Concatenate->save($data)) { 

          $this->Session->setFlash('Your post has been saved.');
          $this->redirect(array('action' => 'index'));

       } else {

          $this->Session->setFlash('Unable to add your post.');

       }

    }

}

Тогда где-то в вашем контроллере вам придется фактически вызывать эту функцию. Измените функцию add() на вашем контроллере так, чтобы она выглядела примерно так:

public function add() { 

   if ($this->request->is('post')) {

      // Put data into array for saving
      $data[] = array( 'original' => $this->request->data );
      $data[] = array( 'concatenated' => $original."m" );

      // Call model function to save it
      $this->Concatenate->saveConcat($data);

   }

}

[РЕДАКТИРОВАТЬ 2]

Я просто не могу понять, почему я получаю ошибку: вызов функции-члена save () для необъекта.

Когда вы вызываете $this->Concatenate->save из класса Concatenate, это означает, что вы пытаетесь получить доступ к переменной внутри класса с именем Concatenate и выполнить функцию. Ни один из которых не существует, конечно. Причина в том, что вам нужно назвать сам объект так:

$this->save("blah blah");

Этот метод (я полагаю, является родительским методом из класса AppModel) будет вызываться с ссылкой на текущий экземпляр объекта Concatenate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...