Zum Inhalt springen

Anfängerfragen Extbase

Erstellt am 14. März 2013 · 18 Antworten · letzte Antwort am 2. Mai 2013

Tags: Frage

karf ·

doch die gibt es natürlich. Aber du befindest dich in einem namespace, dann heißt die klasse nicht mehr t3lib_div sondern \t3lib_div

Aber wie gesagt ich würde dir wirklich empfehlen den objectManager zu verwenden. Ansonsten kannst du komische Fehler mit deinen Objekten bekommen.

Also in deinem Fall

$this->projektRepository = $this->objectManager('TYPO3\Timetrack\Domain\Repository\ProjektRepository');

(oder bist du dir sicher das deine Klasse Tx_timetrack_Domain_Repository_ProjektRepository heißt? In Typo3 6 solltest du am besten die namespaces benutzen!)

Noch besser ist es aber natürlich sich die Repositorys direct injecten zu lassen. dazu einfach die @inject Annotation an deine Klasse-Variable schreiben.

also

/**
 * ProjektRepository
 * @var \TYPO3\Timetrack\Domain\Repository\ProjektRepository
 * @inject
 **/
protected $projektRepository;

Danach hast du in $this->projectRepository automatisch deine Repository Klasse drin. (nicht vergessen vorher den Cache zu löschen 😉)

Philipp88 ·

Sorry nochmal 🙁

erstmal Danke, hat geklappt 🙂

jetzt ein anderes Problem:
Wie kann ich im Controller eine neue Funktion anmelden?

The action "cform" (controller "Personen") is not allowed by this plugin

Funktion heißt "cform"

 /**
	 * action cform
	 *
	 * @return void
	 */
	protected function cformAction($person) {
          \t3lib_utility_Debug::debug($person, 'auto');
          
	}

Ich finde die alte Programmierung war verständlicher bzw. einfacher als Extbase oder ändert sich das noch?

karf ·
Philipp88 schrieb

Sorry nochmal 🙁

erstmal Danke, hat geklappt 🙂

jetzt ein anderes Problem:
Wie kann ich im Controller eine neue Funktion anmelden?

The action "cform" (controller "Personen") is not allowed by this plugin

Funktion heißt "cform"

 /**
	 * action cform
	 *
	 * @return void
	 */
	protected function cformAction($person) {
          \t3lib_utility_Debug::debug($person, 'auto');
          
	}

Im Extension Builder, auf der Linken Seite wo du deine Plugins einrichtest gibt es eine Textbox in die du alle validen Actions für dieses Plugin schreiben kannst. Da dürftest du auch schon etwas reingeschrieben haben, da soweit ich weiß bei keiner Angabe alle Actions erlaubt sind.

Wenn du den Extension Builder nicht nutzt (was ein Fehler ist! der nimmt dir sehr viel Arbeit ab!) kannst du das in der localconf.php konfigurieren.

Philipp88 schrieb

Ich finde die alte Programmierung war verständlicher bzw. einfacher als Extbase oder ändert sich das noch?

Extbase ist in seinen Grundzügen sehr logisch aufgebaut, wenn du mal verstanden hast warum es was macht und vorallem was es alles automatisch macht wirst du es einfacher haben 😉
Allerdings kam ich mit piBase auch nie zurecht *g* (Ok, musste es glücklicherweiße auch nicht allzulange nutzen)

Philipp88 ·

ok, ich habe es jetzt mit den Extension Builder aktualisiert jetzt geht es🙂

Jetzt habe ich ein Formular was in etwa so aussieht:

<f:form action="cform" name="person">
  <table>
    <tr>
      <td>Name</td>
      <td><f:form.textfield property="name" /></td>
    </tr>
    <tr>
      <td>Vorname</td>
      <td><f:form.textfield property="vorname" /></td>
    </tr>
    <tr>
      <td>Kurze Beschreibung</td>
      <td><textarea name="tx_people_people[desc]" cols="10" rows="5"></textarea></td>
    </tr>
    <tr>
      <td colspan="2"><input type="submit" name="tx_people_people[send]" value="Benutzer anlegen" /></td>
    </tr>
  </table>
  </f:form>

Ich versuche jetzt mittels Extbase an die variablen (post) heranzukommen:

public function cformAction($person) {
          \t3lib_utility_Debug::debug($person, 'person');
	}

leider ohne erfolg🙁

Kannst du bitte nochmal helfen?

karf ·

Damit extbase dir ein Objekt erstellt musst du das im <f:form> angeben.

In deinem Fall würde das jetzt so aussehen

<f:form action="cform" name="person" object="{person}">

ich bin mir nicht sicher ob du vorher {person} selbst erzeugen musst. Schaden tut es sicherlich nicht 😉

Es gibt übrigens auch einen <f:form.textarea /> ViewHelper.

(Basic Viewhelper sind alle hier aufgelistet: http://wiki.typo3.org/Fluid)

Philipp88 ·

Hi,

ich habe jetzt den Formular object="{Person}" mitgegeben, leider ist die Variable immer noch leer🙁

Was meinst du mit object selber anlegen?

karf ·

In der dazugehörigen Action eine neue Instanz von Person erstellen

$person = $this->objectManager->create('\Dein\Model\Person');

und an den View übergeben.

$this->view->assign('person', $person);

Ich bin mir aber nicht sicher, ob das nötig ist oder dein Problem löst. Aber so mache ich das meistens (Im Normalfall um default Parameter zu setzen)

Morgen oder Montag werde ich aber wahrscheinlich ein neues Formular machen müssen, da schau ich mal nach welche Schritte mindestens nötig sind.

Philipp88 ·

Das wäre nett von dir ich bekomme das einfach nicht zum laufen 🙁

Jetzt kommt folgende Fehlermeldung:

1253175643: The argument type for parameter $person of method TYPO3\People\Controller\PersonenController->cformAction() could not be detected.

Bei diesen PHP- Code:

/**
	 * action cform
	 *
	 * @return void
	 */
	public function cformAction($person) {
          $person = $this->objectManager->create('\TYPO3\People\Domain\Model\Personen');
          
          $this->view->assign('person', $person);
	}

Wenn ich bei der Funktion den Parameter weglasse kommt zwar nicht mehr die Fehlermeldung von oben, stattdessen aber ne andere:

Fatal error: Class '\TYPO3\People\Domain\Model\Personen' not found

Das Model gibt es aber ...🙁

Bitte helf mir

Philipp

karf ·
Philipp88 schrieb

Das wäre nett von dir ich bekomme das einfach nicht zum laufen 🙁

Jetzt kommt folgende Fehlermeldung:

1253175643: The argument type for parameter $person of method TYPO3\People\Controller\PersonenController->cformAction() could not be detected.

Bei diesen PHP- Code:

/**
	 * action cform
	 *
	 * @return void
	 */
	public function cformAction($person) {
          $person = $this->objectManager->create('\TYPO3\People\Domain\Model\Personen');
          
          $this->view->assign('person', $person);
	}

Du musst den Parameter noch als Annotation in den Header eintragen.
also
@param \TYPO3\People\Domain\Model\Personen $person
in die Zeile vor dem @return

Philipp88 schrieb

Wenn ich bei der Funktion den Parameter weglasse kommt zwar nicht mehr die Fehlermeldung von oben, stattdessen aber ne andere:

Fatal error: Class '\TYPO3\People\Domain\Model\Personen' not found

Das Model gibt es aber ...🙁

Bitte helf mir

Philipp

Sorry das war ein Fehler in meinem Beispiel. Wenn du Klassennamen an eine Typo3 Funktion übergibst, immer ohne den ersten / vom Namespace. Also nur 'TYPO3\People\Domain\Model\Personen'

Du solltest aber vorher noch überprüfen ob nicht ein Objekt übergeben wurde, ansonsten macht der Parameter ja keinen Sinn und du würdest immer mit einem frischen Objekt beginnen. (oder ist das gewollt?)

if ($person == null)
{
    $person = $this->objectManager->create('TYPO3\People\Domain\Model\Personen');
}
Philipp88 ·

hast du schon etwas herrausfinden können? Bei mir funzt es einfach nicht 🙁

Mal was anderes:

Ich sitze jetzt an einer anderen Extension, wo mehrere Bilder ein Datensatz zugeordnet sind und diese in der Singleansicht ausgegeben werden sollen.

Erstmal der Code:

Controller:

...
public function showAction(\TYPO3\Project\Domain\Model\Project $project) {
    $project_id = $this->request->getArgument('project');
    $this->view->assign('project', $project);
    $this->view->assign("path", "uploads/tx_project");

    $images = $this->projectRepository->get_images($project_id);    
    #print_r($images);
    
    $this->view->assign("images", $images);
    
  }

Repository:

public function showAction(\TYPO3\Project\Domain\Model\Project $project) {
    $project_id = $this->request->getArgument('project');
    $this->view->assign('project', $project);
    $this->view->assign("path", "uploads/tx_project");

    $images = $this->projectRepository->get_images($project_id);    
    #print_r($images);
    
    $this->view->assign("images", $images);
    
  }

Ergebnis soll in Template erscheinen:

<f:for each="{images}" as="image">
          {image.image}
        </f:for>

Leider kommt dann folgende Fehlermeldung 🙁

Cannot cast object of type "TYPO3\CMS\Extbase\Persistence\ObjectStorage" to string.

Was ist den da falsch?

Kannst Du oder jemand anderes mir helfen?
Philipp