Anfängerfragen Extbase

  • Philipp88 Philipp88
    Sternenflotten-Admiral
    0 x
    194 Beiträge
    0 Hilfreiche Beiträge
    14. 03. 2013, 19:33

    Hi:)

    Ich bin gerade dabei mir Extbase anzueignen.
    Dazu habe ich 4 Fragen:

    1. Wie kann ich, wenn ich in meinem Controller per finAll() alle Datensätze hole mit den SQL- Befehlen "WHERE", "GROUP BY", "ORDER BY", "LIMIT" die Ausgabe ändern? Oder muss ich da ein eigenes Statement schreiben?

    2. SQL wird ja erst ausgeführt, wenn ich die Daten für den Viewhelper benötige. Was ist aber, wenn ich die Daten erst noch per PHP bearbeiten möchte und die dann erst ausgeben möchte? Früher habe ich per $GLOBALS["TYPO3_DB"]->SQL_fetch_assoc($res) jede Zeile einzeln geholt, Daten abgeändert und in Marker geschrieben. Wie geht sowas?

    3. Ich habe folgende Funktion in Repostory:

    1. public function all_name() {
    2. $res = array(
    3. "vorname" => "wwe",
    4. "name" => "wwebhj",
    5. );
    6.  
    7. return $res;
    8. }

    Wie bekomme ich ein Array - so wie ein SQL- Query - Zeile für Zeile ins Template? Wie muss das Array aufgebaut sein?

    4. Wenn ich per Extension Builder eine Extension erstelle, ist ja als Default eingestellt, dass die list- Action als erstes aufgerufen wird. Wie kann man das ändern?

    Ich weiß das sind viele Anfängerfragen zum Thema Extbase, hoffe aber trotzdem das jemand die mir antworten kann, würde mich sehr freuen :)
    Philipp


  • Philipp88 Philipp88
    Sternenflotten-Admiral
    0 x
    194 Beiträge
    0 Hilfreiche Beiträge
    11. 04. 2013, 18:15

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

    Jetzt habe ich ein Formular was in etwa so aussieht:

    1. <f:form action="cform" name="person">
    2. <tr>
    3. <td>Name</td>
    4. <td><f:form.textfield property="name" /></td>
    5. </tr>
    6. <tr>
    7. <td>Vorname</td>
    8. <td><f:form.textfield property="vorname" /></td>
    9. </tr>
    10. <tr>
    11. <td>Kurze Beschreibung</td>
    12. <td><textarea name="tx_people_people[desc]" cols="10" rows="5"></textarea></td>
    13. </tr>
    14. <tr>
    15. <td colspan="2"><input type="submit" name="tx_people_people[send]" value="Benutzer anlegen" /></td>
    16. </tr>
    17. </table>
    18. </f:form>

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

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

    leider ohne erfolg:(

    Kannst du bitte nochmal helfen?

  • karf karf
    T3PO
    0 x
    25 Beiträge
    0 Hilfreiche Beiträge
    11. 04. 2013, 18:50

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

    In deinem Fall würde das jetzt so aussehen

    1. <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 Philipp88
    Sternenflotten-Admiral
    0 x
    194 Beiträge
    0 Hilfreiche Beiträge
    17. 04. 2013, 18:59

    Hi,

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

    Was meinst du mit object selber anlegen?

  • karf karf
    T3PO
    0 x
    25 Beiträge
    0 Hilfreiche Beiträge
    18. 04. 2013, 10:32

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

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

    und an den View übergeben.
    1. $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 Philipp88
    Sternenflotten-Admiral
    0 x
    194 Beiträge
    0 Hilfreiche Beiträge
    22. 04. 2013, 19:01

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

    Jetzt kommt folgende Fehlermeldung:

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

    Bei diesen PHP- Code:

    1. /**
    2. * action cform
    3. *
    4. * @return void
    5. */
    6. public function cformAction($person) {
    7. $person = $this->objectManager->create('\TYPO3\People\Domain\Model\Personen');
    8.  
    9. $this->view->assign('person', $person);
    10. }

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

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

    Das Model gibt es aber ...:(

    Bitte helf mir

    Philipp

  • karf karf
    T3PO
    0 x
    25 Beiträge
    0 Hilfreiche Beiträge
    22. 04. 2013, 19:41

    [quote="Philipp88"]
    Das wäre nett von dir ich bekomme das einfach nicht zum laufen :(

    Jetzt kommt folgende Fehlermeldung:

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

    Bei diesen PHP- Code:

    1. /**
    2. * action cform
    3. *
    4. * @return void
    5. */
    6. public function cformAction($person) {
    7. $person = $this->objectManager->create('\TYPO3\People\Domain\Model\Personen');
    8.  
    9. $this->view->assign('person', $person);
    10. }

    [/quote]
    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

    [quote="Philipp88"]
    Wenn ich bei der Funktion den Parameter weglasse kommt zwar nicht mehr die Fehlermeldung von oben, stattdessen aber ne andere:

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

    Das Model gibt es aber ...:(

    Bitte helf mir

    Philipp
    [/quote]
    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?)

    1. if ($person == null)
    2. {
    3. $person = $this->objectManager->create('TYPO3\People\Domain\Model\Personen');
    4. }

  • Philipp88 Philipp88
    Sternenflotten-Admiral
    0 x
    194 Beiträge
    0 Hilfreiche Beiträge
    22. 04. 2013, 20:55

    Hallo,

    habe ich schon herausgefunden das der "\" falsch war und habe den gleich gelöscht.
    Jetzt geht es zwar, aber in mein Marker (heißt das noch so?) wird als Inhalt "TYPO3\People\Domain\Model\Personen:" angezeigt statt den Wert :(

    Ich hatte in diesem Tutorial gelesen, dass die Funktion mit der Variable deklariert werden soll wie das Formular heißt?
    http://www.typo3lexikon.de/typo3-tutorials/extensions/fluid/fluid-dokumentation/form.html

  • Philipp88 Philipp88
    Sternenflotten-Admiral
    0 x
    194 Beiträge
    0 Hilfreiche Beiträge
    02. 05. 2013, 17:29

    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:

    1. ...
    2. public function showAction(\TYPO3\Project\Domain\Model\Project $project) {
    3. $project_id = $this->request->getArgument('project');
    4. $this->view->assign('project', $project);
    5. $this->view->assign("path", "uploads/tx_project");
    6.  
    7. $images = $this->projectRepository->get_images($project_id);
    8. #print_r($images);
    9.  
    10. $this->view->assign("images", $images);
    11.  
    12. }

    Repository:

    1. public function showAction(\TYPO3\Project\Domain\Model\Project $project) {
    2. $project_id = $this->request->getArgument('project');
    3. $this->view->assign('project', $project);
    4. $this->view->assign("path", "uploads/tx_project");
    5.  
    6. $images = $this->projectRepository->get_images($project_id);
    7. #print_r($images);
    8.  
    9. $this->view->assign("images", $images);
    10.  
    11. }

    Ergebnis soll in Template erscheinen:

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

    Leider kommt dann folgende Fehlermeldung :(

    1. 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