Refaktor kodu przy podziale sitemapy

0

Hej, zrobiłem podział sitemapy, lecz mam problem z powtarzalnym kodem i chciałbym uniknąć tworzenia dodatkowych funkcji, żeby tylko zmienić wartość offsetu przy robieniu query (pobieram artykuły po 2000).

public function index() {
        $this->layout = false;
        $sitemaps = [
            ['loc' => (APP . '\Config\Config')::getUrl() . '/sitemaps/articles0/sitemap.xml'],
            ['loc' => (APP . '\Config\Config')::getUrl() . '/sitemaps/articles1/sitemap.xml']
            
        ];

        $this->set('sitemaps', $sitemaps);
    }

public function articles0() {
        $this->loadModel('Article');
        
        $articles = $this->Article->query(
            'SELECT url, modified FROM articles WHERE site_id='
            . $this->siteId . " AND status='publish' AND (redirect_url is null OR redirect_url = '') AND landing_page_id is null AND calc_id = '0' LIMIT 2000"
        );
        
        foreach ($articles as $article) {
            $urls[] = [
                'loc' => (APPNAME . '\Config\Config')::getUrl() . '/-' . $article['url'],
                'lastmod' => date('Y-m-d\TH:i:s+00:00', strtotime($article['modified']))
            ];
        }
        
        $this->set('urlset', $urls);
        $this->render('sitemaps/urlset', false);
    }  

public function articles1() {
        $this->loadModel('Article');
        
        $articles = $this->Article->query(
            'SELECT url, modified FROM articles WHERE site_id='
            . $this->siteId . " AND status='publish' AND (redirect_url is null OR redirect_url = '') AND landing_page_id is null AND calc_id = '0' LIMIT 2000, 2000"
        );
        
        foreach ($articles as $article) {
            $urls[] = [
                'loc' => (APPNAME . '\Config\Config')::getUrl() . '/-' . $article['url'],
                'lastmod' => date('Y-m-d\TH:i:s+00:00', strtotime($article['modified']))
            ];
        }
        
        $this->set('urlset', $urls);
        $this->render('sitemaps/urlset', false);
    }  

Chciałbym mieć tylko jedną funkcje articles(), tylko pojawia się problem, że muszę podać nazwę funkcji i nie wiem jak je dynamicznie generować. Pozdrawiam

0

No to stwórz 2 funkcje które tylko będą wywoływać właściwą funkcję z parametrem. Trochę mi te nazwy nie pasują ale nie mam pomysłu z kontekstu na lepsze.
Edit. Zmieniłem trochę ale i tak mi nie pasuje.

public function getLimitedArticles()
{
    $this->getArticles(2000);
}
public function getLimitedArticlesWithOffset()
{
    $this->getArticles(2000,2000);
}
public function getArticles(int $limit = 0, int $offset = 0)
{
    // ciało funkcji z ifem który odczyta parametry i zmodyfikuje zapytanie.
}
0
public function articles0() {
  $this->articles("LIMIT 2000, 2000");
}

public function articles1() {
  $this->articles("LIMIT 2000");
}

private function articles(string $limitQuery) {  // wydziel argument
    $this->loadModel('Article');
    
    $articles = $this->Article->query(
        'SELECT url, modified FROM articles WHERE site_id='
        . $this->siteId . " AND status='publish' AND (redirect_url is null OR redirect_url = '') AND landing_page_id is null AND calc_id = '0' $limitQuery"
    );
    
    foreach ($articles as $article) {
        $urls[] = [
            'loc' => (APPNAME . '\Config\Config')::getUrl() . '/-' . $article['url'],
            'lastmod' => date('Y-m-d\TH:i:s+00:00', strtotime($article['modified']))
        ];
    }
    
    $this->set('urlset', $urls);
    $this->render('sitemaps/urlset', false);
}  

PS: Albo zrób tak jak pisze @jurek1980 z int $limit i int $offset.

0

dziękuje bardzo, a czy mógłbym przeciażać w php metodę, żeby mieć 1 metodę z tą samą nazwą tylko parametrami by się różniła?

0
kinimod99 napisał(a):

dziękuje bardzo, a czy mógłbym przeciażać w php metodę, żeby mieć 1 metodę z tą samą nazwą tylko parametrami by się różniła?

A czemu chciałbyś nazwać metody tak samo, skoro robią różne rzeczy?

1 użytkowników online, w tym zalogowanych: 0, gości: 1