<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Zorta &#187; Model</title>
	<atom:link href="http://www.zorta.de/tag/model/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.zorta.de</link>
	<description>Nähkästchen eines Webentwicklers</description>
	<lastBuildDate>Sat, 29 Oct 2011 20:08:42 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Eine kleine Modelklasse</title>
		<link>http://www.zorta.de/frameworks/eine-kleine-modelklasse/</link>
		<comments>http://www.zorta.de/frameworks/eine-kleine-modelklasse/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 19:30:19 +0000</pubDate>
		<dc:creator>Denis Zunke</dc:creator>
				<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Model]]></category>
		<category><![CDATA[Zend_Db_Table]]></category>
		<category><![CDATA[Zend_Framework]]></category>

		<guid isPermaLink="false">http://www.zorta.de/?p=47</guid>
		<description><![CDATA[Auf meiner Suche nach einer guten Möglichkeit mit Models zu arbeiten habe ich mir eine kleine Modelklasse geschrieben, die in ihrer jetzigen Version sehr einfach ist. Vielleicht ist sie für den einen oder anderen ja auch ein Ansatz zum Arbeiten. Die Funktion ist relativ simpel. Man erstellt sein Model wie immer, aber auf Basis der [...]]]></description>
			<content:encoded><![CDATA[<p>Auf meiner Suche nach einer guten Möglichkeit mit Models zu arbeiten habe ich mir eine kleine Modelklasse geschrieben, die in ihrer jetzigen Version sehr einfach ist. Vielleicht ist sie für den einen oder anderen ja auch ein Ansatz zum Arbeiten.<br />
Die Funktion ist relativ simpel. Man erstellt sein Model wie immer, aber auf Basis der Zorta_Model Klasse. Im Construkt der Klasse muss man eine DbTable Klasse angeben, den Primärschlüssel und die Felder der Klasse setzen. Diese Felder bilden die Grundlage für die spätere Verarbeitung.<br />
Durch die Felder bekommt man bei Abfragen nur die Daten zurück, die man auch haben will. Im späteren Verlauf will ich auch noch einbauen, dass die Select Abfragen angepasst werden. So sind derzeit, von DbTable vorgegeben eigentlich nur Abfragen mit Sternchen &#8230; ebenso sollen noch Beziehungen folgen. Es ist also noch viel zu tun.</p>
<p>Folgend findet ihr die Model Klasse und ein kleines Beispiel. Ich hoffe es hilft :)<br />
<span id="more-47"></span></p>
<pre class="brush: php">&amp;amp;lt;?php

class Zorta_Model {

/**
* Existente Tabellenfelder
* @var array
*/
protected $_felder;

/**
* Primaerschluessel der Tabelle
* @var string
*/
protected $_primary;

/**
* Das DbTable Objekt
* @var Zend_Db_Table
*/
protected $_DbTable;

/**
* Der Name der DbTable, die geladen werden soll bei Abfragen
* @var string
*/
protected $_DbTableName;

/**
* Setzt den Prim�rschl�ssel der Tabelle
* @param string $name
* @return bool
*/
public function setPrimary( $name = null )
{
if(isset($name) &amp;amp;amp;&amp;amp;amp; $name != &amp;amp;quot;&amp;amp;quot;)
{
$this-&amp;amp;gt;_primary = (string) $name;
return true;
}

return false;
}

/**
* Gibt den Prim�rschl�ssel zur�ck
* @return string
*/
public function getPrimary()
{
return $this-&amp;amp;gt;_primary;
}

/**
* Setzt den Objektnamen für die DBTable
* @param string $name
* @return bool
*/
public function setDbTableName( $name )
{
if(isset($name) &amp;amp;amp;&amp;amp;amp; $name != &amp;amp;quot;&amp;amp;quot;)
{
$this-&amp;amp;gt;_DbTableName = (string) $name;
return true;
}

return false;
}

/**
* Gibt den Namen des DbTable Objektes zurück
* @return string
*/
public function getDbTableName()
{
return $this-&amp;amp;gt;_DbTableName;
}

/**
* Erstellt bei Bedarf eine Instanz einer DbTable
* @return Zend_Db_Table
*/
public function getDbTable()
{
if($this-&amp;amp;gt;_DbTable === null){
try{
$this-&amp;amp;gt;_DbTable = new $this-&amp;amp;gt;_DbTableName;
} catch (Zend_Db_Exception $e){
Zorta_Log::logException($e);
}
}

return $this-&amp;amp;gt;_DbTable;
}

/**
* F�gt den Feldern eines hinzu
* @param string $feldname
* @param mixed $feldvalue
* @param bool $allowNull
* @return bool
*/
public function addField( $feldname, $feldvalue = &amp;amp;quot;&amp;amp;quot;, $allowNull = false )
{
if(!$this-&amp;amp;gt;hasField($feldname))
{
$this-&amp;amp;gt;_felder[$feldname][&amp;amp;quot;value&amp;amp;quot;] 	= $feldvalue;
$this-&amp;amp;gt;_felder[$feldname][&amp;amp;quot;null&amp;amp;quot;] 	= $allowNull;

return true;
}

return false;
}

/**
* Entfernt ein Feld aus der Staffelung
* @param string $feldname
* @return bool
*/
public function delField( $feldname )
{
if($this-&amp;amp;gt;hasField($feldname))
{
unset($this-&amp;amp;gt;_felder[$feldname]);
return true;
}

return false;
}

/**
* Setzt den Wert eines Feldes
* @param string $feldname
* @param mixed $feldvalue
* @return bool
*/
public function setField( $feldname, $feldvalue )
{
if($this-&amp;amp;gt;hasField($feldname))
{
$this-&amp;amp;gt;_felder[$feldname][&amp;amp;quot;value&amp;amp;quot;]	= $feldvalue;
return true;
}

return false;
}

/**
* Gibt den Wert eines Feldes zur�ck
* @param string $feldname
* @return mixed | bool
*/
public function getField( $feldname )
{
if($this-&amp;amp;gt;hasField($feldname))
return $this-&amp;amp;gt;_felder[$feldname][&amp;amp;quot;value&amp;amp;quot;];

return false;
}

/**
* Pr�ft, ob ein Feld existent ist
* @param string $feldname
* @return bool
*/
public function hasField( $feldname )
{

if(isset($this-&amp;amp;gt;_felder[$feldname])){
return true;
}

return false;
}

/**
* Gibt das gesamte Feld Array zur�ck
* @return array
*/
public function getAllFields()
{
return $this-&amp;amp;gt;_felder;
}

/**
* Setzt die Werte aller _vorhandenen_ Felder durch ein Arrayin der Form:
* array(&amp;amp;quot;Spalte1&amp;amp;quot; =&amp;amp;gt; &amp;amp;quot;Wert1&amp;amp;quot;, &amp;amp;quot;Spalte2&amp;amp;quot; =&amp;amp;gt; &amp;amp;quot;Wert3&amp;amp;quot;)
*
* @param array $array
* @return bool
*/
public function setFieldsFromArray( $array )
{
if(is_array($array))
{
foreach ($array as $key =&amp;amp;gt; $value)
{
if($this-&amp;amp;gt;hasField($key))
{
return $this-&amp;amp;gt;setField($key, $value);
}
}
}

return false;
}

/**
* Erlaubt das NULL sein von Feldern
* @param string $feldname
* @return bool
*/
public function setFieldAllowNull( $feldname )
{
if($this-&amp;amp;gt;hasField($feldname))
{
$this-&amp;amp;gt;_felder[$feldname][&amp;amp;quot;null&amp;amp;quot;] = true;
return true;
}

return false;
}

/**
* Verbietet das NULL sein von Feldern
* @param string $feldname
* @return bool
*/
public function setFieldDenyNull( $feldname )
{
if($this-&amp;amp;gt;hasField($feldname))
{
$this-&amp;amp;gt;_felder[$feldname][&amp;amp;quot;null&amp;amp;quot;] = false;
return true;
}

return false;
}

/**
* Speichert das Model ab
* Entweder es ist ein Insert, wenn kein Prim�rschl�ssel vorliegt, oder es ist einer, wenn ein Schl�ssel vorliegt
* @return bool
*/
public function save()
{
if(count($this-&amp;amp;gt;getAllFields()) &amp;amp;gt; 0)
{
# Erstellen oder Update, das ist hier die Frage
if($this-&amp;amp;gt;hasField($this-&amp;amp;gt;getPrimary()) &amp;amp;amp;&amp;amp;amp; $this-&amp;amp;gt;getField($this-&amp;amp;gt;getPrimary()) != &amp;amp;quot;&amp;amp;quot;)
{
# Der Key ist existent -&amp;amp;gt; Update
foreach ($this-&amp;amp;gt;getAllFields() as $key =&amp;amp;gt; $value)
{
# Alles darff durch, das ein Value hat, leer sein darf und nicht der primaerschluessel ist
if(($value[&amp;amp;quot;value&amp;amp;quot;] != &amp;amp;quot;&amp;amp;quot; || $value[&amp;amp;quot;null&amp;amp;quot;] == true) &amp;amp;amp;&amp;amp;amp; $key != $this-&amp;amp;gt;getPrimary())
{
$data[$key] = $value[&amp;amp;quot;value&amp;amp;quot;];
}
}

# Da wir nun das Dataset haben darf der Tanz gewagt werden
try{
return $this-&amp;amp;gt;getDbTable()-&amp;amp;gt;update($data,$this-&amp;amp;gt;getPrimary() .&amp;amp;quot; = &amp;amp;quot;. $this-&amp;amp;gt;getField($this-&amp;amp;gt;getPrimary()));
} catch (Zend_Db_Exception $e){
Zorta_Log::logException($e);
}

}
else
{
# Kein Key ist existent -&amp;amp;gt; Neu
foreach ($this-&amp;amp;gt;getAllFields() as $key =&amp;amp;gt; $value)
{
# Jedes Feld durchlaufen und das Dataset bauen
if($value[&amp;amp;quot;value&amp;amp;quot;] != &amp;amp;quot;&amp;amp;quot; || $value[&amp;amp;quot;null&amp;amp;quot;] == true)
{
$data[$key] = $value[&amp;amp;quot;value&amp;amp;quot;];
}
}

# Wenn das DataSet gesetzt ist kann man mit diesem daher gehen und den Insert wagens
try{
return $this-&amp;amp;gt;getDbTable()-&amp;amp;gt;insert($data);
} catch (Zend_Db_Exception $e){
Zorta_Log::logException($e);
}
}
}
return false;
}

/**
* Sucht eine Zeile heraus, achtet dabei auf den Primärschlüssel
* @return array
*/
public function searchByPrimary()
{
if($this-&amp;amp;gt;hasField($this-&amp;amp;gt;getPrimary()))
{
# Holt die Daten der Zeile ein
try{
$data_res = $this-&amp;amp;gt;getDbTable()-&amp;amp;gt;find($this-&amp;amp;gt;getField($this-&amp;amp;gt;getPrimary()))-&amp;amp;gt;toArray();
} catch (Zend_Db_Exception $e){
Zorta_Log::logException($e);
}
$data = array();

# Geht alle erwünschten Felder durch und nimmt die Daten von diesem aus dem
# zuvor gewonnenen Array heraus
foreach ( $this-&amp;amp;gt;getAllFields() as $key =&amp;amp;gt; $value )
{
if(isset($data_res[0][$key]))
{
$data[$key] = $data_res[0][$key];
}
}

return $data;
}

return false;
}

/**
* Sucht alle Datensätze mit allen Spalten heraus
* @param string|array|Zend_Db_Table_Select $where  OPTIONAL An SQL WHERE clause or Zend_Db_Table_Select object.
* @param string|array                      $order  OPTIONAL An SQL ORDER clause.
* @param int                               $count  OPTIONAL An SQL LIMIT count.
* @param int                               $offset OPTIONAL An SQL LIMIT offset.
* @return array
*/
public function searchAllBySelect($where = null, $order = null, $count = null, $offset = null)
{
try{
$data_res = $this-&amp;amp;gt;getDbTable()-&amp;amp;gt;fetchAll($where, $order, $count, $offset)-&amp;amp;gt;toArray();
} catch (Zend_Db_Exception $e){
Zorta_Log::logException($e);
}
$data = array();

foreach($data_res as $key =&amp;amp;gt; $value)
{

foreach ($value as $column =&amp;amp;gt; $column_val)
{

if($this-&amp;amp;gt;hasField($column))
{
$data[$key][$column] = $column_val;
}
}
}

return $data;

}

} [/code]

[code lang=&quot;php&quot;]&amp;amp;lt;?php

class Model_Test extends Zorta_Model {

public function __construct()
{

$this-&amp;amp;gt;setDbTableName(&amp;amp;quot;Model_Test_DbTable&amp;amp;quot;);
$this-&amp;amp;gt;setPrimary(&#039;user_id&#039;);

$this-&amp;amp;gt;addField(&#039;user_id&#039;);
$this-&amp;amp;gt;addField(&#039;user_name&#039;);
$this-&amp;amp;gt;addField(&#039;user_email&#039;);
$this-&amp;amp;gt;addField(&#039;user_code&#039;);

}

}</pre>
<pre class="brush: php">&amp;amp;lt;?php

class Model_Test extends Zorta_Model {

public function __construct()
{

$this-&amp;amp;gt;setDbTableName(&amp;amp;quot;Model_Test_DbTable&amp;amp;quot;);
$this-&amp;amp;gt;setPrimary(&#039;user_id&#039;);

$this-&amp;amp;gt;addField(&#039;user_id&#039;);
$this-&amp;amp;gt;addField(&#039;user_name&#039;);
$this-&amp;amp;gt;addField(&#039;user_email&#039;);
$this-&amp;amp;gt;addField(&#039;user_code&#039;);

}

}</pre>
<pre class="brush: php">&amp;amp;lt;?php

require_once &#039;Zend/Controller/Action.php&#039;;

class TestController extends Zend_Controller_Action
{
/**
* The default action - show the home page
*/
public function indexAction()
{
// TODO Auto-generated {0}::indexAction() default action

$model = new Model_Test();

$model-&amp;amp;gt;setField(&#039;user_name&#039;,&#039;Test04&#039;);
$model-&amp;amp;gt;setField(&#039;user_email&#039;,&#039;test04@test.de&#039;);

echo $model-&amp;amp;gt;save();

$data = $model-&amp;amp;gt;searchAllBySelect();

Zend_Debug::dump($data);

}

}</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.zorta.de/frameworks/eine-kleine-modelklasse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

