| Erfahrener Benutzer
Registriert seit: 10.02.2009
Beiträge: 929
| Konkretes Beispiel:
(Bitte den Code entschuldigen, der ist schon etwas älter, daher Chaus pur, aber es geht nur um den Aufbau
Controller PHP-Code: $catArticleHelper = $this->_getHelper(); list($article, $category) = $catArticleHelper->assertArticleValidAndViewable($nodeId);
$article = $this->getArticleModel()->prepareArticle($article);
$perms = $this->getArticleModel()->getPermissionBasedArticleFetchConditions($category);
#$perms['article_not'] = $article['article_id']; $limit = array('limit' => 10); $otherArticles = $this->getArticleModel()->getArticlesFromAuthor($article['user_id'], $perms, $limit);
$canDelete = $this->getArticleModel()->canDeleteArticle($article); $params = array( 'nodeBreadCrumbs' => $this->getModelFromCache('XenForo_Model_Node')->getNodeBreadCrumbs($category, true), 'article' => $article, 'otherArticles' => $otherArticles, 'category' => $category, 'canDelete' => $canDelete, 'canLike' => $this->getArticleModel()->canLikeArticle($article, $category), 'author' => $this->getArticleModel()->getAuthor($article), 'attachments' => $article['attachments'],
);
model PHP-Code: <?php class Ragtek_AS_Model_Article extends XenForo_Model { const FETCH_USER = 0x01; const FETCH_CATEGORY = 0x02; const FETCH_AVATAR = 0x08; // TODO do we really need this?
public function canEditArticle($artice, array $nodePermissions = null, array $viewingUser = null) { $this->standardizeViewingUserReferenceForNode($artice['node_id'], $viewingUser, $nodePermissions);
if (!$viewingUser['user_id']) { return false; } // CAN EDIT ALL if ( XenForo_Permission::hasContentPermission($nodePermissions, 'canEditAll') OR ($artice['user_id'] == $viewingUser['user_id'] && XenForo_Permission::hasContentPermission($nodePermissions, 'canEditOwn') ) ) { return true; } return false; }
public function canDeleteArticle($artice, array $nodePermissions = null, array $viewingUser = null) { $this->standardizeViewingUserReferenceForNode($artice['node_id'], $viewingUser, $nodePermissions);
if (!$viewingUser['user_id']) { return false; }
if (XenForo_Permission::hasContentPermission($nodePermissions, 'canDeleteAll')) { return true; } else if ($artice['user_id'] == $viewingUser['user_id'] && XenForo_Permission::hasContentPermission($nodePermissions, 'canDeleteOwn')) { return true; } return false; }
public function getArticleFromId($articleId, array $fetchOptions = array()) { $joinOptions = $this->prepareArticleFetchOptions($fetchOptions); $query = ' SELECT article.* ' . $joinOptions['selectFields'] . ' FROM ragtek_article AS article ' . $joinOptions['joinTables'] . ' WHERE article.article_id = ? ';
$article = $this->_getDb()->fetchRow($query, $articleId); if ($article AND $article['attach_count'] > 0) { $article['attachments'] = $this->getArticleAttachments($articleId); } return $article; }
public function getArticles(array $conditions = array(), array $fetchOptions = array()) { $whereConditions = $this->prepareArticleConditions($conditions, $fetchOptions);
$sqlClauses = $this->prepareArticleFetchOptions($fetchOptions); $limitOptions = $this->prepareLimitFetchOptions($fetchOptions);
$query = ' SELECT article.* ' . $sqlClauses['selectFields'] . ' FROM ragtek_article AS article ' . $sqlClauses['joinTables'] . ' WHERE ' . $whereConditions . ' ' . $sqlClauses['orderClause'];
return $this->fetchAllKeyed($this->limitQueryResults( $query, $limitOptions['limit'], $limitOptions['offset'] ), 'article_id'); }
public function getPermissionBasedArticleFetchConditions(array $category, array $nodePermissions = null, array $viewingUser = null) { $this->standardizeViewingUserReferenceForNode($category['node_id'], $viewingUser, $nodePermissions);
if (XenForo_Permission::hasContentPermission($nodePermissions, 'canModerate')) { $viewModerated = true; } else if ($viewingUser['user_id']) { $viewModerated = $viewingUser['user_id']; } else { $viewModerated = false; }
return array( 'deleted' => XenForo_Permission::hasContentPermission($nodePermissions, 'canSeeDeletedArticles'), 'moderated' => $viewModerated ); }
public function getArticlesFromCategory(array $category, array $fetchOptions = array()) { $conditions = $this->getPermissionBasedArticleFetchConditions($category); $conditions['node_id'] = $category['node_id']; return $this->getArticles($conditions, $fetchOptions);
}
public function prepareArticleFetchOptions(array $fetchOptions) { $selectFields = ''; $joinTables = ''; $orderBy = '';
if (!empty($fetchOptions['order'])) { $orderBySecondary = '';
switch ($fetchOptions['order']) { case 'title': case 'view_count': case 'position': $orderBy = 'article.' . $fetchOptions['order']; break; default: $orderBy = 'article.post_date'; } if (!isset($fetchOptions['orderDirection']) || $fetchOptions['orderDirection'] == 'desc') { $orderBy .= ' DESC'; } else { $orderBy .= ' ASC'; }
$orderBy .= $orderBySecondary; }
if (!empty($fetchOptions['join'])) {
if ($fetchOptions['join'] & self::FETCH_USER) {
$selectFields .= ', user.* '; $joinTables .= ' LEFT JOIN xf_user AS user ON (user.user_id = article.user_id)'; } else if ($fetchOptions['join'] & self::FETCH_AVATAR) { $selectFields .= ', user.avatar_date, user.gravatar'; $joinTables .= ' LEFT JOIN xf_user AS user ON (user.user_id = article.user_id)'; }
if ($fetchOptions['join'] & self::FETCH_CATEGORY) { $selectFields .= ', node.title AS node_title'; $joinTables .= ' INNER JOIN xf_node AS node ON (node.node_id = article.node_id)'; } }
if (!empty($fetchOptions['permissionCombinationId'])) { $selectFields .= ', permission.cache_value AS node_permission_cache'; $joinTables .= ' LEFT JOIN xf_permission_cache_content AS permission ON (permission.permission_combination_id = ' . $this->_getDb()->quote($fetchOptions['permissionCombinationId']) . ' AND permission.content_type = \'node\' AND permission.content_id = article.node_id)'; }
if (isset($fetchOptions['likeUserId'])) { if (empty($fetchOptions['likeUserId'])) { $selectFields .= ', 0 AS like_date'; } else { $selectFields .= ', liked_content.like_date'; $joinTables .= ' LEFT JOIN xf_liked_content AS liked_content ON (liked_content.content_type = \'' . Ragtek_AS_Constants::CONTENT_TYPE . '\' AND liked_content.content_id = article.article_id AND liked_content.like_user_id = ' .$this->_getDb()->quote($fetchOptions['likeUserId']) . ')'; } }
return array( 'selectFields' => $selectFields, 'joinTables' => $joinTables, 'orderClause' => ($orderBy ? "ORDER BY $orderBy" : '') ); }
public function prepareArticleConditions(array $conditions) { $sqlConditions = array(); $db = $this->_getDb();
if (!empty($conditions['node_id'])) { $sqlConditions[] = 'article.node_id = ' . $db->quote($conditions['node_id']); }
if (isset($conditions['user_id'])) { $sqlConditions[] = 'article.user_id = ' . $db->quote($conditions['user_id']); }
if (isset($conditions['deleted']) || isset($conditions['moderated'])) {
$sqlConditions[] = $this->prepareStateLimitFromConditions($conditions, 'article', 'status'); }
if (isset($conditions['article_not'])){ $sqlConditions[] = 'article.article_id != ' . $db->quote($conditions['article_not']);
}
return $this->getConditionsForClause($sqlConditions); }
public function getArticlesByIds($ids, array $fetchOptions = array()) { $sqlClauses = $this->prepareArticleFetchOptions($fetchOptions); $query = ' SELECT article.* ' . $sqlClauses['selectFields'] . ' FROM ragtek_article as article ' . $sqlClauses['joinTables'] . ' WHERE article.article_id IN (' . $this->_getDb()->quote($ids) . ')';
return $this->fetchAllKeyed($query, 'article_id'); }
public function prepareArticle(array &$article, $getAttachments = true) { if ($getAttachments) { if ($article['attach_count'] > 0) { $attachments = $this->getArticleAttachments($article['article_id']);
/** @var $attachModel XenForo_Model_Attachment */ $attachModel = $this->getModelFromCache('XenForo_Model_Attachment'); foreach ($attachments AS $attachment) { $article['attachments'][$attachment['attachment_id']] = $attachModel->prepareAttachment($attachment); } } else { $article['attachments'] = array(); } } if ($article['likes']){ $article['likeUsers'] = unserialize($article['like_users']); } $article['visible'] = $this->isVisible($article); $article['isModerated'] = $this->isModerated($article); $article['canEdit'] = $this->canEditArticle($article);
return $article; }
public function canViewArticle(array $article, &$errorPhraseKey = '', array $nodePermissions = null, array $viewingUser = null) { $this->standardizeViewingUserReferenceForNode($article['node_id'], $viewingUser, $nodePermissions);
if (!XenForo_Permission::hasContentPermission($nodePermissions, 'canView')) { return false; }
if ($this->isModerated($article)) { if (!XenForo_Permission::hasContentPermission($nodePermissions, 'canModerate')) { if (!$viewingUser['user_id'] || $viewingUser['user_id'] != $article['user_id']) { return false; } } } else if ($this->isDeleted($article)) { if (!XenForo_Permission::hasContentPermission($nodePermissions, 'canSeeDeletedArticles')) { return false; } } return true; }
public function isModerated(array $article) { return ($article['status'] == Ragtek_AS_Constants::ARTICLE_STATUS_MODERATE); }
public function isVisible(array $article) { return ($article['status'] == Ragtek_AS_Constants::ARTICLE_STATUS_OPEN); }
public function isDeleted(array $article){ return ($article['status'] == Ragtek_AS_Constants::ARTICLE_STATUS_DELETED); }
public function getAuthor(array $article) {
return array( 'user_id' => $article['user_id'], 'username' => $article['username']); }
public function getArticleAttachments($articleId) { /** @var $atModel XenForo_Model_Attachment */ $atModel = $this->getModelFromCache('XenForo_Model_Attachment'); return $atModel->getAttachmentsByContentId(Ragtek_AS_Constants::CONTENT_TYPE, $articleId); }
public function getArticlesFromAuthor($authorId, &$condition = array(), &$fetchOptions = array()){ $condition['user_id'] = $authorId; return $this->getArticles($condition, $fetchOptions); }
public function canLikeArticle(array $article,array $category, &$errorPhraseKey = '', array $nodePermissions = null, array $viewingUser = null) { $this->standardizeViewingUserReferenceForNode($article['node_id'], $viewingUser, $nodePermissions);
if (!$viewingUser['user_id']) { return false; }
if ($article['status'] != Ragtek_AS_Constants::ARTICLE_STATUS_OPEN) { return false; }
if ($article['user_id'] == $viewingUser['user_id']){ $errorPhraseKey = 'liking_own_content_cheating'; return false; } return XenForo_Permission::hasContentPermission($nodePermissions, 'like'); }
public function getArticleIdsInRange($start, $limit) { $db = $this->_getDb();
return $db->fetchCol($db->limit(' SELECT article_id FROM ragtek_article WHERE article_id > ? ORDER BY article_id ', $limit), $start); } } So, wie man hier sieht, wird die ArtikelId dem Model jedesmal mit übergeben, was ja auch per Property möglich wäre => $articlemodel = new Model($articleId); (und genau darum geht es mir^^) |