Dědičnost a předávání neurčitého počtu parametru v metodě

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Blizard
Člen | 45
+
0
-

Zdravím,

chtěl jsem si v baseModel vytvořit metodu která se bude jmenovat třeba insertRow($table) která má takovouto podobu:

	/**
	 * Obecná metoda pro vložení xx záznamů do tabulky
	 * @param string $table název tabulky
	 * @return integer Vrací ID posledního vloženého záznamu
	 */
	protected function insertRow($table)
	{
		$numargs = func_num_args();
		$selector = ($numargs > 1 ? "%m" : "%v");
		$value = array();
		for ($i = 1; $i < $numargs; $i++)
			$value[] = func_get_arg($i);
		\Nette\Diagnostics\Debugger::dump($numargs);
		\Nette\Diagnostics\Debugger::dump($selector);
		\Nette\Diagnostics\Debugger::dump($value);
		try
		{
			$this->db->begin();
			$this->db->query("INSERT INTO [:prefix:$table] $selector", $value);
			$this->db->commit();
		} catch (Exception $ex) {
			$this->db->rollback();
		}
		return $this->db->getInsertId();
	}

dále mám klasicky další model ProducerModel který dědí od baseModel v kterém mám

	public function insertRow($table)
	{
		return parent::insertRow($table);
	}

a v presenteru

$this->producerModel->insertRow("producer", $values);

problém je jednoduchý, nevím přesně jak mám předat neurčitý počet argumentů těm modelům ke zpracování.
Mohlo by tam být klidně

$this->producerModel->insertRow("producer", $values1, $values2);

kde $valueX jsou pole hodnot.

Lze to nějak rozumně vyřešit? Díky.

Oli
Člen | 1215
+
0
-

no a použít tohle nejde?

$this->producerModel->insertRow("producer", array($value1, $value2, $value3, ...));

Další věc kterou moc nechápu, proč chceš předávat víc parametrů, ale insertRow přijímá jen jeden.

factor
Člen | 28
+
0
-

Ahoj

/**
 * Obecná metoda pro vložení xx záznamů do tabulky
 * @param string $table název tabulky
 * @param array $data data určená pro vložení ($key = název sloupce, $val = data)
 * @return NDB vložený řádek
 */
publicfunction insertRow($table, $data)
{
	try
	{
		$query = $this->db->table($table)->insert($data);
	}catch (Exception $e){
		throw new $e;
	}

	return $query;
}

Pouze nástřel

Editoval factor (10. 12. 2013 10:08)

llook
Člen | 407
+
0
-

Tohle:

$value = array();
    for ($i = 1; $i < $numargs; $i++)
        $value[] = func_get_arg($i);

Se dá zkrátit takto:

$value = func_get_args();
array_shift($value);

K samotné otázce, mělo by fungovat tohle:

public function insertRow($table)
{
    return call_user_func_array(['parent', __FUNCTION__], func_get_args());
}
Blizard
Člen | 45
+
0
-

Pomohlo, děkuji.

llook napsal(a):

Tohle:

$value = array();
    for ($i = 1; $i < $numargs; $i++)
        $value[] = func_get_arg($i);

Se dá zkrátit takto:

$value = func_get_args();
array_shift($value);

K samotné otázce, mělo by fungovat tohle:

public function insertRow($table)
{
    return call_user_func_array(['parent', __FUNCTION__], func_get_args());
}