Малоизвестный факт: Cake ДЕЙСТВИТЕЛЬНО возвращает их как объекты или, во всяком случае, как свойства объекта. массивы — это синтаксический сахар:
// In your View:
debug($this->viewVars);
Shwoing $this
— это объект View, а свойство viewVars
соответствует $this->set('key', $variable)
или $this->set(compact('data', 'for', 'view'))
из действия контроллера.
Проблема с раздавливанием их в $Post->id
ради нажатий клавиш заключается в том, почему Cake. Cake разработан, чтобы быть тяжелым, поэтому его встроенная ORM невероятно мощная, неизбежная и предназначена для адресации бесконечных строк бесконечных связанных таблиц - автоматические обратные вызовы, автоматическая передача данных, генерация запросов и т. д. Базовая глубина многомерных массивов зависит в вашем методе поиска, как только вы работаете с более чем одним $Post с несколькими связанными моделями (например), вы вводите массивы в микс, и этого просто невозможно избежать.
Различные методы find
возвращают массивы разной глубины. Из сгенерированного по умолчанию кода контроллера вы можете видеть, что индекс использует $this->set('posts', $this->paginate());
- просмотр использует $this->set('post', $this->Post->read(null, $id));
, а редактирование вообще не использует $this->set
с поиском записи - он назначает $this->data = $this->Post->read(null, $id);
.
FWIW, Set::map
, вероятно, выдает эти undefined index
ошибки, потому что (предполагаю) вы пытаетесь сопоставить действие редактирования, amirite? По умолчанию действия по редактированию используют только $this->set
для установки связанных результатов поиска модели в представление. Вместо этого результат $this->read отправляется на $this->data
. Вероятно, поэтому Set::map не работает. В любом случае, вы все равно будете стремиться к $Post[0]->id
или $Post->id
(в зависимости от того, какой метод вы использовали), что не является большим улучшением.
Вот несколько общих примеров глубины свойства Set::map() для этих действий:
// In posts/index.ctp
$Post = Set::map($posts);
debug($Post);
debug($Post[0]->id);
// In posts/edit/1
debug($this-viewVars);
debug($this->data);
// In posts/view/1
debug($this-viewVars);
$Post = Set::map($post);
debug($Post->id);
http://api13.cakephp.org/class/controller#method-Controllerset
http://api13.cakephp.org/class/model#method-Modelread
http://api13.cakephp.org/class/model#method-ModelsaveAll
ХТН.
person
OpenSorceress
schedule
12.11.2011