А зачем вообще нужна такая замечательный метод? Ужель нельзя просто microtime(true)?
public function getMicroTime() { return microtime(true); }
Да xPDO вообще крутая штука честно говоря :) поправлю:
$c = $modx->newQuery('modResource'); $c->innerJoin('modTemplateVar', 'tv1', "tv1.name='icon'"); $c->innerJoin('modTemplateVarResource', 'val1', "val1.contentid=modResource.id AND val1.tmplvarid = tv1.id AND val1.value='example-icon'"); $c->innerJoin('modTemplateVar', 'tv2', "tv2.name='isCosmos'"); $c->innerJoin('modTemplateVarResource', 'val2', "val2.contentid=modResource.id AND val2.tmplvarid = tv2.id AND val2.value='IS'");
$c = $modx->newQuery('modResource'); $c->innerJoin('modTemplateVarResource', 'tv', "tv.tmplvarid=modResource.id AND tv.tmplvarid = 1 AND tv.value='value1'"); $c->innerJoin('modTemplateVarResource', 'tv', "tv2.tmplvarid=modResource.id AND tv2.tmplvarid = 2 AND tv2.value='value2'");
Развивай далее запрос как хочется.
Да, в xPDO не получается формировать запросы с подзапросами (типа select… where col.value in (select… from )) и т.п., но тем не менее на большинство задач тривиальных его хватает вполне.
Возможно ли в смарти шабонах прервать отрабтку оног, как в сниппете die($res)? Объясню, что я хочу. Тем более, что пишу на половину, чтобы рассказать о удобном методе работы с ajax, пусть и не идеальном. Хотя все решаетцо наверняка очень просто и меня щас будут стыдить, что мало читал доки по смарти и т.д. ))) Есть старый добрый метод аджаксоделанья, когда на верх шаблона вставляешь сниппет
// если в заголовке XMLHttpRequest, как при ajax-запросах методом jquery, то работаем, нет - сниппет вырубаетцо. if ($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') {return;} // что-нибудь возвращаешь $res = 'Hello World!'; // прерываешь работу шаблона die($res);
Там в сниппете мы должны были отдать какой-то контент. А как мы получаем и отдаем контент в смарти-шаблонах? Ну получаем через $smarty.request/$smarty.post/$smarty.get соответствующим образом переданные параметры (или не принимаем), набиваем их в массив через assign, передаем в процессор и отображаем результат. И все это можно вынести в отдельный темплейт и отображать в шаблоне страницы как-то так {include file=«inc/shop/product.tpl»} Ну и как можно модернизировать сниппет выше в смарти-виде?
{if $smarty.server.HTTP_X_REQUESTED_WITH == 'XMLHttpRequest'} {include file="inc/shop/product.tpl"} {else} содержание шаблона. {/if}
Теперь отправляем нужные параметры на страницу $.ajax — и понеслось. И заменяем полученный результат на тот, что в нашем (это метод $.ajax)
success: function (data) { $('.ajax-block').replaceWith(data); }
Собственно прелесть в том, что за отображение на сайте и возвращения аджаксом отвечает один шаблон и любые изменения в первом автоматически же отражаются и во-втором. Конечно, кто-то возразит, что дергать конечный html это не тру и трафика много тратится. Но это просто ооочень удобный метод, который с шаблонами смарти становится намного удобнее. Конечно, в сниппете это тоже можно было имитировать, но выводом аджакса и отображением на сайте нужно было заниматься отдельно. Собственно в чем вопрос. В сниппете мы могли написать die($res); и отработка шаблона прекратилась, а нам бы вернулось то, что есть. В смарте же такое не канает? Шабоны в смарти наследуются, но такой блок, чтобы вверху было
{if $smarty.server.HTTP_X_REQUESTED_WITH == 'XMLHttpRequest'} {include file="inc/shop/product.tpl"} // от здесь бы прерывать отрисовку шаблона {else} содержание шаблона. {/if}
неудобно. Может быть можно как-то похожем образом прервать выполнение шабона, чтобы он остановился? А то приходится в главном layout.tpl писать if-else конструкцию. А это не очень хорошо и не очень удобно.
UPD Если для кому неудобно обертывать весь родительский лейаут в if, то можно сделать плагин на OnWebPageInit и условиями
if ($modx->event->name == 'OnWebPageInit' AND $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') { // Получаем ресурс if (!is_object($modx->resource)) { $modx->resource = $modx->request->getResource($modx->resourceMethod, $modx->resourceIdentifier); } ..........
Ну, и конечно + определяем id и прочие ваши проверки. Но это не так удобно т.к. невозможно переопрделить отдаваемое содержимое в зависимости от шаблона. Зато понимаш, без обертки if :)
Да все правильно :) фишка не в этом, если задача у нас будет — выбрать ресурсы у которых должны быть несколько TV полей определенного значения, а не ресурсы у которых имеется какая-то любая комбинация TV => Значение среди заданных в критерии.
Я знаю что у тебя есть понимание, просто на SQL перевожу дабы меня поняли лучше :)
Посмотри еще раз внимательно мой запрос:
$c = $modx->newQuery('modResource'); $c->leftJoin('modTemplateVarResource', 'TemplateVarResources'); $c->leftJoin('modTemplateVar', 'tv', "tv.id=TemplateVarResources.tmplvarid"); $c->where(array( array( "tv.name" => 'icon', "TemplateVarResources.value" => "example-icon", ), array( "OR:tv.name:=" => 'isCosmos', "TemplateVarResources.value" => "IS", ), ));
Там не AND:, там OR:. И формируется вот такой SQL-запрос:
SELECT modResource.* FROM `modx_site_content` AS `modResource` LEFT JOIN `modx_site_tmplvar_contentvalues` `TemplateVarResources` ON `modResource`.`id` = `TemplateVarResources`.`contentid` LEFT JOIN `modx_site_tmplvars` `tv` ON tv.id=TemplateVarResources.tmplvarid WHERE ( ( `tv`.`name` = 'icon' AND `TemplateVarResources`.`value` = 'example-icon' ) OR ( `tv`.`name` = 'isCosmos' AND `TemplateVarResources`.`value` = 'IS' ) )
Поверь, у меня есть понимание SQL-запросов :) Так что я знаю, что говорю.
Ой понял сори, я то полагался на пред-просмотр, а в нем криво отображается содержимое тега code).
Как я понял еще, мы друг друга сейчас вообще не понимаем) прям какой-то барьер) Механизм я понимаю, я знаю что xPDOQuery это абстракция SQL запроса — разница лишь в подходе(ООП) его организации, так-же как и xPDOObject представление объекта.
Когда я писал:
Через средства xPDO, твой вариант при использовании AND вообще ничего не вернет, т.к мы не можем ставить условие чтобы у 1 строчки tv_name был и 'name1' и 'name2' одновременно(AND), вот это и встало мне в горле когда уже открыл топик) в топике я указал мнимые UPD блоки в которых добавил наблюдения, решением послужил запрос:
я имел ввиду:
$c = $modx->newQuery('modResource'); $c->leftJoin('modTemplateVarResource', 'TemplateVarResources'); $c->leftJoin('modTemplateVar', 'tv', "tv.id=TemplateVarResources.tmplvarid"); $c->where(array( array( "tv.name" => 'icon', "TemplateVarResources.value" => "example-icon", ), array( "AND:tv.name:=" => 'isCosmos', "TemplateVarResources.value" => "IS", ), ));
что эквивалентно:
SELECT * FROM `modx_site_content` AS `resource` INNER JOIN `modx_site_tmplvar_contentvalues` AS `val` ON `val`.`contentid` = `resource`.`id` INNER JOIN `modx_site_tmplvars` AS `tv` ON `tv`.`id` = `val`.`tmplvarid` WHERE ( (tv.name = `icon` AND val.value = `example-icon`) AND (tv.name = `isCosmos` AND val.value = `IS`) )
То-есть когда нам нужны ресурсы у которых оба(или более) поля чему то равны, запрос всегда будет возвращать 0 строк, даже если и будут ресурсы с обоими TV параметрами в БД, проверь сам)
Делая такой запрос с OR, мы получим ресурсы в которых какое либо указанное TV поле соответствует критерии — ну все верно ведь оператор OR.
про подсветку кода — имел ввиду синтаксис.
Я понял. И как раз показал тебе как это делать. Ты прописываешь тег <pre>. Вот этого делать не нужно. Посмотри подсветку в моих комментах, и код без подсветки у себя в комменте. Найди 10 отличий. Лучше вставлять в тег <code> или пользоваться специальной кнопочкой.
Ты видимо недопонимаешь механизма xPDO. Сам xPDO ничего в базе данных не выбирает, у него нет какого-то собственного механизма прямого обращения к данным базы. xPDO формирует в итоге чистый SQL, и потом выполняет этот SQL-запрос к базе данных. Сделай так:
$c = $modx->newQuery('modResource'); $c->leftJoin('modTemplateVarResource', 'TemplateVarResources'); $c->leftJoin('modTemplateVar', 'tv', "tv.id=TemplateVarResources.tmplvarid"); $c->where(array( array( "tv.name" => 'icon', "TemplateVarResources.value" => "example-icon", ), array( "OR:tv.name:=" => 'isCosmos', "TemplateVarResources.value" => "IS", ), )); // Готовим SQL-запрос $c->prepare(); // Выводим этот SQL-запрос print $c->toSQL();
На выходе ты увидишь сформированный SQL. То есть что ты сам напишешь чистый SQL, что подготовишь его средствами xPDO — разницы никакой не будет. А какой результат будет возвращен, зависит уже от этого SQL-запроса, и не вежно сам ты его написал, или xPDO сформировал.
Николай привет и спасибо) Может на ты будем? Да с вариантом с OR условиями я конечно, что-то не до сообразил)
Но как быть если нам надо запросить по условиям по строже чем OR и поставить запрос c AND условиям по TV, такого типа
SELECT * FROM `обычная табла` WHERE `tv_name` = 'value' AND 'tv_name_2' = 'value_2'
Через средства xPDO, твой вариант при использовании AND вообще ничего не вернет, т.к мы не можем ставить условие чтобы у 1 строчки tv_name был и 'name1' и 'name2' одновременно(AND), вот это и встало мне в горле когда уже открыл топик) в топике я указал мнимые UPD блоки в которых добавил наблюдения, решением послужил запрос:
/** SQL ver 3 SUPPORT COMPLETE STATEMENTS ***/ SELECT * FROM `modx_site_content` AS `resource` WHERE ( ( `resource`.`id` IN ( SELECT `val`.`contentid` FROM `modx_site_tmplvars` AS `tv` INNER JOIN `modx_site_tmplvar_contentvalues` AS `val` ON `tv`.`id` = `val`.`tmplvarid` WHERE (tv.name = 'icon' AND val.value = 'example-icon') ) ) AND /** Условие */ ( `resource`.`id` IN ( SELECT `val`.`contentid` FROM `modx_site_tmplvars` AS `tv` INNER JOIN `modx_site_tmplvar_contentvalues` AS `val` ON `tv`.`id` = `val`.`tmplvarid` WHERE (tv.name = 'isCosmos' AND val.value = 'IS') ) ) ) /** Запрос если бы дополнительные поля были бы основными: SELECT * FROM `modx_site_content` AS `resource` WHERE `resource`.`icon` = 'example-icon' AND `resource`.`isCosmos` = 'IS' */
я догадывался что я велосипед замучу, просто IDE(pshtorm) обновлял, наткнулся на встроенный менеджер баз данных проекта, начал ковыряться и попутно вспомнил что такой механизм с Tv мне был нужен;), про подсветку кода — имел ввиду синтаксис.
Так то я в первый раз где либо топик написал)