Smarty+Ajax
Есть сайт на основе smarty, по ключю GET в основное тело сайта <div id="content> выводится определенная страница из шаблона.
тоесть
index.tpl в котором прописано
{include file="$main_content"}
</div>
в index.php прописано
{
$smarty->assign("page_text", "trampampam");
$smarty->assign("main_content", "page.tpl");
}
в page.tpl
так вот, как с помошью аякса сделать вывод скомпилированного содержимого page.tpl в тело <div id="content"> основной страницы?
Как вывести ответ аякса в определенный див я знаю, а вот как вывести целую страницу smarty без перезагрузки я не понимаю...
2. Вывести: document.getElementById("content").innerHTML= ajax.responseText //где ajax - имя объекта ajax-запроса.
?. ????????
?+1. PROFIT!!!
Какие-то противоречащие параграфы. Сами хотите вывести в див, и сказали, что знаете как, и тут же говорите, что не знаете.
Какая разница между smarty-страницей и ajax-ответом? Для браузера абсолютно параллельно - он получает только текст, а что это - его не колышит.
Какая разница между smarty-страницей и ajax-ответом? Для браузера абсолютно параллельно - он получает только текст, а что это - его не колышит.
Я просто не правильно выразился...
нет, я знаю как отправить запрос и получить ответ
потом этот ответ занести в любой объект это не проблема.
Но, тут то не просто ответ в виде данных или json массива, тут целая страница с html разметкой, шаблон в котором нужно проставить все переменные и после этого вывести...
У меня smarty возвращает массив отверов, допустим список названия новостей и коды каждой новости.
а в шаблоне написано
{sectoin name=i loop=$news}
<tr>
<td><a href="index.php?news={$news.id}">{$news.name}</a></td>
</tr>
{/section}
</table>
я просто цепляю шаблон, смарти его выводит, а как это сделать аяксом без перезагрузки я не понимаю...
2. Вывести: document.getElementById("content").innerHTML= ajax.responseText //где ajax - имя объекта ajax-запроса.
?. ????????
?+1. PROFIT!!!
тоесть мне нужно:
1. Получить результат page.php
2. Отправить эти данные в backend.php с пометкой "pages"
3. В backend.php открыть шаблон, расставить значения по html объектам и то что получится отправить респонзом обратно после чего этот респонз вставлять в див=контент?
так получается?
а зачем getElement? можно же $('#element') ?
берешь пишеш скрипт который тебе будет формировать подсекции страницы например page1.php, page2.php пишешь подключаеш смарти... и т.д. и т.п.
Тебе необходимо что бы по запросу /page1.php тебе в браузер выдалась полностью отрендераная часть страницы.
Теперь когда ты обратишся ажаксом к /page1.php тебе в ответ прийде HTML, который ты просто вставиш куда надо..
надеюсь я тя правильно понял и нормлаьно выразился
Тебе необходимо что бы по запросу /page1.php тебе в браузер выдалась полностью отрендераная часть страницы.
да, по запросу /page1.php, page1.php открывает шаблон page1.tpl, расставляет все значения и выплевывает пользователю скомпилиную страничку.
Теперь когда ты обратишся ажаксом к /page1.php тебе в ответ прийде HTML, который ты просто вставиш куда надо..
да, page1.php должен открыть шаблон page1.tpl расставить все значения и да, выдать мне готовый html кусок кода.
тут еще момент всплыл:
смарти зараза компилирует из шаблона php страницу и кидает ее в кэш папку. Выглядит это как
/smatycach/kajghad87146781_page1.php
и когда мы вводим http://site.ru/page1.php то он нам подсовывает ранее скомпилированный
/smatycach/kajghad87146781_page1.php
или если мы на эту страницу не заходили раньше, то компилирует и подсовывает...
получается если решить вопрос:
отправил запрос в page1.php получил ответ в виде html, выдать в div=contect
то как решить вопрос с кэшем? Будем компилировать каждый раз?
ну да он кеширует и выдает пото с кеша, что тут плохого?
1. Получить результат page.php
2. Отправить эти данные в backend.php с пометкой "pages"
3. В backend.php открыть шаблон, расставить значения по html объектам и то что получится отправить респонзом обратно после чего этот респонз вставлять в див=контент?
так получается?
а зачем getElement? можно же $('#element') ?
1. Затем, что не все пионеры используют поделки типа jQuery.
2. Не нужно зыбывать, что innerHTML не работает, если туда передавать строки с фразами <script> </script>...
3. Аяксу безразлично, как много ХТМЛа вы в него передадите... Какие структуры и т.д. хоть всю страницу.
Единственное чего я пока не знаю, это перестраивает ли браузер ДОМ, когда в иннер передаются дивы и т.п.
ну да он кеширует и выдает пото с кеша, что тут плохого?
это хорошо!
Я не понимаю реализации связки smarty+ajax, смарти компилирует своими средствами страницу, и своими же средствами ее выводит из кэша,
а ajax просто отправляет вопрос page1.php и получает ответ. Тоесть ему фактически смарти то и не нужен?
я сам короче запутался...
2. Не нужно зыбывать, что innerHTML не работает, если туда передавать строки с фразами <script> </script>...
3. Аяксу безразлично, как много ХТМЛа вы в него передадите... Какие структуры и т.д. хоть всю страницу.
Единственное чего я пока не знаю, это перестраивает ли браузер ДОМ, когда в иннер передаются дивы и т.п.
понял, спасибо, учту!
Я не понимаю реализации связки smarty+ajax, смарти компилирует своими средствами страницу, и своими же средствами ее выводит из кэша,
а ajax просто отправляет вопрос page1.php и получает ответ. Тоесть ему фактически смарти то и не нужен?
я сам короче запутался...
как не нужен? Смарти формирует ХТМЛ ответ в нужном виде..
есть запрос http://site.ru/index.php?html=page
в index.php
$smarty->display("index.tpl.html");
в index.tpl.html
{include file="$main_content"}
</div>
в page.php
{
$smarty->assign("page_text", "trampampam");
$smarty->assign("main_content", "page.tpl.html");
}
page.tpl.html
общий итог
<span>trampampam</span>
</div>
вот.
Мне нужно, в index.tpl.html добавить ссылку с onclick=doajax
ajax отправляет в index.php POST "html=page"
index.php увидел пост и...
вот тут я сдулся.
Если хотите вписать в шабло не через tpl, а через js, то два способа:
1) innerHTML
2) document.createElement(...), append к какому-либо тегу
[COLOR="Silver"]Если честно, то объяснять вы нифига не умеете. Всю тему вы что-то объясняете, только я так нифига и не понял, че надо. То сначала в див результат засунуть не можете, теперь вообще надо ссылку в шаблон вставить. Бред какой-то.[/COLOR]
2all Я вообще не пойму о чём тут речь) smarty это php шаблонизатор, который позволяет отделить логику от вида. AJAX же просто забирает данные с сервера, те же самые, которые видит браузер и ничего не знает о смарти... Для него это просто html (xml, plain text etc...). О чём речь то?) Может лучше о курицах с лампами поговорим, у них и то общего больше :)
Забудьте про смарти вас не должно волновать смарти, там или не смарти... Зенд, Симфони или вобще ничего....
Главное - вы шлете запрос, сервак обрабатывает, формируется ХТМЛ старница и отсылается назад. Кто формирует, как формуриет - не важно. Главное что бы скрипт правильно обработал, то что надо
В index.php вы вызываете include смартовский, вот он уже и распарсивает вам тпльку, подставляет переменные и т.д и т.п. итог - в респонсе нужная страница.
Как вы обратились к странице, аджаксом, не аджаксом - пофигу.
это прототайп:
method:'post',
parameters: {html:'page'}
onSuccess: function(transport){
$('content').innerHTML = transport.responseText;
}
})
вот и весь вызов. теперь вам надо чтобы index.php при пост запросе и с параметром вернул, то что выв вставляете. в отрендереном виде.
Смарти распарсивает, а мне что делать, если у меня шаблон заточен под смарти? по запросу аякса самому распарсивать шаблон и выплевывать html текст? Я как только дохожу до элементов типа {section} {if} все, пипец, я вообще не понимаю как их сделать аяксом...
брать шаблон, удалять оттуда все элементы {смарти} и заменять аппендами и иннерами?
PS Не надо скайпа, учись задавать вопросы письменно ))
всё просто, SibBear: смарти твой работает на сервере, а AJAX на клиенте. Сделай AJAX-запрос к скрипту, который подключает смарти и выдаёт тебе HTML, и результат пихни в div. Всё.
Делаешь запрос, и что происходит на сервере (php-script):
1. подключили смарти
2. нашли данные, нужные в шаблоне.
3. запихали в шаблон
4. скомпилили шаблон
5. отдали всё стороне, которая всё запросила
6. ВСЁ, на этом твой смарти с пехапе и всем прочим работать закончил. контент ушел в твой AJAX-запрос как response
далее, ты получаешь респонс уже на страничке, откуда ты отправил запрос =)))) и пихаешь респонс в див (кстати, открою секрет всего мэджика, теперь твой респонс содержит "распарсенный smarty шаблон в виде готовой html страницы." (с) ;) )
Скайпов и прочего не надо.
Лучше прочитай про AJAX :) что такое и с чем едят (но его не едят, раньше средство такое чистящее было), как и сказали тут выше. Без понимания не получится.
или у тебя проблема что получаешь шаблон?
или ты не пробывал даже?
Забудь ты вообще про Смарти... Научись для начала выводить AJAX'ом "Hello world!" на странице. Когда поймешь что передается, что отправляется - начинай читать что такое смарти и как оно работает (и вообще, смарти - ужасный тормознутый костыль).
И только когда ты поймешь как работают в отдельности Аякс и Смарти - только тогда ты решишь свой вопрос...
_http://xmlhttprequest.ru
Начинай отсюда... И забудь про свои jQuery и прочую срань...
Тебя в первом классе что учили, звёздочки обводить или интегральные уравнения решать? Начинай с простого.
Хотя, если память не изменяет по Вашим сообщениям по форуму, то Вы больше любите велосипеды писать.
Все, я разобрался, $smarty->display('мой шаблон') разбирает шаблон.
Структура сайта хитрая просто - слона не заметил.
У меня $smarty->display('index.tpl') сделано,
в index.tpl инклудятся все остальные шаблоны.
а то, что если сделать не index, а любой шаблон, тогда он отдаст только содержимое шаблона я не понимал...
Делаешь запрос, и что происходит на сервере (php-script):
1. подключили смарти
2. нашли данные, нужные в шаблоне.
3. запихали в шаблон
4. скомпилили шаблон
5. отдали всё стороне, которая всё запросила
Загвозка состояла в 5м пункте, теперь разобрался. Спасибо!
Всем спасибо, вопрос закрыт.
А почему вы считаете что Смарти это костыль???
А почему вы считаете что Смарти это костыль???
Холисрач в отдельную, тем пожалуйста или личку
А почему вы считаете что Смарти это костыль???
А потому, у него действительно есть недостатки, но как шаблонизатор в моем случае - это оптимальный вариант. Он удобен верстальщикам, которые, как показывает практика вообще не в зуб ногой...
но это другая тема...
Вероятно в ближайшее время я пересмотрю своё отношение к jQuery и Прототипу. Некоторые js вещи у них реализованы очень гуд... А вот смарти... ИМХО нужен только если ты пишешь движок типа ДЛЕ которые будешь ставить на кучи сайтов.
Предлагать альтернативы не буду... Хотя, по JS - есть маленькие библиотечки которые выполняют вполне конкретные функции.
И вообще, любой уважающий себя программист должен знать основы языка. А не как мартышка - взял библиотеку, посмотрел на неё и на форму - "Ааа! Не работает! Научите!" и т.д.
2 patison:
Выше написал...
Ибо со смарти - это как в анекдоте:
Хороший программист за 3 часа напишет программу, которая за 5 секунд сделат то, на что пользователяю потребуется 5 минут.
Громоздкость библиотеки не проблема, т.к. в проектах надо указывать путь не к jquery.js на своем сайте, а к файлу, хранимому на гугле (офиц.разработчики там размещают). Итого - получаем ещё и кэширование и меньшее качание трафика.
По крайней мере в объемах работ моих проектов - если бы я все писал ручками - я бы уже повесился, т.к. обработки кучи событий ввода, drag-drop-ные окошечки и прочие визуальные красоты руками пишутся очень долго, объем когда гигантский, возможность протестировать и отвечать за корректность работы на разных браузерах - минимальна.
Посчет Smarty - а вы с ней поработайте, ага. Только уже с третьей версией, т.к. во второй действительно были ошибки и некоторые неразумные поведения.
Я не сторонник писать в коде а-ля <?="ololo";?> <?php echo($k); ?> <?php for... ;?>
Как раз Smarty позволяет хотя бы верстальщику не смотреть на быдлокод разработчика бэкенда (в данном случае данных для вставки в шаблон). А лучше посмотрите примеры модулей для джумлы, ворд-пресса или друпала. Там без валерьянки и бутылки водки в шаблонах сразу и не разобраться, т.к. чтобы понять, как работает такая-то функция и что она возвращает в шаблоне - прийдется перерыть полкода модуля (в лучшем случае). А если писал ещё и быдлокодер (что гарантированно в 95% в джумле), то прийдется перерыть вообще весь код модуля и не попасть при этом в психушку.
Шаблонизатор (любой) позволяет отделить логику от представления - в этом смарти прекрасно справляется. С его использование не появляется проблем, описанных выше.
Главное, надо в самом шаблоне описать, какие переменные входят, после чего дизайнеру легко будет работать. Я сам принял привычку писать сначала бэкенд, потом фронтенд. Я себе лишь в комментах tpl-а пишу описание входных переменных и как с ними работать. Всё. Меня больше не колышит, как там работает генератор этих данных. Спустя три-четыре недели у меня нет обычно желания опять вспоминать весь код, чтобы отредактировать дизайн. Шаблонизатор сокращает время вхождения в код.
А что делать, если указанные вами переменные или ещё какая-либо операция в чистого php в шаблоне вызвала ошибку? или произошло пересечение имен переменных? Прямо в шаблоне писать catch(Exception), if( ... == null) и т.д.? Это ещё больше говнокодит. А если у вас ещё и неймспейсы юзаются - так это вообще ппц что будет в шаблоне творится.
И ещё - чтобы понять настоящую прелесть таких фреймворков и библиотек - надо писать и дорабатывать большие проекты, в которых предполагается больше 10к кода, более 15-30 грамотных таблиц.
И дело даже не в том, что использование библиотек вводит некое замедление работы сайта (для многих это критично). Дело в том, что возможность обработки ошибок и скорость разработки/доработки очень сильно выростает, а количество ошибок падает.
Топикстартеру советуют научиться излагать мысли. Не сочтите за грубость, но ни один ваш пост даже близко не намекнул на то, что вам надо использовать display. Уж ни один человек даже не подумал в эту сторону.
2 patison:
Выше написал...
Ибо со смарти - это как в анекдоте:
Хороший программист за 3 часа напишет программу, которая за 5 секунд сделат то, на что пользователяю потребуется 5 минут.
Ну и бред вы пишите, товарищь...
Не знаю как у вас, а у меня на натяжку шаблонов смарти уходит немного времени. И потом, если нужно что-то менять в шаблоне (в выводе данных), я не роюсь в каше из html, css и php в одном файле. потому что на большом проекте, без использования шаблонизатора, внесение даже мелких исправлений будет отнимать критически много времени.
А скажите, вы считаете костылём сам смарти, или шаблонизаторы вцелом?
UAS: +1
PS Вообще MVC форева и точка ))
1) вомзожность использования $User->getComments()->get(...). Вообщем, теперь можно использовать сколь угодно ->, до этого в подобном коде ошибка вываливалась.
2) Исключения
3) {literal} для JS-участков теперь не надо - он сам различает где html, где js-блок.
4) Наследование шаблонов
05/10 - 3.0 RC4 Release на оф. сайте. (пока правда не проверял)
Штука полезная, но ИМХО использовать её стоит когда над одним проектом работает несколько человек.
Smarty же использовать в небольших проектах\сайтах с высокой нагрузкой считаю излишним, т.к. сам смарти, компиляция шаблонов, проверка соответствия шаблонов и т.д. - это лишняя нагрузка на сервер. Особенно если ваш сайт висит на виртуалхосте...
Исходя из здравого смысла, работа с шаблонами (привет Смарти) нужна тогда, когда нужно иметь возможность эти шаблоны быстро менять\предоставлять пользователю выбор шаблона и т.п., когда вы пишете движок, которой хотите раздавать\ставить на разные ресурсы...
А в остальном... не вижу смысла в его использовании...
С другой стороны - так мощный и популярный движок как Вордпресс смарти не использует. почему?
=========
Это была лирика...
По сабжу, я настаиваю на том, что вам нужно понять как работает АЯКС и в первую очередь (судя по дополнениям топикстартера) разобаться как работает смарти и вывод.
Штука полезная, но ИМХО использовать её стоит когда над одним проектом работает несколько человек.
Использовать эту штуку надо всегда по той простой причине, что схема "и жрец, и жнец, и на дуде игрец" в программировании выдает не очень качественные результаты. Программист не должен заниматься дизайном. А дизайнер не должен втыкать в серверный код. MVC эту проблему решает на раз.
А это мерить надо. Если хостинг говно, то смарти там особой погоды вряд ли сделает.
Имхо писать, предусматривая расширяемость - тру вей. Причем всегда. Даже когда кажется, что никогда это не пригодится в будущем.
Вордпресс - плохо показательный пример. Его внутренняя архитектура ужасна.
>>Имхо писать, предусматривая расширяемость - тру вей.
Не согласен)) Писать нужно только то, что нужно ))
>>С другой стороны - так мощный и популярный движок как Вордпресс смарти не использует. почему?
Меня один раз попросили что-то там подправить... Я понял, что на психиатора больше потом потрачу)
>>Штука полезная, но ИМХО использовать её стоит когда над одним проектом работает несколько человек.
Я долгое время был одиночкой, но всё же использовал)) Согласен, что для hello world он не упёрся, но когда ты пишешь что-то и не хочешь потом забить на это, то нужно разделать на "рыбу и мясо". Я долго пробывал различные подходы, наблюдал за другими людьми, спрашивал с какими трудностями они сталкиваются... Чаще всего проблемы возникали "в каше" если там больше 2ух страниц. Есть один мой старый проект (Первенец :)) http://audiobazar.ru/ (не сочтите за рекламу), так вот, там каша) Когда меня просили сделать что-то похожее, я просто менял картинки, т.к. даже вёрстку потом поменять не мог. Есть другой пример http://respect-ipoteka.ru/, там использовался гибридный подход (скажем было VC )), изменения стало вносить проще. Когда пересел на "чистое MVC" и начал с ним ставить различные эксперименты (использовал современный подход и smalltalk), то жизнь реально стала проще.
Теперь давайте попробуем потролить вот это (тут в меня должны лететь гнилые помидоры:) ):
>>Smarty же использовать в небольших проектах\сайтах с высокой нагрузкой считаю излишним, т.к. сам смарти, компиляция шаблонов, проверка соответствия шаблонов и т.д. - это лишняя нагрузка на сервер.
Кто меня знает, тот скажет, что я всеми руками и ногами за оптимизацию кода (это прикольно.. наверное самое интересное в программирование), но есть но... Сейчас время не вылизанного кода, а денег. Если сайт будет работать на 100р медленней (за хостинг будут больше платить), а там нужно делать (даже косметическое изменение) хотя бы раз в месяц и тебе за это платить, угадай, что будет для руководства предпочтительней, платить тебе за 2 часа работы или за 10 мин? Ещё если ты спрыгнешь с проекта, то поддерживать шалбон проще будет другому.
PS. Уфф.. выговорился))
PSS. Напомните мне утром перечитать это :)
>>Имхо писать, предусматривая расширяемость - тру вей.
Не согласен)) Писать нужно только то, что нужно ))
Да. Вопрос в том, как писать. Я за то, чтобы писать так, чтобы потом было легко что-либо дописать, расширить функционал, переделать. Такое у меня было не раз и не два, когда изначально продуманная архитектура того или иного решения впоследствие экономила мне время.
Йес!
Надо бы перечитать. Утро. :)