/** * Called by $this->load() to populate data into $this->persistent->rec_data * * Subclasses may override this method to tune load() behavior, e.g. * to load data lazily by field name passed in $field_or_db_row. * Subclasses overriding this should also call parent::doLoad() since the base class * uses it to load data from $this->m model. * * @param array $field_or_db_row see $this->load() * @throws waException */ protected function doLoad($field_or_db_row = null) { // load from array? if (is_array($field_or_db_row)) { $fields = $this->m->getMetadata(); $nulls = array_fill_keys(array_keys($fields), null); $this->persistent->setAll(array_intersect_key($field_or_db_row, $fields) + $nulls); return; } // requested field already loaded? if ($field_or_db_row) { // check if can be loaded from $this->m model if (!array_key_exists($field_or_db_row, $this->m->getMetadata())) { return; } } else { $loaded = true; foreach ($this->m->getMetadata() as $f => $v) { if (!$this->persistent->keyExists($f)) { $loaded = false; break; } } if ($loaded) { return; } } // load from model $row = $this->m->getById($this->id); if (!$row) { throw new waException('No record found in ' . $this->m->getTableName() . ' for id=' . $this->id, 404); } $this->persistent->setAll($row); }
protected function getSQL() { $sql = "SELECT " . $this->select . " FROM " . $this->model->getTableName(); if ($this->where) { $sql .= " WHERE (" . implode(") AND (", $this->where) . ")"; } if ($this->order) { $sql .= " ORDER BY " . $this->order; } if ($this->limit) { $sql .= " LIMIT " . $this->limit; } return $sql; }
/** * @param $url * @param waModel $context * @param int $length * @param string $field * @return string */ public static function genUniqueUrl($url, $context, &$counter = 0, $length = 512, $field = 'url') { $counter = 0; $url = preg_replace('/\\s+/', '-', $url); $url = shopHelper::transliterate($url); if (strlen($url) == 0) { $url = (time() << 24) + $counter++; } else { $url = mb_substr($url, 0, $length); } $url = mb_strtolower($url); $pattern = mb_substr($context->escape($url, 'like'), 0, $length - 3) . '%'; $sql = "SELECT `{$field}` FROM {$context->getTableName()} WHERE url LIKE '{$pattern}' ORDER BY LENGTH(`{$field}`)"; $alike = $context->query($sql)->fetchAll('url'); if (is_array($alike) && isset($alike[$url])) { $last = array_shift($alike); $counter = 1; do { $modifier = "-{$counter}"; $_length = mb_strlen($modifier); $url = mb_substr($last['url'], 0, $length - $_length) . $modifier; } while (isset($alike[$url]) && ++$counter < 100); if (isset($alike[$url])) { $short_uuid = (time() << 24) + $counter++; $_length = mb_strlen($short_uuid); $url = mb_substr($last['url'], 0, $length - $_length) . $short_uuid; } } return mb_strtolower($url); }