code: public function beforeSave(ezcQuery $query)
      {
          $query = parent::beforeSave($query);
  
          /*
           * Если это новая статья — вычисляем новый порядковый номер
           */
          if ($query instanceof ezcQueryInsert)
          {
              $q = $this->getTable()->createSelectQuery(false);
              $q->select('*');
              $e = $q->expr;
              $q->where($e->eq('section', $q->bindValue($this->section, null, PDO::PARAM_INT)));
              $q->orderBy('position', $q::DESC);
              /** @var self $max */
              $max = $this->getTable()->loadOneFromQuery($q);
              $query->set('position',
                  $query->bindValue($max->position + 1, ":position", PDO::PARAM_INT));
              /*
               * Обновляем краткое описание, если надо
               */
              if (!$this->preview)
              {
                  $this->createPreviewFromText();
                  /** @var ezcQueryInsert|ezcQueryUpdate $query */
                  $query->set('preview', $query->bindValue($this->preview, ':preview'));
              }
          }
  
          return $query;
      }
docs: Действия перед сохранением объекта в БД
  
  @param ezcQuery $query
  
  @return ezcQuery
  
  @since 3.01