Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 10/17/2015 in all areas

  1. Hi Tony, I have attached a site-profile as example. It has some data in it that was populated with the following importer script. In the site profile I have created the dam_type and the dam_purpose categories and page fields. The dam_purpose was created as Multiple categories and there will be no items added automaticaly during import. The dam_type will be added automaticaly during install. there is only the templates and the parent created manually. Inspect the profile and look through the importer script, it has all needed comments. After playing around with it, I'm sure you can adapt it to suite your needs. site-rccdams-starter.zip save this besides your PW index.php and call it after you have logged in as superuser: <?php $GLOBALS['templateName'] = 'rccdams'; // the name of the template you use $GLOBALS['oldrccid'] = 'rccid'; // the fieldname in PW which stores the id from the source DB $GLOBALS['parentPath'] = '/rcc_dams/'; // add the path you want the pages stored, e.g. "/rccdams/" or that like, but check that you already have created this (parent) page in PW!! // the templates and parent pages for the categories needs to be created manually before the import action is used!! // also don't forgett to assign them to the rccdams template !! $categoryPages = array( 'dam_type' => array( 'nameOfParentTemplate' => 'dam_type_category_parent', 'nameOfChildTemplate' => 'dam_type_category' ), 'dam_owner' => array( 'nameOfParentTemplate' => '', 'nameOfChildTemplate' => '' ), 'dam_country' => array( 'nameOfParentTemplate' => '', 'nameOfChildTemplate' => '' ), 'dam_purpose' => array( 'nameOfParentTemplate' => 'dam_purpose_category_parent', 'nameOfChildTemplate' => 'dam_purpose_category' ) ); # # ATTENTION: SELECT AN ACTION HERE !! # # select an action you want to proceed by comment uncomment the following two lines # $ACTION = 'deleteImportedPages'; #$ACTION = 'createFields'; #$ACTION = 'importData'; // provide the credentials to connect to the Source-DB, including DB name and Table name $MYSQL = array(); $MYSQL['host'] = '127.0.0.1'; $MYSQL['user'] = ''; $MYSQL['pass'] = ''; $MYSQL['dbname'] = 'rccdams_db'; $MYSQL['tablename'] = 'rccdams_db'; // a list with all the fields and the their types, you want create / import into PW $rccdams_fields = array( 'dam_type' => 'Page', 'dam_country' => 'Page', 'dam_owner' => 'Page', 'dam_purpose' => 'Page', 'rccid' => 'Integer', 'dam_name' => 'Text', 'river' => 'Text', 'capacity' => 'Text', 'cd_proj_start' => 'Datetime', 'cd_proj_start_d' => 'Integer', 'cd_proj_start_m' => 'Integer', 'cd_proj_start_y' => 'Integer', 'cd_rcc_start' => 'Datetime', 'cd_rcc_start_d' => 'Integer', 'cd_rcc_start_m' => 'Integer', 'cd_rcc_start_y' => 'Integer', 'cd_proj_fin' => 'Datetime', 'cd_proj_fin_d' => 'Integer', 'cd_proj_fin_m' => 'Integer', 'cd_proj_fin_y' => 'Integer', 'cd_rcc_fin' => 'Datetime', 'cd_rcc_fin_d' => 'Integer', 'cd_rcc_fin_m' => 'Integer', 'cd_rcc_fin_y' => 'Integer' ); // I'm not sure if all the _d, _m, _y fields are needed. Maybe you only need the 4 Datetime fields! // you can adapt the list to suite your needs ############### READY with config part ########################### $GLOBALS['categoryPages'] = $categoryPages; $timeLimit = (60 * 5); // give it a bit more time than the default 30 seconds $ignoreUserAbort = false; // prepare server for plaintext output if(function_exists('apache_setenv')) @apache_setenv('no-gzip', '1'); @ini_set('zlib.output_compression', 'Off'); @ini_set('output_buffering ', '0'); @ini_set('implicit_flush', '1'); @ob_implicit_flush(true); @ob_end_flush(); if(isset($_SERVER['HTTP_HOST'])) { header('Content-Type: text/plain'); } // Bootstrap ProcessWire require_once('./index.php'); // security check if the current user is a SuperUser, comment the next line out, if you run this script from CLI if (!wire('user')->isSuperuser()) die('ACCESS DENIED!'); ignore_user_abort($ignoreUserAbort); set_time_limit(intval($timeLimit)); // Assign API variables to make things a little easier $fields = wire("fields"); $templates = wire("templates"); $modules = wire("modules"); $sanitizer = wire("sanitizer"); $pages = wire("pages"); echo "\n$ACTION\n"; if ('deleteImportedPages' == $ACTION) { echo "\n"; // we drop all imported pages foreach($pages->find("template={$GLOBALS['templateName']},include=all") as $p) { echo " - now drop {$p->title}\n"; $p->delete(); } echo "\nREADY!\n"; exit(); } if ('createFields' == $ACTION) { echo "\n"; // (1) first get the rccdam template $t = $templates->$GLOBALS['templateName']; if (!$t) { $fg = new Fieldgroup(); $fg->add("title"); $fg->save(); $t = new Template(); $t->name = $GLOBALS['templateName']; $t->fieldgroup = $fg; $t->save(); } // (2) loop through the field list and create those that are missing foreach($rccdams_fields as $name => $type) { echo " - $name :: $type\n"; if ('page' == strtolower($type)) continue; // field of type Page, this need to be created manually $f = $fields->$name; if (!$fields->$name) { // create a new field $f = new Field(); $f->type = $modules->get("Fieldtype" . $type); $f->name = $name; $f->save(); echo " successfully created\n"; } // add it to the rccdam template $t->fieldgroup->add($f); $t->fieldgroup->save(); $t->save(); } echo "\nREADY!\n"; exit(); } if ('importData' == $ACTION) { echo "\n"; // (1) connect to Source-DB $MY_sql = mysql_connect($MYSQL['host'], $MYSQL['user'], $MYSQL['pass']); if($MY_sql) { echo "- connected with MySQL Server\n"; $MY_sql_db = mysql_select_db($MYSQL['dbname'], $MY_sql); if($MY_sql_db) { echo "- connected with source DB\n"; $MY_sql_result = mysql_query("SELECT * FROM {$MYSQL['tablename']}", $MY_sql); if (is_resource($MY_sql_result)) { echo "- found the Table\n\n"; $t = $templates->$GLOBALS['templateName']; while($row = mysql_fetch_array($MY_sql_result, MYSQL_ASSOC)) { // (2) process all records of source table echo " -- fetched row with id {$row['id']}\n"; if (!isValidImportRecord($row)) continue; // this one is already present in PW, so skip further processing // we have data for a new page echo " this one needs to be imported\n"; $p = new Page(); // create a new page and assign the minimum required params: template, parent and title! $p->template = $t; $p->parent = $pages->get($GLOBALS['parentPath']); $p->$GLOBALS['oldrccid'] = $row['id']; $p->title = $row['dam_name']; // now loop through all source data fields foreach($row as $fieldname => $data) { if (!isset($rccdams_fields[$fieldname])) continue; // skip source data fields that are not defined in the $rccdams_fields array!! if (!$t->fieldgroup->$fieldname) continue; // skip source data when there is no field in our template // check which type we need in PW for this if ('Page' != $rccdams_fields[$fieldname]) { // we can simply add the source data into the target field, but pass it once through the sanitizer or typecast it to integer $data = 'Integer' == $rccdams_fields[$fieldname] ? (int)$data : $sanitizer->text($data); $p->$fieldname = $data; } else { // we have a Pagefield, we need to act accordingly, // here in the starter script I only work with dam_type and dam_purpose // the other needs to be added by you, switch($fieldname) { case 'dam_type': // this must be a single category Page !! in Details Tab it must set to SIngle Page or empty NullPage !! // we want create child pages for this category automatically, therefore // we need to check if there is already a child page, fetch this or create a new one: $data = $sanitizer->text($data); $cp = getCategoryPage('dam_type', $data); $p->$fieldname = $cp; break; case 'dam_owner': break; case 'dam_country': break; case 'dam_purpose': // this is a Multi-Items-Category and it has shortcuts in the source DB $data = strtolower(trim($sanitizer->text($data))); $cpa = getCategoryPagesPurpose($data); $p->$fieldname = $cpa; break; } } } $p->save(); echo " saved into DB!\n\n"; } mysql_free_result($MY_sql_result); } } } mysql_close($MY_sql); echo "\nREADY!\n"; exit(); } function isValidImportRecord($row) { // we check for a page with the rccdams template and the original id, (what we have stored under rccid with every imported page) $page = wire('pages')->get("template={$GLOBALS['templateName']},{$GLOBALS['oldrccid']}={$row['id']}"); // if a $page with ID greater than zero is found, we already have this page imported and want to skip it here, therefor we retun false! return $page->id > 0 ? false : true; } function getCategoryPage($name, $data) { $nameOfParentTemplate = $GLOBALS['categoryPages'][$name]['nameOfParentTemplate']; $nameOfChildTemplate = $GLOBALS['categoryPages'][$name]['nameOfChildTemplate']; // if there is no data in the source record, we return a NullPage Object if (empty($data)) { $cp = new NullPage(); } else { // if we have this page already in PW, we return it $cp = wire('pages')->get("template={$nameOfChildTemplate},name=" . wire('sanitizer')->pageName($data)); if (0 == $cp->id) { // if it ins't already there, we create it $cp = new Page(); $cp->of(false); $cp->template = $nameOfChildTemplate; $cp->parent = wire('pages')->get("template={$nameOfParentTemplate}"); $cp->title = $data; $cp->save(); } } return $cp; } function getCategoryPagesPurpose($data) { $nameOfChildTemplate = $GLOBALS['categoryPages']['dam_purpose']['nameOfChildTemplate']; $cpa = new PageArray(); // create an empty PageArray if (empty($data)) return $cpa; // if we have no source data, return empty PageArray for($i = 0; $i < strlen($data); $i++) { // add category pages to the array $cp = wire('pages')->get("template={$nameOfChildTemplate},name={$data[$i]}"); $cpa->add($cp); } return $cpa; } EDIT: I added the $ACTION "deleteImportedPages" to the script, and a few more comments. Please use this from above and not this that ships in the ZIP archive.
    5 points
  2. InputfieldURLChecker This is a tiny module to add a URL check button to InputfieldURL. It's live, meaning that it opens what you just typed in, and visible only if the field is non-empty. It's as unobtrusive as can Modules directory GitHub It would be the best if something similar would be built-in to PW. There will be probably some tweaks and settings in the future. Suggestions welcome (even for module name).
    4 points
  3. I have visions of Hobbits creating sites in ProcessShire now, whilst getting drunk and causing mischief
    3 points
  4. What it does: you can easily define replacement-tags in your fields (also descriptions) like this: [demo] => '<span class="demo">some demo markup</span>', [demo2] => '<span class="demo">some other demo markup</span>', [demo3] => '<span class="demo">one more demo markup with a <a href="#" class="pw-modal">modal link</a>!</span>', Screenshot: Why? today i had to (to be more precise: i wanted to) have a link in one of my field-descriptions that opened a modal to a list of icons... basically i just wanted to add a "pw-modal" class to the link what is not possible through markdown [link](http://example.com) i ended up with the following little module: // removed - please see the code on github its also on github: https://github.com/BernhardBaumrock/ProcessWireModules/blob/master/InputfieldTagReplacer.module i know but didn't use RuntimeMarkup because i wanted the link in the description not in a separate field! Questions: would it be possible to get the currently edited $page somehow? the $page object i get now is the admin page with the according process. it would be nice to be able to do things like $page->parent or the like... would there be another method to hook into that would be more efficient or better in any other way? how can i debug the $event object? i tried var_dump($event); die(); but that showed nothing var_dump($event->return); die(); shows the form/field markup would there have been an easier way to achieve this?
    2 points
  5. Started using Gulp for a few projects several months back. It's a great tool, but found it to be a tad bulky for one of the projects. These are my current choices: Large projects: Gulp with zillions of plugins (working on one as we speak) Medium projects with a decent handful of assets: NPM Small projects with one or two scripts and one stylesheet (including PW modules): The respective ST3 plugins for LESS and Uglify Currently, this works for me. I see there are other alternatives to Gulp, but none of them give me good reason to switch over. Some alternatives boast about shorter code, but I really don't think that matters. Performance and feature-richness are what made me choose Gulp. Using NPM is also great, though not as fast. My only real quirk with NPM is on Windows. I don't particularly want to use Cygwin as I'm comfortable with my Mingw32 setup, but that means I loose several features like glob, which is essential. Nonetheless, workarounds are easy to build.
    2 points
  6. If you didn't yet, check the latest post from the blog, Ryan explains a lot there https://processwire.com/blog/posts/processwire-2.6.20-and-surprise-processwire-3.0-alpha-1/ Try setting compatibility with 2x to see if all works $config->compat2x = true If it does, work and you want to try the new features (what would be the point of installing this version if not?), put it back to false and check if you are calling wire() on your templates, if that's the case, either change those call to the equivalent variables ($page, $pages, etc...) or add the PW namespace to the top of those template files namespace ProcessWire; I think you'll have to do this also for each module.
    2 points
  7. U sguold not uses.entity encodededer w ckeditor or any.html feld uses it.with feilds thet haves.no htmls
    2 points
  8. Regardless of your setup I would use a managed layer. Whether it's ServerPilot or some other tool. I don't really like spending to much time doing this sysadmin work. They also got a free plan which only allows one user. Keep in mind that it is good practice to separate your installs with different users since they don't share their files and databases. I really see it as a convenience. With some tutorials you could fairly easy manage it from the command line. Just try it out for 30 minutes.
    2 points
  9. SimpleForms Alpha bumped to 0.8.0, featuring support for YAML configuration (proudly powered by symfony/yaml), in addition to JSON. You can now use a config.yaml file instead of config.json. Note that that JSON is preferred over YAML in the case that both files exist. An example YAML config file is in the default-forms directory. As you just noticed, the form directory is no longer named "forms" - it is now named "default-forms". When you install the module, the contents of this directory is copied to site/assets/forms. To me, this seems to be best-practice, considering the fact that the previous directory was wiped out on module upgrade. Lastly, you may find that, in some situations, selected fields need to be disabled when the form is rendered. For example, a "subject" field may need to be pre-populated based on a GET parameter and, therefor, read only. Often, the readonly attribute is enough, but I think disabled is better. Previously, such a field would be re-enabled after the form was processed and validation errors occurred (you may have noticed that the entire form is disabled when the form is processing). Now, these state of these fields persist by adding data-sf-disabled when the form is prepared by the front-end plugin. This makes the behaviour consistent with the intention.
    2 points
  10. Hi Tony, have only a bit time now, but think I definetly can explain how to get this part with the page-fieldtype sorted. Best thing would be to start with a simple step by step solution: in admin, create a template without a file, called country and let it have only the title field. Save! create a second template, called countries (plural / multiples of country), only assign the title filed to it and: Save! go into your page tree and create a single page named countries, with the template countries, now add children to this page, all of them should have the template country, ok, now go into fields and create a new field of type "page", name it countries. In the Input tab of it, go to Selectable Pages, use Parent of selectable page(s) and click the change button you get the admin page tree now and have to go to your previously created countries (parent) page. Click select to select it! additionally to that, go to Template of selectable pages(s) and use the dropdown to select country, (the single page template) Now you can go to Input field type and select one that fits best your needs. For this example, please select the AsmSelect* ok, ready to save the field! Now go to a template where you want to be able to select countries or one country, - add the new created field "countries" to it and save. Open a page with that template or create a new one that bases of the template that now has the page field countries included. Go to the field and play around with it! You got it now? Go ahead and edit your countries field: under the Details tab select: Single page or empty page ... (this will restrict the field to let the user select only one child out of all available) if you don't like the AsmSelect, go to Input tab and select another one, best would be Select now? save it and test your changes. Come back here if you don't get it i to work.
    2 points
  11. Hi, this is a textformatter-module to globally set all kinds of YouTube and Vimeo options to embedded videos. It works well with TextformatterVideoEmbed and I think also with TextformatterOEmbed - https://github.com/blynx/TextformatterVideoEmbedOptions ... this is my first module - so I hope the code is acceptable ... ; ) What do you think about the way I implemented the configuration? I Seperated all the config and defaults into a JSON file and generated all fields automatically ... I was wondering if this was already possible or a good idea at all here: https://processwire.com/talk/topic/11155-create-inputfields-from-json-array/ Looking forward hearing your feedback! Cheers, Steffen
    1 point
  12. You overwrite $attachments in the for each, use ".=".
    1 point
  13. $process = $this->wire('process'); if($process && $process->className() == 'ProcessPageEdit') $page = $process->getPage();
    1 point
  14. Horst, I can't thank you enough for all the help you're providing. I've passed this on to the guy who I'm working with to produce the site, and who did the original import. He's far more savvy than me on these things Tony.
    1 point
  15. changed to "Neueste zuerst" and "Älteste zuerst"
    1 point
  16. Hey OviS, Sorry to hear you are running into this weird issue. I hadn't noticed the thread before, otherwise I would've responded earlier. At my previous company we had exactly the same issue. I never could really reproduce it. But when we migrated our servers the issue went away. We came from a rather old MySQL version (5.0.x.x) to a new one (5.6.x.x). I didn't noticed at once because we were using a temporary solution. We created a repeater with an Image field and a Text field per row. In the Image field setting we set the row to 0 so the description didn't show. Not really nice, but workable and our clients didn't really bother after a while. After the migration I did some work for a smaller client with images. I tried to see if the issue had been resolved. After a few edits and some time, it kept working. We took the plunge and converted them all back. No problems since. I don't know your setup and the way you guys work, but I would say a full site convert seems a lot more work then to create a temporary workable solution. Also you could try to reproduce with another MySQL version.
    1 point
  17. Hi @matjazp - thanks for the request. Please try the latest version which should do what you need. If no templates are selected, then the module will still search all templates as before so the changes won't affect existing users.
    1 point
  18. - interesting, but Google doesn't translate it correct: https://translate.google.de/?hl=en#auto/en/%D0%9F%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%A8%D0%B8%D1%80%D0%B5
    1 point
  19. You can add a textformatter to that Field. drop the following code into a file named and located at site/modules/TextformatterRemoveEncodedSpaces/TextformatterRemoveEncodedSpaces.module <?php class TextformatterRemoveEncodedSpaces extends Textformatter { public static function getModuleInfo() { return array( 'title' => 'Remove Encoded Spaces ()', 'version' => '0.0.1', 'summary' => 'Removes that weird encoded spaces (& #160 from my Textareas!' ); } public function format(&$str) { $search = array( ' ' ); $replace = array( ' ' ); $str = str_replace($search, $replace, $str); } } install it and add it to the output of your textarea field.
    1 point
  20. I see, I'll maybe have a look into but will maybe take some time. It's always a lot of work update a module with readme etc, but will put on my list. For now I think a better approach would then be this to replace the UL wrapper class, "MarkupSocialShareButtons", with your own class or extend it: $content .= str_replace("MarkupSocialShareButtons cf", "myClasses", $modules->MarkupSocialShareButtons->render());
    1 point
  21. You can use Hanna code for this http://modules.processwire.com/modules/process-hanna-code/ You would create a new Hanna code called, let's say "value", and put something like this in the code: echo $page->get($field); Then you would simply do this inside the body text: [[value, field=parent_company]] Read the Hanna code instructions to have a feeling of what you can do with it.
    1 point
  22. At the moment I dont use functions to create a menu out of the page tree, because you are more flexable. In most cases the menus consist of not so much items. If you use the pagetree to create the menu you are in a fixed structure. With manual writing of the menu you could change the markup, you can show only the items you want, you can easly integrate icons to each menu point,.....all without problems. So its quite worth to think over if you really need a function for your menu. Best regards
    1 point
  23. Hi Roych and welcome to the forum! There is Damienov's function for rendering a bootstrap 3 dropdown menu. So no need to reinvent the wheel You need to include that function somewhere in your template. E.g. you could make a file functions.php and put that function inside and save it to site/templates/inc/functions.php. Note that this part does NOT belong in your functions.php, only the function itself: // bundle up the first level pages and prepend the root home page $homepage = $pages->get(1); $pa = $homepage->children; $pa = $pa->prepend($homepage); // Set the ball rolling... echo renderChildrenOf($pa); Then in your main template or even in your init.php file you include the function: /* * Include any other shared functions we want to utilize in all our templates * */ require_once("./inc/functions.php"); Now in your template were you want to render the function you put this part: // bundle up the first level pages and prepend the root home page $homepage = $pages->get(1); $pa = $homepage->children; $pa = $pa->prepend($homepage); // Set the ball rolling... echo renderChildrenOf($pa); This should render a nice BS dropdown navigation.
    1 point
  24. I don't know exactly how you need your data to be organized, and how you import it, but I think best way would be if it is possible to import it in several steps. Maybe, that's exactly what you are said / asked me, - You need to do the import completly new. Here is the way hoa I would do it: First import or create all categories, create a parent page, e.g. like with the countries example, create the countries template and page. Then create the child template and import all items as children of the parent page. Repeat this for all other categories! (name, owner, country, dimensions, construction dates, construction methods, etc) If your categories are ready, you need to create the fields and templates (incl. template file(s)) for your main data pages. Also this will have one or more Page-Fields for the categories. When importing a record of the main data, you need to assign a category by a page field. If you can provide some informations about the data that you need to import, we can provide further help / assistance with an importer script. Is it in CSV file? Is it in a mySQL-DB or is it a mysql.dump? Can you provide at least one record with example data and all the fieldnames? Maybe it is also possible to import all at once, but therefore we need some more informations. Horst
    1 point
  25. You've two options to create relationships in processwire. Either using the parent/child one or using pagefields. As you've rightly pointed out the Simple Multiple Categories way kongondo described will most likely be the right one, kinda like this. Dams - Dam 1 - Dam 2 - … Country - China - Japan - … Owner - Some One - Another One Type - Type 1 - Type 2 Purpose - 1 - 2 The dam pages will have pagefields, where you can categorize each dam to their country, owner type and purpose. All the other pages will most likely only hold raw information, e.g. first and lastname of the owner as separate fields. How to create those pages will depend on how you want to import them, but the best strategy will most likely be, that you create all the category pages at first and in the end import the dams, so you can already fill all the pagefields with the corresponding links to the categories.
    1 point
  26. Hi Celfred! Maybe you're having non-breaking spaces in your if statement, which causes the error. Try clearing spaces in your statement and rewrite them. At least on mac version of Sublime Text alt+space inserts non-breaking spaces. If you're using Sublime Text, add this line to key bindings configuration (Settings > Key bindings - User) to prevent those nasty spaces: { "keys": ["alt+space"], "command": "insert", "args": {"characters": " "}},
    1 point
  27. i usually use a custom module and put all of my custom admin stuff there, e.g.: public function ready(){ if($this->page->process == "ProcessPageEdit"){ $this->addHookAfter('ProcessPageEdit::buildFormContent', $this, 'mySpecialThing'); } } public function mySpecialThing(HookEvent $event) { $form = $event->return; $field = $this->modules->get("InputfieldMarkup"); $field->markupText = "<h3>My Special Thing</h3>"; $form->prepend($field); } // end function
    1 point
  28. I can imagine how overwhelmed you feel right now. It's like wanting to start playing the guitar, but being confronted with amplifier settings, guitar brands and whatnot right within the first minutes. When you only want to learn one single chord first and build upon that. I guess you already stumbled upon Chris Coyiers close-to-perfect intro to Grunt? http://24ways.org/2013/grunt-is-not-weird-and-hard/ ? My advice would be: Choose either Grunt or Gulp (both are great, capable, and have all necessary functions as plugins), stick to that decision for a couple of projects, don't let distract yourself by the usual developer tiffs, and once you build your own Grunt/Gulp boilerplate and feel confident with it, reach out for optimizations (and maybe read these links here again). But then you'll already have entered the amazing world of task runners and will most probably consider them as a crucial part of your development workflow Also, here's a super simple Gulpfile from processwire-recipes.com, just dealing with SASS and gluing some JS files together (Please ignore the messed up indentations in the file)
    1 point
  29. I made this into a blank site profile. Download and instructions here. Tested on a new PW install and it is working fine. Maybe some of you want to test it in other environments and let me know if I need to amend the README. Thank you.
    1 point
  30. @pwFoo: WebSockets are an overkill for something like this - they are designed for distributed messaging between multiple concurrent users for web applications that work in real-time. For this same reason, they require a special server designed for the purpose - the best currently being something running on top of node.js (like socket.io), a language which was designed for things like this from the ground up. Erlang would be another choice (it even has a socket.io port). In other words, you cannot handle WebSockets with just Apache and mod_php5. Ok, you could always run a PHP-based WS daemon like Ratchet, in the background, but I'm personally not a fan of PHP-based TCP-daemons. They are good for toying with new concepts though. And yes, I do know about the guy who wrote an SSH2 server with PHP, but still, you and I both probably stick with OpenSSH I don't even see this happening for quite some time because Apache was never designed for this kind of purpose. Neither was PHP.
    1 point
  31. massage and error for admin no ? use them like this u can two $pages->error('bad man'); $session->message('hi'); wire('pages')->error('bad bad.man'); wire('session')->message('hiho'); work.for any api vrable it does
    1 point
×
×
  • Create New...