Advertisement
  1. Code
  2. PHP

Wie können Sie Ihren Twitter-Status mit CodeIgniter aktualisieren?

Scroll to top
Read Time: 14 min

() translation by (you can also view the original English article)

Hallo, in diesem Tutorial werden wir unseren Twitter-Status über die 'Twitter API' mit CodeIgniter aktualisieren. Ich empfehle, Schritt für Schritt zu folgen, anstatt das Tutorial zu beschönigen. Lassen Sie uns eintauchen!

Tutorial Details

  • Programm: CodeIgniter PHP Framework
  • Version:1.7.1
  • Schwierigkeit: Fortgeschritten
  • Geschätzte Fertigstellungszeit: 30 Minuten

1. Konfigurieren von CodeIgniter

Zuerst müssen wir einige Standardeinstellungen im Abschnitt CI-Konfiguration bearbeiten.

Öffnen Sie die Datei system/application/config/autoload.php und bearbeiten Sie Folgendes unter:

1
$autoload['libraries'] = array('');

zu:

1
$autoload['libraries'] = array('database');

Dadurch wird die Datenbank automatisch geladen. Öffnen Sie als Nächstes database.php und bearbeiten Sie die Datenbankverbindungseinstellung - den Namen von Ihre Datenbank, Benutzer und Passwort. Als Namen verwenden wir ci_twitter_api.

Öffnen Sie nun config.php und ändern Sie die base_url in Ihren CI-Ordner. Mein Ordner heißt twitter_api. In diesem Ordner befindet sich mein System-Ordner. Also wird meine base_url sein:

1
$config['base_url']	= "http://localhost/ci/twitter_api";

2. Füllen Sie die Datenbank

Da wir mit einer Datenbank arbeiten werden, benötigen wir einige Daten, mit denen wir spielen können. Öffnen Sie phpmyadmin oder Ihr bevorzugtes Datenbankverwaltungsprogramm und erstellen Sie eine neue Datenbank namens ci_twitter_api. Jetzt werden wir eine  neue Tabelle mit der folgenden SQL-Abfrage einrichten, aber Achtung, verwenden Sie IHRE Twitter-Benutzernamen und Passwort-Anmeldedaten.

1
CREATE TABLE IF NOT EXISTS `accounts` (
2
     `id` int(11) NOT NULL AUTO_INCREMENT,
3
     `username` varchar(120) NOT NULL,
4
     `password` varchar(32) NOT NULL,
5
     `active` int(11) NOT NULL,
6
     `last_message` varchar(140) NOT NULL,
7
     PRIMARY KEY (`id`)
8
   ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
9
   
10
   INSERT INTO `accounts` (`id`, `username`, `password`, `active`, `last_message`) VALUES
11
   (1, '<b>YOUR USERNAME</b>', '<b>YOUR PASSWORD</b>', 1, 'No message sent.');

Klicken Sie rechts auf die Schaltfläche OK, und die Abfrage sollte verarbeitet werden. Nun sollte Ihre Struktur für die Tabellen-Konten ähnlich wie in der folgenden Abbildung aussehen.

3. Erstellen des Modells

Gehen Sie zu system/application/models und erstellen Sie eine neue Datei mit dem Namen twitter_model.php.

Zuerst deklarieren wir oben zwei globale Variablen.

1
var $accounts_table = 'accounts';
2
var $update_url = 'http://twitter.com/statuses/update.xml';

Also verweist $accounts_table auf die Tabelle, die wir gerade zuvor erstellt haben, und $update_url ist die URL, die wir  zum Aktualisieren unseres Status verwenden werden. Wenn Twitter seine Update-URL ändert, müssen Sie sie hier nur einmal bearbeiten, anstatt jedes Mal, wenn sie im Code verwendet wird.

Nun erstellen wir unsere erste Methode, die einfach das in der Datenbank gespeicherte aktive Benutzerkonto zurückgibt, basierend auf der Zeile active und dem Wert 1. Ich habe dies hinzugefügt, weil manche Leute zwei oder mehr Twitter- Konten haben.

1
 class Twitter_model extends Model {
2
3
    // get the active twitter account from the database, by row active = 1

4
    function getActiveAccount()
5
    {
6
        return $this->db->get_where($this->accounts_table, array('active' => '1'))->row();	
7
    }

Wir verwenden einfach aktive Datensätze, um das aktive Konto abzurufen und die betroffene Zeile zurückzugeben.

Im nächsten Schritt erstellen wir die Hauptmethode, die Aktualisierung-Methode. Dabei werden unser Benutzername, unser Passwort und natürlich die Nachricht verwendet, die wir senden und unseren Status auf Twitter aktualisieren möchten. Außerdem interpretiert es  den HTTP_CODE, der von Twitter zurückgegeben wird, um uns zu sagen, ob der Status erfolgreich aktualisiert  wurde oder nicht.

1
// update twitter status and last message on success

2
function update_status($username, $password, $message)
3
{
4
	$ch = curl_init($this->update_url);
5
6
	curl_setopt($ch, CURLOPT_POST, 1);
7
	curl_setopt($ch, CURLOPT_POSTFIELDS, 'status='.urlencode($message));
8
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
9
	curl_setopt($ch, CURLOPT_USERPWD, $username . ':' . $password);
10
	
11
	curl_exec($ch);
12
	
13
	$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
14
	
15
	// if we were successfull we need to update our last_message

16
	if ($httpcode == '200')
17
	{
18
		$this->db->where('active', '1');
19
		$this->db->update($this->accounts_table, array('last_message' => $message));
20
		
21
		return TRUE;	
22
	}
23
	
24
	else
25
	{
26
		return FALSE;	
27
	}
28
}

Auf den ersten Blick mag der obige Code etwas kompliziert aussehen, aber es ist nicht so schwer zu verstehen. Der wichtigste Teil ist dass wir cURL verwenden, um mit Twitter zu kommunizieren. Es ist wirklich toll Bibliothek, mit der wir HTTP-POST-Daten von Twitter senden und empfangen können.

Nun initialisiert curl_init eine cURL-Sitzung und verwendet die URL als Parameter - in unserem Fall die Statusaktualisierung URL von der Twitter-API.

Mit curl_setopt setzen wir einige notwendige Optionen für die cURL-Übertragung.

  • CURLOPT_POST: Wir setzen diesen Wert auf '1', um HTTP POST zu verwenden, das mit HTML-Formularen identisch ist.
  • CURLOPT_POSTFIELDS: Diese Option akzeptiert die POST-Daten, die wir senden möchten. In unserem Fall 'status =' und unsere Nachricht. Wir müssen die Nachricht urlencodieren, um  Sonderzeichen wie '%&/' verwenden zu können.
  • CURLOPT_RETURNTRANSFER: Es ist wichtig, dass wir dies auf '1' setzen, da es die Übertragung  als Zeichenfolge zurückgibt. Diese Zeichenfolge teilt uns später mit, ob der Status erfolgreich aktualisiert wurde oder nicht.
  • CURLOPT_USERPWD: Diese Option dient zur Authentifizierung. Es dauert einfach unseren Twitter-Benutzernamen und unser Passwort im Format username:password.
1
curl_exec($ch);
2
3
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
4
5
// if we were successfull we need to update our last_message

6
if ($httpcode == '200')
7
{
8
	$this->db->where('active', '1');
9
	$this->db->update($this->accounts_table, array('last_message' => $message));
10
	
11
	return TRUE;	
12
}
13
14
else
15
{
16
	return FALSE;	
17
}

In diesem Teil führen wir die Übertragung mit curl_exec() aus und holen uns den zurückgegebenen HTTP_CODE  mit curl_getinfo(CURLINFO_HTTP_CODE). Dieser HTTP_CODE teilt uns mit, ob die Statusaktualisierung abgeschlossen wurde oder nicht. Code '200' bedeutet, dass es funktioniert hat und das Update durchgeführt wurde. Sie können eine vollständige Liste der HTTP-Statuscodes hier anzeigen.

Wenn wir von Twitter '200' zurückbekommen, senden wir eine Abfrage an unsere Datenbank, die unsere last_message-Zeile aktualisiert, und schließlich geben  wir TRUE zurück. Wenn 200 nicht zurückgegeben wird, geben wir einfach FALSE zurück.

Um unser twitter_model fertigzustellen, erstellen wir eine letzte Methode, die die letzte Nachricht erhält, die wir gesendet haben. Wir benötigen diese Methode, weil wir unsere letzte Nachricht in einer Ansicht anzeigen werden. 

1
// get the last_message, by row active = 1

2
function getLastMessage()
3
{
4
	$this->db->select('last_message');
5
	$last_message =  $this->db->get_where($this->accounts_table, array('active' => '1'))->row()->last_message;
6
	
7
	return htmlspecialchars($last_message);
8
}

Diese Methode ist ziemlich einfach. Sie wählt die Zeile last_message aus unserem aktiven Konto aus und gibt sie mit htmlspecialchars in HTML-Entities konvertiert zurück. Unsere twitter_model.php sieht jetzt so aus:

1
	class Twitter_model extends Model {
2
	
3
	var $accounts_table = 'accounts';
4
	var $update_url = 'http://twitter.com/statuses/update.xml';
5
	
6
	// get the active twitter account from the database, by row active = 1

7
	function getActiveAccount()
8
	{
9
		return $this->db->get_where($this->accounts_table, array('active' => '1'))->row();	
10
	}
11
	
12
	// update twitter status and last message on success

13
	function update_status($username, $password, $message)
14
	{
15
		$ch = curl_init($this->update_url);
16
17
		curl_setopt($ch, CURLOPT_POST, 1);
18
		curl_setopt($ch, CURLOPT_POSTFIELDS, 'status='.urlencode($message));
19
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
20
		curl_setopt($ch, CURLOPT_USERPWD, $username . ':' . $password);
21
		
22
		curl_exec($ch);
23
		
24
		$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
25
		
26
		// if we were successfull we need to update our last_message

27
		if ($httpcode == '200')
28
		{
29
			$this->db->where('active', '1');
30
			$this->db->update($this->accounts_table, array('last_message' => $message));
31
			
32
			return TRUE;	
33
		}
34
		
35
		else
36
		{
37
			return FALSE;	
38
		}
39
	}
40
	
41
	// get the last_message, by row active = 1

42
	function getLastMessage()
43
	{
44
		$this->db->select('last_message');
45
		$last_message =  $this->db->get_where($this->accounts_table, array('active' => '1'))->row()->last_message;
46
		
47
		return htmlspecialchars($last_message);
48
	}
49
}

4. Erstellen des Controllers

Gehen Sie nun zu system/application/controllers und erstellen Sie eine neue Datei mit dem Namen twitter.php. Fügen wir einige Zeilen hinzu:

1
class Twitter extends Controller {
2
3
function Twitter()
4
{
5
	parent::Controller();
6
	
7
	$this->load->model('twitter_model');
8
}

Dies ist ein einfacher CI-Konstruktor, der unser twitter_model lädt. Es wird uns also innerhalb des gesamten Controllers zur Verfügung stehen. Jetzt kommt die index()-Methode.

1
function index()
2
{
3
	$data['heading'] = 'Hi, send a tweet!';
4
	$data['last_message'] = $this->twitter_model->getLastMessage();
5
	$data['active_user'] = $this->twitter_model->getActiveAccount()->username;
6
	
7
	$this->load->view('header', $data);
8
	$this->load->view('index');
9
	$this->load->view('footer');
10
}

Wir übergeben Informationen wie Text, unsere letzte Nachricht und den Benutzernamen des aktiven Benutzers an das $data-Array. Dank unseres twitter_models ist es ein Kinderspiel, die letzte Nachricht und den aktiven Benutzernamen abzurufen. Zumindest laden wir einigeAnsichten, die wir erstellen, nachdem wir unseren Controller fertiggestellt haben. Lassen Sie uns die Update-Methode erstellen.

1
// updating our status on twitter ( new message )

2
function update()
3
{		
4
	if ($this->input->post('submit'))
5
	{
6
		$this->load->library('form_validation');
7
		$this->form_validation->set_error_delimiters('<div class="error">', '</div>');
8
		$this->form_validation->set_rules('message', 'Message', 'trim|required|min_length[5]|max_length[140]');
9
		
10
		if ($this->form_validation->run() == FALSE)
11
		{
12
			$this->index();
13
		}
14
		
15
		else
16
		{
17
			$message = $this->input->post('message');
18
			
19
			// get useraccount data

20
			$account = $this->twitter_model->getActiveAccount();
21
			$username = $account->username;
22
			$password = $account->password;
23
			
24
			// send a tweet

25
			if ($this->twitter_model->update_status($username, $password, $message))
26
			{
27
				redirect('twitter');	
28
			}
29
			
30
			else
31
			{
32
				$data['error'] = 'There was an error while updating your status';
33
				
34
				$this->load->view('header', $data);
35
				$this->load->view('error');
36
				$this->load->view('footer');
37
			}
38
		}
39
	}

Das mag wieder verwirrend sein, aber wir werden es Teil für Teil durchgehen.

1
if ($this->input->post('submit'))
2
	{
3
		$this->load->library('form_validation');
4
		$this->form_validation->set_error_delimiters('<div class="error">', '</div>');
5
		$this->form_validation->set_rules('message', 'Message', 'trim|required|min_length[5]|max_length[140]');
6
		
7
		if ($this->form_validation->run() == FALSE)
8
		{
9
			$this->index();
10
		}

Mit $this->input->post('submit') prüfen wir, ob das Formular gesendet wurde - was wir später in unserer Hauptansicht  Datei erstellen werden. Danach laden wir die Bibliothek form_validation, weil wir sicherstellen möchten, dass für bestimmte Eingaben einige Regeln erforderlich sind, wie eine minimale und maximale Länge von 5 und 140 Zeichen. Zusätzlich schneiden wir die Leerzeichen mit trim ab und  setzen das Feld als erforderlich, da wir keine leere Nachricht benötigen. Die Funktion set_rules nimmt als ersten Parameter Folgendes an: den Namen des from-Feldes, unsere Fallmeldung (die in Kürze in der View erstellt wird) und als zweiten Parameter einen Menschen  den Namen für dieses Feld, der in die Fehlermeldung eingefügt wird ( wird in der View-Datei gemacht).

Wir rufen $this->form_validation->run() auf, was TRUE oder FALSE zurückgeben kann. Wenn eine von uns festgelegte Regel verletzt wurde gibt FALSE zurück und wir rufen einfach unsere index()-Methode auf. In den von der index()-Methode aufgerufenen Ansichtsdateien werden die Fehlermeldungen angezeigt, nachdem wir unsere Ansichten erstellt haben.

1
else
2
   {
3
       $message = $this->input->post('message');
4
       
5
       // get useraccount data

6
       $account = $this->twitter_model->getActiveAccount();
7
       $username = $account->username;
8
       $password = $account->password;
9
       
10
       // send a tweet

11
       if ($this->twitter_model->update_status($username, $password, $message))
12
       {
13
           redirect('twitter');	
14
       }
15
       
16
       else
17
       {
18
           $data['error'] = 'There was an error while updating your status';
19
           
20
           $this->load->view('header', $data);
21
           $this->load->view('error');
22
           $this->load->view('footer');
23
       }
24
   }

Dank unseres twitter_model ist es wieder so einfach, den Benutzernamen und das Passwort des aktuell aktiven Benutzers abzurufen. Wir könnten auch $username = $this->twitter_model-> getActiveAccount()->username ausführen, aber ich denke, für dieses Tutorial ist dies ein bisschen leichter zu verstehen.

Mit $this->twitter_model->update_status() rufen wir die Methode auf, die mit Twitter "spricht". Es sagt Twitter unsereBenutzername, Passwort und unsere Nachricht. Wenn der Status erfolgreich aktualisiert wurde, leiten wir mit redirect() vom URL-Helfer um.

Wenn etwas nicht stimmte, setzen wir eine Fehlermeldung und laden einige Ansichtsdateien, die im nächsten Schritt erstellt werden :). Der Controller sieht jetzt so aus:

1
	class Twitter extends Controller {
2
3
	function Twitter()
4
	{
5
		parent::Controller();
6
		
7
		$this->load->model('twitter_model');
8
	}
9
	
10
	function index()
11
	{
12
		$data['heading'] = 'Hi, send a tweet!';
13
		$data['last_message'] = $this->twitter_model->getLastMessage();
14
		$data['active_user'] = $this->twitter_model->getActiveAccount()->username;
15
		
16
		$this->load->view('header', $data);
17
		$this->load->view('index');
18
		$this->load->view('footer');
19
	}
20
	
21
	// updating our status on twitter ( new message )

22
	function update()
23
	{		
24
		if ($this->input->post('submit'))
25
		{
26
			$this->load->library('form_validation');
27
			$this->form_validation->set_error_delimiters('<div class="error">', '</div>');
28
			$this->form_validation->set_rules('message', 'Message', 'trim|required|min_length[5]|max_length[140]');
29
			
30
			if ($this->form_validation->run() == FALSE)
31
			{
32
				$this->index();
33
			}
34
			
35
			else
36
			{
37
				$message = $this->input->post('message');
38
				
39
				// get useraccount data

40
				$account = $this->twitter_model->getActiveAccount();
41
				$username = $account->username;
42
				$password = $account->password;
43
				
44
				// send a tweet

45
				if ($this->twitter_model->update_status($username, $password, $message))
46
				{
47
					redirect('twitter');	
48
				}
49
				
50
				else
51
				{
52
					$data['error'] = 'There was an error while updating your status';
53
					
54
					$this->load->view('header', $data);
55
					$this->load->view('error');
56
					$this->load->view('footer');
57
				}
58
			}
59
		}
60
		
61
		else
62
		{
63
			redirect('twitter');
64
		}
65
	}
66
}

5. Erstellen der Ansichten

Jetzt erstellen wir unsere Ansichtsdateien. Gehen Sie zu system/application/views und erstellen Sie die folgenden Dateien:

  • header.php
  • footer.php
  • index.php
  • error.php

Die header.php enthält die grundlegenden HTML-Metainformationen, unseren CSS-Link und die Eröffnungs-Tags unserer Haupt-Divs.#wrapper und #main.

1
    <!DOCTYPE html>
2
    <html>
3
    <head>
4
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5
    <link media="screen" rel="Stylesheet" type="text/css" href="<?php echo base_url(); ?>css/style.css" />
6
    <title>Using the Twitter API with CodeIgniter</title>
7
    </head>
8
    
9
    <body>
10
    
11
    <div id="wrapper">
12
    
13
    <div id="main">

Wir verwenden base_url(), das wir so konfiguriert haben, dass es auf unsere CSS-Datei verweist, die im nächsten Schritt erstellt wird.

Die footer.php enthält einfach unsere schließenden Tags.

1
	</div><!--end main-->
2
3
    </div><!--end wrapper-->
4
    
5
    </body>
6
    </html>

In der index.php geht die Party.

1
	<h3>
2
	<?php echo $heading; ?>
3
    <span>
4
    	( account: <?php echo anchor('http://twitter.com/' . $active_user, $active_user); ?> )
5
    </span>
6
    </h3>
7
    
8
    
9
    <?php echo form_error('message'); ?>
10
    
11
    <?php echo form_open('twitter/update', array('id' => 'update_form')); ?>
12
    <?php echo form_input(array('name' => 'message', 'maxlength' => '140')); ?>
13
    <?php echo form_submit('submit', 'update'); ?>
14
    <?php echo form_close(); ?>
15
    
16
    <div id="last_message">
17
        <fieldset>
18
            <legend>Last <span>sent by <b><?php echo $active_user ?></b></span></legend>
19
            <p><?php echo $last_message; ?></p>
20
        </fieldset>
21
    </div><!--end last_message-->

Alle hier verwendeten Variablen werden von unserem Controller über die index()-Methode übergeben. Darüber hinaus, verwenden wir den Formular-Helfer, um ein einfaches HTML-Formular zu erstellen. Denken Sie daran, ich habe Ihnen die Fehlerbehandlung für die Nachrichtenfeld hier gemacht; form_error('message') macht diese Magie.

Unter dem Formular wird die letzte vom Konto des aktiven Benutzers gesendete Nachricht angezeigt.

Schließlich wird die error.php für eine benutzerdefinierte Fehlerdatei verwendet, falls die Statusaktualisierung nicht erfolgreich war.

1
	<h3><?php echo $error; ?></h3>
2
3
     <?php echo anchor('twitter', 'Go back and try again'); ?>

6. Hinzufügen von CSS

Um es etwas schöner zu machen, werden wir etwas CSS hinzufügen. Gehen Sie zu system/ und erstellen Sie den Ordner CSS. Erstellen Sie in diesem Ordner eine Datei mit dem Namen style.css und fügen Sie sie  den folgenden Code ein.

1
    /* Reset CSS */
2
    
3
    html, body, div, span, object, h1, h2, h3, h4, h5, h6, p, blockquote, pre,
4
    a, address, code, img, 
5
    small, strong, dl, dt, dd, ol, ul, li,
6
    fieldset, form, label {
7
        margin: 0;
8
        padding: 0;
9
        border: 0;
10
        outline: 0;
11
        font-size: 100%;
12
        vertical-align: baseline;
13
        background: transparent;
14
    }
15
    
16
    body {
17
    	line-height: 1.5;
18
        font-family:Arial, sans-serif;
19
        margin:0;
20
    }
21
    ol, ul, li {
22
        list-style: none;
23
        list-style-type:none;
24
    }
25
    
26
    .clear { clear:both; }
27
    
28
    /* DEFAULTS */
29
        
30
    h3 {
31
        color:#35CCFF;
32
        font-size:20px;
33
    }
34
35
    /* CUSTOM */
36
        
37
    #wrapper {
38
        width:900px;
39
        margin:0 auto;
40
    }
41
    
42
    /* main */
43
    
44
    #main {
45
        margin-top:50px;
46
    }
47
    
48
    #main h3 span {
49
        font-size:14px;	
50
        color:#cccccc;	
51
    }
52
    
53
    #main h3 a {
54
        color:#cccccc;	
55
    }
56
    
57
    /* form */
58
    
59
    #update_form input {
60
        width:888px;
61
        padding:5px;
62
        border:1px solid #d3d3d3;
63
        display:block;
64
    }
65
    
66
    #update_form input[type="submit"] {
67
        width:auto;
68
        margin-top:10px;
69
        background-color:#000000;;
70
        border:none;
71
        color:white;
72
        font-size:12px;
73
        font-weight:bold;
74
        cursor:pointer;
75
        padding:3px;
76
    }
77
    
78
    div.error {
79
        display:block;
80
        background-color:#FB8A8A;
81
        border:1px solid #FF3B3B;
82
        padding:5px;
83
        color:#ffffff;
84
        width:50%;
85
        margin-bottom:30px;
86
        font-weight:bold;
87
        margin:0 auto 10px auto;
88
        text-align:center;
89
    }
90
    
91
    /* last message */
92
    
93
    #last_message fieldset {
94
        border:1px dashed #d3d3d3;
95
        padding:5px;
96
        margin-top:30px;
97
    }
98
    
99
    #last_message fieldset p {
100
        padding:5px;
101
        font-size:18px;
102
        font-weight:normal;
103
    }
104
    
105
    #last_message legend span {
106
        font-size:12px;
107
    }

Ich verwende Eric Meyers CSS-Reset, um die Ansicht in allen Browsern zu neutralisieren. Ihre Bewerbung sollte nun das Bild unten mögen.

Das große Finale

Testen wir unsere neue Anwendung. Wir werden eine Nachricht hinterlassen und den Update-Button drücken!

Nach dem Update:

Schauen wir uns Twitter an :)

Wenn wir gegen eine Formularüberprüfungsregel verstoßen, indem wir versuchen, eine leere Nachricht zu senden:

Schlussfolgerung

Ich hoffe wirklich, dass ich Ihnen ein wenig beim Erlernen von CodeIgniter und der Verwendung der großartigen Twitter-API geholfen habe! Hättest du etwas anders gemacht? Wenn ja, lassen Sie es uns wissen!

  • Folgen Sie uns auf Twitter oder abonnieren Sie den Nettuts+ RSS-Feed, um weitere tägliche Tipps und Artikel zur Webentwicklung zu erhalten.
Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.