62 lines
1.9 KiB
PHP
62 lines
1.9 KiB
PHP
<?php
|
|
/**
|
|
* @package FOF
|
|
* @copyright Copyright (c)2010-2022 Nicholas K. Dionysopoulos / Akeeba Ltd
|
|
* @license GNU General Public License version 3, or later
|
|
*/
|
|
|
|
namespace FOF40\Model\Mixin;
|
|
|
|
defined('_JEXEC') || die;
|
|
|
|
/**
|
|
* Trait for PHP 5.5 Generators
|
|
*/
|
|
trait Generators
|
|
{
|
|
/**
|
|
* Returns a PHP Generator of DataModel instances based on your currently set Model state. You can foreach() the
|
|
* returned generator to walk through each item of the data set.
|
|
*
|
|
* WARNING! This only works on PHP 5.5 and later.
|
|
*
|
|
* When the generator is done you might get a PHP warning. This is normal. Joomla! doesn't support multiple db
|
|
* cursors being open at once. What we do instead is clone the database object. Of course it cannot close the db
|
|
* connection when we dispose of it (since it's already in use by Joomla), hence the warning. Pay no attention.
|
|
*
|
|
* @param integer $limitstart How many items from the start to skip (0 = do not skip)
|
|
* @param integer $limit How many items to return (0 = all)
|
|
* @param bool $overrideLimits Set to true to override limitstart, limit and ordering
|
|
*
|
|
* @return \Generator A PHP generator of DataModel objects
|
|
* @since 3.3.2
|
|
* @throws \Exception
|
|
*/
|
|
public function &getGenerator($limitstart = 0, $limit = 0, $overrideLimits = false)
|
|
{
|
|
$limitstart = max($limitstart, 0);
|
|
$limit = max($limit, 0);
|
|
|
|
$query = $this->buildQuery($overrideLimits);
|
|
|
|
$db = clone $this->getDbo();
|
|
$db->setQuery($query, $limitstart, $limit);
|
|
$cursor = $db->execute();
|
|
|
|
$reflectDB = new \ReflectionObject($db);
|
|
$refFetchAssoc = $reflectDB->getMethod('fetchAssoc');
|
|
$refFetchAssoc->setAccessible(true);
|
|
|
|
while ($data = $refFetchAssoc->invoke($db, $cursor))
|
|
{
|
|
$item = clone $this;
|
|
$item->clearState()->reset(true);
|
|
$item->bind($data);
|
|
$item->relationManager = clone $this->relationManager;
|
|
$item->relationManager->rebase($item);
|
|
|
|
yield $item;
|
|
}
|
|
}
|
|
}
|