Вывод внешних шаблонов, в диалоговых окнах .

Использование функции render или renderInternal?

#1 13 сентября 2014 в 10:48
Вопрос непростой., больше к разработчикам ICMS 2!
Уважаемый R2! Присутствует ошибка при использовании renderInternal или я неправильно делаю?
Подскажите пожалуйста, очень нуждаюсь в подсказке.

Как вывести шаблон контроллера в диалоговом окте API редактора tinymce ?
Вернее сказать, я вывожу без проблем, но немного неправильно, там есть чуток лишнего, ссылки- шапка — футер.
В редакторе tinymce, в файле плагина создаю с помощью API окно и обращаюсь к контроллеру icms, контроллер выводит шаблон (cmsTemplate::getInstance()->render)

Метод cmsTemplate::getInstance()->renderInternal() выводит всю страницу! Что очень печально.
Напоминает при AJAX выход по return() ане exit().
Я так понимаю что в системе есть метод cmsTemplate::getInstance()->renderInternal()
для вывода только шаблона контроллера или шаблона вызванного.отдача шаблона при ajax запросах.
Но проверить невозможно не работает..
  1. Вызов из контроллера
  2. cmsTemplate::getInstance()->renderInternal('rfm','dialog', array(
  3. 'data1' => $data1,
  4. 'data2' => $data2
  5. )) ;
  1. //Входные параметры $controller='rfm',$tpl_file='dialog',$data=array('data1'=>$data1,'data2'=>$data2)
  2.  
  3. public function renderInternal($controller, $tpl_file, $data=array()){
  4. //старт debug
  5. $this->setContext($controller);
  6. //стоп debug
  7. $result = $this->render($tpl_file, $data, new cmsRequest(array(), cmsRequest::CTX_INTERNAL));
  8. $this->restoreContext($result);
  9. return $result;
  10.  
  11. }
Сдесь при вызова $this->setContext($controller);
определили текущий контроллер $this->controller = 'rfm'
И все… далее проблема.
Следующий шаг приводит к ошибке системы в renderInternal
// вызов $result = $this->render($tpl_file, $data, new cmsRequest(array(), cmsRequest::CTX_INTERNAL));
//он вызывает функцию getStylesFileName где и теряется имя контроллера.

$this->controller=NULL
$this->controller->name=NULL

И ошибки отсутствия обьекта контроллера
  1.  
  2. Notice: Trying to get property of non-object in C:\usr\domains\instantcms.rfm.3\system\core\template.php on line 832
  3.  
  4. Notice: Trying to get property of non-object in C:\usr\domains\instantcms.rfm.3\system\core\template.php on line 906
Принудительно указав $this->controller='имя контроллера" первая ошибка проходит.
Кто подскажет, я правильно двигаюсь в этом направлении, вывести только нужный мне шаблон- через функцию renderInternal, или есть другие методы системы.

Кому интересно!
Собственно… файловый менеджер как контроллер icms 2 почти готов, и вызывается и работает, и через адресную строку и через редактор tinymce, только в этом и проблема, вывести только шаблон в окне без оболочки системы.Остается использовать функции сессий ядра, и распределение прав пользователей.И будет счастье.

PS//От горе мне, от больной головы. Прочитаю свой вопрос и волосы дыбом.!!!
#2 13 сентября 2014 в 17:50

Как вывести шаблон контроллера в диалоговом окте API редактора tinymce ?

oll
Через
  1. $template->renderPlain('шаблон', array('параметры'));
ещё не пробовали?
#3 13 сентября 2014 в 19:00
То что надо!!! Спасибо!!
Неважно что $this->addJS $this->addCSS не работают надо стили и js скрипты как обычно в html странице подключать.
  1. <link href="/templates/default/controllers/**/css/*****.css" rel="stylesheet" type="text/css" />
  2. <script type="text/javascript" src="/templates/default/controllers/***/js/***.js"></script>

Но при таком подходе
  1.  
  2. public function renderPlain($tpl_file, $data=array()){
  3. $tpl_file = $this->getTemplateFileName('controllers/'.$this->controller->name.'/'.$tpl_file);
  4.  
  5.  
  6. extract($data); include($tpl_file);
  7.  
  8. $html = ob_get_clean();
  9.  
  10. echo $html;
  11.  
  12. $this->controller->halt();
  13.  
  14. }
  15.  
нет загрузки документа как таковой!
$(document).ready(function(){ во всех js ошибка
.
  1. Uncaught TypeError: undefined is not a function bootstrap.min.js:6
  2. Uncaught TypeError: Cannot read property 'fn' of undefined bootstrap-lightbox.min.js:1
  3. Uncaught ReferenceError: jQuery is not defined jquery.touchSwipe.min.js:1
  4. Uncaught TypeError: Cannot read property 'fn' of undefined bootstrap-modal.min.js:1
  5. Uncaught ReferenceError: jQuery is not defined bootstrap-modalmanager.min.js:1
  6. Uncaught TypeError: Cannot read property 'fn' of undefined jquery.jplayer.min.js:14
  7. Uncaught ReferenceError: jQuery is not defined jquery.ui.position.min.js:1
  8. Uncaught ReferenceError: jQuery is not defined jquery-ui.js:6
  9. Uncaught ReferenceError: jQuery is not defined jquery.contextMenu.min.js:1
  10. Uncaught ReferenceError: jQuery is not defined jquery.lazyload.js:242
  11. Uncaught ReferenceError: $ is not defined
Получается что просто показали буфер и все.Для страниц без js вполне даже нормально. А со скриптами немного не то!
Сразу появилось желание выкинуть все!
#4 13 сентября 2014 в 19:26
У меня в pdf-читалке скрипты работают, без проблем. Возможно, с путями к файлам что-то не так?
#5 13 сентября 2014 в 20:17

cmsTemplate::getInstance()->renderInternal()

oll
Этот метод делает не то, что вы подумали.
Он идентичен простому render(), но применяется тогда, когда нужно временно переключить контекст (контроллер).
Например. Компонент content выводит страницу записи (скажем статьи) через render(). И в шаблоне записи $this->controller ссылается на content. Но нам надо вывести еще и комментарии в этом же шаблоне, с помощью компонента comments. Если внутри comments тоже делать render(), то и в шаблоне комментариев $this->controller будет указывать на content, что неправильно. Поэтому в comments делается renderInternal(), который временно переключает контекст ($this->controller) шаблона на comments, а после рендера возвращает предыдущий — content.

То есть, renderInternal() используется в тех экшенах, которые не предполагают прямого вызова (через URL), а могут быть вызваны только другими контроллерами. Это, как бы, экшены для "внутреннего потребления", поэтому и метод называется renderInternal

Для ajax-запросов вы должны использовать метод render(), который должен корректно работать, т.к. он автоматически определяет что запрос пришел асинхронно и делает exit после вывода шаблона (не дожидаясь рендера основного макета, с шапкой и футером). Если у вас какая-то более сложная система, чем прямой запрос-ответ, то после render() в контроллере вы можете сами сделать $this->halt() чтобы прекратить выполнение скрипта дальше. Тогда все будет нормально.

this->addJS $this->addCSS не работают

oll
Правильно, ведь шапка (c <head>) не рендерится при ajax-запросе, значит и теги <script> вставлять некуда. Они вставляются прямо в тело вашего шаблона.

нет загрузки документа как таковой!
$(document).ready(function(){ во всех js ошибка

oll
Проверка на ready в данном случае не требуется. Вы просто в конец своего шаблона можете вставить
  1. <script> ...делаем что надо на js... </script>
и все будет работать нормально
#6 13 сентября 2014 в 20:32
Спасибо R2! Я поняла что проверку на ready не надо делать.
Loadырь! Да Ваши скрипты работают у них нет проверки загрузки документа!
Kонтроллер вызываю через API Tinymce так
  1.  
  2. win = editor.windowManager.open({
  3. title: title,
  4. file: editor.settings.external_filemanager_path+'dialog?type=4&descending='+descending+sort_by+fldr+crossdomain+'&lang='+editor.settings.language+'&akey='+akey,
  5. width: 800,
  6. height: 600,
  7. inline: 1,
  8. resizable: true,
  9. maximizable: true
  10. });
Видимо Ajax не используется. Я Api редактора только пару дней изучаю!
Спасибо за подсказки,,, Работаю дальше!
#7 14 сентября 2014 в 01:17

Работаю дальше!

oll
Бог в помошь!
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.