#php #silverstripe
#php #silverstripe
Вопрос:
Я разрабатываю простой модуль для обеспечения «мягкого» планирования страниц (Embargo amp; Expire, я знаю, что это также предусмотрено модулем workflow). Для этого я написал SiteTreeExtension, который добавляет Embargo amp; Expiration в качестве полей Datetimefields.
Я пытаюсь реализовать augmentSQL для этого, чтобы отфильтровать страницы, которые находятся под эмбарго / сроком действия. Но каждый раз, когда я добавляю дополнительное предложение ‘Where’ к методу augmentSQL, включающему поля Embargo или Expiration, поля ‘Embargo’ и ‘Expiration’ всех результирующих страниц отображаются неустановленными. Если я закомментирую строки ‘addWhere’, эти поля отлично загружают свои данные.
Как я могу добавить правильное предложение where, чтобы страницы, находящиеся под эмбарго / сроком действия, были исключены?
class EmbargoExpirySchedulerExtension extends SiteTreeExtension {
public static $db = array(
'Embargo' => 'SS_Datetime',
'Expiry' => 'SS_Datetime'
);
...
function augmentSQL(SQLQuery amp;$query) {
$myclass = $this->owner->className;
if (is_subclass_of(Controller::curr(), 'ContentController')) { // on frontend
$query
->addWhere(array(
// ( These lines seem to cause Embargo/Expiry to be unset/empty: )
""{$myclass}"."Embargo" IS NULL OR "{$myclass}"."Embargo" < NOW()",
""{$myclass}"."Expiry" IS NULL OR "{$myclass}"."Expiry" > NOW()",
));
}
}
}
Ответ №1:
Если вы применяете это расширение к, SiteTree
тогда ваши поля Embargo
и Expiry
будут добавлены в SiteTree
таблицу.
Вы вызываете {$myclass}.Embargo
и {$myclass}.Expiry
.
Если вы находитесь на странице типа HomePage
, это вызовет запрос HomePage.Embargo
и HomePage.Expiry
.
Embargo
и Expiry
не существуют в HomePage
таблице. Они существуют в SiteTree
таблице.
Вместо этого вы хотите запросить SiteTree.Embargo
и SiteTree.Expiry
.
Кроме того, в вашем запросе к таблицам и столбцам вместо использования экранированных двойных кавычек "
используйте обратные тики `
вместо этого:
->addWhere(array(
"`SiteTree`.`Embargo` IS NULL OR `SiteTree`.`Embargo` < NOW()",
"`SiteTree`.`Expiry` IS NULL OR `SiteTree`.`Expiry` > NOW()"
));
Обратные пометки делают код более аккуратным и будут добавляться _Live
или _versions
автоматически, когда это необходимо.
Комментарии:
1. Двойные кавычки используются для поддержки PostgreSQL, хотя, вероятно, здесь это не важно.