Возможно ли использование Controller :: render () в Model :: afterSave () с CakePHP? - PullRequest
1 голос
/ 10 августа 2009

У меня есть некоторый пример кода, который я хотел бы реорганизовать, так как мне нужно, чтобы он работал после сохранения записи. В настоящее время он работает после первой визуализации записи (используя afterFilter). Он выполняет рендеринг нужного мне представления с макетом и сохраняет его в файл.

function afterFilter() {
    parent::afterFilter();
    if($this->params['pass'][0] == 'contact') {
        $surrenderOuput = $this->surrender($this->params['pass'][0]);
        $path = WWW_ROOT . 'cache' . DS . $this->params['pass'][0] . DS . 'index.html';
        $file = new File($path, true);
        $file->write($surrenderOuput);
        $file->close();
    }
}
function surrender($action = null, $layout = null, $file = null) {
    $this->beforeRender();

    $viewClass = $this->view;
    if ($this->view != 'View') {
        if (strpos($viewClass, '.') !== false) {
            list($plugin, $viewClass) = explode('.', $viewClass);
        }
        $viewClass = $viewClass . 'View';
        App::import('View', $this->view);
    }

    $this->Component->beforeRender($this);

    $this->params['models'] = $this->modelNames;

    if (Configure::read() > 2) {
        $this->set('cakeDebug', $this);
    }

    $View =& new $viewClass($this);

    if (!empty($this->modelNames)) {
        $models = array();
        foreach ($this->modelNames as $currentModel) {
            if (isset($this->$currentModel) && is_a($this->$currentModel, 'Model')) {
                $models[] = Inflector::underscore($currentModel);
            }
            $isValidModel = (
                isset($this->$currentModel) && is_a($this->$currentModel, 'Model') &&
                !empty($this->$currentModel->validationErrors)
            );
            if ($isValidModel) {
                $View->validationErrors[Inflector::camelize($currentModel)] =&
                    $this->$currentModel->validationErrors;
            }
        }
        $models = array_diff(ClassRegistry::keys(), $models);
        foreach ($models as $currentModel) {
            if (ClassRegistry::isKeySet($currentModel)) {
                $currentObject =& ClassRegistry::getObject($currentModel);
                if (is_a($currentObject, 'Model') && !empty($currentObject->validationErrors)) {
                    $View->validationErrors[Inflector::camelize($currentModel)] =&
                        $currentObject->validationErrors;
                }
            }
        }
    }

    $this->autoRender = false;
    $output = $View->render($action, $layout, $file);

    return $output;
}

Итак, я в основном отрисовываю представление с его макетом, возвращаю его как вывод и сохраняю его в файл. Отлично. Есть ли способ сделать что-то подобное в модели?

Ответы [ 2 ]

2 голосов
/ 11 августа 2009

Вы можете рассмотреть возможность установки переменной-члена в вашем afterSave () в модели и проверки этого значения в вашем afterFilter () в вашем контроллере.

0 голосов
/ 25 ноября 2014

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

Контроллер:

$this->Model->myFunc($this);

Модель

public function myFunc($object) {
 $object->render();
}

Надеюсь, это поможет кому-то, кто сталкивается с этой темой.

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