Создайте пользовательский блок HTML с помощью переполнения cakeStack

Я пытаюсь создать сайт с использованием cakephp (2.5) с некоторыми функциями CMS.
Итак, я хочу дать привилегированному веб-администратору изменить некоторые блоки на веб-страницах (не блоки тортов). Я застрял в создании этой функции в днях. Я объясню на примере ниже.

Пример — если несколько страниц имеют одно и то же изображение, и администратор хочет изменить его время от времени. так что мои файлы представления метода имеют такой сегмент кода.

<div id='image'>{{block_same_image}}</div>

Затем, перед рендерингом каждой страницы, я получаю html-содержимое страницы и ищу «ключ блокировки» ({{}} Block_same_image) используя регулярное выражение ({{block- [a-zA-Z0-9] *}})

Если найдено совпадение, посмотрите в таблицу «блок» базы данных и получите соответствующий контент для ключа блока и замените «ключ блока», как показано ниже.

 <div id='image'><img src='.....'></div>

После этого я хочу сделать HTML-контент для браузера.

Я также разработал модуль создания статических страниц для этого веб-сайта, чтобы администратор мог создавать HTML-страницы и сохранять их в базе данных. Если администратор захочет использовать вышеуказанное изображение на одной из этих страниц, то просто добавив {{block_same_image}} к содержимому страницы, вы получите тег изображения для этой страницы.

У меня есть 2 вопроса, связанных с этим сенарио.

  1. Как получить и прочитать html-контент перед его рендерингом (попробуйте просмотреть-> get (), но у меня не получилось)
  2. Можно ли использовать AppController а также appmodule сделать поиск и заменить функции. (Я пытаюсь применить этот метод к каждому представлению без изменения каждого контроллера и файла модели. Потому что теперь у меня более 60 действий)
    Я действительно застрял в этом. может кто-нибудь помочь ??

1

Решение

Вопрос 1

Видеть это Пьянящая нация сообщение. Вам нужно установить $this->autoRender в false и создать экземпляр View объект.

<?php
/* Make sure the controller doesn't auto render. */
$this->autoRender = false;

/* Set up new view that won't enter the ClassRegistry */
$view = new View($this, false);
$view->set('text', 'Hello World');
$view->viewPath = 'elements';

/* Grab output into variable without the view actually outputting! */
$view_output = $view->render('box');

Вопрос 2 -А

Вы можете написать произвольную функцию в вашем контроллере приложения, которая использует скоросшиватель & файл API с preg_replace.

<?php
App::uses('Controller', 'Controller');
App::uses('Folder', 'Utility');
App::uses('File', 'Utility');

class AppController extends Controller {

//Your logic

public function searchAndReplace(){

$ViewFile = new File('../View/Tests/sample.ctp');
$content = $ViewFile->read();
$content = preg_replace('/something/', 'something else', $content);
$ViewFile->write($content);

}

}

Вопрос 2-B (моя рекомендация)

Я бы порекомендовал использовать генерация кода с испечь для такого рода задач. Ты бы:

1) Скопируйте lib/Cake/Console/Templates/default папка для App/Console/Templates/[theme name] (Название темы может быть как угодно)

2) Измените или создайте свой шаблон представления с необходимыми изменениями.

3) Беги cake bake view all из командной строки, относительно вашего App каталог.

* Это решение может быть шагом назад, что позволит сделать два шага вперед.

0

Другие решения

Других решений пока нет …