SiteTreeExtension-> augmentSQL, похоже, вызывает пустые поля

#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, хотя, вероятно, здесь это не важно.